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[]和赢家数组或其他东西。

c#井字游戏效率

保持你的游戏逻辑/棋盘表现和棋盘渲染分开。这将允许你更容易地扩展你的游戏,例如,如果你想添加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];