因此,我必须在10x10的板上制作一个用户对战计算机战舰游戏,以进行编程 class 。我必须让计算机随机放置五艘大小分别为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语句时2D数组(坐标)也没有被修改。
我将do while循环的条件设置为(dirTest == 0),但是即使dirTest在switch语句的末尾明显等于1,循环也不会结束。

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

最佳答案

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

  • 仅当break评估为true时,才会到达switch (dir)块内的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)。
  • 08-19 01:41