【问题标题】:Program printing different co ordinates from the ones I generated for it程序打印与我为它生成的坐标不同的坐标
【发布时间】:2019-11-16 14:46:52
【问题描述】:

基本上,我需要我的程序将我手动输入的点放置在网格上(这很好),然后在同一个网格上随机放置一个点,并根据用户请求重复多次。目前,我的代码会打印计算机选择的数字,但不会将它们放在网格上,直到我输入另一个数字并按 Enter 键,然后将其放置在看似随机的位置。 这是我的代码

void placeCShip(){
    int a,b;
    srand(time(NULL));
    a = printf("%d\n", rand()%15);
    b = printf("%d\n", rand()%15);
    scanf("%d, %d", &a, &b);
    if (grid[a][b] == SEA, grid[a][b] != PSHIP){
        grid[a][b] = CSHIP;
    }
}

这是重复它的函数,当我排除 Cships 时它工作得非常好,当我包含它时 Pships 仍然工作,但是 Cships 没有给出正确的坐标

void placePShips(){
    int i,fleetSize;
    printf("\nEnter fleet size : ");
    scanf("%d", &fleetSize);
    for(i=0;i<fleetSize;i++){
        placePShip();
        placeCShip();
        printGrid();
    }
}

我尝试过的;

完全删除 printf,只使用 rand 函数,解决了告诉我随机坐标的问题,但我仍然需要输入另一个数字并单击 enter 才能出现

完整代码:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define MAXGRIDSIZE 15
#define SEA '.'
#define PSHIP 'P'
#define CSHIP 'C'
#define BOMB '*'
#define SUNKENSHIP 'v'

unsigned char grid[MAXGRIDSIZE][MAXGRIDSIZE];


//F1
void printGrid(){
    int x, y;
    printf("\n");
    for(y=0; y<MAXGRIDSIZE; y++){
        printf("%2d", y);
        for(x=0; x<MAXGRIDSIZE; x++){
            printf("%3c", grid[y][x]);
        }
        printf("\n");
    }
    printf("%2c", ' ');
    for(x=0; x<MAXGRIDSIZE; x++){
            printf("%3d", x);
    }
    printf("\n");
}

//F2
void initGrid(){
    int x, y;
    for(y=0; y<MAXGRIDSIZE; y++){
        for(x=0; x<MAXGRIDSIZE; x++){
            grid[y][x] = SEA;
        }
    }
}

//F3
void placePShip(){
    int x,y;
    printf("\nEnter Ship location: x , y: ");
    scanf("%d , %d", &x, &y);
    if (grid[y][x] == SEA){
        grid[y][x] = PSHIP;
    }
}

//F4
void placeCShip(){
    int a,b;
    srand(time(NULL));
    a = rand()%15;
    b = rand()%15;
    scanf("%d, %d", &a, &b);
    if (grid[a][b] == SEA, grid[a][b] != PSHIP){
        grid[a][b] = CSHIP;
    }
}


//F5
void placePShips(){
    int i,fleetSize;
    printf("\nEnter fleet size : ");
    scanf("%d", &fleetSize);
    for(i=0;i<fleetSize;i++){
        placeCShip();
        placePShip();
        printGrid();
    }
}

//F6
int main(){
    initGrid();
    printGrid();
    placePShips();
    printGrid();

    return 0;
}

【问题讨论】:

  • 您的代码中有更多对scanf() 的调用,但您未显示。请发minimal reproducible example
  • 什么是SEA,? ...我希望在条件中的两个检查之间使用 &amp;&amp;|| 而不是那个逗号。
  • @Yunnosch 在那里添加了完整的代码,现在应该可以看到所有内容了:)
  • @Yunnosch 现在工作正常,除了每次我输入坐标或舰队大小我必须输入一个字符并输入它才能移动到下一行/代码部分
  • ;关于对srand()的调用。该函数只应调用一次,最好在main() 函数的开头调用

标签: c random coordinates


【解决方案1】:

简短回答:您有不需要的“scanf”调用,这将

代码混合了 IO 和打字。考虑在使用之前查看每个函数的每个手册页。另外,请注意编译器警告,因为这将为您节省大量调试时间。

以placeCShip开头:

void placeCShip(){
    // Loop until unused location is found.
    while ( 1 ) {
        int a=rand()%15 ;
        int b=rand()%10 ;
// MOVE to 'main':    srand(time(NULL));
        if (grid[a][b] == SEA){
            grid[a][b] = CSHIP;
            break ;
        }
    }
}

对于 Player ship,考虑切换到 fgets/sscanf。 'scanf' 会让你在解析错误时进入无限循环。

void placePShip(){
    // Loop until valid coordinates are entered.
    while ( 1 ) {
        int x,y;
        printf("\nEnter Ship location: x , y: ");
        scanf("%d , %d", &x, &y);
        if (grid[y][x] == SEA){
            grid[y][x] = PSHIP;
            break ;
       }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多