Subject: 05-02 supermatch.rb To: ruby-05-02@e.koeki-u.ac.jp Date: Mon, 05 May 2008 14:40:37 +0900 (JST) X-Mailer: Mew version 4.2 on Emacs 21.3.50 / Mule 5.0 (SAKAKI) 氏名: (M) 学籍番号: C107189 クラス: D 選択した番号: 2番 1.どういうプログラムを作るか 今回は2番の「コンピュータ先手でコンピュータ必勝にする」プログラムを作成 した。 2.作成したプログラム #!/usr/koeki/bin/ruby match = 20 print "1〜3本の範囲でマッチ棒を取ります。最後の1本を取った方の負け!\n" printf("わたしの番: マッチ棒が%d本あります\n",match) saisho = 3.to_i printf("わたしは%d本取りました。\n",saisho) match -= saisho while match > 0 printf("あなたの番: マッチ棒が%d本あります\n", match) print "何本取りますか?(1〜3): " toru = gets.chomp.to_i if toru < 1 || toru > 3 then print "1〜3の範囲で取って下さい.\n" redo end match -= toru if match < 1 then print "最後の1本を取りました。あなたの負けです! や〜い\n" break end printf("わたしの番: マッチ棒が%d本あります\n", match) com_toru = 3-toru+1 printf("私は%d本取りました。\n", com_toru) match -= com_toru if match < 1 then print "最後の1本を取りました。わたしの負けです! くやち〜〜!!\n" break end end 3.プログラムを動かした結果 1〜3本の範囲でマッチ棒を取ります。最後の1本を取った方の負け! わたしの番: マッチ棒が20本あります わたしは3本取りました。 あなたの番: マッチ棒が17本あります 何本取りますか?(1〜3): 1 わたしの番: マッチ棒が16本あります 私は3本取りました。 あなたの番: マッチ棒が13本あります 何本取りますか?(1〜3): 2 わたしの番: マッチ棒が11本あります 私は2本取りました。 あなたの番: マッチ棒が9本あります 何本取りますか?(1〜3): 3 わたしの番: マッチ棒が6本あります 私は1本取りました。 あなたの番: マッチ棒が5本あります 何本取りますか?(1〜3): 1 わたしの番: マッチ棒が4本あります 私は3本取りました。 あなたの番: マッチ棒が1本あります 何本取りますか?(1〜3): 1 最後の1本を取りました。あなたの負けです! や〜い 4.プログラムの説明 コンピュータ先手でコンピュータ必勝にするため、 ゲーム開始時のマッチ棒の本数を「4の倍数+1+A」とし、 A:コンピュータが最初に選択する数とした。 そこで、A = 3 とし、 16+1+3=20 とおき、最初の数を20と決定した。 次に、コンピュータが先手で、A本とらせるため、 printf("わたしの番: マッチ棒が%d本あります\n",match) saisho = 3.to_i printf("わたしは%d本取りました。\n",saisho) match -= saisho とした。 A を saisho と置き換え、 .to_i をつけることで 3 を数量化した。 また、 match -= saisho は、 saisho すなわち 3 を match から引くことを意 味する。 後は、printf("あなたの番: マッチ棒が%d本あります\n", match) print "何本取りますか?(1〜3): " toru = gets.chomp.to_i if toru < 1 || toru > 3 then print "1〜3の範囲で取って下さい.\n" redo とあるように、1〜3本の間で選択させ、それに対応して printf("わたしの番: マッチ棒が%d本あります\n", match) com_toru = 3-toru+1 printf("私は%d本取りました。\n", com_toru) match -= com_toru に示すように、 3-toru+1 を計算し、最後の1本を取らせ、コンピュータが必勝 するようなプログラムになっている。 5.考察 コンピュータが先手とする場合、コンピュータが最初に取る数を決める必要があ ると考えた。 そして、それを最初に述べて、その後はプレイヤーに合わせて取る数を計算して いけば良いと思い、 printf("わたしの番: マッチ棒が%d本あります\n",match) saisho = 3.to_i printf("わたしは%d本取りました。\n",saisho) match -= saisho を組み込んだ。 6.参考文献 http://roy/~yuuji/2008/pf1/04/match.html http://roy/~yuuji/2008/pf1/04/typeconv.html (東北公益文科大学 学生専用サーバ 広瀬先生のページを参考にさせていただき ました。) 7.感想 今回はスラスラと作成できず、2日費やした。 実は、最初は5番を作成していたが、いくら実行してもエラーが出てしまい、プ ログラムを完成できなかった。 もしよろしければ、こちらにのせておくので、お時間のあるときでよろしいので、 見ていただけないでしょうか。 #!/usr/koeki/bin/ruby match = 25 print"1回にとれるマッチ棒の上限を3〜5本の間で選択して下さい:" erabu = gets.chomp.to_i case erabu when erabu = 3 print "1〜3本の範囲でマッチ棒を取ります。最後の1本を取った方の負け!\n" while match > 0 printf("あなたの番: マッチ棒が%d本あります\n", match) print "何本取りますか?(1〜3): " toru = gets.chomp.to_i if toru < 1 || toru > 3 then print "1〜3の範囲で取って下さい.\n" redo end match -= toru if match < 1 then print "最後の1本を取りました。あなたの負けです! や〜い\n" break end printf("わたしの番: マッチ棒が%d本あります\n", match) com_toru = 3-toru+1 printf("私は%d本取りました。\n", com_toru) match -= com_toru if match < 1 then print "最後の1本を取りました。わたしの負けです! くやち〜〜!!\n" break end end when erabu = "4" print "1〜4本の範囲でマッチ棒を取ります。最後の1本を取った方の負け!\n" while match > 0 printf("あなたの番: マッチ棒が%d本あります\n", match) print "何本取りますか?(1〜4): " toru = gets.chomp.to_i if toru < 1 || toru > 4 then print "1〜4の範囲で取って下さい.\n" redo end match -= toru if match < 1 then print "最後の1本を取りました。あなたの負けです! や〜い\n" break end printf("わたしの番: マッチ棒が%d本あります\n", match) com_toru = 4-toru+1 printf("私は%d本取りました。\n", com_toru) match -= com_toru if match < 1 then print "最後の1本を取りました。わたしの負けです! くやち〜〜!!\n" break end end when erabu = "5" print "1〜5本の範囲でマッチ棒を取ります。最後の1本を取った方の負け!\n" while match > 0 printf("あなたの番: マッチ棒が%d本あります\n", match) print "何本取りますか?(1〜5): " toru = gets.chomp.to_i if toru < 1 || toru > 5 then print "1〜5の範囲で取って下さい.\n" redo end match -= toru if match < 1 then print "最後の1本を取りました。あなたの負けです! や〜い\n" break end printf("わたしの番: マッチ棒が%d本あります\n", match) com_toru = 5-toru+1 printf("私は%d本取りました。\n", com_toru) match -= com_toru if match < 1 then print "最後の1本を取りました。わたしの負けです! くやち〜〜!!\n" break end end else erabu < 3 || erabu > 5 then print "3〜5の範囲で選択して下さい。\n" end アドバイスいただければ幸いです。 よろしくお願いします。