C#Tic Tac Toe效率

时间:2015-10-09 12:24:44

标签: c#

我在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 []与一系列获胜者比较。

3 个答案:

答案 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];