gpt4 book ai didi

c# - 战舰 AI - 完全迷失

转载 作者:太空狗 更新时间:2023-10-30 01:21:07 26 4
gpt4 key购买 nike

<分区>

我正在使用 C#.NET 构建战舰游戏。它应该使用相当简单的评分机制。没有船沉没,如果玩家或计算机获得 17 次命中,则他们获胜。如果你命中,你可以再转一圈。 AI随机攻击直到命中,此时它会在每个方向攻击一个瓷砖直到找到趋势,然后继续直线攻击直到找到死胡同(未被占用的空间或边缘)板。如果在计算机攻击的相反方向上有未被击中的空间,它将攻击这些空间。它不会瞄准它已经击中的空间或遵循已经遵循的模式。

到目前为止,这是我的 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 后,玩家可以进行一次攻击,而计算机永远不会轮到它。然后它不会恢复到玩家回合,即使玩家的攻击十字准线仍然可见。如果有人可以提供帮助,将不胜感激。抱歉没有包含 PaintmouseDown 方法,它们超出了字符限制。

没有 findTargets 的 UI(播放器和计算机交换)。

带有 findTargets 的 UI(计算机无法轮流,玩家只能轮流一次)。

在此先感谢您的帮助。

编辑: 我已经确定了问题所在,它似乎无法跳出 findTargets 中的 while 循环。即使我通过在 origin(-1, -1) 时停止循环来解决问题,它也会在第一次命中时陷入循环。

编辑 2: 它会触发第一个循环,然后无限循环。出于某种原因,它根本不会增加 lim[0].X。当我在循环中插入一个消息框以显示一些数据时,它显示两次然后不再出现,即使它仍在循环中。有谁知道这是为什么吗?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com