我正在使用C#.NET构建战舰游戏,它应该使用相当简单的得分机制。没有船只沉没,如果玩家或电脑得分17个命中,他们就赢了。如果你打中了,你可以再次轮到你。AI会随机攻击,直到它得分一个命中为止,然后它将在每个方向上攻击一个瓷砖,直到找到趋势,然后继续沿着直线攻击,直到找到死路(未占用空间或棋盘边缘)。如果在电脑攻击的相反方向上有未被攻击的空格,则它将攻击这些空格。它不会攻击已经攻击过的空格或遵循已经遵循的模式。
由于我无法确定出错的原因,导致问题变得非常混乱。如果我注释掉
然而,启用
没有使用
使用
提前感谢任何帮助。
编辑:我已经找到了问题所在,似乎它不能跳出
编辑2:它进入了第一个循环,并无限循环。由于某种原因,它完全没有增加
这是目前我的AI。
int shipCounter = 0, trend = 0;
static Random rnd = new Random();
bool gameOver = false, playerTurn = false;
int[] score = { 0, 0 };
struct gameData
{
public bool occupied, hit, marked;
}
gameData[,,] data;
public void computerMove()
{
Point target = seekTarget();
try
{
if (data[1, target.X, target.Y].hit)
computerMove();
else
{
data[1, target.X, target.Y].hit = true;
if (data[1, target.X, target.Y].occupied)
{
attacking = true;
score[0]++;
computerMove();
}
}
playerTurn = true;
}
catch (IndexOutOfRangeException)
{ computerMove(); }
}
public Point seekTarget()
{
Point origin = new Point(-1, -1);
//find a point that's been hit.
int x = 0, y = 0;
while (x < gridSize && y < gridSize)
{
if (data[1, x, y].hit && data[1, x, y].occupied && !data[1, x, y].marked)
{
origin = new Point(x, y);
break;
}
x++;
if (x == gridSize && y != gridSize)
{
x = 0;
y++;
}
}
return findTargets(origin);
}
public Point findTargets(Point origin)
{
Point[] lim = { origin, origin, origin, origin };
Point[] possibleTargets = { origin, origin, origin, origin };
//Find the edges.
while (lim[0].X >= -1 && ((!data[1, lim[0].X, lim[0].Y].hit && !data[1, lim[0].X, lim[0].Y].occupied) || (data[1, lim[0].X, lim[0].Y].hit && data[1, lim[0].X, lim[0].Y].occupied)))
{
lim[0].X--;
if (lim[0].X == -1)
break;
}
while (lim[1].Y >= -1 && ((!data[1, lim[0].X, lim[0].Y].hit && !data[1, lim[0].X, lim[0].Y].occupied) || (data[1, lim[0].X, lim[0].Y].hit && data[1, lim[0].X, lim[0].Y].occupied)))
{
lim[1].Y--;
if (lim[1].Y == -1)
break;
}
while (lim[2].X <= gridSize && ((!data[1, lim[0].X, lim[0].Y].hit && !data[1, lim[0].X, lim[0].Y].occupied) || (data[1, lim[0].X, lim[0].Y].hit && data[1, lim[0].X, lim[0].Y].occupied)))
{
lim[2].X++;
if (lim[2].X == gridSize)
break;
}
while (lim[3].Y <= gridSize && ((!data[1, lim[0].X, lim[0].Y].hit && !data[1, lim[0].X, lim[0].Y].occupied) || (data[1, lim[0].X, lim[0].Y].hit && data[1, lim[0].X, lim[0].Y].occupied)))
{
lim[3].Y++;
if (lim[3].Y == gridSize)
break;
}
//Cell targeting AI
}
return new Point(rnd.Next(10), rnd.Next(10));
}
由于我无法确定出错的原因,导致问题变得非常混乱。如果我注释掉
findTargets
函数并让计算机随机攻击,那么它就可以正常工作。计算机和玩家轮流攻击,计算机击中后,游戏会交换回合。然而,启用
findTargets
后,玩家只能进行一次攻击,而计算机不会接管回合。即使此时玩家的攻击准星仍然可见,游戏也没有返回到玩家回合。如果有人能提供帮助,将不胜感激。很抱歉没有包含Paint
或mouseDown
方法,因为它们超出了字符限制。没有使用
findTargets
的UI(玩家和计算机轮流攻击):
![](https://istack.dev59.com/SKpMA.webp)
findTargets
的UI(计算机无法接管回合,玩家只能攻击一次):
![](https://istack.dev59.com/LH8N7.webp)
编辑:我已经找到了问题所在,似乎它不能跳出
findTargets
中的while循环。即使当我解决了当origin
为(-1,-1)
时它无法停止循环的问题时,仍然会在第一次攻击中陷入循环。编辑2:它进入了第一个循环,并无限循环。由于某种原因,它完全没有增加
lim[0].X
。当我在循环中插入一个消息框来显示一些数据时,它会显示两次,然后不再出现,即使它仍在循环中。有人知道为什么吗?