ページ 11

リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 14:17
by tk-xleader
暇だったんで作ってみました。

https://www.webfile.jp/dl.php?i=388372& ... c348a882d8

からダウンロードできます。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 15:20
by 管理人
おぉ、素晴らしい。
この敵のアルゴリズムはどうやって計算されてるんですか?

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 15:31
by tk-xleader
単純にその場で一番多く取れる場所を選択しているだけです。
もっと強くしようと思ったら、これをいくらか繰り返して、先読みするという方法が考えられるのですが、複雑すぎると大変だなぁと思って、一番楽なアルゴリズムを実装しました。

描画にはDxライブラリを使っています。

ソースコードをアップします。(まぁしかしこんな汚いコードをよく公開する気になるな。っ手ほど汚いですが…)

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 15:53
by 管理人
なるほど、ぷよぷよ作ったときもそんな風にシミュレートしました。
やっぱ適切な方法をとるにはGAみたいなアルゴリズムを組まないといけないんですかねぇ。
連鎖のプログラムはついに解らずに断念しましたし、
AIプログラムってホント難しいですよね。
将棋は未だに勝てないらしいですし、ゲームで一番難しいAIは将棋のAIなのかな?

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 16:18
by tk-xleader
早速バグ発見です。

https://www.webfile.jp/dl.php?i=388372& ... c348a882d8

から、修正版をダウンロード出来ます。

ちなみに、ソースコードのうち、「Debugs.cpp」と「Debugs.h」はWindowsプログラムでバグ修正を効率よくやろうと作ったものです。
ご自由に使ってもらっていいですよ。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 16:25
by array
遊ぼうとしたらクリックが反応しませんでした><; 操作手順はクリックで良いんですよね。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 16:34
by tk-xleader
>arrayさん

はい、駒をおきたいところにクリックするだけです。忘れてた、パスは右クリックです。

>管理人さん

http://ja.wikipedia.org/wiki/%E3%82%B3% ... 6%E6%A3%8B

どうなんでしょうか、確実に進化はしているようです。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 16:45
by 管理人
あぁそれ見ましたよw

>2008年現在ではコンピュータ将棋は、プロの底辺レベルに達したとみなされているものの、プロのトップレベルの実力には依然達していない。

って書いてありますし、プロのトップに勝つにはまだ難しそうですね。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 17:07
by KEV
遊ばせてもらいましたー。
参考になります。
俺オセロよぇぇ…

COMの計算速度が一定なのを見る限り
毎回全部のセルで判定してるのかな。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 17:09
by tk-xleader
将棋は指せるのは指せるのですが…滅茶苦茶弱いですよ。

しかし弱いなぁ(自分で作っといて!?)…、普通にこんな状態になります。

ちなみに、「オセロ」は商標なんですよね。それで一応避けています。
http://ja.wikipedia.org/wiki/%E3%82%AA% ... %E6%88%AF)
によると、最高性能のオセロAIはすでに正解チャンピオンですらかないません。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 17:11
by tk-xleader
>KEVさん

COMはわざとウェイトかけてます。こうすれば少し雰囲気出るかな?と思って…
実際に全セル計算してはいますが、それでも全く速度は気になりません。(処理落ちはあまり重視してません。)

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 17:16
by KEV
あぁそうだったんですね。
確かにゲームには雰囲気は大事ですよね。

同時に5個以上取られる場合はウェイトを長くするとかにすると
やらしさがアップしそうです(ぇ。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 17:23
by tk-xleader
ウェイトかけてるのは、もうひとつ理由があって、このウェイトを外すと、プレイヤーがパスした時に、連続パスになってしまうので、ここで調整できるようにしてあります。

ちなみに、角を取る事を意識すれば、だいぶ違いますよ。COMは取れる数の事しか考えません(角を取りにいかない。)から…

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 18:39
by toyo
昔ASCIIという雑誌でコンピュータオセロの対決をしてたのを思い出しました
当事から森田さんの作ったプログラムがかなり強かったですね
その後も森田オセロはいろいろなハードで出ましたし
当事はPC88やPC98の時代でしたが今のCPUなら終盤の局面ではかなり手前から総当りの最良手順が計算できるのではないでしょうか
将棋やチェス、オセロのようなゲームを「二人・零和・有限・確定・完全情報・ゲーム」というらしいですがこういうゲームのアルゴリズムにはα-β法というのが有効なようです。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 19:40
by nayo
オセロはコンソール画面でできる簡単なゲームはないかと考えて作りましたね
端から内側へ2番目、四隅の隣の位置におかないように意識するだけで結構勝てるかと思います
ただ序盤は負けてるように見えますけど

しかし敵のアルゴリズムを考えるのは難しいですね

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 20:00
by Hermit
DXライブラリを入れていないからでしょうかね?
駒が表示されないんだけど・・・実行方法が変でしょうか?
(デスクトップにおいています)

あと、全部一色になったとき(途中で置く場所がなくなったとき)
勝ち負けの判定は必要だと思います。
まともに勝負しようとすると、必ず全部自分の色になって次が置けなくなるので。

まあ、ゲームと思わず、ソースを見るだけのものであればそれはそれで有りかとも思いますが(^^;

そういえば・・・リバーシとは駒の置き方ちがいません?
(金田はじめちゃん・・・だったっけ? の事件簿では・・・)

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 21:01
by tk-xleader
>リバーシとは駒の置き方ちがいません?

リバーシは「オセロ」を含むゲームの総称としても使われています。その意味で使っています。

http://ja.wikipedia.org/wiki/%E3%82%AA% ... C.E3.82.B7

>駒が表示されないんだけど・・・実行方法が変でしょうか?

付属の、「Piece」というフォルダがあるはずですが、それは同じ場所においているでしょうか?
また、Dxライブラリはスタティックリンクなライブラリなので、特にランタイムが必要でもないはずです。(DirectX7が必要ではあります。)

>あと、全部一色になったとき(途中で置く場所がなくなったとき)
>勝ち負けの判定は必要だと思います。
>まともに勝負しようとすると、必ず全部自分の色になって次が置けなくなるので。

パスすると、COMもパスをするはずなので、それで勝負が決まるはずです。

>まあ、ゲームと思わず、ソースを見るだけのものであればそれはそれで有りかとも思いますが(^^;

…?? どういうことでしょうか?

Re:リバーシゲームを作ってみました。

Posted: 2008年8月21日(木) 21:28
by Hermit
パスが必要だったんですね。失礼しました。

で、フォルダーの状態ですが、

ls した状態ですと、

C:\Users\usr.usr-PC.000\Desktop\Reversi>ls -R
.:
Log.txt Piece Readme.txt Reversi.exe

./Piece:
Brack.bmp Thumbs.db White.bmp

の様になります。
OS は Windows Vista Home Premium

>…?? どういうことでしょうか?
バグ出しの為のアップかなと思ったということです。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月22日(金) 10:08
by tk-xleader
>バグ出しの為のアップかなと思ったということです。

まぁこのゲーム自体は本格的な開発ではありませんし、話のネタにでもなるかな~、と思って作ったものですから…

>OS は Windows Vista Home Premium

VistaではDxライブラリは最新版である必要があるみたいです。出来ればデスクトップ以外のところに置いたほうがいいとは思うのですが…

https://www.webfile.jp/dl.php?i=388372& ... c348a882d8

とりあえず、最新版のダウンロードをしてみてください。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月22日(金) 16:12
by lbfuvab
う~ん、リバーシのAIは見た事ないですが
チェスならオープンソースなのがいくつかありますね。
ex) GNU chess , Crafty

Re:リバーシゲームを作ってみました。

Posted: 2008年8月22日(金) 16:57
by kusites
kusites

Re:リバーシゲームを作ってみました。

Posted: 2008年8月22日(金) 17:19
by tk-xleader
>リバーシのAIは見た事ないですが
>チェスならオープンソースなのがいくつかありますね。

ゲーム自体はオセロに準じています、商標の問題でリバーシという名称を使用しています。
しかし、僕のはたぶん最弱のAIでしょう。だって取れる駒の数しか考えないんですから…(なぜ角を取らない!?)

ただ…、この最弱のAIに駒の全取りを一度もしたことがないんですよ、どんだけ弱いんだろう…

Re:リバーシゲームを作ってみました。

Posted: 2008年8月22日(金) 21:26
by lbfuvab
AI作成の助けになるようなサイトを発見しました。
http://hitsujiai.blog48.fc2.com/blog-entry-26.html
なかなか斬新です。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月23日(土) 01:27
by tk-xleader
確かに、僕のは評価関数なる手法をとってませんからねぇ、弱いのも当然です。

逆に、このAIに対してどこまで滅多打ちできるかというのが僕としては気になります。(こんな弱小オセロマシンにパーフェクトで勝ってみたい。)

Re:リバーシゲームを作ってみました。

Posted: 2008年8月25日(月) 21:46
by 組木紙織
以前私が作ったリバーシです。
AIの判定は確か順番に取れるかどうか確認をして行って一番最初に取れるところに置いています。
うまくやればパーフェクトで勝てます。

C++ Windows SDKで作っています。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月25日(月) 22:29
by array
>組木紙織さん

遊ばせてもらいました。

なんか凄い致命的そうなバグが・・・・(多分

取れる位置なら相手の駒の上にも置けちゃうのですが(笑

途中で全部黒にしてやりました^^

Re:リバーシゲームを作ってみました。

Posted: 2008年8月26日(火) 07:07
by 組木紙織
それ多分仕様です。(笑)
気になるのなら、
ソースコードもあったと思うので、自由に改造してくれて構いません。
なんならAIを強くしてもらっても。

何せ一年以上前のことなので、どんな設計にしたかとか、どこまで完成させたとか一切忘れています。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月26日(火) 11:02
by tk-xleader
遊ばせてもらいました。

一応勝てるんですけど、全くパーフェクトなんて程遠い状態です。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月26日(火) 13:52
by たかぎ
さっきやってみたらパーフェクトでした。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月26日(火) 15:31
by GPGA
同じくパーフェクトいただきました。
ところで、相手の駒を全部埋めた時点をパーエフェクトと言っていいんですかね?

マスをすべて埋めると同時に相手の駒をすべて埋めるのをパーフェクトと呼ばれると
かなり難しいですね。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月27日(水) 18:18
by バグ
DXライブラリ版とSDK版が発表されてるので、MFC版でも作ってみようかな…(笑)

Re:リバーシゲームを作ってみました。

Posted: 2008年8月27日(水) 18:19
by バグ
それから、コンソール版とかも(笑)

Re:リバーシゲームを作ってみました。

Posted: 2008年8月27日(水) 20:28
by Hermit
最新版、Vista のデスクトップに置いても、表示は良いようです。

報告遅れてすいません。
ちょっと、ジュニアオリンピックの役員研修で大阪に出かけていたもので。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月28日(木) 00:47
by tk-xleader
>最新版、Vista のデスクトップに置いても、表示は良いようです。

報告ありがとうございます。とりあえずバグはなし、ということでよさそうですね。

>DXライブラリ版とSDK版が発表されてるので、MFC版でも作ってみようかな…(笑)
>それから、コンソール版とかも(笑)

なるほど、なら.NETでも…、といいたいところですが、.NET言語の中でポピュラーなC#とVB…、どっちも書けないんですよ…
でも、さまざまなバージョンができると、この先オセロ/リバーシゲームに関する質問が減りそうです。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月28日(木) 01:47
by たかぎ
> DXライブラリ版とSDK版が発表されてるので、MFC版でも作ってみようかな…(笑)
> それから、コンソール版とかも(笑)
> なるほど、なら.NETでも…

だったらCGI版でも作りましょうか...

> といいたいところですが、.NET言語の中でポピュラーなC#とVB…、どっちも書けないんですよ…

GUIだけC#やC++/CLIで作って、内部処理はC/C++で作るのがよいでしょうね。

Re:リバーシゲームを作ってみました。

Posted: 2008年8月28日(木) 09:42
by バグ
>>tkmakwins15さん
質問自体の数は変わらないんじゃないでしょうか?
実際、リバーシのコアの部分はそんなに難易度の高いものではないですし…
こういったプログラムの場合は、むしろCPUのアルゴリズムの方が本体っぽいですよね(苦笑)

Re:リバーシゲームを作ってみました。

Posted: 2008年8月28日(木) 09:54
by tk-xleader
>こういったプログラムの場合は、むしろCPUのアルゴリズムの方が本体っぽいですよね(苦笑)

確かに、AIづくりが一番大変なところですね。

>GUIだけC#やC++/CLIで作って、内部処理はC/C++で作るのがよいでしょうね。

うーん、それはC#の場合は、C#でGUIを作って、内部処理に関してはDLLImportで呼び出すということでしょうか?

Re:リバーシゲームを作ってみました。

Posted: 2008年8月28日(木) 10:52
by たかぎ
> うーん、それはC#の場合は、C#でGUIを作って、内部処理に関してはDLLImportで呼び出すということでしょうか?

あるいは、インタフェース部分だけC++/CLIにするかです(その程度なら簡単です)。