第9回 Rubyであそぼ / 広告ページの作成 レポート課題 氏名:佐藤智久 学籍番号:C1110803 語学クラス:英語2 コース:地域共創コース 1.筆記問題 A. a. 0x32 + 0x24 = 0x?? この問題は16進数同士を足した場合の数を求めている。 16進数の1桁どうしの足し算なので、このまま計算しても答えは出るが以降 の問題も考慮し、10進数に変換してから計算する。 3*16**1 = 48 2*16**0 = 2 48 + 2 = 50 0x32 = 0d50 2*16**1 = 32 4*16**0 = 4 32 + 4 = 36 0x24 = 0d36 この2つを足した合計を16進数に変換した値が答えとなる。 50 + 36 = 86 86 / 16 = 5 86 % 16 = 6 よって 56 が16進数に変換された答えとなり、 答えは 0x56 となる。 b.0x15 + 0x2d = 0x?? これもa同様、10進数に変換して計算する。 1*16**1 = 16 5*16**0 = 5 16 + 5 = 21 今回は0x2「d」となっているので、この部分が16進数表記でいうどれに当た るかを調べる。 d = 13 なので、 2*16**1 = 32 13*16**0= 13 32 + 13 = 45 これらを足して、 21 + 45 = 66 66を16進数に変換し直すと、 66 / 16 = 4 66 % 16 = 2 よって 42 が16進数に変換したときの値となり、 0x42がこの問題の答えとなる。 c.0xed - 0x12 = 0x?? 今回は16進数同士の引き算だが、方法は足算のときとあまり変わらない。 まずは同じように10進数に変換する。 e = 14 d = 13 14*16**1 = 224 13*16**0 = 13 224 + 13 = 237 1*16**1 = 16 2*16**0 = 2 16 + 2 = 18 この2つを引くと、 237 - 18 = 219 この値を16進数に直す。 219 / 16 = 13 219 % 16 = 11 16進数では、 13 = d 11 = b と表されるので、 答えは 0xdb となる。 B.1から31までの整数で、7で割るとあまりが2であるような数を答えよ。 問題文を逆に考えると、7で割るとあまりが2である場合、割る数は7の倍数+2 であることがわかる。 7の倍数はそれぞれ、7・14・21・28となるので、これらに2を加えていくと、 9・16・23・30となる。 よって答えは 9、16、23、30 である。 2.プログラム問題 A.最高傑作の作成。 今回私が作成したプログラムは「石とりゲーム+α」というゲームプログラム です。 設定としては、ユーザとCPUでの石取りゲームを行い、勝った場合はさらに おまけでゲームをもう1つ行うようにしています。 作成したプログラムは以下の通りです。 #!/usr/koeki/bin/ruby # coding:euc-jp srand #乱数を適当に取り出してならべておく。 a = rand(100) #aに取り出した乱数を格納する。 pot = a #potにaの値を格納する。 e = rand(3) #eに乱数を格納。 hand = ["グー","チョキ","パー"] printf("さて、この壺の中には%s個の石ころが入っています。\n",pot) print("これを私とあなたで順番に取っていきます。\n") print("そして最後に石ころを取った方が負け、というゲームです。\n") sleep 1 #遅延処理。1秒処理を遅らせる。 print("\n詳しい説明をしましょうか?\n") print("1.はい 2.いいえ→") w = gets.chomp #説明を聞くかどうかの入力。 if w == "1" print("わかりました。\n") print("\nこのゲームは先ほど説明したように、順番に石ころを取っていきます。\n") print("最初に先攻、後攻を決めてからゲーム開始です。\n") sleep 1 #遅延処理 print("\n注意事項として、お互いに1度に取れる石ころの数は3つまでです。\n") print("3つまでなら1つでも2つでも構いません。\n") print("説明はこんな感じですね。\n") elsif w == "2" print("そうですか。\n") end print("\nでは始めます。\n") sleep 1 print("\n準備はよろしいですか?\n") print("1.yes 2.no→") m = gets.chomp #準備が出来たかどうかを入力 if m =="1" print("では始めましょう。\n") sleep 1 print("\n順番はどうしますか?\n") print("1.私から 2.あなたから→") s = gets.chomp #どちらから始めるかを入力 if s == "1" #ユーザ側からゲーム開始 print("\nそれではあなたからですね。\n") while pot >= 0 printf("\n壺の中には%s個の石ころが入っています。\n",pot) print("何個取りますか?\n") print("1から3→") while true #入力ミスを修正するためのループ処理 g = gets.to_i #石ころを何個取るかを入力 if g <= 0 || g > 3 #もし1から3以外を選んだ場合 print("ルール違反ですよ?(ニッコリ\n") print("もう一度選んで下さい。\n") print("1から3→") else break #入力ミスがなかった場合はふつうに処理 end end pot -= g #全体の数から入力した値だけ引いていく if pot <= 0 #もしそこで全体が0になった場合 me = 1 #ユーザ側にフラグを立てる break #ゲームをそこで終了 end k = rand(4) #相手が何個引くか乱数で設定 while true if k == 0 #もし乱数で0が格納された場合 k = rand(4) #もう一度乱数を格納し直す else break #問題なければループを抜けゲームを続行 end end printf("では私は%s個取ります。\n",k) pot -= k #全体の値からCPUが入力した値を引く if pot <= 0 #もし全体が0になった場合 you = 1 #CPU側にフラグを立てる break #そこでゲームを終了 end end elsif s == "2" #CPU側からゲーム開始 print("それじゃあ私から始めますね。\n") while pot >= 0 #全体の値が0になるまで続ける k = rand(3) while true if k == 0 k = rand(3) else break end end printf("では私は%d個取ります。\n",k) pot -= k if pot <= 0 you = 1 break end printf("\n壺の中には%d個の石ころが入っています。\n",pot) print("何個取りますか?\n") print("1から3→") while true g = gets.to_i if g <= 0 || g > 3 print("ルール違反ですよ?(ニッコリ\n") print("もう一度入力して下さい。\n") print("1から3→") else break end end pot -= g if pot <= 0 me = 1 break end end end if you == 1 #もしCPU側にフラグが立っていたら print("\nあなたの勝利です!\n") #勝利宣言 elsif me == 1 #逆にユーザ側にフラグが立っていた場合 print("\nあなたの負けです!orz\n") #敗北宣告 end if you == 1 #もしユーザが勝利していた場合 print("ダブルアップに挑戦しますか?") print("あ、説明をまだしてませんでしたね。\n") sleep 2 #遅延処理。ここでは2秒遅らせる。 print("では説明します。\n") sleep 1 print("\n簡単に言えば、これから私とジャンケンをして頂きます。\n") print("勝てば成功、負ければ失敗です。\n") print("あ、あいこは±0になってます。\n") sleep 3 print("\n説明は以上です。\n") print("で、どうしますか?\n") print("1.yes 2.no →") d = gets.to_i #ダブルアップを行うかどうかを入力 if d == 1 #ダブルアップを行うならば print("\nでは始めます!\n") print("最初はグー!\n") print("じゃんけん・・・\n") print("(出す手を決めろ!)\n") print("0.グー 1.チョキ 2.パー →") t = gets.to_i #自分が出す手を選択 sleep 3 print("\nポン!\n") #ユーザとCPUの printf("\n\nあなた:%s \t 相手:%s\n",hand[t] ,hand[e]) #手を表示 if t == e #もしお互いの手が一緒だった場合(値が同じ場合) print("あいこですね。\n") print("では±0ということで。\n") elsif t < e #ユーザ側の値が小さく、 if t == 0 || e == 2 #なおかつユーザが0、CPUが2を選択した場合 print("あなたの勝ちです!\n") print("というわけでダブルアップ成功です!\n") else print("あなたの負けです!\n") print("というわけでダブルアップ失敗です。\n") end elsif t > e #ユーザ側の値が大きく、 if t == 2 || e == 0 #かつユーザが2、CPUが0を選んでいる場合 print("あなたの負けです!\n") print("というわけでダブルアップ失敗です。\n") else print("あなたの勝ちです!\n") print("というわけでダブルアップ成功です!\n") end end elsif d == 2 #ダブルアップを行わないことを選んだ場合 print("\nわかりました。\n") end end elsif m == "2" #準備が出来ていない場合 print("\n残念です・・・\n") print("それではまた次の機会と言うことで。\n") end print("\n\nゲーム終了です。お疲れ様でした。\n") B.指定したホームページへの最高傑作の記載。 http://roy/~c111080/adv/ ・広告ページ ・企画書 ・取扱説明書 ・プログラム本体 ・cssの作成 ・ユーザのホームページ(c111080)との相互リンク C.最高傑作に対しての報告 http://roy/~c111080/adv/index.html ゲーム部門へのエントリーを希望します。 3.感想 今回の課題は自分で自由に作成したプログラムをホームページで広告として 紹介したが、まず1からプログラムを作成し、かつそれをWEBに載せようとする には、結構な時間が必要になった。 今回のプログラムはいざ作ってみるとそこまで複雑なものではなかったので 問題なかったが、これがきちんとしたPCゲームのダウンロードサイト、ソフト ウェアのフリーサイトとなると、難しい印象を受けた。 最高傑作とは言え、課題点や思いついた追加要素などがあるので、今後も余裕 があればどんどん改装していきたい。 4.共同学習者名 渡辺十夢 齋藤允貴 齋藤康平 及川慎司 小野貴己 伊藤貴章