首先打印菜单,并初始化棋盘
1.用二维数组,把数组的没一个元素置为 ’ ’
2.打印棋盘
3.玩家落子(scanf()实现)
4.检查输入的位置是否已经有子,如果有则需要重新输入(1-3之间)
5.判断输赢(包括棋盘是否已满的情况)
6.电脑落子(用rand()随机数实现)
7.检查随机数所指向的位置是否已经有子,如果有,则重新产生随机数(1-3之间)
8.判断输赢(包括棋盘是否已满的情况)
重复3 - 8步骤.
主函数
void Menu(){
printf("**************************\n");
printf("******* 1 . play *********\n");
printf("******* 0 . exit *********\n");
printf("**************************\n");
}
int main() {
srand((unsigned int)time(NULL));//随机种子
Menu();
int input = 0;
while (1){
printf("请输入选择: \n");
scanf("%d", &input);
switch (input){
case 1:
Game();
break;
case 0:
printf("退出!");
break;
default:
break;
}
}
return 0;
}
进入游戏
void Game(){//游戏开始
int arr[MAX_ROW][MAX_COL] = { 0 };
InitBoard(arr,MAX_ROW,MAX_COL);//初始化棋盘
ShowBoard(arr, MAX_ROW, MAX_COL);//打印棋盘
while (1){
Player(arr, MAX_ROW, MAX_COL);//玩家落子
ShowBoard(arr, MAX_ROW, MAX_COL);//打印棋盘
char ret = IsWin(arr, MAX_ROW, MAX_COL);
if (ret != 0){//判断输赢
if (ret == 1){
printf("平局\n");
break;
}
else{
printf("你赢了\n");
break;
}
}
Computer(arr, MAX_ROW, MAX_COL);//电脑落子
ShowBoard(arr, MAX_ROW, MAX_COL);//打印棋盘
ret = IsWin(arr, MAX_ROW, MAX_COL);
if (ret != 0){//判断输赢
if (ret == 1){
printf("平局\n");
break;
}
else{
printf("电脑赢了\n");
break;
}
}
}
}
初始化棋盘
void InitBoard(int (*arr)[MAX_COL], int row, int col){
int i = 0;
for (i = 0; i < row; i++){
int j = 0;
for (j = 0; j < col; j++){
arr[i][j] = ' ';
}
}
}
打印棋盘
void ShowBoard(int(*arr)[MAX_COL], int row, int col){
int i = 0;
for (i = 0; i < row; i++){
int j = 0;
for (j = 0; j < col; j++){
printf(" %c ", arr[i][j]);
if (j < col - 1){
printf("|");
}
}
printf("\n");
if (i < row - 1){
for (j = 0; j < col; j++){
printf("---");
if (j < col - 1){
printf("|");
}
}
}
printf("\n");
}
}
玩家落子(如果该位置上已经有子,则需要重新输入)
void Player(int(*arr)[MAX_COL], int row, int col){
int i = 0;
int j = 0;
while (1){
printf("请输入坐标:");
scanf("%d %d", &i, &j);
if (IsFull(arr,i - 1, j - 1) == 1){//判断是否有子
printf("该位置已经有子了!");
continue;
}
arr[i - 1][j - 1] = 'X';
break;
}
}
检查落子(如果该位置已经有子,返回0,否则返回1)
int IsFull(int(*arr)[MAX_COL],int row, int col){
if (arr[row][col] != ' '){
return 1;
}
return 0;
}
判断输赢,包含棋盘已经下满的情况(根据返回值的情况确定谁赢,或者平局)
char IsWin(int(*arr)[MAX_COL], int row, int col){
//赢得情况 有八种
//横着
if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] != ' '){
return arr[0][0];
}
if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] != ' '){
return arr[1][0];
}
if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] != ' '){
return arr[2][0];
}
//竖着
if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] != ' '){
return arr[0][0];
}
if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] != ' '){
return arr[0][1];
}
if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] != ' '){
return arr[0][2];
}
//对角线
if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] != ' '){
return arr[0][0];
}
if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] != ' '){
return arr[0][2];
}
int i = 0;
int j = 0;
for (i = 0; i < row; i++){
for (j = 0; j < col; j++){
if (arr[i][j] == ' '){
return 0;//还有空余的地方,继续进行落子
}
}
}
return 1;//平局
}
电脑落子(如果该位置上已经有子,则需要重新生成随机数)
void Computer(int(*arr)[MAX_COL], int row, int col){
int i = 0;
int j = 0;
while (1){
i = rand() % 3 + 1;//[1,3]随机数
j = rand() % 3 + 1;
if (IsFull(arr, i - 1, j - 1) == 1){//判断是否有子
continue;
}
arr[i - 1][j - 1] = 'O';
break;
}
}
检查
判断输赢,和棋盘是否已经下满的情况
重复3 - 8 步骤.