Keener_Tic_Tac_Toe(井字棋游戏)代码(c语言)

一个WEBC菜鸟 2019-01-14

遇到的问题:

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("井字棋游戏初始化...");

char game[3][3] = {{'1','2','3'},{'4','5','6'},{'7','8','9'}};

win = false;

//输入玩家1,2姓名

printf("(不要使用空格,回车键结束)");

printf("请输入玩家1姓名:");

scanf("%s",player1);

printf("请输入玩家2姓名:");

scanf("%s",player2);

//随机选择先落子玩家

srand((unsigned)time(NULL));

choose_player = rand()%2 + 1;

if(choose_player == 1){

take_turns = true;

printf("%s(玩家1)首先落子(1~9).",player1);

}else{

take_turns = false;

printf("%s(玩家2)首先落子(1~9).",player2);

}

//循环_2

while(!win){

//输出3x3游戏格

printf("");

printf(" %c | %c | %c ",game[0][0],game[0][1],game[0][2]);

printf("---+---+---");

printf(" %c | %c | %c ",game[1][0],game[1][1],game[1][2]);

printf("---+---+---");

printf(" %c | %c | %c ",game[2][0],game[2][1],game[2][2]);

printf("");

//玩家1,玩家2分别下棋

//落子是否有效

do{

printf("%s落子:",take_turns?player1:player2);

//这里需要清楚缓冲区(why?)

if(feof(stdin) || ferror(stdin)){

break;

}

while((c = getchar()) != '' && c != EOF);

scanf("%c",&number);

//why:ASCII码表对应的数字差48~

row = ((int)number-48-1)/3;

col = ((int)number-48-1)%3;

//printf("%d.%d.%c.",row,col,game[row][col]);

//printf("%c",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("");

printf(" %c | %c | %c ",game[0][0],game[0][1],game[0][2]);

printf("---+---+---");

printf(" %c | %c | %c ",game[1][0],game[1][1],game[1][2]);

printf("---+---+---");

printf(" %c | %c | %c ",game[2][0],game[2][1],game[2][2]);

printf("");

}else{

if(take_turns){

take_turns = false;

}else{

take_turns = true;

};

}

}

//循环_1,是否开始新游戏

if(feof(stdin) || ferror(stdin)){

break;

}

while((c = getchar()) != '' && c != EOF);

printf("是否开始新游戏?(y/n)");

scanf("%c",&another_game);

}while(toupper(another_game)=='Y');

//结束

return 0;

}

---------------------

作者:LNZ001

来源:CSDN

原文:https://blog.csdn.net/LNZ001/article/details/54780728

版权声明:本文为博主原创文章,转载请附上博文链接!

Keener_Tic_Tac_Toe(井字棋游戏)代码(c语言)

相关推荐

NewActivity / 0评论 2020-05-08
fengjing81 / 0评论 2020-01-23