> 文档中心 > 【每日C语言】基于C语言实现的三子棋小游戏

【每日C语言】基于C语言实现的三子棋小游戏

目录

游戏说明:

游戏实现:

1、测试游戏的逻辑(test.c)

2、关于游戏相关的函数声明、符号定义、头文件的包含(game.h)

3、游戏相关函数的实现(game.c)

程序流程图:

源代码:

1、test.c

2、game.h

3、game.c

游戏效果:

改进方案


游戏说明:

三子棋是一种民间传统游戏,又叫九宫棋、井字棋,是黑白棋的一种。只要自己的三个棋子连成一条线,对方就算输了,但很多时候会出现和棋的情况。

游戏实现:

1、测试游戏的逻辑(test.c)

(1)主函数 -> main()

(2)游戏实现 -> game()

2、关于游戏相关的函数声明、符号定义、头文件的包含(game.h)

3、游戏相关函数的实现(game.c)

(1)初始化棋盘 -> InitBoard()

(2)打印棋盘 -> DisplayBoard()

(3)玩家下棋 -> PlayerMove()

(4)电脑下棋 -> ComputerMove()

(5)判断棋盘是否满了 -> IsFull()

(6)判断游戏是否有输赢 -> IsWin()

程序流程图:

源代码:

1、test.c

(1)菜单函数

void menu(){printf("***************************\n");printf("******* 1、进入游戏 *******\n");printf("******* 0、退出游戏 *******\n");printf("***************************\n");}

(2)游戏函数

void game(){//存储数据 - 二维数组char board[ROW][COL];//初始化棋盘 - 初始化空格InitBoard(board, ROW, COL);  //对于二维数组,要把行、列存过去//打印棋盘 - 本质是打印数组DisplayBoard(board, ROW, COL);char ret = 0;while (1){//玩家下棋PlayerMove(board,ROW,COL);DisplayBoard(board, ROW, COL);//判断玩家是否赢得游戏ret = IsWin(board, ROW, COL);if (ret != 'C')break;//电脑下棋ComputerMove(board,ROW,COL); DisplayBoard(board, ROW, COL);//判断电脑是否赢得游戏ret = IsWin(board, ROW, COL);if (ret != 'C')break;}if (ret == '*'){printf("---------------------------\n");printf("玩家赢了\n");}else if (ret == '#'){printf("---------------------------\n");printf("电脑赢了\n");}else{printf("---------------------------\n");printf("双方平局\n");}DisplayBoard(board, ROW, COL);printf("---------------------------\n");}

(3)主函数

int main(){int input = 0;srand((unsigned int)time(NULL));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;}

2、game.h

#pragma once#include  #include #include //符号的定义#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);

3、game.c

(1)初始化棋盘

//初始化棋盘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] = ' ';}}}

(2)打印棋盘

//打印棋盘void DisplayBoard(char board[ROW][COL], int row, int col){int i = 0;printf(" --- --- --- \n");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");}}printf(" --- --- --- \n");}

(3)玩家下棋 -> '*'

//玩家下棋void PlayerMove(char board[ROW][COL], int row, int col){int x = 0;int y = 0;printf("---------------------------\n");printf("玩家准备:\n");while (1){printf("请输入下棋的坐标 -> ");scanf("%d %d", &x, &y);//判断坐标合法性if (x >= 1 && x = 1 && y <= col){//下棋//判断坐标是否被占用if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("坐标被占用,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}}

(4)电脑下棋 -> '#'

//电脑下棋void ComputerMove(char board[ROW][COL], int row, int col){printf("---------------------------\n");printf("电脑下棋:\n");//判断坐标是否被占用while (1){int x = rand() % row;  // x的范围:0-2int y = rand() % col;  // y的范围:0-2if (board[x][y] == ' '){board[x][y] = '#';break;}}}

(5)判断棋盘是否满了

//判断棋盘是否满了int IsFull(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++){if (board[i][j] == ' '){return 0; //棋盘没满}}}return 1;  //棋盘满了}

(6)判断游戏是否有输赢

//判断游戏是否有输赢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];}}//判断三列for (i = 0; i   若棋盘满了返回1;若不满返回0int ret = IsFull(board, row, col);if (ret == 1){return 'Q';}return 'C';}

游戏效果:

 

改进方案:

1、ComputerMove() 函数,应设计一个算法,使电脑会思考,会判断,聪明地下棋;

2、IsWin() 函数,上面设计已将代码写死,即只能用于3*3的棋盘,应改进代码,使其更为灵活;