ヌメロン(Numer0n)とは
マスターマインドをベースに、相手が選んだ数字を当てる推理ゲーム
Numer0n (wikipedia)
ヌメロンの基本ルール
- それぞれのプレイヤーが0~9までの数字が書かれたカードのうち3つを使って3ケタの番号を作成する。ただし、「112」「121」といった同じ数字を2つ以上使用した番号は作れない。
- 先攻のプレイヤーは相手が作成したと思われる番号をコールする。相手はコールされた番号と自分の番号を見比べ、コールされた番号がどの程度合って いるかを発表する。
- 数字と位置が合っていた場合は「EAT」
- 数字は合っているが位置は合っていない場合は「BITE」
- 例として相手の番号が 「765」、コールされた番号が「746」であった場合「1 EAT - 1 BITE」となる。
- これを先攻・後攻が繰り返して行い、先に相手の番号を完全に当てきったプレイヤーの勝利となる。
ルールは 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勉強中なので、もっとこうしたらいいとかあればアドバイスお願いします。