2
3

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.

じゃんけんアプリの試作

Last updated at Posted at 2018-01-29

元のひな型

def janken
    puts "[0]:グー\n[1]:チョキ\n[2]:パー"
    player_hand = gets.to_i

    program_hand = rand(3)

    jankens = ["グー", "チョキ", "パー"]

    puts "あなたの手:#{jankens[player_hand]}, わたしの手:#{jankens[program_hand]}"

    if player_hand == program_hand
      puts "あいこで"
      # 返り値を返す
    elsif (勝ちの条件)
      puts "あなたの勝ちです"
      # 返り値を返す
    else
      puts "あなたの負けです"
      # 返り値を返す
    end
  end

  next_game = true

  puts "最初はグー、じゃんけん..."

  # じゃんけんを繰り返す
  while next_game do
    next_game = janken
  end

プロセス・気づいたこと

判定部分

まず勝敗の判定部分から考えた。
ひな型では乱数をrand(3)と発生させていたが、0から数えるのでrand(2)に書き換えた。(0,1,2の3パターン)

program_hand = rand(2)

ひな型では0,1,2以外の数字が入力された場合の分岐がなかったので、勝敗判定の前に他の数が入力された場合の分岐を追加した。

if player_hand != 0 && player_hand != 1 && player_hand != 2
puts "0か1か2を入力してください"

次に、勝敗の判定部分を考えた。プレイヤーが勝利するのは
(a)program_handに代入される乱数が0(グー)でプレイヤーの入力した値が2(パー)
または
(b)program_handに代入される乱数が1(チョキ)でプレイヤーの入力した値が0(グー)
または
(c)program_handに代入される乱数が2(パー)でプレイヤーの入力した値が1(チョキ)
の時である。
まとめると(a)または、player_hand < program_handの時、プレイヤーが勝利する。よって勝利の条件は

player_hand == 2 && program_hand == 0 || player_hand < program_hand

とした。
無効な入力でなく、あいこでなく、勝ちではない時にプレイヤーの負けなので、負け部分はひな型を改変しなかった。

jankenメソッドの切り分け

ひな型のjankenメソッドは同一メソッド内でプレイヤーの入力待ちと勝敗の判定を行っていたので入力部分と判定部分を別のメソッドに分けた。
メソッドを分けると、入力部分で定義したplayer_handやprogram_handは、スコープの問題で判定部分では使えなくなるので、Jankenクラスにまとめ、player_handとprogram_handをクラス内の全メソッドで使えるインスタンス変数@player_hand,@program_handに書き換えた。

ループ処理

next_gameの初期値はtrueで、while文で返り値がtrueかfalseかによって処理を続行するか否かを判定したい。jankenメソッドを二つに分けてJankenクラスでまとめたので、Jankenクラスのオブジェクトをnewメソッドで作る。
変数next_gameに代入されるのはJankenクラスの判定部分であるメソッドjudge_jankenの返り値である。

  next_game = true
  while next_game do
    next_game = Janken.new.judge_janken
  end

入力部分の処理はオブジェクトを作成した時に自動的に呼び出したいのでinitializeメソッドとする。
while文の繰り返しが行われる条件はnext_gameがtrueの時なので、judge_jankenメソッドでは無効な入力、またはあいこの時にはtrueを、プレイヤーが勝った場合、負けた場合にはfalseを返り値として返すように改変した。

  class Janken
    def initialize
      puts "[0]:グー\n[1]:チョキ\n[2]:パー"
      @player_hand = gets.to_i

      @program_hand = rand(2)

      jankens = ["グー", "チョキ", "パー"]

      puts "あなたの手:#{jankens[@player_hand]}, わたしの手:#{jankens[@program_hand]}"
    end

    def judge_janken
      if @player_hand != 0 && @player_hand != 1 && @player_hand != 2
        puts "0か1か2を入力してください"
        return true

      elsif @player_hand == @program_hand
        puts "あいこで"
        return true
        # 返り値を返す

      elsif @player_hand == 2 && @program_hand == 0 || @player_hand < @program_hand
        puts "あなたの勝ちです"
        return false
        # 返り値を返す
      else
        puts "あなたの負けです"
        return false
        # 返り値を返す
      end
    end
  end

ひな型を改変したコード(完成品)

  class Janken
    def initialize
      puts "[0]:グー\n[1]:チョキ\n[2]:パー"
      @player_hand = gets.to_i

      @program_hand = rand(2)

      jankens = ["グー", "チョキ", "パー"]

      puts "あなたの手:#{jankens[@player_hand]}, わたしの手:#{jankens[@program_hand]}"
    end

    def judge_janken
      if @player_hand != 0 && @player_hand != 1 && @player_hand != 2
        puts "0か1か2を入力してください"
        return true

      elsif @player_hand == @program_hand
        puts "あいこで"
        return true
        # 返り値を返す

      elsif @player_hand == 2 && @program_hand == 0 || @player_hand < @program_hand
        puts "あなたの勝ちです"
        return false
        # 返り値を返す
      else
        puts "あなたの負けです"
        return false
        # 返り値を返す
      end
    end
  end

  puts "最初はグー、じゃんけん..."
  next_game = true
  while next_game do
    next_game = Janken.new.judge_janken
  end

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?