如何检查玩家是否在井字游戏中获胜?
How to check if player wins in tic-tac-toe game?
您好,
我在 Visual Studio Winforms 上工作,我正在尝试构建井字游戏。
我陷入了检查玩家是否获胜的方法。
我试图在激活时这样做。小例子:
private void StartForm_Activated(object sender, EventArgs e)
{
if ((_pcb1.Image == imagecircle) && (_pcb2.Image == imagecircle) && (_pcb3.Image == imagecircle))
{
MessageBox.Show("You Win!");
}
if ((_pcb4.Image == imagecircle) && (_pcb5.Image == imagecircle) && (_pcb6.Image == imagecircle))
{
MessageBox.Show("You Win!");
}
if ((_pcb7.Image == imagecircle) && (_pcb8.Image == imagecircle) && (_pcb9.Image == imagecircle))
{
MessageBox.Show("You Win!");
}
}
(我知道赢的情况更多)。
它永远不会进入方法,我试图找到一种在表单打开时始终处于活动状态的方法。请帮助:)
你应该在该玩家的每一步移动后检查该玩家的胜利。我假设您的玩家通过单击 "Make a Move" 按钮或单击游戏区域来移动。我还假设,您的按钮或游戏字段有 Click
事件。因此,您应该将检查代码粘贴到按钮或游戏字段的 Click
事件中。
下面是一些可以扩展到任何游戏大小的代码:
public class Level
{
private readonly Team[,] _game;
public Level(int extent)
{
_game = new Team[extent, extent];
}
public bool HasWon(Team team)
{
var yMax = GetYMax();
var xMax = GetXMax();
var won = false;
// check horizontally
for (var y = 0; y < yMax; y++)
{
won = false;
for (var x = 0; x < xMax; x++)
won |= _game[y, x] == team;
if (won) return true;
}
// TODO check vertically
// TODO check diagonally
return won;
}
public void SetTile(Team team, int x, int y)
{
var xMax = GetXMax();
var yMax = GetYMax();
if ((x < 0) || (x > xMax))
throw new ArgumentOutOfRangeException("x");
if ((y < 0) || (y > yMax))
throw new ArgumentOutOfRangeException("y");
_game[y, x] = team;
}
private int GetXMax()
{
var xMax = _game.GetUpperBound(1);
return xMax;
}
private int GetYMax()
{
var yMax = _game.GetUpperBound(0);
return yMax;
}
}
public enum Team
{
Red,
Blue
}
你要做的事情:
- 实施逻辑来检查一个团队是垂直获胜还是对角获胜
- 使用此 class 实现您的游戏,根据数组绘制图片
_game
(使其公开可用)
- 研究
|
OR 运算符以了解它在此处的使用方式:https://msdn.microsoft.com/en-us/library/6373h346.aspx
- 进一步调试代码(我没有:)
如果你想找到一些不断调用的方法,以检查玩家是否赢了,你可以创建一个每1毫秒运行一次的Timer
。那么 Timer.Tick
的事件处理程序就是这样一个方法。
但是,您不应该找到这样的方法来检查 winning/losing。每 1 毫秒检查一次是浪费资源。
想一想,什么动作会影响井字游戏的结果?当然是当任一玩家在棋盘上放置东西(X 或 O)时! 那个是你需要检查是否有人赢了的时候。还有,如果放的东西是X,就不用去检查下O的玩家是否赢了,因为那根本不可能!
此外,检查图片框中的图像是否等于 X 或 O 图像确实是 "non abstract" 代码。尝试把这些东西抽象成一个模型
您好, 我在 Visual Studio Winforms 上工作,我正在尝试构建井字游戏。 我陷入了检查玩家是否获胜的方法。 我试图在激活时这样做。小例子:
private void StartForm_Activated(object sender, EventArgs e)
{
if ((_pcb1.Image == imagecircle) && (_pcb2.Image == imagecircle) && (_pcb3.Image == imagecircle))
{
MessageBox.Show("You Win!");
}
if ((_pcb4.Image == imagecircle) && (_pcb5.Image == imagecircle) && (_pcb6.Image == imagecircle))
{
MessageBox.Show("You Win!");
}
if ((_pcb7.Image == imagecircle) && (_pcb8.Image == imagecircle) && (_pcb9.Image == imagecircle))
{
MessageBox.Show("You Win!");
}
}
(我知道赢的情况更多)。 它永远不会进入方法,我试图找到一种在表单打开时始终处于活动状态的方法。请帮助:)
你应该在该玩家的每一步移动后检查该玩家的胜利。我假设您的玩家通过单击 "Make a Move" 按钮或单击游戏区域来移动。我还假设,您的按钮或游戏字段有 Click
事件。因此,您应该将检查代码粘贴到按钮或游戏字段的 Click
事件中。
下面是一些可以扩展到任何游戏大小的代码:
public class Level
{
private readonly Team[,] _game;
public Level(int extent)
{
_game = new Team[extent, extent];
}
public bool HasWon(Team team)
{
var yMax = GetYMax();
var xMax = GetXMax();
var won = false;
// check horizontally
for (var y = 0; y < yMax; y++)
{
won = false;
for (var x = 0; x < xMax; x++)
won |= _game[y, x] == team;
if (won) return true;
}
// TODO check vertically
// TODO check diagonally
return won;
}
public void SetTile(Team team, int x, int y)
{
var xMax = GetXMax();
var yMax = GetYMax();
if ((x < 0) || (x > xMax))
throw new ArgumentOutOfRangeException("x");
if ((y < 0) || (y > yMax))
throw new ArgumentOutOfRangeException("y");
_game[y, x] = team;
}
private int GetXMax()
{
var xMax = _game.GetUpperBound(1);
return xMax;
}
private int GetYMax()
{
var yMax = _game.GetUpperBound(0);
return yMax;
}
}
public enum Team
{
Red,
Blue
}
你要做的事情:
- 实施逻辑来检查一个团队是垂直获胜还是对角获胜
- 使用此 class 实现您的游戏,根据数组绘制图片
_game
(使其公开可用) - 研究
|
OR 运算符以了解它在此处的使用方式:https://msdn.microsoft.com/en-us/library/6373h346.aspx - 进一步调试代码(我没有:)
如果你想找到一些不断调用的方法,以检查玩家是否赢了,你可以创建一个每1毫秒运行一次的Timer
。那么 Timer.Tick
的事件处理程序就是这样一个方法。
但是,您不应该找到这样的方法来检查 winning/losing。每 1 毫秒检查一次是浪费资源。
想一想,什么动作会影响井字游戏的结果?当然是当任一玩家在棋盘上放置东西(X 或 O)时! 那个是你需要检查是否有人赢了的时候。还有,如果放的东西是X,就不用去检查下O的玩家是否赢了,因为那根本不可能!
此外,检查图片框中的图像是否等于 X 或 O 图像确实是 "non abstract" 代码。尝试把这些东西抽象成一个模型