c新手吧 关注:8,558贴子:48,066
  • 6回复贴,共1

新手求教,请问一下问题出在哪里?

只看楼主收藏回复

代码如下
#include <stdio.h>
#include <ctype.h>
int main(void)/*做一个简易五子棋程序*/
{
int player = 0;
int winner = 0;
int choice = 0;
int row = 0;
int column = 0;
int line = 0;
char game_start = 'Y';
char board [5][5] = {/*标记每个格子的位置*/
{'1','2','3','4','5'},
{'6','7','8','9','10'},
{'11','12','13','14','15'},
{'16','17','18','19','20'},
{'21','22','23','24','25'}
};
for(int i = 0 ; i <= 25 && winner == 0;i++)
{/*绘制格子*/
printf(" %2c | %2c | %2c | %2c | %2c \n",board[0][0],board[0][1],board[0][2],board[0][3],board[0][4]);
printf("-----+-----+-----+-----+-----\n");
printf(" %2c | %2c | %2c | %2c | %2c \n",board[1][0],board[1][1],board[1][2],board[1][3],board[1][4]);
printf("-----+-----+-----+-----+-----\n");
printf(" %4c | %2c | %2c | %2c | %2c \n",board[2][0],board[2][1],board[2][2],board[2][3],board[2][4]);
printf("-----+-----+-----+-----+-----\n");
printf(" %2c | %2c | %2c | %2c | %2c \n",board[3][0],board[3][1],board[3][2],board[3][3],board[3][4]);
printf("-----+-----+-----+-----+-----\n");
printf(" %2c | %2c | %2c | %2c | %2c \n",board[4][0],board[4][1],board[4][2],board[4][3],board[4][4]);
/*玩家更替*/
player = i%2+1;
do
{/*提示玩家选择格子*/
printf("Player %d,please enter the number to place your %c in the board\n",player,(player == 1)?'O':'X');
scanf("%d",&choice);
row = --choice/5;
column = choice%5;
}while(choice<0 || choice>25 || board[row][column] == 'O' || board[row][column] == 'X');/*判断格子选择正误*/
board[row][column]=(player == 1)?'O':'X';/*填入'X','O'*/
/*判断获胜条件是否达成*/
if(board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] == board[3][3] && board[0][0] == board[4][4]
|| board[0][4] == board[1][3] && board[0][0] == board[2][2] && board[0][0] == board[3][1] && board[0][0] == board[4][0])
winner=player;
else
{
for(int line = 0;i < row;i++)
if(board[line][0] == board[line][1] && board[line][0] == board[line][2] && board[line][0] == board[line][3] && board[line][0] == board[line][4]
|| board[0][line] == board[1][line] && board[0][line] == board[2][line] && board[0][line] == board[3][line] && board[0][line] == board[4][line])
winner = player;
}
};
if(winner == 0)
printf("How pity!A draw game.");
else
printf("Congratulations!Player %d,you win the game!\n",player);
return 0;
}
/*剩余问题:方格内两位数不能正确显示*/
运行结果如图所示

从10开始显出都出问题了(例如第三行第一个是11显示成1了...),萌新表示试了好几种方法貌似都是各种问题,求大神指点


IP属地:广东1楼2016-01-29 17:05回复
    char board [5][5] = {/*标记每个格子的位置*/
    {'1','2','3','4','5'},
    {'6','7','8','9','10'},
    {'11','12','13','14','15'},
    {'16','17','18','19','20'},
    {'21','22','23','24','25'}
    };
    这句居然编译通过了,这才是问题。类型要改成int,单引号去掉,输出格式也要相应的改成%d。目前只看出这点问题。


    IP属地:江西2楼2016-01-29 17:21
    收起回复
      2026-03-20 23:44:16
      广告
      不感兴趣
      开通SVIP免广告
      是我没看仔细,只看了声明就发帖了。想用同一种输出格式又能输出两位以上数字,又能输出字母,那就只能用字符串,这样程序几乎全部要改。建议只把输出棋盘的语句修改,用循环语句一格一格的显示,加个判断语句,如果值等于'O'或'X',就用%c格式,否则就用%d格式。


      IP属地:江西3楼2016-01-30 22:48
      回复
        于是,我又回来了
        既然没法同一种格式显示数字和字符两种类型,那就统一成字符好了(虽然我用的方法貌似很笨)
        不多说了,上代码
        /*做一个五子棋程序*/
        #include <stdio.h>
        int main(void)
        {
        int player = 0;
        int winner = 0;
        int row = 0;
        int column = 0;
        int line = 0;
        char board [5][5] = {/*标记每个格子的位置*/
        {' ',' ',' ',' ',' '},
        {' ',' ',' ',' ',' '},
        {' ',' ',' ',' ',' '},
        {' ',' ',' ',' ',' '},
        {' ',' ',' ',' ',' '}
        };
        for(int i = 0 ; i <= 25 && winner == 0;i++)
        {/*绘制格子*/
        printf(" 1 2 3 4 5 \n");
        printf(" +----+----+----+----+----+\n");
        printf("1 | %2c | %2c | %2c | %2c | %2c |\n",board[0][0],board[0][1],board[0][2],board[0][3],board[0][4]);
        printf(" |----+----+----+----+----|\n");
        printf("2 | %2c | %2c | %2c | %2c | %2c |\n",board[1][0],board[1][1],board[1][2],board[1][3],board[1][4]);
        printf(" |----+----+----+----+----|\n");
        printf("3 | %2c | %2c | %2c | %2c | %2c |\n",board[2][0],board[2][1],board[2][2],board[2][3],board[2][4]);
        printf(" |----+----+----+----+----|\n");
        printf("4 | %2c | %2c | %2c | %2c | %2c |\n",board[3][0],board[3][1],board[3][2],board[3][3],board[3][4]);
        printf(" |----+----+----+----+----|\n");
        printf("5 | %2c | %2c | %2c | %2c | %2c |\n",board[4][0],board[4][1],board[4][2],board[4][3],board[4][4]);
        printf(" +----+----+----+----+----+\n");
        /*玩家更替*/
        player = i%2+1;
        do
        {/*提示玩家选择格子*/
        printf("Player %d,please enter the number to place your %c in the board\n",player,(player == 1)?'O':'X');
        scanf("%d %d",&row,&column);
        }while(row<1 || column<1 || row>5 || column>5 || board[column-1][row-1] == 'O' || board[column-1][row-1] == 'X');/*判断格子选择正误*/
        board[column-1][row-1]=(player == 1)?'O':'X';/*填入'X','O'*/
        /*判断获胜条件是否达成*/
        if( board[0][0] != ' ' && board[0][0] == board[1][1] && board[0][0] == board[2][2]
        && board[0][0] == board[3][3] && board[0][0] == board[4][4]
        || board[0][4] != ' ' && board[0][4] == board[1][3] && board[0][4] == board[2][2]
        && board[0][4] == board[3][1] && board[0][4] == board[4][0])
        winner=player;
        else
        {
        for(line = 0;line < 5;line++)
        if(board[line][0] != ' ' && board[line][0] == board[line][1] && board[line][0] == board[line][2]
        && board[line][0] == board[line][3] && board[line][0] == board[line][4]
        || board[0][line] != ' ' && board[0][line] == board[1][line] && board[0][line] == board[2][line] && board[0][line] == board[3][line] && board[0][line] == board[4][line])
        winner = player;
        }
        }/*和for配对的大括号*/
        if(winner == 0)
        printf("How pity!A draw game.");
        else
        printf("Congratulations!Player %d,you win the game!\n",player);
        return 0;
        }
        输出结果(个人感觉目前最大的缺陷是有人胜利的话最后一步棋显示不出来...)

        P.S.
        顺便用字符数组将数字当成字符输出似乎是可以的...我也是看着教材上是这么写的才仿写下来了,毕竟照着打感觉不会有什么进步,楼下是图


        IP属地:广东4楼2016-02-02 17:40
        收起回复