第7回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号: C109xxx 語学クラス: 英語 1 コース(系): 環境サイエンス 1. A. 仕様書 <企画意図> プログラムでばば抜きができないか、と考えたのでばば抜きをプログラムでつくっ てみた。 <遊び方> 遊び方は普通の遊び方と変わりません。同じカードが来たら捨て、最後に Joker を持っていたら負けになります。 <連絡先> c109149@e.koeki-u.ac.jp プログラム 1.考えた設定 ばば抜きをプログラムで書いてみた。 2.作成したプログラム #!/usr/koeki/bin/ruby def baba(retu) # メソッドの定義 for w in 1 .. 26 # 1 から 26 まで繰り返す retu << w.to_i # 配列の中に追加していく end # for の end retu << "Joker" # "Joker" を追加する shuffle(retu) # shuffle メソッドを呼び出す end # def の end def shuffle(e) # メソッドの定義 srand # rand の種を設定 0.upto(e.size-1) do |i| # 1つ数を増やし i に代入 j = rand(e.size) # j に rand でもらった数を代入 w = e[i] # w に e[i] を代入 e[i] = e[j] # e[i] と e[j] を入れ替え e[j] = w # w を e[j] に代入 end # upto の end end # def の end def kesu(kado) # メソッドの定義 i = 0 # 回数を数える変数 while i < kado.size # kado の長さだけ繰り返す e = kado.shift # kado の先頭を取ってくる q = kado.size # kado の長さを代入 kado.delete_if{|x| x % 13 == e % 13} # x に kado の要素をいれていき、x を 13 で割った余りと # e を 13 で割った余りが同じだったら配列から削除 if q == kado.size # もし q と kado の長さが同じだったら kado << e # e を kado に追加する end # if の end i += 1 # while を終わらせるために 1 を足す end # while の end end # def の end def hyouji(tehuda) # メソッドの定義 for r in tehuda # tehuda の数だけ繰り返す if r == 1 # もし r が 1 だったら system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/1.png&') # 画像の表示 elsif r == 2 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/2.png&') elsif r == 3 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/3.png&') elsif r == 4 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/4.png&') elsif r == 5 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/5.png&') elsif r == 6 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/6.png&') elsif r == 7 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/7.png&') elsif r == 8 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/8.png&') elsif r == 9 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/9.png&') elsif r == 10 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/10.png&') elsif r == 11 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/11.png&') elsif r == 12 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/12.png&') elsif r == 13 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/13.png&') elsif r == 14 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/14.png&') elsif r == 15 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/15.png&') elsif r == 16 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/16.png&') elsif r == 17 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/17.png&') elsif r == 18 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/18.png&') elsif r == 19 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/19.png&') elsif r == 20 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/20.png&') elsif r == 21 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/21.png&') elsif r == 22 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/22.png&') elsif r == 23 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/23.png&') elsif r == 24 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/24.png&') elsif r == 25 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/25.png&') elsif r == 26 system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/26.png&') else r == "Joker" # もし r が "Joker" だったら system('display http://roy.e.koeki-u.ac.jp/~c109149/advertise2/27.png&') end sleep(1) # 1 杪間プログラムを止める end # for の end end # def の end card = Array.new # card という配列を作る baba(card) # baba メソッドを呼び出す play = [] # プレイヤーのカードをしまう配列 com = [] # コンピュータのカードをしまう配列 0.step(27,2) do |jibun| # 27 まで 2 つ間を空けて jibun に代入 play << card[jibun] # card[jibun] を play に追加 end # step の end 1.step(26,2) do |aite| # 26 まで 2 つ間を空けて aite に代入 com << card[aite] # card[aite] を com に追加 end # step の end kesu(play) # kesu メソッドを呼び出す kesu(com) shuffle(play) # shuffle メソッドを呼び出す shuffle(com) STDERR.print("これからばば抜きをはじめます\n") STDERR.print("このゲームは 27 枚でやります\n") STDERR.print("あなたに配られたカードはこれです\n") hyouji(play) # hyouji メソッドを呼び出す sleep (3) # 3 杪プログラムを止める system('pkill display -U `whoami`') # 表示されている画像を強制終了 STDERR.print("最初に私から引きます\n") sleep(2) # 2 杪プログラムを止める srand # rand の種を設定 a = rand(play.size) # rand でもらった数を代入 b = play[a] # b に play[a] を代入 com << play[a] # com に play[a] を追加 play.delete_at(a) # play の a 番目の要素を削除 kesu(com) # kesu メソッドを呼び出す while true # break するまで繰り返し STDERR.print("次はあなたの番です\n") sleep(2) # 2 杪プログラムを止める hyouji(play) # hyouji メソッドを呼び出す STDERR.printf("0 〜 %d の中から番号を選んでください\n",com.size-1) a = gets.to_i # 入力されたものを整数に変換し a に代入 if a < 0 || a > com.size-1 # もし 0 より下または com の長さより下だったら STDERR.printf("0から%dの中で選んでください\n",com.size-1) sleep(1) # 1 杪プログラムを止める redo # while の 横の条件を無視してやり直す end # if の end b = com[a] # b に com[a] を代入 play << com[a] # paly に com[a] を追加 com.delete_at(a) # com の a 番目を削除 kesu(play) # kesu メソッドを呼び出す shuffle(play) # shuffle メソッドを呼び出す play.compact! # 配列の中の nil を消す com.compact! # 配列の中の nil を消す if play.size == 0 # paly の長さが 0 だったら break # while を抜ける end # if の end if com.size == 0 # paly の長さが 0 だったら break # while を 抜ける end # if の end STDERR.print("次に私が引きます\n") sleep(2) # 2 杪プログラムを止める srand # rand の種を設定 a = rand(play.size) # rand からもらってきた数を a に代入 b = play[a] # b に play[a] を代入 com << play[a] # com に play[a] を追加 play.delete_at(a) # play の a 番目の要素を削除 kesu(com) # kesu メソッドを呼び出す shuffle(com) # shuffle メソッドを呼び出す play.compact! # 配列中の nil を消す com.compact! # 配列中の nil を消す if play.size == 0 # play の長さが 0 だったら break # while を抜ける end # if の end if com.size == 0 # ocm の長さが 0 だったら break # while を抜ける end # if の end system('pkill display -U `whoami`') # 表示されている画像を強制終了させる end # while の end system('pkill display -U `whoami`') # 表示されている画像を強制終了させる if com.size == 0 # com の長さが 0 だったら print("★私の勝ちです★\n") else play.size == 0 # play の長さが 0 だったら print("参りました〜\n") end # if の end 3.もとにしたプログラムからの変更点 配列名.delete(a) 配列名.delete_if(|x| x < a)など 配列名.delete_at(a) 配列名.compact! redo 上にある学んでいないメソッドを使いプログラムを作成した。 4.実行結果 pan{c109149}% ./babanuki.rb [~/public_html/advertise2] [21, 3, 8, 14, 22, 17, 5, 12, 26, 18, 13, 19, 9, 23] [2, 15, 11, 25, 16, 1, "Joker", 10, 20, 4, 6, 7, 24] これからばば抜きをはじめます このゲームは 27 枚でやります あなたに配られたカードはこれです [23, 14, 19, 12, 3, 17] [6, 25, 4, 10, "Joker", 16, 1] 最初に私から引きます [23, 14, 19, 12, 3] [10, "Joker", 16, 1, 6, 25] 次はあなたの番です [23, 14, 19, 12, 3] [10, "Joker", 16, 1, 6, 25] 0 〜 5 の中から番号を選んでください 3 4 5 [23, 12, 19, 3] [10, "Joker", 16, 6, 25] 次に私が引きます 3 4 [23, 12, 19] [10, 25, "Joker", 6] 次はあなたの番です [23, 12, 19] [10, 25, "Joker", 6] 0 〜 3 の中から番号を選んでください 2 4 3 ["Joker", 23, 12, 19] [10, 25, 6] 次に私が引きます 3 2 ["Joker", 12, 19] [25, 6] 次はあなたの番です ["Joker", 12, 19] [25, 6] 0 〜 1 の中から番号を選んでください 1 2 1 [12, "Joker"] [25] 次に私が引きます 1 2 [12] [25, "Joker"] 次はあなたの番です [12] [25, "Joker"] 0 〜 1 の中から番号を選んでください 0 0 1 [] ["Joker"] 参りました〜 5.考察 自分の手札は system を使い画像で表示しているため何を持っているのか分から なかったので p メソッドで自分とコンピュータの手札、自分とコンピュータの 手札の数が分かるようにした。 13 以上の数があるのは通し番号にしたため、13 以上の数は 13 を引いた数が本 当の数になる。13 以上の数は黒のカードである。 自分が最初持っている手札は 黒の8、赤の3、赤の8、黒の1、黒の9、黒の4、赤の5、赤の12、黒の13、黒の5 赤の13、黒の6、赤の9、黒の10 コンピュータが持っているカードは 赤の2、黒の2、赤の11、黒の12、黒の3、赤の1、Joker、赤の10、黒の7、赤の4 赤の6、赤の7、黒の11 ここで同じ数字のものを捨てていく 自分のカードは黒の8と赤の8、黒の9と赤の9、黒の13と赤の13、黒の5と赤の5 が同じ数字なので捨てる。 コンピュータは黒の2と赤の2、黒の11と赤の11、黒の7と赤の7が同じ数字なの で捨てる。 すると自分は、 赤の3、黒の1、黒の4、赤の12、黒の6、黒の10が残る。 コンピュータは 黒の12、黒の3、赤の1、Joker、赤の10、赤の4、赤の6が残る。 実行結果と比べると、同じように残っている。 最初はコンピュータから引く、引いたものは黒の4。 自分は赤の3、黒の1、赤の12、黒の6、黒の10になった。 引かれた黒の4は消える。 コンピュータは黒の12、黒の3、赤の1、Joker、赤の10、赤の6になった。 同じだった黒の4と赤の4は捨てる。 実行結果と比べると、同じように残っている。 次に自分が引く、引いたものは赤の1。 自分は赤の3、赤の12、黒の6、黒の10になった。 同じだった黒の1と赤の1は捨てる。 コンピュータは黒の12、黒の3、Joker、赤の10、赤の6になった。 引かれた赤の1は消える。 実行結果と比べると、同じように残っている。 自分の手札の数とコンピュータの手札の数は、4と5なのでwhileは抜けない。 コンピュータが引いたものは赤の3。 自分は赤の12、黒の6、黒の10になった。 引かれた赤の3は消える。 コンピュータは黒の12、Joker、赤の10、赤の6になった。 同じだった黒の3と赤の3は捨てる。 実行結果と比べると同じように残っている。 自分の手札の数とコンピュータの手札の数は、3と4なのでwhileは抜けない。 自分が引いたものはJoker。 自分は赤の12、黒の6、黒の10、Jokerになった。 同じ数はないのでJokerが増えただけ。 コンピュータは黒の12、赤の10、赤の6になった。 引かれたJokerは消える。 実行結果と比べると同じように残っている。 自分の手札の数とコンピュータの手札の数は、4と3なのでwhileは抜けない。 コンピュータが引いたものは黒の10。 自分は赤の12、黒の6、Jokerになった。 引かれた黒の10は消える。 コンピュータは黒の12、赤の6になった。 同じだった黒の10と赤の10は捨てる。 実行結果と比べると同じように残っている。 自分の手札の数とコンピュータの手札の数は、3と2なのでwhileは抜けない。 自分が引いたものは赤の6。 自分は赤の12、Jokerになった。 同じだった黒の6と赤の6は捨てる。 コンピュータは黒の12になった。 引かれた赤の6は消える。 実行結果と比べると同じように残っている。 自分の手札の数とコンピュータの手札の数は、2と1なのでwhileは抜けない。 コンピュータが引いたものはJoker。 自分は赤の12になった。 引かれたJokerは消える。 コンピュータは黒の12、Jokerになった。 同じ数はないのでJokerが増えただけ。 実行結果と比べると同じように残っている。 自分の手札の数とコンピュータの手札の数は、1と2なのでwhileは抜けない。 自分が引いたものは黒の12。 自分の手札はnilになった。 同じだった黒の12と赤の12は捨てる。 コンピュータはJokerになった。 実行結果と比べると同じように残っている。 nilはcompact!メソッドにより消える。 よって自分の配列の長さは0になる。 自分の手札の数とコンピュータの手札の数は、0と1なのでwhileを抜ける。 コンピュータが負けたので「参りました〜」が表示される。 広告ページ http://roy/~c109149/advertise2/ 2.感想 今回プログラムを作るのにかなり苦労した。習っていないメソッドを使ったので どのように使えばいいか理解するのに時間がかかった。時間はかかったがなんと か完成したので良かった。 3.参考文献 Object Oriented Programming http://roy/~yuuji/2010/pf2/11/oo.html 広瀬雄二先生 基礎プログラミングI第5回 http://roy/~naoya/ruby/5.html 神田直弥先生 逆引きRuby - 配列 - http://www.namaraii.com/rubytips/?%C7%DB%CE%F3 [Ruby] 配列 - Life with IT - http://l-w-i.net/t/ruby/array_001.txt 組込み関数 - Ruby リファレンスマニュアル - http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html 配列から要素を取り除くメソッド - Ruby入門勉強ルーム - http://www.mapee.jp/ruby/post_26.html 4.共同学習者 青木 千紗 大島 藍 小松 由里 佐竹 聡美 5.添付