このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 133代目 #834 # [2010/01/15 19:27:07] リュック: 【質問テンプレ】 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org563734.zip.html # # 課題8 # # 以下の機能を持った丁半ゲームのプログラムを作成せよ. # なお,丁半ゲームとは,2つのサイコロをツボと呼ばれる篭に # 入れて振り,出たサイコロの目の合計が丁(偶数)か半(奇数) # かを当てる昔のギャンブルである. # # - 半と丁のどちらに賭けるかを入力する機能 # - 2つのサイコロを振り,出た目を表示する機能(もちろん出る目はランダム) # - 賭けに勝ったか負けたかを判定して結果を表示する機能 # ゲームを続行するかどうかを入力する機能 # # # # # 課題9 # # # - メニュー画面から操作を選ぶ機能.図1参照.今回は,「1:はじめから」 # 「0:終了する」を実行できるようにする.「1:はじめから」を選ぶと,ゲーム # がスタートし,プレーヤーが「続行しない」旨の入力を行うまでゲームを # 続行する.「続行しない」旨の入力があれば,メニュー画面に戻る. # 「0:終了する」を選ぶと,プログラムを終了する. # - お金を賭ける機能.初期の所持金は4000文で,一回の賭け金は1文 # 以上所持金以下とする.所持金が無くなればゲームオーバーであり, # メ画面に戻る現在の所持金がいくらであるかは必要なタイミングでプレーヤーに示 される必要がある. # - 不正な入力を検知し,プレーヤーにフィードバックする機能.たとえば, # 1または0の入力のみが期待される場合に,文字列や,1,0以外の数字 # などが入力されれば,エラーメッセージを出力した上で再度の入力を # 求める.図3参照. # - プレーヤーに入力を促すためのプロンプト("> ")を表示する機能. # # # # # 課題10 # # # 演習課題9で作成した丁半ゲームのプログラムに,以下の機 # 能を追加せよ. # - コンピュータが自動で操作を行う博打打(以降では自動プレーヤーと呼ぶ)を3名 # 参加させる機能.図1,図2参照.3名にはそれぞれ,名前,初期の所持金,1回あ # たりの最大の賭け金(現在の所持金における割合として表される)があらかじめ設 # 定されている.設定値はゲームバランスを考慮して決定すること.ゲームを開始す # ると,自動プレーヤーは自らの所持金が尽きるまで連続して賭けに参加する.半, # 丁に賭ける確率はそれぞれ1/2であり,1文以上最大賭け金以下の範囲でランダ # ムな金額を賭ける. # # ゲームデータをセーブ・ロードする機能図3参照ゲームデータとは自動プレーヤ― # を含む全プレーヤーの現在の所持金,賭けに勝った回数と負けた回数で # ある.プレーヤーはゲームを終了してメニューに戻る際に,それまでの内容を保存 # するかどうか選択することができる.また,メニューから「2:つづきから」を選択する # と,前回保存した内容を反映してゲームを開始する.ゲームデータは2つ以上作 # 成しないものとする.ゲームデータのファイルフォーマットは特に指定しない. # # # # # 課題11 # # # 演習課題10で作成した丁半ゲームのプログラムに,以下の # 機能を追加せよ. # - 成績を評価する機能.メニューから「3: 成績」を選択すると,ゲームデータをロード # して各プレーヤーの(1) 勝ち負けの回数,(2) 現在の所持金,(3) 稼いだ金額, # (4) 初期設定の所持金に対する(3)の割合を表示する.そして(4)によってプレー # ヤーの順位を明らかにし,その順位によってA〜Dの4段階評価を表示する.つま # り,プレーヤーの(4)の大きさが1番であればA,2番であればB,3番であればC,4 # 番であればDである.以上を表示した後,メニューに戻る.ゲームデータが存在し # ない場合については,その旨表示してメニューに戻る. # # # 長くなりましたが、どうかよろしくお願いします。 # 途中までは作成しているのですが、よくわかりません。 # どなたか、よろしくお願いします。 # 難易度設定はいらないそうです。 # # 賭場 :- 壷, サイコロを振る(_壷), 丁か半か, 壷を開く(_壷,_出目), 勝負の表示(_出目). 壷 :- 入ります,音楽スタート. 入ります :- write('入ります\n'). サイコロを振る(_壷) :- _ひとつ目の賽の目 is random(6) + 1, _ふたつ目の賽の目 is random(6) + 1, サイコロの目を描く(_ひとつ目の賽の目,_ふたつ目の賽の目), _壷 = ([_ひとつ目の賽の目,_ふたつ目の賽の目],_サイコロ表示),!. サイコロの目を描く(_ひとつ目の賽の目,_ふたつ目の賽の目,_サイコロ表示) :- N1 is (random(6) + 1) * 2, N2 is (random(6) + 1) * 2, atomic_list_concat(['%',N1,'s%t\n%',N2,'s%t\n'],_表示パターン), swritef(_サイコロ表示,_表示パターン,[' ',_ひとつ目の賽の目,' ',_ふたつ目の賽の目]). 丁か半か :- write('丁か半か\n'), sleep(3), 張る, 'よろしいですか、よろしいですね'. 張る :- findall(_,( 丁か半か(_行), ( _行 = '',!,fail;丁か半か(_行))),_). 丁か半か(_行) :- 行入力(_行), split(_行,[' '],[_客,_丁か半か,_金額]), assertz(賭け(_客,_丁か半か,_金額)). 丁か半か(_行) :- 丁か半か(_行). 'よろしいですか、よろしいですね' :- write('よろしいですか\n'), sleep(5), write('よろしいですね\n'), sleep(2). 壷を開く(_壷,_ひとつ目の賽の目,_ふたつ目の賽の目,_丁か半か) :- _壷 = ([_ひとつ目の賽の目,_ふたつ目の賽の目],_サイコロ表示), writef('%t',[_サイコロ表示]), sleep(2), writef('%t %tの%t\n',[_ひとつ目の賽の目,_ふたつ目の賽の目,_丁か半か]),!. 丁半判定(_ひとつ目の賽の目,_ふたつ目の賽の目,丁) :- 0 is (_ひとつ目の賽の目 + _ふたつ目の賽の目) mod 2. 丁半判定(_ひとつ目の賽の目,_ふたつ目の賽の目,半) :- 1 is (_ひとつ目の賽の目 + _ふたつ目の賽の目) mod 2. 勝負の表示(_出目) :- 賭け(_客,_丁か半か,_金額), 勝負判定(_出目,_丁か半か,_勝ち負け), writef('%t,%t,%t円\n',[_客,_勝ち負け,_金額]), fail. 勝負の表示(_) :- 賭け金の分配については知識がないから省略. 勝負判定(_目,_目,勝ち). 勝負判定(_出目,_丁か半か,負け) :- \+(_出目=_丁か半か). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). split(_行,_区切り文字列ならび,[_項|R]) :- sub_atom(_行,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび), catch(read_term_from_atom(_前文字列,_項,[]),E,fail), split(_後文字列,_区切り文字列ならび,R),!. split(_行,_,[_行]). sub_atom(_文字列,_前文字列,_適用文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適用文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 音楽スタート. 賭け金の分配については知識がないから省略.