我正在尝试创建一个基本的tic tac toe游戏。当我第一次创建这个时,用户会点击一个图像框,然后该图像框将变为相应的玩家计数器。图像位置将存储在变量中,并应用类似于:
string Cross = "ProjectFile/etc/..";
Image1.ImageLocation = Cross;
为了看看玩家是否完成了三行,我有2个if语句,一个用于十字架,一个用于圆圈:
if(image1.ImageLocation == Cross && Image2.ImageLocation == Cross && Image3.ImageLocation == Cross)
{
//Display message box, you've won etc.
}
这很好用,但我意识到在发布此文件时,图像位置不会存在于另一台计算机上。所以我将图像放入资源文件中。并像这样使用它们:
Position1.Image = Properties.Resources.Cross;
这在将图像加载到游戏上时工作正常但是当检查玩家是否赢了,它不能识别完整的行时,我正在使用这样的if语句:
if ((Position1.Image == Properties.Resources.Cross && Position2.Image == Properties.Resources.Cross && Position3.Image == Properties.Resources.Cross) || //etc.
如何查看图片框所使用的图像是否与资源文件中的图像相同?
答案 0 :(得分:2)
我会重新构建游戏逻辑,不检查图像,而是创建一个int
值的3x3矩阵。然后将空白分配为0,将X分配为1,将O分配为2.(更新:现在enum
值)
在图像框OnClick
事件上,拍摄特定图像框,将其索引计算到矩阵中,并将值设置为适当的值。然后检查是否有胜利者。
获胜逻辑可以是这样的:(更新为enum
而不是int。感谢Matt Burland!)
enum TicTacToeSquare
{
Blank,
X,
O
}
...
private TicTacToeSquare[][] _board;
...
public bool IsWinner(TicTacToeSquare player)
{
if(player == TicTacToeSquare.Blank)
return false;
if(_board.Any(i => i.All(ii => ii == player)))
return true;
for(int i = 0; i < 3; i++)
{
if(_board.All(item => item[i] == player))
return true;
}
if(_board[0][0] == _board[1][1] && _board[1][1] == _board[2][2])
return true;
if(_board[0][2] == _board[1][1] && _board[1][1] == _board[2][0])
return true;
return false;
}
这只是一个快速刺伤,我会在你最终确定它之前检查它。
答案 1 :(得分:0)
您正在尝试比较参考。 Position1.Image
是对该图像的引用,Properties.Resources.Cross
是不同的引用,可能是同一图像,但也可能不是。我会创建一个包含某种图像ID或图像名称的新对象,而不是直接比较图像,比较名称或ID。或者,您可以覆盖Equals
和GetHashCode
方法,以便直接比较2个图像对象,但这比OOP时更喜欢做的工作。