リバーシ 06a1056 藤田将義.

Slides:



Advertisements
Similar presentations
G ゼミ 2010/5/14 渡辺健人. パフォーマンスの測定 CUDA Visual Profiler CUDA の SDK に標準でついているパフォーマン ス測定用のツール 使い方: exe ファイルのパスと作業ディレクトリ指定して実 行するだけ 注意点 : GPU のコード実行後にプログラム終了前に,
Advertisements

Othello Let us cling together. メンバー 班長 杉本友宏 プログラマー 京谷貴平 アルゴリズム 佐野祐之 パワーポイント 菊澤遼平 発表 川本敏和.
模擬国内予選2013 Problem F テトラ姫のパズル 原案:須藤 解答:大友、須藤 解説:須藤.
 C 川船 美帆.  強い人工知能の作成 o 「遺伝的アルゴリズム」  「どうぶつしょうぎ」のアプリケーショ ン作成 o スマートフォン向けアプリケーション.
水曜パソコン講座 「Windows Update プログラム  を実行する手順」         を解説します.
3次元nクイーン問題の 解に関する研究 論理工学研究室 伊藤精一
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
コンピュータ囲碁の仕組み ~ 将棋との違い ~
Ex7. Search for Vacuum Problem
アルゴリズムとデータ構造 2010年7月5日
Ex8. Search for Vacuum Problem(2)
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
リバーシの並列化 並列化するときに起こる問題を定義しろ おぷてぃまいざー SSAIとMSAIは比較しろ  前田昂寛.
Lispとは ゲーム理論 minimaxアルゴリズム αβアルゴリズム ソースコードの一部
2004年度JAVAゼミコンテスト作品 「Othello」
Handel-Cによる       エアホッケー.
プログラミング演習3 第4回 ミニプロジェクト.
アルゴリズムとデータ構造 2012年6月14日
情報工学概論 (アルゴリズムとデータ構造)
情報処理Ⅱ 2005年12月22日(木).
第8回 プログラミングⅡ 第8回
システム開発実験No.7        解 説       “論理式の簡略化方法”.
INSERT(x,p,L)の例 (一部) 磯 直行 2009年5月5日
インタラクティブ・ゲーム制作 <プログラミングコース>
アルゴリズムとデータ構造 2011年6月14日
アルゴリズムとデータ構造 2011年6月20日
JAVAでつくるオセロ 伊東飛鳥、宮島雄一 長畑弘樹、ソギ原直人.
情報論理工学 研究室 第6回: リバーシの合法手生成.
~オセロゲーム~ アルゴリズムとそのプログラム
インタラクティブ・ゲーム制作 <プログラミングコース>
ハッシュ表 データ構造とプログラミング(12)
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
情報論理工学 研究室 第5回: 局面・駒石・手の表現.
シューティングゲーム.
アルゴリズムとデータ構造1 2006年7月4日
演習1 : インターフェイスを使ってみよう 「10人の客(乗用車、バイク、ストーブのいずれかランダムに決定)に1~100(L)の給油をするガソリンスタンドをシミュレートする実行クラス : RefuelSimulation」を作成する。給油の際には、どの種類の客が何リットル給油したか出力すること。 実行結果例.
4人版リバーシYoninの解析 情報論理研究室 藤本 侑花
ゲームプログラミング講習  第3章 ゲーム作成 ブロック崩しを作ります ゲームプログラミング講習 第3章 ゲーム作成.
G班メンバー リーダー 橋本望 SE 北本理紗と服部友哉 PPT作成 橋本望と山田侑加
京都大学大学院情報学研究科 宮川博光 伊藤大雄
アルゴリズムとデータ構造1 2005年7月1日
アルゴリズムとデータ構造1 2009年7月9日
アルゴリズムとデータ構造1 2005年7月5日
アルゴリズムとデータ構造1 2005年6月24日
アルゴリズムとデータ構造 2010年6月21日
Ex7. Search for Vacuum Problem
モンテカルロ法を用いた 立体四目並べの対戦プログラム
3次元Nクイーン問題の 解の存在の検証 07-1-037-0106 前波 大貴 情報論理工学研究室 宜しくお願いします。
アルゴリズムとプログラミング (Algorithms and Programming)
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
アルゴリズムとデータ構造1 2006年7月4日
数値解析ⅡーI ~オセロゲームのプログラム~
アルゴリズムとデータ構造1 2006年6月23日
第6回:得点を表示しよう! (文字の表示、乱数)
アルゴリズムとデータ構造1 2009年7月2日
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
F班 メンバー 班長 雨堤 智宏 アルゴリズム解析 角田 泰彬 竹林 秀高 ppt作成 清水 貴史
Othello G班         山崎 木下 山本 上手      .
情報論理工学 研究室 第8回: ミニマックス法.
アルゴリズムとデータ構造 2012年6月21日
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
GUI部品とイベント処理の例 マインスィーパもどきの作成 倉敷芸術科学大学 産業科学技術学部 梶浦文夫.
スライドの終わりまでテキストが繰り返しスクロールされます • スライドの終わりまでテキストが繰り返しスクロールされます •
プログラミング演習I 2003年6月11日(第9回) 木村巌.
アルゴリズムとデータ構造1 2005年7月12日
アルゴリズムとデータ構造1 2007年7月6日
ソフトウェア制作論 平成30年10月17日.
Presentation transcript:

リバーシ 06a1056 藤田将義

スライド一覧 リバーシプログラムのメソッド vectorについて

メソッド一覧 メソッド名 説明 move Pointで指定された位置に石を打つ pass パスする undo 1つ前の手の状態に戻す init ボードをゲーム開始直後の状態にする isGameOver ゲームが終了しているかどうか調べる getColor 指定した座標の石の色を調べる countDisc 指定された石の個数を返す getCurrentColor 現在の手番の色を返す getUpdate 直前の手で返された石が並んだvectorを返す getMovablePos 石の打てる座標が並んだvectorを返す getTurns 現在の手数を返す checkMobility 指定された座標に石を打てるか、またどの方向に石を裏返せるか判定

move { if(point.x <= 0 || point.x > BOARD_SIZE) return false; if(point.y <= 0 || point.y > BOARD_SIZE) return false; if(MovableDir[Turns][point.x][point.y] == NONE) return false; flipDiscs(point); Turns++; CurrentColor = -CurrentColor; initMovable(); return true; } 石が打てるか判定 現在の手数、手番の色など更新

flipDiscs int x, y; Disc operation(point.x , point.y, CurrentColor); // 行った操作を表す石 int dir = MovableDir[Turns][point.x][point.y]; std::vector<Disc> update; RawBoard[point.x][point.y] = CurrentColor; update.push_back(operation); // 上 if(dir & UPPER) // 上に置ける { y = point.y; operation.x = point.x; while(RawBoard[point.x][--y] != CurrentColor) RawBoard[point.x][y] = CurrentColor; operation.y = y; }

flipDiscs ・ ・ // 石の数を更新 int discdiff = update.size();   ・      ・ // 石の数を更新 int discdiff = update.size(); Discs[CurrentColor] += discdiff; Discs[-CurrentColor] -= discdiff -1; Discs[EMPTY]--; UpdateLog.push_back(update);

initMovable Disc disc(0, 0, CurrentColor); int dir; MovablePos[Turns].clear(); for(int x=1; x<=BOARD_SIZE; x++) { disc.x = x; for(int y=1; y<=BOARD_SIZE; y++) disc.y = y; dir = checkMobility(disc); if(dir != NONE) // 置ける MovablePos[Turns].push_back(disc); } MovableDir[Turns][x][y] = dir;

checkMobility // 既に石があったら置けない if(RawBoard[disc.x][disc.y] != EMPTY) return NONE; int x, y; unsigned dir = NONE; // 上 if(RawBoard[disc.x][disc.y-1] == -disc.color) { x = disc.x; y = disc.y-2; while(RawBoard[x][y] == -disc.color) { y--; } if(RawBoard[x][y] == disc.color) dir |= UPPER; }

ゲーム終了の判定 (isGameOver) { // 60手に達していたらゲーム終了 if(Turns == MAX_TURNS) return true; // 打てる手があるならゲーム終了ではない if(MovablePos[Turns].size() != 0) return false; //現在の手番と逆の色が打てるかどうか調べる Disc disc; disc.color = -CurrentColor; for(int x=1; x<=BOARD_SIZE; x++) disc.x = x; for(int y=1; y<=BOARD_SIZE; y++) disc.y = y; // 置ける箇所が1つでもあればゲーム終了ではない if(checkMobility(disc) != NONE) return false; } return true;

pass { // 打つ手があればパスできない if(MovablePos[Turns].size() != 0) return false; // ゲームが終了しているなら、パスできない if(isGameOver()) return false; CurrentColor = -CurrentColor; // 空のupdateを挿入しておく UpdateLog.push_back(std::vector<Disc>()); initMovable(); return true; } UpdateLog.push_back(nullupdate);

undo { // ゲーム開始地点ならもう戻れない if(Turns == 0) return false; CurrentColor = -CurrentColor; const std::vector<Disc> &update = UpdateLog.back(); // 前回がパスかどうかで場合分け // 前回はパス if(update.empty())  // MovablePos及びMovableDirを再構築 MovablePos[Turns].clear(); for(unsigned x=1; x<=BOARD_SIZE; x++) for(unsigned y=1; y<=BOARD_SIZE; y++) MovableDir[Turns][x][y] = NONE; } // 前回はパスでない else

undo Turns--; // 石を元に戻す RawBoard[x][y] = EMPTY; for(unsigned i=1; i<update.size(); i++) { RawBoard[update[i].x][update[i].y] = -update[i].color; } // 石数の更新 unsigned discdiff = update.size(); Discs[CurrentColor] -= discdiff; Discs[-CurrentColor] += discdiff -1; Discs[EMPTY]--; // 不要になったupdateを1つ削除 UpdateLog.pop_back(); return true;

init { // 全マスを空きマスに設定 for(int x=1; x <= BOARD_SIZE; x++) for(int y=1; y <= BOARD_SIZE; y++) RawBoard[x][y] = EMPTY; } // 壁の設定 for(int y=0; y < BOARD_SIZE + 2; y++) RawBoard[0][y] = WALL; RawBoard[BOARD_SIZE+1][y] = WALL; for(int x=0; x < BOARD_SIZE + 2; x++) RawBoard[x][0] = WALL; RawBoard[x][BOARD_SIZE+1] = WALL;

init // 初期配置 RawBoard[4][4] = WHITE; RawBoard[5][5] = WHITE; RawBoard[4][5] = BLACK; RawBoard[5][4] = BLACK; // 石数の初期設定 Discs[BLACK] = 2; Discs[WHITE] = 2; Discs[EMPTY] = BOARD_SIZE*BOARD_SIZE - 4; // 手数は0から数える Turns = 0; // 先手は黒 CurrentColor = BLACK; // updateを全て消去 UpdateLog.clear(); initMovable(); }

情報を取得するメソッド unsigned countDisc(Color color) const { return Discs[color]; } Color getColor(const Point& p) const return RawBoard[p.x][p.y]; const std::vector<Point>& getMovablePos() const return MovablePos[Turns]; 石の数を数える 指定された位置の色を返す 石を打てる座標が 並んだvectorを返す

情報を取得するメソッド 直前の手で打った石と 裏返した石が並んだ vectorを返す 現在の手番の色を返す 現在の手数を返す std::vector<Disc> getUpdate() const { if(UpdateLog.empty()) return std::vector<Disc>(); else return UpdateLog.back(); } Color getCurrentColor() const return CurrentColor; unsigned getTurns() const return Turns; 直前の手で打った石と 裏返した石が並んだ vectorを返す 現在の手番の色を返す 現在の手数を返す

vectorについて サイズ可変な配列 1手目のupdate 2手目のupdate ・・・・ update 3手目のupdate 返された石の座標 ・・・・ 返された石の座標 n手目のupdate 新しく置いた石の座標

次回の予定 思考ルーチンについて 実際に動かせるようにしていく

参考文献 リバーシのアルゴリズム         著者  Seal Software

ご清聴ありがとうございました