遇到的问题:
1.中间有需要清楚键盘缓冲区,具体(?)
2.number char型,强制int型转换是利用ASCII码,相差48.
3.string型c 支持,c并没有,利用char型字符数组解决,char player1[20];scanf("%s",player1);printf("%s",player1);
代码如下:
- #include <stdio.h>
- #include <ctype.h>
- #include <stdbool.h>
- #include <stdlib.h>
- #include <time.h>
-
-
- int main(){
-
- //初始化
- char another_game = 'Y';
- char game[3][3] = {{'1','2','3'},{'4','5','6'},{'7','8','9'}};
- bool win = true;
- int choose_player = 0;
- char number = '0';
- int row = 0 , col = 0;
- bool take_turns = false;
- char player1[20],player2[20];
- int c;
-
- //循环_1
- do{
- //初始化游戏
- printf("井字棋游戏初始化...\n");
- char game[3][3] = {{'1','2','3'},{'4','5','6'},{'7','8','9'}};
- win = false;
-
- //输入玩家1,2姓名
- printf("(不要使用空格,回车键结束)\n");
- printf("请输入玩家1姓名:\n");
- scanf("%s",player1);
- printf("请输入玩家2姓名:\n");
- scanf("%s",player2);
-
- //随机选择先落子玩家
- srand((unsigned)time(NULL));
- choose_player = rand()%2 1;
- if(choose_player == 1){
- take_turns = true;
- printf("%s(玩家1)首先落子(1~9).\n",player1);
- }else{
- take_turns = false;
- printf("%s(玩家2)首先落子(1~9).\n",player2);
- }
-
- //循环_2
- while(!win){
- //输出3x3游戏格
- printf("\n");
- printf(" %c | %c | %c \n",game[0][0],game[0][1],game[0][2]);
- printf("--- --- ---\n");
- printf(" %c | %c | %c \n",game[1][0],game[1][1],game[1][2]);
- printf("--- --- ---\n");
- printf(" %c | %c | %c \n",game[2][0],game[2][1],game[2][2]);
- printf("\n");
-
-
- //玩家1,玩家2分别下棋
- //落子是否有效
- do{
- printf("%s落子:",take_turns?player1:player2);
- //这里需要清楚缓冲区(why?)
- if(fEOF(stdin) || ferror(stdin)){
- break;
- }
- while((c = getchar()) != '\n' && c != EOF);
- scanf("%c",&number);
-
- //why:ASCII码表对应的数字差48~
- row = ((int)number-48-1)/3;
- col = ((int)number-48-1)%3;
- //printf("%d.%d.%c.\n",row,col,game[row][col]);
- //printf("%c\n",number);
- }while( game[row][col] != number);
-
- //更新棋盘
- if(take_turns){
- game[row][col] = 'X';
- }else{
- game[row][col] = 'O';
- }
-
- //循环_2,判定:是否有人胜利
- if((game[0][0] == game[0][1] && game[0][1] == game[0][2])||
- (game[1][0] == game[1][1] && game[1][1] == game[1][2])||
- (game[2][0] == game[2][1] && game[2][1] == game[2][2])||
- (game[0][0] == game[1][0] && game[1][0] == game[2][0])||
- (game[0][1] == game[1][1] && game[1][1] == game[2][1])||
- (game[0][2] == game[1][2] && game[1][2] == game[2][2])||
- (game[0][0] == game[1][1] && game[1][1] == game[2][2])||
- (game[0][2] == game[1][1] && game[1][1] == game[2][0])
- ){
- win = true;
- printf("%s胜利!游戏结束.",take_turns?player1:player2);
-
- printf("\n");
- printf(" %c | %c | %c \n",game[0][0],game[0][1],game[0][2]);
- printf("--- --- ---\n");
- printf(" %c | %c | %c \n",game[1][0],game[1][1],game[1][2]);
- printf("--- --- ---\n");
- printf(" %c | %c | %c \n",game[2][0],game[2][1],game[2][2]);
- printf("\n");
- }else{
-
- if(take_turns){
- take_turns = false;
- }else{
- take_turns = true;
- };
- }
-
- }
- //循环_1,是否开始新游戏
- if(feof(stdin) || ferror(stdin)){
- break;
- }
- while((c = getchar()) != '\n' && c != EOF);
- printf("是否开始新游戏?(y/n)");
- scanf("%c",&another_game);
- }while(toupper(another_game)=='Y');
- //结束
- return 0;
- }