» じゃんけんのブログ記事

では早速じゃんけんプログラムを変更します。

STDOUT.sync = true

goo = 1
par = 2
choki = 3

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

print("[1:グー、2:パー、3:チョキ]","\n")
print("[1,2,3]の数字を入力","\n")

human_hand = gets.to_i
computer_hand = rand(3)+1
p(human_hand) #追加

print("あなたの手",hand[human_hand-1],"\n")
print("コンピュータの手",hand[computer_hand-1],"\n")

「p(human_hand)」を追加して、入力された値をチェックしてみます。
まず「5」を入力してみます。この時の実行結果。

[1:グー、2:パー、3:チョキ]
[1,2,3]の数字を入力
5 #この値はRDEが表示しています。
5 #p(human_hand)で表示された値。
あなたの手nil #
コンピュータの手パー #ここはランダムです。
Complete(0)

キーボードから入力された値は配列handの値を指定する数字です。今回5を入力したので配列に値が存在しない、
番号を指定したことになります。リファレンスの配列についてはここを参照。
リファレンスによると、「nth 番目の要素が存在しない時には nil を返します。」とあります。今回5を入力したので、
この説明通りnilが表示されました。
もう一つ「nth の値が負の時には末尾からのインデックスと見倣します(末尾 の要素が -1 番目)。」
ともあります。
次に「あ」の文字を入力してみます。
実行結果

[1:グー、2:パー、3:チョキ]
[1,2,3]の数字を入力
あ #RDEが表示しています。
0 #p(human_hand)による表示。
あなたの手チョキ
コンピュータの手グー
Complete(0)

リファレンスの「to_i」はここ
リファレンスによると「整数とみなせない文字があればそこまでを変換対象とします。変換対象が 空文字列であれば 0 を返します。」
とあります。これが、今回「あ」の文字を入力して0が表示された理由ですね。
もうひとつ「あなたの手チョキ」と表示されてます。これは先ほどの説明した
「nth の値が負の時には末尾からのインデックスと見倣します(末尾 の要素が -1 番目)。」のためです。
「print(“あなたの手”,hand[human_hand-1],”\n”)」でhand[0-1]をしているために、配列の指定番号に、
「-1」を使用していることになります。「-1」が指定するのは配列の末尾の「チョキ」になります。ちなみに、負の値で
配列の先頭を指定すると「-3」、「グー」の値を取得できます。
最後に「case文」を使用して「1,2,3」以外の値を入力した場合の処理を追加します。

STDOUT.sync = true

goo = 1
par = 2
choki = 3

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

print("[1:グー、2:パー、3:チョキ]","\n")
print("[1,2,3]の数字を入力","\n")

human_hand = gets.to_i
computer_hand = rand(3)+1


case human_hand#追加

  when 1,2,3 then#追加
     print("あなたの手",hand[human_hand-1],"\n")
     print("コンピュータの手",hand[computer_hand-1],"\n")

     a = computer_hand - human_hand

     case a
    
       when -1,2 then
          print("あなたの勝ちです","\n")
       when -2,1 then
          print("あなたな負けです","\n")
       else
          print("引き分けです","\n")
     end

  else#追加
     print("あなたの入力は無効です")
end #追加

今まで使っていた変数には値を1個しか入れていませんでしたが、配列には
複数の値を入れて使うことが可能です。
配列への値の入れ方。

配列名 = [値1、値2、値3]
配列に入れた値をとりだすには、
変数 =配列名[番号]
番号は0から始まります。
値1を取り出すには、
変数 =配列名[0]
になります。

さっそく使ってみます。
おみくじプログラムです。

omikuzi = ["大吉","中吉","小吉","吉","半吉","末吉","末小吉","凶","小凶","半凶","末凶","大凶"]

a = rand(12)

print("あなたの引いたくじは",omikuzi[a],"です","\n")

配列に入れた値を取り出すためにrand(12)で0から11の整数をつくり、値を取り出すための番号に
しています。

前回のプログラムでは実行結果の「あなたの手とコンピュータの手」のところに数字が表示されているだけでした。
少し分かりにくいので配列を使ってこのメッセージを変更します

STDOUT.sync = true

goo = 1
par = 2
choki = 3

hand = ["グー","パー","チョキ"] #追加

print("[1:グー、2:パー、3:チョキ]","\n")
print("[1,2,3]の数字を入力","\n")

human_hand = gets.to_i
computer_hand = rand(3)+1

print("あなたの手",hand[human_hand-1],"\n") #変更
print("コンピュータの手",hand[computer_hand-1],"\n")

配列「hand」には[“グー”,”パー”,”チョキ”]を入れています。配列の値をどりだすには「0,1,2」の数字が
必要になります。変数「human_handとcomputer_hand」には「1,2,3」のどれかの数字が入っているので、
hand[human_hand-1]、hand[computer_hand-1]のように「1」を引いています。

じゃんけんプログラムもほぼ完成。残る問題は、自分の手を入力する際に
「1,2,3」以外の番号や文字を入力した場合どうするかです。

条件分岐には「if文」の他に「case文」があります。
「if文」は条件の成立、不成立によって実行する処理を2つに分岐しますが、
「case文」は条件にする値によって、実行する処理を2つ以上に分岐します。

case 条件にする値

      when 値1 then
        実行する処理
      when 値2 then
        実行する処理
      when 値3 then
        実行する処理
      else
        一致する値が無い場合に実行する処理
end

では「case文」を使用して、
コンピューターにサイコロを振ってもらい出た目を表示してもらいましょう。

dice = rand(7)+1

case dice

   when 1 then
    print("1が出ました","\n")
   when 2 then
    print("2が出ました","\n")
   when 3 then
    print("3がでました","\n")
   when 4 then
    print("4がでました","\n")
   when 5 then
    print("5がでました","\n")
   when 6 then
    print("6がでました","\n")
   else
    print("サイコロには無い目がでました","\n")
end

値の部分には複数の値を書く事も出来ます。

dice = rand(6)+1

case dice

   when 1,3,5 then
    print("奇数が出ました","\n")
   when 2,4,6 then
    print("偶数が出ました","\n")
end

では「case文」を使用してじゃんけんプログラムを書き変えてみます。
「if文」の条件には「コンピュータの手 - 人間の手」を使用しました。
この時の値を見てみると勝利の時は「2、-1」。
負けの時は「-2、1」になっています。この2組の値を使用して書いてみます。

STDOUT.sync = true

goo = 1
par = 2
choki = 3

print("[1:グー、2:パー、3:チョキ]","\n")
print("[1,2,3]の数字を入力","\n")

human_hand = gets.to_i
computer_hand = rand(3)+1

print("あなたの手",human_hand,"\n")
print("コンピュータの手",computer_hand,"\n")

a = computer_hand - human_hand

case a
    
    when -1,2 then
       print("あなたの勝ちです","\n")
    when -2,1 then
       print("あなたな負けです","\n")
    else
       print("引き分けです","\n")
end

かなりシンプルになりました。

前回のプログラムでは「human_hand = rand(3)+1」でランダムに値を設定していました。
今回はこれをキーボードから設定できるように変更します。前回プログラムに下記のように、
変更してください。

STDOUT.sync = true #追加

goo = 1
par = 2
choki = 3

print("[1:グー、2:パー、3:チョキ]","\n") #追加
print("[1,2,3]の数字を入力","\n") #追加

human_hand = gets  #この部分を変更
computer_hand = rand(3)+1

最初の行にある「STDOUT.sync = true」はRDEで必要なだけで、通常はいりません。
さて、画面左下のコンソールに実行結果が表示されているとおもいますが、何か変です。

引き分け判定を実行
グー判定を実行
パー判定を実行
チョキ判定を実行

は表示されるのですが、何度実行しなおしても、
じゃんけんの結果である、「引き分け、You Win、You Lose」が表示されません。
これは「if文」の条件がどれも成立していないと思われます。
「gets命令」でキーボードから取得した値を「p命令」を使ってコンソールに表示してみます。

STDOUT.sync = true

goo = 1
par = 2
choki = 3

print("[1:グー、2:パー、3:チョキ]","\n")
print("[1,2,3]の数字を入力","\n")

human_hand = gets  
computer_hand = rand(3)+1
p(human_hand) #追加
p(computer_hand) #追加

試しにキーボードから3を入力します。
実行結果

[1:グー、2:パー、3:チョキ]
[1,2,3]の数字を入力
3 #この数字はRDEが表示しています。
"3\n" #この部分がキーボートから入力した値です
1 #ここはコンピューターがランダムに決めた値です。
引き分け判定を実行
グー判定を実行
パー判定を実行
チョキ判定を実行
Complete(0)

この結果を見てみると、「human_hand」には「”3\n”」が代入され、「computer_hand」には「1」が代入されています。
「”3\n”」は「ダブルクォートで囲まれた文字」、「1」は整数。文字と整数を比較していたことになります。
「human_hand」に「”3\n”」(文字)が代入されている状態で条件が成立する「if文」がなかったので、ブログラムが予想した
通りに動かなかったようです。
「gets」と「p」はこちら
rubyには文字を整数に変換する命令があるので、それを使用します。

STDOUT.sync = true

goo = 1
par = 2
choki = 3

print("[1:グー、2:パー、3:チョキ]","\n")
print("[1,2,3]の数字を入力","\n")

human_hand = gets.to_i  #この部分を変更
computer_hand = rand(3)+1
p(human_hand)
p(computer_hand)

これで実行結果が正しく表示されます。
「to_i」についてはこちら

前回のプログラムでは勝敗判定が決定したあとも、それ以降のプログラムが実行されています。
確認するために、前回のプログラムを変更します。
「#」以降の行はコメントとしてRubyは実行しません。

goo = 1
par = 2
choki = 3

human_hand = rand(3)+1 #この部分を変更
computer_hand = rand(3)+1

print("引き分け判定を実行","\n") #追加
if computer_hand == human_hand then
  print("引き分け","\n")
  #exit #追加
end

print("グー判定を実行","\n") #追加
if human_hand == goo then
  if (computer_hand - goo) == 2 then
    print("You Win","\n")
    #exit #追加
  end

  if (computer_hand - goo) == 1 then
    print("You Lose","\n")
    #exit #追加
  end
end

print("パー判定を実行","\n") #追加
if human_hand == par then
  if (computer_hand - par) == -1 then
    print("You Win","\n")
    #exit #追加
  end

  if (computer_hand - par) == 1 then
    print("You Lose","\n")
    #exit #追加
  end
end

print("チョキ判定を実行","\n") #追加
if human_hand == choki then
  if (computer_hand - choki) == -1 then
    print("You Win","\n")
    #exit #追加
  end

  if (computer_hand - choki) == -2 then
    print("You Lose","\n")
    #exit #追加
  end
end

プログラムを実行するとcomputer_handとhuman_handの手が同じで引き分けの判定が表示された後も、
「グー、パー、チョキ判定を実行」という文がすべて表示されると思います。
たとえば「引き分け」の勝敗が決まった後にも、それ以降のプログラムが実行され、
「グー、パー、チョキ判定」をする「if文」が実行されています。「引き分け」で勝敗が決まっているので、
それ以降のプログラム実行は無駄です。
追加した「#exit」の「#」をすべて削除します。これで
「引き分け」の勝敗が決まった後、「グー、パー、チョキ判定を実行」というメッセージは表示されなくなります。
「exit」を実行した段階でプログラムが終了し、それ以降のコードは実行されなくなりました。

「exit」についてはこちらを参照

2024年3月
« 4月    
 12
3456789
10111213141516
17181920212223
24252627282930
31  

カテゴリー

広告

現在の住まい、将来はVPSへ引越します。 ロリポップの上位版です。

広告

広告

最近のコメント

    広告

    Railsを動かす予定のVPS。無料キャンペーン中。

    広告