LoginSignup
6
3

More than 5 years have passed since last update.

[Ruby]数当てゲームのヌメロン作ってみた

Last updated at Posted at 2017-12-15

ヌメロン(Numer0n)とは

マスターマインドをベースに、相手が選んだ数字を当てる推理ゲーム
Numer0n (wikipedia)

ヌメロンの基本ルール

  1. それぞれのプレイヤーが0~9までの数字が書かれたカードのうち3つを使って3ケタの番号を作成する。ただし、「112」「121」といった同じ数字を2つ以上使用した番号は作れない
  2. 先攻のプレイヤーは相手が作成したと思われる番号をコールする。相手はコールされた番号と自分の番号を見比べ、コールされた番号がどの程度合って いるかを発表する。
    • 数字と位置が合っていた場合は「EAT
    • 数字は合っているが位置は合っていない場合は「BITE
    • 例として相手の番号が 「765」、コールされた番号が「746」であった場合「1 EAT - 1 BITE」となる。
  3. これを先攻・後攻が繰り返して行い、先に相手の番号を完全に当てきったプレイヤーの勝利となる。

ルールは Numer0n数当てゲーム から抜粋しました。

仕様

今回は対戦ではなく、ランダムに生成された相手の番号を一方的に当てるだけにしました。
ターミナル上で動かせます。

ソースコード

numeron.rb
class Numeron
  attr_reader :condition

  def initialize
    # 相手の番号
    @opp_nums = [*"0".."9"].sample(3)
    # ゲームが続いているかの状態
    @condition = true
    puts "コールしてください"
  end

  # EAT と BITE の数を調べる
  def check(call_nums)
    @eat_count = 0
    @bite_count = 0
    call_nums.chars.each_with_index do |call_num, call_position|
      opp_positon = @opp_nums.index(call_num)
      next unless opp_positon
      if opp_positon == call_position
        @eat_count += 1
      else
        @bite_count += 1
      end
    end
  end

  # EAT と BITE の数を知らせる
  def announce_result
    if @eat_count == 3
      puts "3 EAT"
      @condition = false # ゲーム終了
    else
      puts "#{@eat_count} EAT - #{@bite_count} BITE"
    end
  end

end


numeron = Numeron.new

while numeron.condition
  call_nums = gets.chomp # 3桁の数字をコール
  numeron.check(call_nums)
  numeron.announce_result
end

出力

$ruby numeron.rb 
コールしてください
345
0 EAT - 0 BITE
678
1 EAT - 1 BITE
617
0 EAT - 1 BITE
728
3 EAT

さいごに

Ruby勉強中なので、もっとこうしたらいいとかあればアドバイスお願いします。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3