ヌメロンとは
簡単にいうと数当てゲーム
今回は、コンピューターが持つランダムな数値列を当てたら勝ち
ルールについて
- それぞれのプレイヤーが0~9までの数字が書かれたカードを使って3桁または4桁の番号を作成する。ただし、「112」「121」といった同じ数字を2つ以上使用した番号は作れない。
- 先攻のプレイヤーは相手が作成したと思われる番号をコールする。相手はコールされた番号と自分の番号を見比べ、コールされた番号がどの程度合っているかを発表する。
- 数字と位置が合っていた場合は「EAT」
- 数字は合っているが位置は合っていない場合は「BITE」
- 例として相手の番号が 「765」、コールされた番号が「746」であった場合「1 EAT - 1 BITE」となる。
- これを先攻・後攻が繰り返して行い、先に相手の番号を完全に当てきったプレイヤーの勝利となる。
ルールは Numer0n数当てゲーム から抜粋しました。
今回作成したもの
今回はコンピュータのもつ数字を当てていくスタイルを採用しました
一方的に攻めていきます
ソースコード
numelon.rb
class Numelon
#桁数を3桁か4桁で選択できる
def select_digits
puts "プレイする桁数を選んでください\n3 or 4"
@select_num = gets.to_i
if @select_num == (3 || 4)
return @select_num
else
puts "桁数が間違っています"
select_digits
end
end
#ランダムな数値列の作成
def make_num
program_num = [*(0..9)]
rand_array = program_num.shuffle
@rand_num = rand_array.take(select_digits)
end
#入力された数値を取得
def enter_num
puts "#{@select_num}桁の数字を入力してください"
num = gets.chomp
enter_array = num.split('').map(&:to_i)
#数字の重複を調べる
num_dup = enter_array.group_by(&:itself).map{ |key, value| value.count }
num_dup.delete(1)
#桁数が違う場合、再入力を求める
if enter_array.length != @select_num
puts "桁数が違います。再入力してください"
enter_num
#同じ数字が入力されていた場合、再入力を求める
elsif num_dup.length != 0
puts "同じ数字が入力されています。再入力してください"
enter_num
else
check_num(enter_array)
end
end
def check_num(enter_array)
eat_count = 0
bite_count = 0
enter_array.each_with_index {|num, i|
if num == @rand_num[i]
eat_count += 1
elsif @rand_num.include?(num)
bite_count += 1
end
}
puts "#{eat_count} eat - #{bite_count} byte"
if eat_count == @select_num
puts "あなたの勝ちです"
exit
else
enter_num
end
end
end
player = Numelon.new
player.make_num
player.enter_num
実際のプレイ
ruby numelon.rb
プレイする桁数を選んでください
3 or 4
5
桁数が間違っています
プレイする桁数を選んでください
3 or 4
3
3桁の数字を入力してください
12345
桁数が違います。再入力してください
3桁の数字を入力してください
112
同じ数字が入力されています。再入力してください
3桁の数字を入力してください
789
0 eat - 2 byte
3桁の数字を入力してください
198
1 eat - 0 byte
3桁の数字を入力してください
837
0 eat - 3 byte
3桁の数字を入力してください
378
3 eat - 0 byte
あなたの勝ちです
最後に
rubyの勉強ということで今回はヌメロンを作成
本家のヌメロンは対人戦だから、コンピューターと戦わせようと思ったけど難しかったから一方的に当てるスタイルにしてみた
時間ができたらひらがなヌメロンや英単語ヌメロンを作りたい
クラス・メソッドについての理解が浅いので汚いコードになっています
もっと簡潔な記述などあればコメントで教えてください!