第6回 基礎プログラミング II レポート課題 氏名:佐藤 裕康 学籍番号:c1090911 語学クラス:英語1 コース(系):政策マネジメント 1.A alphabet = ["a","b",...,"z"] となった場合のalphabet[18]およびalphabet[40]なので、 alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] となる。 alphabet[18]は、配列は0から始まるので"s"となる。 alphabet[40]は、アルファベットが26までしかないので、存在しないことになる。 2.A a.考えた設定 配列を取り込んで、平均を計算するプログラムを作りました。 b.作成したプログラム #!/usr/koeki/bin/ruby def average(score) sum = 0.0 for gus in score sum += gus end sum / score.length end points = Array.new i=0 while true STDERR.print "燃費を入力して下さい: " line = gets if line == nil break end points << line.to_i # points[i] = line.to_i p points # i += 1 end printf("\n 平均燃費は %3.1f です\n", average(points)) if average(points) >= 12 print("すばらしい燃費です\n") elsif average(points) <= 11 && average(points) >= 9 print("こんなもんでしょう\n") else average(points) print("ちょっとやばいかも?\n") end c.元にしたプログラムからの変更点 数値によって変化するコメント文を追加してみました。 それについて、数値が9以上11以下などの設定を工夫してみました。 d.プログラムを実行した結果画面 pan{c109091}% ./def_statistic.rb [~/Ruby] 燃費を入力して下さい: 10 [10] 燃費を入力して下さい: 11 [10, 11] 燃費を入力して下さい: 12 [10, 11, 12] 燃費を入力して下さい: ^D 平均燃費は 11.0 です こんなもんでしょう pan{c109091}% [~/Ruby] 他のパターンでは pan{c109091}% ./def_statistic.rb [~/Ruby] 燃費を入力して下さい: 9 [9] 燃費を入力して下さい: 8 [9, 8] 燃費を入力して下さい: 8 [9, 8, 8] 燃費を入力して下さい: ^D 平均燃費は 8.3 です ちょっとやばいかも? pan{c109091}% [~/Ruby] こういったものもあります。 e.導き出された結果の考察 きちんと動いていて、コメント文もその通りなので、このプログラムは正しいと 言える。 B. a.考えた設定 選択肢によって結果が変化するるびおっち的ゲームを作りました。 内容は、プレイヤーが敵と戦ってその結果を現す、というものになっています。 b.作成したプログラム #!/usr/koeki/bin/ruby def message(name) STDERR.print("[1]槍\n") STDERR.print("[2]砲撃\n") STDERR.print("[3]ガード\n") end def enedama(time,guard) x = 4 * time - guard printf("%dターン目\n",time) printf("自分へのダメージ %d\n", x) x end STDERR.printf("名前を入力して下さい") name = gets.chomp if name == "" name = "22B" end printf("%sという名前ですね。 \n",name) sleep 1 print("さっそくですが敵が現れました。\n") sleep 1 printf("%sさん頑張りましょう\n\n", name) print("行動を選んでください\n") dama = 1 enemy = 1 time = 0 while true printf("%dターン目\n", time) message(name) ans = gets.chomp.to_i message(name) dama += ans * time enemy += enedama(time,ans) if dama > 4 break end if enemy > 6 break end if time == 3 break end time +=1 print("---------------------------------------\n") end printf("%sは", name) if enemy > 9 print("敵を倒しました\n") elsif enemy <= 5 print("敵を倒し切れませんでした\n") else print("負けました\n") end print("終わり\n") c.元にしたプログラムからの変更点 スリープをいれたことと、線を入れて区切ることにより、見やすいようにしまし た。 他は、ダメージなどの数字を少し改良して、敵をぎりぎり倒せるくらいにしてみ た。 d.プログラムを実行した結果画面 まずは全部1を選んだ場合 pan{c109091}% ./def_rollplaying_a.rb [~/Ruby] 名前を入力して下さい 22Bという名前ですね。 さっそくですが敵が現れました。 22Bさん頑張りましょう 行動を選んでください 0ターン目 [1]槍 [2]砲撃 [3]ガード 1 [1]槍 [2]砲撃 [3]ガード 0ターン目 自分へのダメージ -1 --------------------------------------- 1ターン目 [1]槍 [2]砲撃 [3]ガード 1 [1]槍 [2]砲撃 [3]ガード 1ターン目 自分へのダメージ 3 --------------------------------------- 2ターン目 [1]槍 [2]砲撃 [3]ガード 1 [1]槍 [2]砲撃 [3]ガード 2ターン目 自分へのダメージ 7 22Bは敵を倒しました 終わり pan{c109091}% [~/Ruby] 全部2の場合 pan{c109091}% ./def_rollplaying_a.rb [~/Ruby] 名前を入力して下さい 22Bという名前ですね。 さっそくですが敵が現れました。 22Bさん頑張りましょう 行動を選んでください 0ターン目 [1]槍 [2]砲撃 [3]ガード 2 [1]槍 [2]砲撃 [3]ガード 0ターン目 自分へのダメージ -2 --------------------------------------- 1ターン目 [1]槍 [2]砲撃 [3]ガード 2 [1]槍 [2]砲撃 [3]ガード 1ターン目 自分へのダメージ 2 --------------------------------------- 2ターン目 [1]槍 [2]砲撃 [3]ガード 2 [1]槍 [2]砲撃 [3]ガード 2ターン目 自分へのダメージ 6 22Bは負けました 終わり pan{c109091}% [~/Ruby] 全部3の場合 pan{c109091}% ./def_rollplaying_a.rb [~/Ruby] 名前を入力して下さい 22Bという名前ですね。 さっそくですが敵が現れました。 22Bさん頑張りましょう 行動を選んでください 0ターン目 [1]槍 [2]砲撃 [3]ガード 3 [1]槍 [2]砲撃 [3]ガード 0ターン目 自分へのダメージ -3 --------------------------------------- 1ターン目 [1]槍 [2]砲撃 [3]ガード 3 [1]槍 [2]砲撃 [3]ガード 1ターン目 自分へのダメージ 1 --------------------------------------- 2ターン目 [1]槍 [2]砲撃 [3]ガード 3 [1]槍 [2]砲撃 [3]ガード 2ターン目 自分へのダメージ 5 22Bは敵を倒し切れませんでした 終わり pan{c109091}% [~/Ruby] ランダムの場合 pan{c109091}% ./def_rollplaying_a.rb [~/Ruby] 名前を入力して下さい 22Bという名前ですね。 さっそくですが敵が現れました。 22Bさん頑張りましょう 行動を選んでください 0ターン目 [1]槍 [2]砲撃 [3]ガード 1 [1]槍 [2]砲撃 [3]ガード 0ターン目 自分へのダメージ -1 --------------------------------------- 1ターン目 [1]槍 [2]砲撃 [3]ガード 2 [1]槍 [2]砲撃 [3]ガード 1ターン目 自分へのダメージ 2 --------------------------------------- 2ターン目 [1]槍 [2]砲撃 [3]ガード 3 [1]槍 [2]砲撃 [3]ガード 2ターン目 自分へのダメージ 5 22Bは負けました 終わり pan{c109091}% [~/Ruby] e.導き出された結果の考察 何回かやってみた結果、1を多く選んだ方がエンディングがよくなる傾向にある と思いました。そして、全体的に負ける可能性が高いようでした。 そして、ダメージの計算式をbc -lで確認してみました。 全部1を選んだ場合 pan{c109091}% bc -l [~/Ruby] 4*0-1 -1 4*1-1 3 4*2-1 7 となっていたので正しいと言える 全部2の場合 pan{c109091}% bc -l [~/Ruby] 4*0-2 -2 4*1-2 2 4*2-2 6 となったのでこちらもあっている。 全部3の場合は pan{c109091}% bc -l [~/Ruby] 4*0-3 -3 4*1-3 1 4*2-3 5 となっていたのであっていたので、このプログラムは正しいと言える。 f.参考文献 http://roy/~madoka/2010/r2/06/06_11_theme_09_rubiocci.html るびおっち http://roy/~madoka/2010/r2/06/06_10_theme_08_while.html 「while 文で入力するとき」 3.感想 methodの考え方を使ってできそうなことは、「ドラゴンクエスト」の戦闘シーンみたいな シミュレーションや、育成ゲームの「たまごっち」とか「デジモン」とかもでき るんじゃないかと思いました。 今回は、プログラムA問題も自分なりに工夫することができたし、B問題にも進む ことができたので、良かったと思います。 今回のB問題のようなるびおっち的プログラムはゲームを制作しているみたいで 楽しかったです。メールをまとめていて気付きましたが、もう少しエンディング のバリエーションを増やせばよかったと思いました。 この反省を次回に活かして、次回も頑張りたいと思いました。 4.参考文献など 共同学習者 池田 博哉 遠藤 孝之