Subject: #04 supermatch.rb From: SATO Yukari To: ruby-05-12@e.koeki-u.ac.jp Date: Fri, 14 May 2010 20:06:18 +0900 (JST) X-Mailer: Mew version 4.2 on Emacs 23.1 / Mule 6.0 (HANACHIRUSATO) 氏名: SY 学籍番号:c1090934 クラス:英語 4 選択した番号: 3番 1.3番を選択した。 最初の本数を自由に選べるようにした。指定した範囲内のすべての数字(本数)を入 力しても、コンピュータが必ず勝つようにする。 そのためには、コンピュータが必ず勝てる数に調整してから、ゲームを開始する仕 組みを作らなければいけない。 2. #!/usr/koeki/bin/ruby print "1回につき1〜3本の範囲で好きな本数分マッチ棒を取っていくよ。\n" print "最後の1本を取った方が負けになるよ!\n" print "マッチ棒の数を5〜20本の中から選んでね。:" match = gets.chomp.to_i if match < 5 || match > 20 then print "5〜20本の中から選んで入力してね。\n" redo end if match %4 == 1 then elsif match %4 == 2 match -=1 print "先に私が1本取ります。\n" elsif match %4 == 3 match -=2 print "先に私が2本取ります。\n" elsif match %4 == 0 match -=3 print "先に私が3本取ります。\n" end 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" print "またチャレンジしてね。\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回につき1〜3本の範囲で好きな本数分マッチ棒を取っていくよ。 最後の1本を取った方が負けになるよ! マッチ棒の数を5〜20本の中から選んでね。:20 先に私が3本取ります。 あなたの番: マッチ棒が17本あります 何本取りますか?(1〜3): 3 わたしの番: マッチ棒が14本あります 私は1本取りました。 あなたの番: マッチ棒が13本あります 何本取りますか?(1〜3): 2 わたしの番: マッチ棒が11本あります 私は2本取りました。 あなたの番: マッチ棒が9本あります 何本取りますか?(1〜3): 1 わたしの番: マッチ棒が8本あります 私は3本取りました。 あなたの番: マッチ棒が5本あります 何本取りますか?(1〜3): 3 わたしの番: マッチ棒が2本あります 私は1本取りました。 あなたの番: マッチ棒が1本あります 何本取りますか?(1〜3): 1 最後の1本を取りました。あなたの負けです! 残念でしたー。 またチャレンジしてね。 4.説明 ◯マッチの数を指定した範囲内で自由に選べるようにした。 ◯マッチの数を指定していないので、match = gets.chomp.to_i とした。 ・gets 指定された場所から文字列を読み込んでその値を返すことを表す。 ・chomp 文字列の末尾が改行文字('\n')である場合にそれを切り取ることを 表す。 ・to_i 文字列を整数に変換した値を表す。 ◯マッチの数を5〜20本の間にしたので、 if toru < 1 || toru > 3 then を参考にして、 if match < 5 || match > 20 then と表した。 これは、【もし、5より小さい数または20より大きい数を入力してしまった場合】 のことも考えて作ってある。 ◯コンピュータが先にマッチを取り、勝つことができる数に調整できるようにす るために 【if〜then〜elsif〜else〜end】の制御構造を利用した。 コンピュータが勝つには、この場合、4の倍数+1の数の時だけである。 この数以外の場合も勝たなくてはいけない。 4で割った時 ・余りが1の数→もともとコンピュータが勝つことができる数 ・余りが2の数→選んだ数から1を引く (マッチを1本取る) ・余りが3の数→選んだ数から2を引く (マッチを2本取る) ・余りが0の数→選んだ数から3を引く (マッチを3本取る) よって、相手にバレズにもともとコンピュータが勝つことができる数に設定で きる。 ◯ % は、余りの計算をするときに使う。 ◯ \n は、改行文字で文字列の末尾に必ず入る。 ◯ == は、「左辺と右辺が等しいか」という意味である。 ◯ %d は、,(カンマ)の後ろの文字列に置き換えることを表す。 ◯ redo 最初に戻る、ふりだしに戻るを表す。 5.考察 ◯ ( 取ることのできる最大の値 + 1 )の倍数に +1をした数にコンピュータは勝 つことができる。 ◯どんな数でもコンピュータが勝てるようにするには、 【if〜then〜elsif〜 else〜end】 の制御構造を利用して、コンピュータが勝つ ことのできる 4の倍数+1の数になるように、コンピュータが先にマッチを取れ るようにして、数を調整しなければいけない。 6.参考文献 Rubyプログラミング基礎講座 広瀬雄二 著 出版社:技術評論社 7.感想 とても難しかった。授業4回目で課題のレベルが高いと感じ、今後の授業につい ていくことができるのか不安になった。考えてプログラムを作成しなければいけ ないので大変だった。次回の授業と課題も頑張りたい。