現在オセロプログラミングの基礎部分は出来上がり、人対人ならできるようになりました。
JButtonを利用し、打つことが出来ない部分は.setEnabled(false)を使うことでボタンを押せないようなエラー処理をしております。
とりあえず打つことが出来るマスからランダムで打つ場所を選択するCPU部分を実装したいのですが、どのような方法を取ればよいでしょうか。
もし、何か他に現在出来上がってる部分についての情報が必要であれば追加で書き込みますのでコメントをいただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
今作っているプログラムがどういう構造になっているかはわかりませんが、いいプログラムにしていくために重要な点をお伝えします。
インターフェースの抽出というお話です。
大まかな話ですが、「ゲームの進行役」という存在がいるとしましょう。現在の手番のプレーヤーに盤面を示してどこに打ちたいか指し手を返してもらいます。そして指し手に従って自分の持っている盤面を変化させ、次の手番のプレーヤーを決定します。
さて、ゲームの進行役にとってプレーヤーが人間であるかどうかCPUであるのかはどうでもいいことです。人間であろうがCPUであろうが、盤面に対して合法手を返してくれればそれでいいのです。
つまり、ゲームの進行役が相手をしているのは人間でもCPUでもなく、「プレーヤー」であると言えます。これがインターフェースの抽出です。
コードで書いてみましょう。
java
1/** プレーヤーを表すインターフェース */ 2interface Player { 3 /** 盤面を受け取って指し手を返す */ 4 Position move(Board board); 5} 6 7/** 人間を表すクラス */ 8class Human implements Player { 9 /** 盤面を受け取って指し手を返す */ 10 Position move(Board board) { 11 // GUIを操作して打つ位置を受け取るようなコードを書きます。 12 // もちろん、合法な手でない入力をされた場合には再入力させます。 13 } 14 15 // 以下、必要なプライベートフィールドとかプライベートメソッドとか 16} 17 18/** CPUを表すクラス */ 19class Cpu implements Player { 20 /** 盤面を受け取って指し手を返す */ 21 Position move(Board board) { 22 // 盤面の空いているマスのうち、合法な手をランダムに選んで返すようなコードを書きます。 23 } 24 25 // 以下、必要なプライベートフィールドとかプライベートメソッドとか 26}
こんな風にクラスが作れるわけです。
人間の操作の部分、たぶん今の構造はこうなってはいないでしょうから大分書き直すことになるでしょうけど。
この形にしたら、Cpuクラスのmoveメソッド内、
// 盤面の空いているマスのうち、合法な手をランダムに選んで返すようなコードを書きます。
を埋めるだけです。できる気がしてきませんか?
投稿2015/12/03 08:41
総合スコア5568
0
全領域を探索して相手が打てる場所をリストに格納して,そのリストの添字に乱数でアクセスすればよいのではないでしょうか?
マス目全体を管理するclass Boardのインスタンスboardの中に,各マスを管理するclass Squareのインスタンスの配列sqがあるとします.クラス名などはご自分のものに読み替えてください.
java
1Random rnd = new Random(); 2ArrayList<Square> sqArr = new ArrayList<Square>(); 3for (int i = 0; i < 8; i++) 4 for (int j = 0; j < 8; j++) 5 if (board.sq[i][j].isBlank() && board.canPut(i, j, cpu)) 6 sqArr.add(board.sq[i][j]); 7Square cpuHand = sgArr.get(rnd.nextInt(sgArr.size()));
別解として,すでにコマが置いてある場所を保存するリストと,コマが置いていない場所を保存するリストを作っても良いかもしれません.リストアクセスのため若干遅くなりますが,探索場所が減るので高速になるかもしれません.
投稿2015/12/03 09:18
総合スコア751
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/03 12:54
2015/12/05 04:03