C -战舰,随机的舰船位置

wbgh16ku  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(128)

所以,我必须在10x10的棋盘上制作一个用户vs电脑的战舰游戏,用于编程课。我必须让电脑随机放置5艘大小为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语句中的某个地方。我使用了调试器来查看导致问题的原因,我注意到2D阵列(coord)在遍历swotch语句时不会被修改,即使有足够的空间放置船只。(dirTest==0),但是即使dirTest在switch语句的末尾明显等于1,循环也不会结束。

i34xakig

i34xakig1#

你的格式没有帮助;请尝试采用更传统的风格。2然而,我能看到几个问题。

  • switch (dir)块中的break语句只有在if (nbCaseOk==lenShip-1)的计算结果为true时才能被访问。因此,当dir == 0为true时,您可能需要仔细阅读这段代码的每一部分。
  • 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)。
7kqas0il

7kqas0il2#

看起来在for循环的第一次运行时,countShip等于5,并且这个值没有在你的switch中处理,这意味着你没有给lenShip分配任何有意义的值。因为nbCaseOk==lenShip-1条件永远不会满足,所以你永远不会执行dirTest=1

相关问题