0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby ターミナル上で動くヌメロンを作成してみた

Posted at

ヌメロンとは

簡単にいうと数当てゲーム
今回は、コンピューターが持つランダムな数値列を当てたら勝ち

ルールについて

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

ルールは 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の勉強ということで今回はヌメロンを作成
本家のヌメロンは対人戦だから、コンピューターと戦わせようと思ったけど難しかったから一方的に当てるスタイルにしてみた

時間ができたらひらがなヌメロンや英単語ヌメロンを作りたい

クラス・メソッドについての理解が浅いので汚いコードになっています
もっと簡潔な記述などあればコメントで教えてください!

0
0
3

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?