Help us understand the problem. What is going on with this article?

じゃんけんゲームに現れる数学の話

概要

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした