c#井字游戏效率
本文关键字:效率 游戏 | 更新日期: 2023-09-27 18:16:51
我已经在c#中做了一个tic tac toe,但是我已经硬编码了一些行,所以我想知道是否有更有效的方法来做事情。
首先,我有一个PictureBoxes数组
PictureBox[] picBoxes = new PictureBox[NUM_OF_SPACES];
初始化为my pictures
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[]和赢家数组或其他东西。
保持你的游戏逻辑/棋盘表现和棋盘渲染分开。这将允许你更容易地扩展你的游戏,例如,如果你想添加AI。一种方法是将棋盘存储为整型或一对整型(您可以进行位掩码,但可能更容易为每个玩家设置一个)。然后,您可以将这些整数与已知的获胜位置进行与。
首先,正如Ananke所说,让你的游戏逻辑脱离你的呈现逻辑。
对于完成,你可以使用位棋盘(对不起,我不能帮助它,象棋开发者)。有不同的方法可以做到这一点,一种是有两个位板,每个玩家一个,另一种是有两个玩家的组合位板。
为了简单起见,我建议使用两个位板。
由于它是3 × 3板上的井字游戏,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
}
win条件应该放在一个数组中,这样你就可以遍历它们,而不是一个一个地检查它们。
您可以为此使用多维数组或锯齿数组,并逐行遍历条目https://msdn.microsoft.com/en-us/library/2yd9wwz4.aspxhttps://msdn.microsoft.com/en-us/library/2s05feca.aspx
var boxes = new YourObject[3,3];
或
var boxes = new YourObject[3][3];