C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: リバーシ(オセロ)の配列の仕方


(過去ログ 131 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■77348 / inTopicNo.1)  リバーシ(オセロ)の配列の仕方
  
□投稿者/ KH (1回)-(2015/10/11(Sun) 13:12:26)

分類:[C#] 

リバーシ(オセロ)のAIを作っています。
オセロのマス目は a1 b2 と表記し
アルファベットは横、数字は縦を表します。
しかし、盤面を配列にすると

ban = new int[8, 8]{
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 2, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 2, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 } };

一番目が縦、二番目が横になってしまいます。
これをうまく縦横統一したやり方はないものでしょうか?

ご存知の方がいらっしゃいましたらアドバイスいただけましたら幸いです。

なお、また、自分のトピックが見つからず3回目になってしまいました。
申し訳ないです。
引用返信 編集キー/
■77352 / inTopicNo.2)  Re[1]: リバーシ(オセロ)の配列の仕方
□投稿者/ よもやま (6回)-(2015/10/11(Sun) 14:29:04)
No77348 (KH さん) に返信
> リバーシ(オセロ)のAIを作っています。
> オセロのマス目は a1 b2 と表記し
> アルファベットは横、数字は縦を表します。
> しかし、盤面を配列にすると
> 
> ban = new int[8, 8]{ 
> { 0, 0, 0, 0, 0, 0, 0, 0 }, 
> { 0, 0, 0, 0, 0, 0, 0, 0 }, 
> { 0, 0, 0, 0, 0, 0, 0, 0 }, 
> { 0, 0, 0, 2, 1, 0, 0, 0 }, 
> { 0, 0, 0, 1, 2, 0, 0, 0 }, 
> { 0, 0, 0, 0, 0, 0, 0, 0 }, 
> { 0, 0, 0, 0, 0, 0, 0, 0 }, 
> { 0, 0, 0, 0, 0, 0, 0, 0 } };
> 
> 一番目が縦、二番目が横になってしまいます。
> これをうまく縦横統一したやり方はないものでしょうか?
うまく縦横統一という方向性がよくわからないです。
画面上表記の問題?
プログラムコード的には、二次元配列ban[8, 8]をban[x, y]と使おうがban[y, x]として使おうが製作者次第なので。。



引用返信 編集キー/
■77355 / inTopicNo.3)  Re[2]: リバーシ(オセロ)の配列の仕方
□投稿者/ よもやま (7回)-(2015/10/12(Mon) 18:29:19)
No77352 (よもやま さん) に返信

> 画面上表記の問題?
> プログラムコード的には、二次元配列ban[8, 8]をban[x, y]と使おうがban[y, x]として使おうが製作者次第なので。。

#縦横統一というのがどういった内容で縦横統一と判断されるのか不明瞭なので
#想像の域をでませんが。。
#仮にWindows FormでAIの動作を見るためplayer Vs AIの実装をするとします。

画面側
盤面をreversiBoard
升目をa1, b1, etc

〜実装の仕方1〜
///升目"a1"に白Or黒を配置
private void a1_Click(object sender, EventArgs e)
{
    reversiBoard.Select("a1");
}
///升目"b1"に白Or黒を配置
private void b1_Click(object sender, EventArgs e)
{
    reversiBoard.Select("b1");
}
と升目ごとに石(白Or黒)を配置する際の実装を上記で行うことが縦横統一?

〜実装の仕方2〜
盤面をreversiBoard
盤面上から得られる升目をcellEntity
盤面の石に対する挙動を管理するのをreversiController

private void reversiBoard_Click(object sender, EventArgs e)
{
    //senderから升目情報を取得
    //reversiBoard_Clickは、盤面上の全ての升目に対するクリック動作時に呼び出されるようClickイベントに割り当てられているとする。
    cellEntity cellinfo = (cellEntity)sender.tag;
    //取得した升目情報を元に、盤面に石を配置できるかの判定などを行い、石を配置した後の挙動を制御する
    reversiController.Select(cellinfo);
}
実装の仕方2は、
・各升目に"a1"や"b1"といった情報をtagプロパティに初期値として格納する
・InitializeComponentやForm_Loadに際して、各升目のtagプロパティにcellEntityを生成し格納する
いずれかの方法でコード上に統一感を持たせる必要があります。

AI側の設計、実装として二次元配列を使うとした場合、
内部データ構造と升目との対応付けは必要です。
AIが石の配置場所として升目"a1"や"b1"でやり取りしたいのであれば二次元座標と升目との変換は避けることはできないと思います。


引用返信 編集キー/
■77356 / inTopicNo.4)  Re[3]: リバーシ(オセロ)の配列の仕方
□投稿者/ 774RR (321回)-(2015/10/13(Tue) 11:40:11)
思考ルーチンまで作り始めると、盤面データの内部実装は 8x8 ではなくて 10x10 のほうが楽/高速
(盤面データに「打禁止」を用意すると、打位置の盤面外のチェックが不要になる)

なのでそもそも「ソースコード上の盤面データ」と「実盤面データ」が1対1対応してる必要は無い
っつか、意味ないっつか。

引用返信 編集キー/
■77782 / inTopicNo.5)  Re[4]: リバーシ(オセロ)の配列の仕方
□投稿者/ KH (8回)-(2015/11/22(Sun) 23:13:14)
皆さまご回答いただき誠にありがとうございます。
すいません。しばらくこのスレを見落としてました。
今は縦を横、横を縦として頭の中で変換しながらやっています。
頭の中がごっちゃになって間違っていそうで怖いのでもっとうまい方法があればいいのですが
募集は閉め切らせていただきます。どうも失礼いたしました。
解決済み
引用返信 編集キー/
■77783 / inTopicNo.6)  Re[2]: リバーシ(オセロ)の配列の仕方
□投稿者/ シリウス (1回)-(2015/11/22(Sun) 23:37:48)
2015/11/22(Sun) 23:41:28 編集(投稿者)
2015/11/22(Sun) 23:41:17 編集(投稿者)

<pre><pre>解決済み付いてるけど。

恐らく気になってるのはここだろうと仮定して。

> プログラムコード的には、二次元配列ban[8, 8]をban[x, y]と使おうがban[y, x]として使おうが製作者次第なので。。

int check(x, y) {
return ban[y, x];
}

とか適当な関数作れば良いのでは。



追記

二重ループの順番が気持ち悪いに関しては諦める方が良いかも。
すぐ慣れるし、こんな所に引っかかってる時間がもったいないので。
</pre></pre>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -