» 2010 » 10月 » 12のブログ記事

今まで使っていた変数には値を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」についてはこちら

2010年10月
    11月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

カテゴリー

広告

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

広告

広告

最近のコメント

    広告

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

    広告