飛び越しゲーム 計算数理2演習 課題1 2011年度(阿原).

Slides:



Advertisements
Similar presentations
1 実技演習1 2008/01/28,29 JaLTER Morpho 講習会. 2 起動・接続 各自、コンピュータを起動してネットワーク に接続してください。 各自、コンピュータを起動してネットワーク に接続してください。 IP アドレス自動取得 IP アドレス自動取得 無線 LAN 使用可 無線.
Advertisements

プログラミング論 第八回数字の計算,整数の入出力. 本日の内容 前回の課題(続き) 前回の課題(続き) 数字の計算をする 数字の計算をする – 加減乗除を行う – インクリメント演算子とデクリメン ト演算子.
コンピュータと情報 第10回 Excel を使ってみる. Excel の起動 ① 「スタート」ボタンをク リック ② すべてのプログラムにマ ウスカーソルをあわせる ③ 「 Microsoft Office 」 → 「 Microsoft Excel 2003 」 にマウスをあわせて,ク リック ④.
1 WORD の起動法と終了法 ● WORD の起動法 (1) デスクトップの Microsoft Word アイ コンをダブルクリックする。 * (2) 「スタート」 ― 「すべてのプログラ ム」 ― 「 Microsoft Word 」と選ぶ。 (3) Word で作成された文書があるとき は、そのアイコンをダブルクリック.
情報処理 第8回第8回第8回第8回. 目次 (1) スタイルの利用 – スタイルの概要 – スタイルの適用 (1) – 「スタイル」ウィンドウを開く – スタイルの適用 (2) – スタイル適用のセオリー – すべてのスタイルを表示 – スタイルの書式を変える (1) – スタイルの書式を変える (2)
 C 川船 美帆.  強い人工知能の作成 o 「遺伝的アルゴリズム」  「どうぶつしょうぎ」のアプリケーショ ン作成 o スマートフォン向けアプリケーション.
情報基礎演習I(プログラミング) 第9回 6月22日 水曜5限 江草由佳
ペルソナウェア2002 キャラクターメーカーで キャラクターを作ろう
初年次セミナー 第8回 データの入力.
UNIX利用法.
UNIX利用法 情報ネットワーク特論資料.
PC作業の一時停止 ●「スタンバイ(サスペンド)」: メモリには電源が供給される。実行中のデータがそのままメモリに保持されるため、作業を中断した状態から 数秒で再開ができる。省電力。 操作: 「スタート」→「電源オプション」→「スタンバイ」とクリックする。 ●「休止状態」: メモリの内容をハードディスクに退避してから全デバイスの電源をオフ。作業を中断した状態からの再開ができる。ノートPCでは電池が消耗しない。
プログラミング入門 電卓番外編 ~エクセルで関数表示~.
ファイルやフォルダを検索する ①「スタート」→「検索」→「ファイルとフォルダ」とクリックする。
情報処理 第11回の教材 プレゼンテーションソフト PowerPoint 高知大学 共通教育 理学部 対象 担当:塩田 ここはメモを書く欄。
Accessによる SQLの操作 ~実際にテーブルを操作してみよう!~.
2004年度JAVAゼミコンテスト作品 「Othello」
クイズ 「インターネットを使う前に」 ネチケット(情報モラル)について学ぼう.
基礎プログラミング 第13回(2007年5月28日) 「関数」の補足説明 Report-Fの解説.
エクスプローラ ● エクスプローラ: ファイルやフォルダを階層構造で表示してあり、これらを操作するのに便利。
イスカンダルの豆腐屋ゲーム 計算数理2演習 課題2 (2011年度、阿原).
第6章 2重ループ&配列 2重ループと配列をやります.
さとりすと Satori Ghost Editor 里々ゴーストの統合開発環境を作ったよ page: 1/25
碁石ゲームに関する考察 4目並べ講座 パターン生成ゲームの楽しみ 徳山 豪 (東北大学) .
初年次セミナー 第2回 文字の出力.
情報学部 プログラミング体験教室 (初級編)
マイクロソフト Access を使ってみよう 第1回
JAVAでつくるオセロ 伊東飛鳥、宮島雄一 長畑弘樹、ソギ原直人.
SAS University Edition 導入のすすめ
【プログラミング応用】 必修2単位 通年 30週 授業形態:演習.
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
シャノンのスイッチングゲームにおけるペアリング戦略の複雑さについて
Microsoft Visual Studio 2005 の使い方
プログラミング応用 printfと変数.
プログラミング 4 記憶の割り付け.
ゲームプログラミング講習  第3章 ゲーム作成 ブロック崩しを作ります ゲームプログラミング講習 第3章 ゲーム作成.
G班メンバー リーダー 橋本望 SE 北本理紗と服部友哉 PPT作成 橋本望と山田侑加
デジタル画像とC言語.
京都大学大学院情報学研究科 宮川博光 伊藤大雄
PC作業の一時停止 ●「スタンバイ(サスペンド)」: メモリには電源が供給される。実行中のデータがそのままメモリに保持されるため、作業を中断した状態から 数秒で再開ができる。省電力。 操作: 「スタート」⇒「電源オプション」⇒「スタンバイ」とクリックする。 ●「休止状態」: メモリの内容をハードディスクに退避してから全デバイスの電源をオフ。作業を中断した状態からの再開ができる。ノートPCでは電池が消耗しない。
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
フィジカル・コンピューティング Arduino入門.
情報処理 第13回の教材 プレゼンテーションソフト PowerPoint 高知大学 共通教育 理学部 対象 担当教員 : 塩田
C言語 はじめに 2016年 吉田研究室.
ファイルやフォルダを検索する ①「スタート」→「検索」とクリックする。 ②「表示項目」から適当なものを選択する。
高度プログラミング演習 (01).
第1章 いよいよプログラミング!! ~文章の表示 printf~
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
情報基礎演習I(プログラミング) 第8回 6月8日 水曜5限 江草由佳
本当は消去できていない!? ~データを完全消去する方法~
本当は消去できていない!? ~データを完全消去する方法~
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
数値解析Ⅱ ~五目並べのプログラミング~ C班.
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
or-8. ゲーム理論 (オペレーションズリサーチを Excel で実習するシリーズ)
ヒープソート.
情報処理 II 第12回の教材 プレゼンテーションソフト PowerPoint 高知大学理学部 数理情報科学科1回生い組対象 担当:塩田教官
標準入出力、変数、演算子、エスケープシーケンス
Othello G班         山崎 木下 山本 上手      .
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
ca-9. 数の扱い (コンピュータアーキテクチャとプロセッサ)
エクスプローラ ● エクスプローラ: ファイルやフォルダを階層構造で表示してあり、これらを操作するのに便利。
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
情報処理 II 第11回の教材 プレゼンテーションソフト PowerPoint 高知大学 共通教育 理学部 対象 担当:塩田
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
FPS(続き).
printf・scanf・変数・四則演算
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

飛び越しゲーム 計算数理2演習 課題1 2011年度(阿原)

● ● ● ○ ○ ○ ● ● ● ○ ○ ○ 次のようなゲームを考えます 黒石を6つ、白石を6つ用意して、2×9の 升目の上に、下図のようにおきます。これ で準備完了です。 ● ● ● ○ ○ ○ ● ● ● ○ ○ ○

基本ルール 二人のプレーヤーがそれぞれ黒石・白石を動か します。黒石は左から右へ、白石は右から左へと 動かします。 黒石と白石は交互に動かします。動かせる状況 であるならばパスをすることは許されません。 つながった相手の石を飛び越すことが出来ま す。(自分の石は飛び越せません。)

飛び越し方 下の図のように、飛び越すことが出来ます。 ● ○ ● ○ ● ○

飛べない例 隙間があったり、自分の石があると飛び越 せません ● ○ ● ○

上がり 黒石は、全部右側に寄せれば上がり、白 石は全部左側に寄せれば上がりです。 黒勝ち ○ ○ ○ ● ● ● ○ ○ ○ ● ● ●

盤の名前の付け方 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 2*9 9 10 11 12 13 14 15 16 17 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 8 2*10 10 11 12 13 14 15 16 17 18 19

補助的なルール このゲームでは、動かせる場所がある場 合にはパスできません。 自分の石がないところを指定すると、即負 けになります。

このゲームの戦術を考えてください あなたは黒を持って、このゲームで出来る だけ勝つようなアルゴリズムを考案してくだ さい。 盤のサイズが2*9,2*10の2つの場合 について戦術を考えてください。そして、そ れぞれの場合について、阿原が準備した3 人のプレーヤーからできるだけ勝ちを上げ てください。

戦術のポイント 一般論としては,相手の石をたくさん飛び 越したほうが早くゴールに近づきます。 相手に自分の石を飛び越させないように することも大切です。 相手を手詰まりにもちこんで、こちらが手 を進めるという作戦もあり得ます。

戦術のポイント2 パスができないことを戦術に組み込むのも大切なことです。相手が動かしたくない石を、ほかの石を手詰まりにすることによって、無理やり動かさせるという戦術もあり得ます。 完全情報ゲームなので,必ず先手必勝か後手必勝があるはずですが,先手を持った場合,後手を持った場合,どちらも善戦できるプログラムを作ってください.(コンピュータ側は必勝手順で指すことはしません.)

ダウンロードファイル http://www.math.meiji.ac.jp/~ahara/sk2 e/2011jump2008.zip http://www.math.meiji.ac.jp/~ahara/sk2 e/2011jump2010.zip をダウンロードしてください。(表紙ページにもリンクが あります。)これを解凍すると、いくつかのファイル が現れますが、それらが同じフォルダにあるように してください。(普通に解凍すればそうなります。) jump.vcprojというファイルをダブルクリックすると, Visual C++が起動します. 皆さんが編集してよいのはjump.cppのみです。

コンパイルと実行 まずはプログラムを変更することなく,「デバッグ」メニューから「デバッグ開始」を選んでください.[F5]キーを押しても同じことです.以後,プログラムを動かすときにはいつもこの方法を用いてください. もし,「悪いことをした心当たりがない」のにコンパイルできなくなった場合には,「ビルド」メニューの「ソリューションのリビルド」を選択してください.それでも動かなかったら阿原を呼んでください.

プログラムの画面

動かし方 まずは自分の手入力とプログラムとで対戦し てみてください.「盤の大きさ」「プレーヤー2選 択」をしてから,「1ゲーム(先手)」または「1ゲ ーム(後手)」をクリックしてください. プレーヤー1を手入力にしておけば,画面上 の青いコマをクリックすることによって,プレー ヤー2と対戦することができます.

プログラミング開始 あらかた遊んだら,今度はプログラミングをしてましょ う.一度ゲーム画面を閉じて,Visual C++の画面に 戻ります. 左側(時に右側)に「ソリューションエクスプローラー」 をかかれた部分があり,そこに「太字のjump」をダブ ルクリックします.そして「ソースファイル」をダブルク リックして「jump.cpp」をダブルクリックします.(この 作業は一度おこなえば,次からは自動的に開いてく れます.)

プログラム開始 Jump.cppというファイルを開くと,下のほうに Int Form1::myplay(void){ ・・・・・・ }  }  という部分があり,ここが「プログラム本体」で す.ここに飛び越しゲームをプレーする戦略プ ログラムを書いてもらいます.

プログラムの手引き 盤面を左から int board[]; という配列変数で表します。青石(あなた) は1、赤石(相手)は2、何もないところは0 であらわされます。2*9盤の最初の状態で は、 board[0]=board[1]=board[2]=1; board[9]=board[10]=board[11]=1; です。(2列目は9~17になります。)

盤の大きさを表す変数width widthという変数があり、これで盤の幅をあら わしています。つまり、widthの変数の値は 9,10のいずれかです。 このことから、左下の升目は board[width] とあらわされることが分かります。

jump.cppの中身 この中身を変更してください。 int Form1::myplay(void){ int i; for(i=0;i<2*width;i++){ if(player1_movable(board,i)){ return i; } return -1; この中身を変更してください。

return iとは? この関数では、「次に動かす石の位置」を指定し ます。上段一番左が0、一番右が8です。動かせ る黒石がそこにあれば、あとはプログラムが動か してくれます。もし、動かせる黒石でない場所を 指定した場合は負けです。初手で2の位置にあ る黒石を一つ右へ動かすためには、最初に     return 2; とすればよいことがわかります。

使ってよいデータは 配列変数board[]だけが参照できるデー タです。(これがゲームの情報の全てです。 完全情報ゲームといいます。) 2*9の時には配列変数の大きさは18です が、2*10の時には20となります。この配 列変数の値から、次に動かす石の場所を 返すような関数を作ってください。

使ってよい関数 bool player1_movable(int b[],int i); という関数を用意しました。これはi番の場所 を指定した場合、そこに黒石があって、そ の黒石が動かせる状況にあれば、trueが 返され、それ以外の場合にはfalseが返さ れる関数です。通常は if(player1_movable(board,2)){    return 2; } のように使ってください。

初級者のためのヒント(1) int i; for(i=0;i<2*width;i++){ if(player1_movable(board,i)){ return i; } こうすることによって、「盤面の0から順に2*width-1まで調べて、もし、動かせるコマがあればそのコマを動かす」という命令になります。

初級者のためのヒント(2) int i; for(i=2*width-1;i>=0;i--){ if(player1_movable(board,i)){ return i; } こうすることによって、「盤面の2*width-1から順に0まで(減らしながら)調べて、もし、動かせるコマがあればそのコマを動かす」という命令になります。

初級者のための練習問題 width=9だとして、盤面を、0,9,1,10,2,11,… の順番に調べたいときには、どのようにプログ ラムを組めばよいでしょうか? width=9だとして、盤面を、 8,17,7,16,6,15,…の順番に調べたいときに は、どのようにプログラムを組めばよいでしょ うか?

初級者のためのヒント 盤面の i 番を調べているときに、「一つ右隣 の盤面」を調べたいときには board[i+1] という変数を調べればよいことがわかります。 「一つ右隣に相手のコマがあれば」という条件 文は if(board[i+1]==2){ と書けばよいことがわかります。

レポートのポイント 勝つための戦略を明確にレポートしてください。「ひたすら進 める」などの漠然とした表現はだめです。 勝てなかったゲームについて、どの手がまずくて勝てなかっ たかをレポートしてください。つまり、ポイントとなる盤面を再 現し、そこであなたのプログラムは**という手を指したが、 実際には++のほうが良い手であった。という感じのレポート を作ってください。