第6回 基礎プログラミング II レポート課題 氏名:川島哲 学籍番号:c1090489 語学クラス:英語3 コース(系):政策マネ 1. alphabet = ["a","b",...,"z"] これを全て書きだすと 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]は"a"から数えて18番目すなわち"r"のことを指す しかしアルファベットは26文字しかないのでalphabet[40]は存在しない 従って alphabet[18]=r alphabet[40]=0 プログラムA a. RPGにおける4人パーティのレベルの平均を調べるプログラム b.プログラム名:def_statistic.rb #!/usr/koeki/bin/ruby i =0 #人数カウントの変数 gan =0 #レベルの合計をしまう変数 def ava(rx,vc,ms) rx += vc ava = rx / ms #合計レベル/人数 end while true i +=1 STDERR.printf("%d人目のキャラクターのレベルは?:",i) lv = gets.chomp.to_i #入力したレベルをしまう変数 gan += lv.to_i if i== 4 #4人パーティが一般的なので4人で終了 break end end printf("平均レベルは%3.1fレベルです。\n",ava(gan,lv,i)) #printf("%d =%d / %d",ava(gan,lv,i),gan,i) #デバッグ用 c. 講義中にDLしたプログラムdef_ary_movie.rbをもとに人数のカウントを部分を追 加/改変し作成した。 d.実行結果 pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:5 2人目のキャラクターのレベルは?:5 3人目のキャラクターのレベルは?:5 4人目のキャラクターのレベルは?:5 平均レベルは6.0レベルです。 e.考察 実行から分かる通り見るからに数値が間違っていた。 なのでどこに原因があるかを確かめてみる 以下デバッグ文解除 pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:3 2人目のキャラクターのレベルは?:3 3人目のキャラクターのレベルは?:3 4人目のキャラクターのレベルは?:3 平均レベルは3.0レベルです。 3 =12 / 4% pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:4 2人目のキャラクターのレベルは?:4 3人目のキャラクターのレベルは?:4 4人目のキャラクターのレベルは?:4 平均レベルは5.0レベルです。 5 =16 / 4% pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:4 2人目のキャラクターのレベルは?:4 3人目のキャラクターのレベルは?:4 4人目のキャラクターのレベルは?:4 平均レベルは5.0レベルです。 5 =16 / 4% pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:5 2人目のキャラクターのレベルは?:5 3人目のキャラクターのレベルは?:5 4人目のキャラクターのレベルは?:5 平均レベルは6.0レベルです。 6 =20 / 4% pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:6 2人目のキャラクターのレベルは?:6 3人目のキャラクターのレベルは?:6 4人目のキャラクターのレベルは?:6 平均レベルは7.0レベルです。 7 =24 / 4% 5以上になるとなぜか+1された状態で結果が表示される。 次に配列を見直し要因ではないかと思う部分を見たところ6行目の rx +=vcの部 分が関っているのではないかと考え#で消してみる pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:3 2人目のキャラクターのレベルは?:3 3人目のキャラクターのレベルは?:3 4人目のキャラクターのレベルは?:3 平均レベルは3.0レベルです。 合計12 3 =12 / 4% pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:6 2人目のキャラクターのレベルは?:6 3人目のキャラクターのレベルは?:6 4人目のキャラクターのレベルは?:6 平均レベルは6.0レベルです。 合計24 6 =24 / 4% pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:7 2人目のキャラクターのレベルは?:7 3人目のキャラクターのレベルは?:7 4人目のキャラクターのレベルは?:7 平均レベルは7.0レベルです。 合計28 7 =28 / 4% 上手く行くようになったしかしなぜ数が増えるのかは結局理解出来なかった。 次に適当な数で平均を出す。 pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:5 2人目のキャラクターのレベルは?:8 3人目のキャラクターのレベルは?:6 4人目のキャラクターのレベルは?:4 平均レベルは5.0レベルです。 これをbc-lで計算する (5+8+6+4)/4 5.75000000000000000000 5.75では疑問が残るのでプログラムの結果文から小数第3位まで表示するように 変更する。 pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:5 2人目のキャラクターのレベルは?:8 3人目のキャラクターのレベルは?:6 4人目のキャラクターのレベルは?:4 平均レベルは5.000レベルです。 計算結果と全く違うものになった。どこがおかしいかテキストをめくったところ 数値をしまう変数が全てiになっていたのでfにしてみた。 pan{c109048}% ./def_statistic.rb [~/Ruby] 1人目のキャラクターのレベルは?:5 2人目のキャラクターのレベルは?:8 3人目のキャラクターのレベルは?:6 4人目のキャラクターのレベルは?:4 平均レベルは5.750レベルです。 これでやっと計算が正しいといえるようになった。 プログラム名(改):def_statistic.rb #!/usr/koeki/bin/ruby i =0 #人数カウントの変数 gan =0 #レベルの合計をしまう変数 def ava(rx,vc,ms) #rx += vc ava = rx / ms #合計レベル/人数 end while true i +=1 STDERR.printf("%d人目のキャラクターのレベルは?:",i) lv = gets.chomp.to_f #入力したレベルをしまう変数 gan += lv.to_f if i== 4 #4人パーティが一般的なので4人で終了 break end end printf("平均レベルは%3.3fレベルです。\n",ava(gan,lv,i)) #printf("合計%d\n",gan) #printf("%d =%d / %d",ava(gan,lv,i),gan,i) #デバッグ用 参考) Rubyプログラミング講座 技術評論社 /広瀬雄二 P39,50 プログラム 西村まどか http://roy/~madoka/2010/r2/prog/def_ary_movie.rb プログラム問題B(未完成) a. 怪獣を拾って育成、結果によってそれぞれ異なった"バッドエンド"を迎えるゲー ムを作成 b.プログラム名:def___rollplaying_a.rb #!/usr/koeki/bin/ruby def fla(re) #怪獣の安定度を示すゲージ◯で表す re.times do print("◯\t") end print("\n") sleep(0.5) end def message(name) #コマンド文 STDERR.printf("%sはどうする?: \n", name) STDERR.print("[1]\t肉を与える\n") STDERR.print("[2]\t色々壊す\n") STDERR.print("[3]\t薬物注入\n") end def atk(hi,round) #日付と攻撃力について記すmethod b = 2 * hi - round * 2 printf("%d日目\n",hi) printf("攻撃力上昇効果:%d\n", b) end print("怪獣を拾った。\n") STDERR.printf("怪獣に名前を付けよう!:") name = gets.chomp if name == "" #無記だった場合のデフォルトネーム name = "ああああ" elsif name=="捨てる" #捨てた場合の展開 print("怪獣なんて居なかった…あれは幻だったんだ。") exit end printf("%sと命名する\n",name) mei = 1 fight = 1 #攻撃力 day = 0 #経過日数 live = 0 #安定度 print("円形(◯)は怪獣の安定性を表す。\n") while true fla(mei) message(name) ans = gets.chomp!.to_i #コマンドをしまうmethod #printf("%d,%d",day,ans) #デバッグ用print live += day * ans #安定度を算出 printf("安定性:%d\n", live) fight += atk(day,ans) #攻撃力概算 printf("攻撃力:%d\n", fight) if live > 6 break end if fight > 8 break end day += 1 end fla(fight) printf("%sは", name) if fight > 8 #攻撃力8以上だった場合 print("立派に育った、育ちすぎた。\n") sleep(2) printf("巨大化した%sは町を壊し進んでいく。\n",name) sleep(2) print("私はただその姿を眺めることしか出来なかった…\n") elsif fight <= 5 #攻撃力5以下だった場合 printf("温厚な性格になった。%sはいつのまにか家族のようになっていた。\n",name) sleep(2) printf("ある朝目覚めると%sは居なくなっていた。\n",name) sleep(2) printf("いやいなくなったのではない、私が%sの中に入っていたのだ。\n",name) sleep(2) print("あの生物は自分を育てさせ恩人を食す生き物だったのだ\n") sleep(3) print("こんなことになるなら拾うべきではなかった!\n") else print("石になった。動かない、鳴かない。\n") sleep(1) print("私は直すための方法を考えた。育てた日々を否定されたくなかったからだ。\n") sleep(1) print("10年…20年…経ち30年が過ぎようとしていた頃…\n") sleep(1) printf("%sは動いた…崩れ落ちただの石と化した。\n",name) end print("-------GAME OVER-------") c. 講義中の「るびおっち」を参考にEDをテキスト&sleepで次々でる方式に変更 d. pan{c109048}% ./def___rollplaying_a.rb [~/Ruby] 怪獣を拾った。 怪獣に名前を付けよう!:sa saと命名する 円形(◯)は怪獣の安定性を表す。 ◯ saはどうする?: [1] 肉を与える [2] 色々壊す [3] 薬物注入 1 安定性:0 0日目 攻撃力上昇効果:-2 ./def___rollplaying_a.rb:53:in `+': nil can't be coerced into Fixnum (TypeError) from ./def___rollplaying_a.rb:53 (捨てた場合) pan{c109048}% ./def___rollplaying_a.rb [~/Ruby] 怪獣を拾った。 怪獣に名前を付けよう!:捨てる 怪獣なんて居なかった…あれは幻だったんだ。 e. 実行が上手くいかないのでデバッグ用のプログラムを作ってみた。 プログラム名:dammypg.rb #!/usr/koeki/bin/ruby def fla(re) re.times do print("◯\t") end print("\n") sleep(0.5) end def message(name) STDERR.printf("%sはどうする?: \n", name) STDERR.print("[1]\t肉を与える\n") STDERR.print("[2]\t色々壊す\n") STDERR.print("[3]\t薬物注入\n") end def atk(hi,round) b = 4 * hi - round * 2 printf("%d日目\n",hi) printf("攻撃力上昇効果:%d\n", b) end mei = 1 fight = 1 day = 0 live = 0 STDERR.print("name:") name = gets.chomp.to_i STDERR.print("tesuto:") ans = gets.chomp.to_i while true fla(mei) message(name) answer = gets.chomp.to_i live += day * answer printf("安定性:%d\n", live) fight += atk(day,answer) printf("攻撃力:%d\n", fight) if live > 6 break end if fight > 8 break end #mon(ans) day += 1 end dammypgは不要なprint文を削除したプログラムである。 e-2. pan{c109048}% ./dammypg.rb [~/Ruby] name:2 tesuto:2 ◯ 2はどうする?: [1] 肉を与える [2] 色々壊す [3] 薬物注入 2 安定性:2 0日目 攻撃力上昇効果:-4 ./dammypg.rb:40:in `+': nil can't be coerced into Fixnum (TypeError) from ./dammypg.rb:40 該当する行は > fight += atk(day,answer) "+"がおかしいと出てる 試しに +=より右を変数ではなく適当な数字に変更したところ問題なく動いた、人に聞いたり してみたが、なぜ他のプログラムに出来ていざ変数を別の変数に+するかたちで 作ると動かずとまってしまうのか結局分からなかった。 参考) プログラム(るびおっち) /西村まどか http://roy/~madoka/2010/r2/prog/def_rubiocci.rb 感想) なんらかの店にいってたまたま「20%OFF」等割り引きが書いてあった場合に割り 引き後の値段を計算する。 共同学習者 金田 麻美 笹原 千珠子 遠藤太朗