合并if语句来设置值限制

时间:2016-03-23 10:43:51

标签: c

我正在为我的计划创建一个战舰计划;该程序工作正常但我试图确保当用户将坐标超出范围时,程序会说他们输入的坐标不正确。这是代码:

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

    void startBoard(int board[][5])
{
  int line, column;
    for(line=0 ; line < 5 ; line++ )
        for(column=0 ; column < 5 ; column++ )
            board[line][column]=-1;
 }

void showBoard(int board[][5])
{

int line, column;

    printf("\t1 \t2 \t3 \t4 \t5");
    printf("\n");

    for(line=0 ; line < 5 ; line++ ){
        printf("%d",line+1);
        for(column=0 ; column < 5 ; column++ ){
            if(board[line][column]==-1){
                printf("\t~");
            }else if(board[line][column]==0){
                printf("\t*");
            }else if(board[line][column]==1){
                printf("\tX");
            }

        }
        printf("\n");
    }

}

void startShips(int ships[][2]){
    srand(time(NULL));
    int ship, last;

    for(ship=0 ; ship < 3 ; ship++){
        ships[ship][0]= rand()%5;
        ships[ship][1]= rand()%5;
for(last=0 ; last < ship ; last++){
            if( (ships[ship][0] == ships[last][0])&&(ships[ship][1] == ships[last][1]) )
                do{
                    ships[ship][0]= rand()%5;
                    ships[ship][1]= rand()%5;
                }while( (ships[ship][0] == ships[last][0])&&(ships[ship][1] == ships[last][1]) );
        }

    }
}

void giveShot(int shot[2])
{

    printf("Line: ");
    scanf("%d",&shot[0]);
    shot[0]--;

    printf("Column: ");
    scanf("%d",&shot[1]);
    shot[1]--;

}

int hitship(int shot[2], int ships[][2])
{
    int ship;

    for(ship=0 ; ship < 3 ; ship++){
        if( shot[0]==ships[ship][0] && shot[1]==ships[ship][1]){
            printf("You hit a ship with the shot (%d,%d)\n",shot[0]+1,shot[1]+1);
            return 1;
        }
    }
    return 0;
}

void tip(int shot[2], int ships[][2], int attempt)
{
    int line=0,
        column=0,
        row;

    //count how many ships there is line/column
    for(row=0 ; row < 3 ; row++){
        if(ships[row][0]==shot[0])
            line++;
        if(ships[row][1]==shot[1])
            column++;
    }

    printf("\nDica %d: \nline %d -> %d ships\ncolumn %d -> %d ships\n",attempt,shot[0]+1,line,shot[1]+1,column);
 }

 void changeBoard(int shot[2], int ships[][2], int board[][5]){
    if(hitship(shot,ships))
        board[shot[0]][shot[1]]=1;
    else
        board[shot[0]][shot[1]]=0;
}

int main() {
    int board[5][5];
    int ships[3][2];
    int shot[2];
    int attempts=0,
        hits=0;

    startBoard(board);
    startShips(ships);

    printf("\n");

    do{
        showBoard(board);
        giveShot(shot);
        attempts++;

        if(hitship(shot,ships)){
            tip(shot,ships,attempts);
            hits++;
        }
        else
            tip(shot,ships,attempts);

        changeBoard(shot,ships,board);


    }while(hits!=3);

    printf("\n\n\nFinished game. You hit the three ships in %d attempts", attempts);
    showBoard(board);
}

1 个答案:

答案 0 :(得分:2)

我认为while语句比if更有用。

首先要求用户输入值。然后当用户输入错误的值时,你会再次问他。

看起来像这样:

printf("Line: ");
scanf("%d",&shot[0]);
while(shot[0]<lower_bound || shot[0]>upper_bound){
    printf("Incorrect entry");
    printf("Enter a correct Line: ");
    scanf("%d",&shot[0]);
}
shot[0]--;

如果你确实需要if,你可以用while更改if,但这只会检查一次值而while语句会一直检查,直到得到你需要的为止