gpt4 book ai didi

C - 战舰,随机放置

转载 作者:行者123 更新时间:2023-12-02 01:07:48 25 4
gpt4 key购买 nike

所以,我必须在 10x10 的板上制作一个用户对计算机的 Battleship 游戏来上编程课。我必须让计算机随机放置五艘大小为 5、4、3、3 和 2 的船。

我所做的是,我生成了 0 到 9 之间的两个随机数作为我的 x 和 y 坐标,然后是第三个数字来决定船的放置方向。然后我使用一个 switch 语句来检查板上是否有足够的空间来首先放置船,如果有,则修改板阵列(好吧,无论如何这就是它应该做的)。

    int main(void)
{ int x,y, bato[5]={5,4,3,3,2}, NbCases=17, countShip, dir, lenShip, countCaseEmpt, countLenShip, nbCaseOk, countModCase,i, dirTest;
time_t t;

srand(time(&t));
// gestir(plato a, int * bato, int x, int y)

// plato coord={{5,3,2,2,2},{5,3},{5,3},{5,3},{5},{0},{1,1}};
// plato is a custom data type defined as "int plato[10][10]"
plato coord={0}; //plateau vide
i=0;

for (countShip=5 ; countShip>0 ; countShip--)
{
do{
i++;
printf("%d\n",i); //counter used to check if the do while loop worked at all

nbCaseOk=0;
dirTest=0;

do {x=abs(rand())%10; y=abs(rand())%10;} while (coord[y][x]!=0); //start coordinates selection

dir = rand()%4; //direction selection

switch (countShip){ //ship lenght determination
case 0: lenShip=2; break;
case 1: lenShip=3; break;
case 2: lenShip=3; break;
case 3: lenShip=4; break;
case 4: lenShip=5; break;}


switch (dir){ //empty case checker and square modifier
case 0: //right
{
if (x+lenShip-1<10)
for (countLenShip=1 ; countLenShip<lenShip ; countLenShip++)
if (coord[y][x+countLenShip]==0) nbCaseOk+=1;

if (nbCaseOk==lenShip-1) {dirTest=1;
for (countModCase=0 ; countModCase<lenShip ; countModCase++)
coord[y][x+countModCase]=countShip; break;}}

case 1: //up
{
if (y+lenShip-1<10)
for (countLenShip=1 ; countLenShip<lenShip ; countLenShip++)
if (coord[y+countLenShip][x]==0) nbCaseOk+=1;

if (nbCaseOk==lenShip-1) {dirTest=1;
for (countModCase=0 ; countModCase<lenShip ; countModCase++)
coord[y+countModCase][x]=countShip; break;}}

case 2: //left
{
if (x-lenShip+1>=0)
for (countLenShip=1 ; countLenShip<lenShip ; countLenShip++)
if (coord[y][x-countLenShip]==0) nbCaseOk+=1;

if (nbCaseOk==lenShip-1) {dirTest=1;
for (countModCase=0 ; countModCase<lenShip ; countModCase++)
coord[y][x-countModCase]=countShip; break;}}

case 3: //down
{
if (y-lenShip+1>=0)
for (countLenShip=1 ; countLenShip<lenShip ; countLenShip++)
if (coord[y-countLenShip][x]==0) nbCaseOk+=1;

if (nbCaseOk==lenShip-1) {dirTest=1;
for (countModCase=0 ; countModCase<lenShip ; countModCase++)
coord[y-countModCase][x]=countShip; break;}}
}} while (dirTest==0);


}

aff(coord);

while (NbCases>0)
{
printf("Rentrer une coordonnee x, puis une coordonnee y, comprises entre 0 et 9:"); //"enter a coordinate between 0 and 9 for x, then another one for y:
scanf("%d",&x); scanf("%d",&y);

NbCases+=gestir(coord, bato, x, y);
aff(coord);
}

printf("état bateau: %d\n nombre cases: %d",coord[0][0], NbCases); //ship state and number of empty squares
return 0;
}

我的问题是出现了无限循环。我很确定错误出在我的 switch 语句中。我使用调试器查看是什么导致了问题,我注意到在执行 swotch 语句时二维数组(坐标)没有被修改,即使有足够的空间放置飞船。我将 do while 循环的条件设置为 (dirTest==0),但即使在 switch 语句结束时 dirTest 明显等于 1,循环也不会结束。

PS:如果我的代码非常困惑,我真的很抱歉,今年之前我一生中唯一做过的编程是去年一些非常轻量级的 python。

最佳答案

您的格式没有帮助;请尝试采用更传统的风格。但是,我可以看到几个问题。

  • break switch (dir) 中的语句 block 仅在 if (nbCaseOk==lenShip-1) 时到达评估为真。因此,当 dir == 0 时,您有责任仔细阅读此代码的每个部分。 .

  • for (countShip=5 ; countShip>0 ; countShip--)可以,但是除非你有充分的理由倒数,否则使用 for (countShip=0; countShip<5 ; countShip++)反而。无论如何,countShip在您编写的代码中将具有 5、4、3、2 和 1 的值。不是 switch (countShip) 预期的 4、3、2、1、0代码块。我不确定 nbCaseOk 发生了什么在你的代码中,但也许你的循环没有退出,因为 lenShip永远不等于 2?

  • abs(rand())%10是多余的。就rand()%10很好。

  • 更笼统地说;你在这里重复了很多代码。尝试处理所有 dir具有相同代码的情况(例如,通过修改两个变量 dxdy )。

关于C - 战舰,随机放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46759446/

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