My TIPs for the programing

プログラミング学習記録

【テストプログラム3】

完成形

(janken2.rb)

# 判定部分のみをクラスに。
PLAYER_INPUT_TO_INTEGER = {'g'=> 1 ,'c' => 2 ,'p' => 3 }
MACHINE_INTEGER_TO_INPUT = { 0 => "g" ,  1  => "c",  2  => "p"}
MACHINE_LIST_JANKEN = ["g","c","p"]
GCP_TO_JAPANESE = {'g'=>'グー','c' => 'チョキ','p'=>'パー'}

puts "input g or p or c"
print "you:"
player_gcp = gets.chomp
machine_gcp = MACHINE_LIST_JANKEN[rand(3)]

class Judge
  def judgement(player_gcp,machine_gcp)
    # p @player_gcp
    player_123 = PLAYER_INPUT_TO_INTEGER[player_gcp]
    machine_012 = MACHINE_INTEGER_TO_INPUT.invert[machine_gcp]
    result = (player_123 - machine_012 +3)% 3
    case result
    when 0
      return "勝ち"
    when 1
      return "あいこ"
    when 2
      return "負け"
    end
  end
end

judge = Judge.new
puts "あなたは#{GCP_TO_JAPANESE[player_gcp]}、私は#{GCP_TO_JAPANESE[machine_gcp]}、"
unless judge.judgement(player_gcp,machine_gcp)=="あいこ"
  print "あなたの"
end
puts "#{judge.judgement(player_gcp,machine_gcp)}です。"

(test_janken2.rb)

require 'test/unit'
require_relative 'janken2'

class TC_janken < Test::Unit::TestCase
  def setup
    @judge = Judge.new
  end

  # def teardown
  # end

  def test_janken1
    assert_equal("勝ち",@judge.judgement("g","c"))
    assert_equal("あいこ",@judge.judgement("g","g"))
    assert_equal("負け",@judge.judgement("g","p"))
    assert_equal("勝ち",@judge.judgement("c","p"))
    assert_equal("あいこ",@judge.judgement("c","c"))
    assert_equal("負け",@judge.judgement("c","g"))
    assert_equal("勝ち",@judge.judgement("p","g"))
    assert_equal("あいこ",@judge.judgement("p","p"))
    assert_equal("負け",@judge.judgement("p","c"))
  end
end
Finished in 0.00094 seconds.
-------------------------------------------------------------------------------------------------
1 tests, 9 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
-------------------------------------------------------------------------------------------------
1063.83 tests/s, 9574.47 assertions/s

エラーfailureなし。

やったこと
  • メソッドの数だけテストが必要になるから、共通機能は1つのメソッドにまとめた。 具体的にはg/c/p から数字に変換するメソッドを判定のクラスに組み込んだ。 その際に、machineとplayerのじゃんけんの出し手の処理処理が異なったっため、一致させた。

  • クラスに変数を渡そうとして試行錯誤していたが、クラス直下にメソッドを作成し、そのメソッドに引数を渡すものとした。

  • 直接testを行う部分の記述は複雑な処理を書かずに人間に見てわかりやすいものとした。

  • クラス内のメソッドで参照するハッシュは定数CONSTとした。

  • 判定部分のクラスと出力は分離した。 クラスの戻り値を受け取って出力するものとした。

  • 謎のend_of_inputエラー。classがcalssになってた。