- text_01.c:为测试游戏的文件,包含整个游戏的逻辑
- game.c:实现函数逻辑的文件
- game.h:为头文件,函数声明
- 选择1,开始游戏
- 选择0,退出游戏
- 选择其他的内容,打印“选择错误,请重新选择”;并给予重新选择的机会
//打印菜单:
- menu()//设计菜单
- {
- printf("*******************************\n");
- printf("******* 1.play *******\n");
- printf("******* 0.exit *******\n");
- printf("*******************************\n");
- }
//实现菜单运行的基本逻辑:
- int main()
- {
- srand((unsigned)time(NULL));//设置随机数的生成起点
- int input = 0;
- do
- {
- menu();//打印菜单
- printf("请选择=>");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- game();
- break;
- case 0:
- printf("退出游戏!\n");
- break;
- default:
- printf("选择错误!请重新选择:\n");
- break;
- }
- } while (input);//非零即真
- return 0;
- }
//将棋盘当中的所有格子初始化为空格字符即可
- //初始化棋盘;
- void InitBoard(char board[ROW][COL], int row, int col)
- {
- int i = 0;
- int j = 0;
- for (i = 0; i < row; i++)
- {
- for (j = 0; j < col; j++)
- {
- board[i][j] = ' ';
- }
- }
- }
//第一版:十分局限,只能打印三列
- void DisplayBoard(char board[ROW][COL], int row, int col)
- {
- int i = 0;
- for (i = 0; i < row; i++)
- {
- //打印数据
- printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
- //打印分割信息
- if (i < row - 1)
- {
- printf("---|---|---\n");
- }
- }
- }
//第二版:可以打印任意行列的棋盘
- //打印棋盘(第二版)
- void DisplayBoard(char board[ROW][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 ", board[i][j]);
- if (j < col-1)
- {
- printf("|");
- }
- }
- printf("\n");
- //打印分割信息
- if (i < row - 1)
- {
- int j = 0;
- for (j = 0; j < col ; j++)
- {
- printf("---");
- if (j < col - 1)
- {
- printf("|");
- }
- }
- printf("\n");
- }
- }
- }
- 输入坐标(范围是1~3),先行后列,从上到下,从左到右
- 判断坐标范围是否合法,若超出范围,则提示“坐标非法,请重新输入!!!”,并让其再次选择其他坐标
- 判断坐标是否被重复占用,若是被占用,则提示“坐标已被占用!!!,请选择其他位置”,并让其再次选择其他坐标
见代码:
- //玩家下棋:
- void PlayerMove(char board[ROW][COL], int row, int col)
- {
- int x = 0;
- int y = 0;
- printf("玩家下棋=>\n");
- while (1)
- {
- printf("请输入坐标=>\n");
- scanf("%d %d", &x, &y);
- //判断坐标范围是否合法
- if (x >= 1 && x <= row && y >= 1 && y <= col)
- {
- //判断坐标是否被重复占用
- if (board[x - 1][y - 1] == ' ')
- {
- board[x - 1][y - 1] = '*';
- break;
- }
- else
- {
- printf("坐标已被占用!!!,请选择其他位置\n");
- }
- }
- else
- {
- printf("坐标非法,请重新输入!!!\n");
- }
- }
- }
- 找出空白的位置
- 随机下棋(rand用法,前面文章有详解)
- (后续可以再优化代码,让电脑变得更加聪明)
见代码:
- //电脑下棋:(找空白的位置,随机下棋)
- void ComputerMove(char board[ROW][COL], int row, int col)
- {
- printf("电脑下棋=>\n");
- int x = 0;
- int y = 0;
- while (1)
- {
- x = rand() % row;//生成随机数,范围是0~2
- y = rand() % col;
- if (board[x][y] == ' ')
- {
- board[x][y] = '#';
- break;
- }
- }
- }
- 玩家赢——'*'
- 电脑赢——'#'
- 平局——'Q'
- 继续——'C'
//赢的情况:行,列,对角线三个相同的棋相连
- int i = 0;
- for (i = 0; i < row; i++)
- {
- if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
- {
- return board[i][1];
- }
- }
-
- //列
- int j = 0;
- for (j = 0; j < col; j++)
- {
- if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[1][j] != ' ')
- {
- return board[1][j];
- }
- }
-
- //对角线
- if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
- {
- return board[1][1];
- }
- if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
- {
- return board[0][2];
- }
//平局——判断棋盘是否下满(创建函数)
-
- //判断棋盘是否已经排满(函数)
- int IsFull(char board[ROW][COL], int row, int col)
- {
- //如果满了返回1
- //不满返回0
- int i = 0;
- int j = 0;
- for (i = 0; i < row; i++)
- {
- for (j = 0; j < col; j++)
- {
- if (board[i][j] == ' ')
- {
- return 0;
- }
- }
- }
- return 1;
- }
- #define _CRT_SECURE_NO_WARNINGS
- #include
- #include
- #include
- #include"game.h"
- menu()//设计菜单
- {
- printf("*******************************\n");
- printf("******* 1.play *******\n");
- printf("******* 0.exit *******\n");
- printf("*******************************\n");
- }
- void game()
- {
- char ret = '0';
- char board[][100] = { 0 };
- //初始化棋盘的函数
- InitBoard(board, ROW, COL);//行(row),列(col)
- DisplayBoard(board, ROW, COL);
- while (1)
- {
- PlayerMove(board, ROW, COL);
- //判断输赢:
- ret = IsWin(board, ROW, COL);
- if (ret != 'C')//说明游戏不再继续
- {
- break;
- }
- DisplayBoard(board, ROW, COL);
- ComputerMove(board, ROW, COL);
- //判断输赢:
- ret = IsWin(board, ROW, COL);
- if (ret != 'C')//说明游戏不再继续
- {
- break;
- }
- DisplayBoard(board, ROW, COL);
- }
- if (ret == '*')
- {
- printf("玩家胜利!!!\n");
- }
- else if (ret == '#')
- {
- printf("电脑胜利!!!\n");
- }
- else
- {
- printf("平局\n");
- }
- DisplayBoard(board, ROW, COL);
- }
- int main()
- {
- srand((unsigned)time(NULL));//设置随机数的生成起点
- int input = 0;
- do
- {
- menu();//打印菜单
- printf("请选择=>");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- game();
- break;
- case 0:
- printf("退出游戏!\n");
- break;
- default:
- printf("选择错误!请重新选择:\n");
- break;
- }
- } while (input);
- return 0;
- }
- #pragma once
- #define ROW 3
- #define COL 3
- //初始化棋盘;
- void InitBoard(char board[ROW][COL], int row, int col);
-
- //打印棋盘:
- void DisplayBoard(char board[ROW][COL], int row, int col);
-
- //玩家下棋:
- void PlayerMove(char board[ROW][COL], int row, int col);
-
- //电脑下棋:
- void ComputerMove(char board[ROW][COL], int row, int col);
-
- //判断输赢:
- char IsWin(char board[ROW][COL], int row, int col);
- #define _CRT_SECURE_NO_WARNINGS
- #include
- #include
- #include
- #include"game.h"
- //初始化棋盘;
- void InitBoard(char board[ROW][COL], int row, int col)
- {
- int i = 0;
- int j = 0;
- for (i = 0; i < row; i++)
- {
- for (j = 0; j < col; j++)
- {
- board[i][j] = ' ';
- }
- }
- }
-
-
- //打印棋盘(第一版)
- // 十分局限,列数已经规定死了
- //void DisplayBoard(char board[ROW][COL], int row, int col)
- //{
- // int i = 0;
- // for (i = 0; i < row; i++)
- // {
- // //打印数据
- // printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
- // //打印分割信息
- // if (i < row - 1)
- // {
- // printf("---|---|---\n");
- // }
- // }
- //}
-
-
- //打印棋盘(第二版)
- void DisplayBoard(char board[ROW][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 ", board[i][j]);
- if (j < col-1)
- {
- printf("|");
- }
- }
- printf("\n");
- //打印分割信息
- if (i < row - 1)
- {
- int j = 0;
- for (j = 0; j < col ; j++)
- {
- printf("---");
- if (j < col - 1)
- {
- printf("|");
- }
- }
- printf("\n");
- }
- }
- }
-
-
- //玩家下棋:
- void PlayerMove(char board[ROW][COL], int row, int col)
- {
- int x = 0;
- int y = 0;
- printf("玩家下棋=>\n");
- while (1)
- {
- printf("请输入坐标=>\n");
- scanf("%d %d", &x, &y);
- //判断坐标范围是否合法
- if (x >= 1 && x <= row && y >= 1 && y <= col)
- {
- //判断坐标是否被重复占用
- if (board[x - 1][y - 1] == ' ')
- {
- board[x - 1][y - 1] = '*';
- break;
- }
- else
- {
- printf("坐标已被占用!!!,请选择其他位置\n");
- }
- }
- else
- {
- printf("坐标非法,请重新输入!!!\n");
- }
- }
- }
-
-
- //电脑下棋:(找空白的位置,随机下棋)
- void ComputerMove(char board[ROW][COL], int row, int col)
- {
- printf("电脑下棋=>\n");
- int x = 0;
- int y = 0;
- while (1)
- {
- x = rand() % row;//生成随机数,范围是0~2
- y = rand() % col;
- if (board[x][y] == ' ')
- {
- board[x][y] = '#';
- break;
- }
- }
- }
-
-
- //判断棋盘是否已经排满(函数)
- int IsFull(char board[ROW][COL], int row, int col)
- {
- //如果满了返回1
- //不满返回0
- int i = 0;
- int j = 0;
- for (i = 0; i < row; i++)
- {
- for (j = 0; j < col; j++)
- {
- if (board[i][j] == ' ')
- {
- return 0;
- }
- }
- }
- return 1;
- }
-
- //判断输赢:
- //1.玩家赢——'*'
- //2.电脑赢——'#'
- //3.平局——'Q'
- //4.继续——'C'
- char IsWin(char board[ROW][COL], int row, int col)
- {
- //行
- int i = 0;
- for (i = 0; i < row; i++)
- {
- if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
- {
- return board[i][1];
- }
- }
-
- //列
- int j = 0;
- for (j = 0; j < col; j++)
- {
- if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[1][j] != ' ')
- {
- return board[1][j];
- }
- }
-
- //对角线
- if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
- {
- return board[1][1];
- }
- if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
- {
- return board[0][2];
- }
- //没有人赢,就要判断平局,判断棋盘是否已经下满
- if (IsFull(board, row, col))
- {
- return 'Q';
- }
- //游戏继续
- return 'C';
- }