for 変数 in 値 do
実行する処理
end
値の部分には配列などを指定できます。
例えば「a = [1,2,3,4,5]」という配列「a」を値にすると、
まず「1」をとりだして変数にいれて、処理を実行します。
次に「2」を取り出して変数にいれ処理を実行。
あとは「5」を取り出すまで繰り返しです。
前回の「while」文を使用したプログラムを「for」文で書き換えます。
a = [1,2,3] #くじを引く回数
for x in a do
kuzi = rand(10)
if kuzi == 7 then
print("7が出ました。当たりです。","\n")
else
print("はずれ。もう一度チャレンジして下さい。","\n")
end
end
ちなみに配列「a」の部分は「1..3」という書き方もできます。
次回は「while」文と「for」文を使用してシーザー暗号を作ってみます。
条件が成立している間、同じ処理を繰り返し行う場合に使います。
while 条件 do
実行する処理
end
簡単なプログラムを作ります。
num = 3 #くじを引く回数
i = 1
while i <= num do #iがnumに入れた値になるまで繰り返します
kuzi = rand(10) #数字が小さいと当たりが出やすい
if kuzi == 7 then
print("7が出ました。当たりです。","\n")
else
print("はずれ。もう一度チャレンジして下さい。","\n")
end
i += 1
end
「while文」での注意。10行目にある「i += 1」を削除して実行すると、条件部分にある
「i」の値が1のままで条件がずっと成立した状態になります。
試しに「i += 1」を削除して実行してください。あなたのパソコンは暴走すると思います。
これを止めるにはRDEのメニュー「実行(R)」-「停止(W)」を押せば止まります。
では早速じゃんけんプログラムを変更します。
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」以外の番号や文字を入力した場合どうするかです。
最近のコメント