はじめまして、リュウと申します。
現在、2人対戦型のテトリスを作っていて人間同士の対戦はできるようになったのですがCPUとの対戦がどう作ったらいいのかが分かりません。
ブロックを「何処にどの角度で落とせばいいのかを判断する関数」が作りたいのですがやり方がわかりません。
そのため現在は「ブロックを回さずに最もブロックのy座標が低くなる位置に落とす」というきわめて単純な関数になっています。
http://dixq.net/forum/viewtopic.php?f=3&t=2977
これを参考にして検索しましたが完成したものばかり出てきて具体的な作成法が見つかりません。
「ブロックの落とす場所を良い位置に決定する方法」の実装の仕方、もしくは、それが書いているサイトを教えてください。
よろしくお願いします。
テトリス風ゲームのAIについて
Re: テトリス風ゲームのAIについて
とりあえず、「全てのブロックの角度で最もブロックのy座標が低くなる位置に落とす」という風に改良するというところから始めてみませんか?リュウ さんが書きました: そのため現在は「ブロックを回さずに最もブロックのy座標が低くなる位置に落とす」というきわめて単純な関数になっています。
あまりいいアドバイスでなければすみません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: テトリス風ゲームのAIについて
>>みけCAT さん
ありがとうございます。
以前にも同様のことを試したのですができなくて挫折していましたが今回改めてやり直してみました。
ブロックを回す関数が間違っていたためできなかったことがわかりました。
その部分を修正したので「全てのブロックの角度で最もブロックのy座標が低くなる位置に落とす」の関数の実装ができました。
実行結果は14ライン消せるようになりました。大きな進歩だと思います。
しかし、新たな問題が見えてきました。
y座標の基準が4×4のブロックの1番上ということ、
全パターンを調べてこれまでで1番低くなるところよりも低くなればその場所を記録する、
この2つから下のような現象が起きてしまいます。
●●●●□○
□□□□□○
□□□□□○
□□□□□○
○の場所に落ちれば理想なのですが●の場所に落ちてしまいます。
これはまだ「同じ高さにおいて何処が1番よいかを判断する」ことができないからだと思います。
また、y座標の基準を1番下に変えた場合別の同様の現象が起きました。
http://www1.u-netsurf.ne.jp/~future/HTML/Tetris.html
上のサイトより「評価関数」というものを作って全パターンを評価すれば良いようですが、どうやって作ればいいのでしょうか?
「自作」なので「評価関数」自体はオリジナルのものにしたいのですがその元となる物の作り方がわからないので再び困っています。
ありがとうございます。
以前にも同様のことを試したのですができなくて挫折していましたが今回改めてやり直してみました。
ブロックを回す関数が間違っていたためできなかったことがわかりました。
その部分を修正したので「全てのブロックの角度で最もブロックのy座標が低くなる位置に落とす」の関数の実装ができました。
実行結果は14ライン消せるようになりました。大きな進歩だと思います。
しかし、新たな問題が見えてきました。
y座標の基準が4×4のブロックの1番上ということ、
全パターンを調べてこれまでで1番低くなるところよりも低くなればその場所を記録する、
この2つから下のような現象が起きてしまいます。
●●●●□○
□□□□□○
□□□□□○
□□□□□○
○の場所に落ちれば理想なのですが●の場所に落ちてしまいます。
これはまだ「同じ高さにおいて何処が1番よいかを判断する」ことができないからだと思います。
また、y座標の基準を1番下に変えた場合別の同様の現象が起きました。
http://www1.u-netsurf.ne.jp/~future/HTML/Tetris.html
上のサイトより「評価関数」というものを作って全パターンを評価すれば良いようですが、どうやって作ればいいのでしょうか?
「自作」なので「評価関数」自体はオリジナルのものにしたいのですがその元となる物の作り方がわからないので再び困っています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: テトリス風ゲームのAIについて
ソースコード見ていないので何とも言えませんが、落とす先のy座標でいちばん良いポイントを決めるべきだと思います。
あと、評価関数は落とした結果何個消えるかをシミュレートして、一番個数が消えるポイントを捜す関数が評価方法の1つだと思います。
わざと連鎖を目指すAIもありだと思いますが、大連鎖をわざと起こすようにAIを組むのはちょっと修業が必要かなと思います。
[補足]
結局AIプログラムは、自分の頭でゲームプレイ時に考えていることをプログラム化するものなので、自分の知らないテクニックをプログラム化をすることは出来ません。
その変わり先読みを正確に行ったり、自分より深く先読みさせたり、高速に先読みせることは可能ですね。
まず、自分がゲームプレイ時にやっていることをできるだけ正確に書きだして見ることから始めてみてください。
評価点をどのように付けるか定番パターンは無いので、自分で決めるしかありません。
頭の中でテトラミンを落とす時どっちが得か考えていると思いますが、別に点数つけて考えていませんし1つの点数だけで評価できるものでもないと思います。
その曖昧なものを曖昧さを許さないプログラムにするので、何かを削ったり評価方法を考えてやる必要があります。
それがAIを組む面白さであり、自分で考えて悪戦苦闘しないと意味のない所でもあります。
あと、評価関数は落とした結果何個消えるかをシミュレートして、一番個数が消えるポイントを捜す関数が評価方法の1つだと思います。
わざと連鎖を目指すAIもありだと思いますが、大連鎖をわざと起こすようにAIを組むのはちょっと修業が必要かなと思います。
[補足]
結局AIプログラムは、自分の頭でゲームプレイ時に考えていることをプログラム化するものなので、自分の知らないテクニックをプログラム化をすることは出来ません。
その変わり先読みを正確に行ったり、自分より深く先読みさせたり、高速に先読みせることは可能ですね。
まず、自分がゲームプレイ時にやっていることをできるだけ正確に書きだして見ることから始めてみてください。
評価点をどのように付けるか定番パターンは無いので、自分で決めるしかありません。
頭の中でテトラミンを落とす時どっちが得か考えていると思いますが、別に点数つけて考えていませんし1つの点数だけで評価できるものでもないと思います。
その曖昧なものを曖昧さを許さないプログラムにするので、何かを削ったり評価方法を考えてやる必要があります。
それがAIを組む面白さであり、自分で考えて悪戦苦闘しないと意味のない所でもあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: テトリス風ゲームのAIについて
>> softya(ソフト屋)さん
ありがとうございます。
結局、自分で納得のいくものが作ることができればそれでいいってことですね。
「見本を元に自分なりにアレンジを加えていく」という風に考えていましたが、それではその見本の作者の味が入っていて完全な自分のものとはならないですね。
完成するにはまだまだ時間がかかりそうですがじっくりと作って行きたいと思います。
softya(ソフト屋) さん、みけCAT さん、 ありがとうございました。
ありがとうございます。
結局、自分で納得のいくものが作ることができればそれでいいってことですね。
「見本を元に自分なりにアレンジを加えていく」という風に考えていましたが、それではその見本の作者の味が入っていて完全な自分のものとはならないですね。
完成するにはまだまだ時間がかかりそうですがじっくりと作って行きたいと思います。
softya(ソフト屋) さん、みけCAT さん、 ありがとうございました。