概要
Rubyist Magazine 0002号の記事 Ruby ではじめるプログラミング 【第 1 回】を読みながらじゃんけんゲームを作って遊んでいたら,割り算の余りに着目してプログラムを簡潔にできることに気が付き,実際に簡単にした.
詳細
割り算の定義
負の整数の割り算の余りを考えるので,念のため割り算の定義を確認しておく.
定義
任意の整数 $n,m$(ただし $m\neq0$)に対して $n=mq+r$ かつ $0\leq r<q$ を満たす整数の組 $(q,r)$ がただ一つ存在する.このとき,$q$ を「$n$ を $m$ で割ったときの商」,$r$ を「$n$ を $m$ で割ったときの余り」と呼ぶ.
じゃんけんと割り算の余り
グーを1,チョキを2,パーを3とする.プレイヤーAとコンピュータBの2人でじゃんけんをするとき,結果は全部で9通りである.下記の表はじゃんけんの各場合について B-A を計算したものである.
A\B | 1 | 2 | 3 |
---|---|---|---|
1 | 0 | 1 | 2 |
2 | -1 | 0 | 1 |
3 | -2 | -1 | 0 |
プレイヤーAが勝つ場合は (A,B)=(1,2), (2,3), (3,1) の3通りであり,B-A の値は1または-2となっている.ここで $1=3\times0+1$,$-2=3\times(-1)+1$ より,1と-2はともに3で割ったときの余りが1となっている.同様に
- あいこの場合,B-A の値を3で割ったときの余りは0
- プレイヤーAが負ける場合,B-A の値を3で割ったときの余りは2
となっている.Ruby ではじめるプログラミング 【第 1 回】に記載されているプログラムでは,じゃんけんの9通りの場合をすべて列挙しているが,上記の性質を利用すれば下記のように9通りも書かずに実装することができる.
rsp.rb
puts 'じゃんけんゲームを起動します'
scene = 'gamestart'
hand = {1 => 'グー', 2 => 'チョキ', 3 => 'パー'}
sleep 1
win = 0 # 勝ちの数
lose = 0 # 負けの数
draw = 0 # 引き分けの数
while true
case scene
when 'gamestart'
puts '何を出しますか?'
(1..3).each do |n|
puts "#{n}: #{hand[n]}"
end
puts '9: ゲーム終了'
puts "[現在の戦績: #{win}勝#{lose}敗#{draw}引き分け]"
com = rand(3) + 1 # コンピュータの手
player = gets.to_i # プレイヤーの手
case player
when 1, 2, 3
scene = 'result'
when 9
puts 'ゲームを終了します'
sleep 1
exit
else
scene = 'nothing'
end
when 'result'
puts "あなたは#{hand[player]}を出した!"
puts "相手は#{hand[com]}を出した!"
sleep 1
if (com - player) % 3 == 0
puts 'あいこです'
draw += 1
elsif (com - player) % 3 == 1
puts 'あなたの勝ちです!'
win += 1
elsif (com - player) % 3 == 2
puts 'あなたの負けです...'
lose += 1
end
sleep 1
scene = 'gamestart'
when 'nothing'
puts 'あなたは何も出さなかった!'
sleep 1
puts 'あなたの負けです...'
lose += 1
sleep 1
scene = 'gamestart'
end
end