我在C#中做了一个tic tac toe,但是我已经对一些行进行了硬编码,所以我想知道是否有更有效的方法。
首先,我有一个PictureBoxes数组
PictureBox[] picBoxes = new PictureBox[NUM_OF_SPACES];
并用我的照片初始化
picBoxes = new PictureBox[] { picBox0, picBox1, picBox2, picBox3, picBox4, picBox5, picBox6, picBox7, picBox8 };
我想知道是否有更好的方法来检查谁赢得了使用我的图片盒阵容,因为目前我已经
if(picBox0.Tag == "X" && picBox1.Tag == "X" && picBox2.Tag == "X")
{
gameOver = true;
finalMessage = "X is the winner";
}
X为8次,O为8次。所以我想知道是否有更好的方法来检查谁赢得了使用数组,比如将picBox []与一系列获胜者比较。
答案 0 :(得分:5)
保持游戏逻辑/电路板表示和电路板渲染分离。这样您就可以更轻松地扩展游戏,例如如果你想添加AI。一种方法是将您的电路板存储为int或一对int(您可以使用位掩码,但每个播放器可能更容易)。然后,您可以将这些整数与已知的获胜位置进行对比。
答案 1 :(得分:3)
首先,正如Ananke所说,让你的游戏逻辑远离你的表现逻辑。
为了完成你可以使用位板(抱歉无法帮助它,我的象棋开发者)。有不同的方法,一个是有两个位板,每个玩家一个,另一个是两个玩家的组合位板。
为简单起见,我建议使用两个位板。
因为在3乘3的板上是tic-tac-toe 9位应该足够了,所以你可以通过常规int
实现这一点(再次保持简单)。板上的每个字段由整数字段中的位表示,编号1是第一位(最低有效位),字段编号2,下一个字段,依此类推。董事会的代表如下:
Field number: Field 1 | Field 2 | Field 3
Mask for field: 000000001 | 000000010 | 000000100
----------+-----------+----------
Field number: Field 4 | Field 5 | Field 6
Mask for field: 000001000 | 000010000 | 000100000
----------+-----------+----------
Field number: Field 7 | Field 8 | Field 9
Mask for field: 001000000 | 010000000 | 100000000
现在考虑一个游戏,其中棋盘上的情况如下:
X | O | X
X | O |
X | | O
两位板看起来如下所示,对于播放器1(X),它看起来像这样:001001101
而对于播放器2(O),它看起来像这样:100010010
。要检查获胜者,我们只需检查获胜条件模式的两位模式:
X | X | X | | | | X | | | X | | | X
| | X | X | X | | X | | | X | | | X
| | | | X | X | X X | | | X | | | X
0x003 0x038 0x1C0 0x049 0x092 0x124
000000111 000111000 111000000 001001001 010010010 100100100
X | | | | X
| X | | X |
| | X X | |
0x111 0x054
100010001 001010100
我们所做的就是为每个玩家迭代胜利条件,并检查是否满足其中任何一个。支票可能如下所示:
if ((boardPlayer1 & winCondition1) == winCondition1) {
// Player 1 has won, using winCondition1
}
else if ((boardPlayer2 & winCondition1) == winCondition1) {
// Player 2 has won, using winCondition1
}
胜利条件应该在一个数组中,这样你就可以循环遍历它们而不是逐个检查它们。
答案 2 :(得分:0)
您可以为此使用多维或锯齿状数组,并逐行迭代项目 https://msdn.microsoft.com/en-us/library/2yd9wwz4.aspx https://msdn.microsoft.com/en-us/library/2s05feca.aspx
var boxes = new YourObject[3,3];
或
var boxes = new YourObject[3][3];