C语言三子棋小游戏实现全程
时间:2022-09-07 09:58:42|栏目:C代码|点击: 次
前言
很高兴为大家带来三字棋的扩展版本
game.h
在这个文件中我们完成对代码的函数声明,常量的定义和头文件的包含。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> #include<stdlib.h> //定义行和列 #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 PlayMove(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); int IsFull(char board[ROW][COL], int row, int col);
test.c
这里我们测试三子棋游戏实现的逻辑
#define _CRT_SECURE_NO_WARNINGS #include"game.h" void menu() { printf("***********************\n"); printf("****1.play 0.exit ****\n"); printf("***********************\n"); } void game() { char board[ROW][COL] = { 0 }; //初始化棋盘 InitBoard(board, ROW, COL); //打印棋盘 DisplayBoard(board, ROW, COL); char ret = 0; //下棋 while (1) { //玩家下 PlayMove(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"); } if (ret == '#') { printf("人机都打不过,好好反省噢!\n"); } if (ret == 'Q') { printf("遇见了旗鼓相当的对手\n"); } } int main() { srand((unsigned int)time(NULL));//设置随机数的种子 int input = 0; do { menu(); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }
game.c
在这个文件中,我们主要完成对游戏代码的实现。
#define _CRT_SECURE_NO_WARNINGS #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; int j = 0; for (i = 0;i<row;i++) { for (j = 0;j < row;j++) { //打印数据 printf(" %c ", board[i][j]); //打印| if (j < col - 1) { printf("|"); } } printf("\n"); //打印分割线 if (i < row - 1) { for (j = 0;j < row;j++) { printf("---"); //打印| if (j < col - 1) { printf("|"); } } } printf("\n"); } printf("\n"); } //玩家下棋"*" void PlayMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下\n"); while (1) { printf("请输入坐标:>"); 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"); while (1) { int x = rand() % row;//生成0~2的数 int y = rand() % col;//生成0~2的数 if (board[x][y] == ' ') { board[x ][y ] = '#'; break; } } } //判断棋盘是否满 //满了就返回 1 //不满就返回 0 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; } //判断输赢 //玩家赢返回 "*" //电脑赢 "#" //平局 "Q" //继续 "C" char IsWin(char board[ROW][COL], int row, int col) { //每行相等 int i = 0; int j = 0; int count = 0;//记录相同棋子数 for (i = 0;i < row;i++) { count = 0; for (j = 0;j < col - 1;j++) { if (board[i][j] == board[i][j + 1] && board[i][j] != ' ') { count++; } } if (count == row - 1) { return board[i][j]; } } //每列相等 for (i = 0;i < col;i++) { count = 0; for (j = 0;j < row - 1;j++) { if (board[j][i] == board[j+1][i] && board[j][i] != ' ') { count++; } } if (count == col - 1) { return board[j][i]; } } //对角线相等 //第一条 count = 0; for(i = 0,j = 0;i<row-1&&j<col-1;i++,j++) { if (board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ') { count++; } } if (count == col - 1) { return board[i][j]; } //第二条对角线 //此次要记得把count重新归零 count = 0; for (i = 0, j = col - 1;i < row - 1&& j > 0;i++, j--) { if (board[i][j] == board[i+1][j - 1] && board[i][j] != ' ') { count++; } } if (count == col - 1) { return board[i][j]; } if (IsFull(board, ROW, COL)) { return 'Q'; } return 'C'; }
游戏代码实现的过程
对于三子棋游戏实现的思路是很重要的,让博主带领大家看看到底是如何实现的吧。
1 初始化棋盘
我们要实现棋盘的设计,要借助于二维数组board,很明显刚刚开始棋盘中是上面都没有的,我们就要二维数组所有元素都初始化为空格。
//棋盘初始化 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; int j = 0; for (i = 0;i<row;i++) { for (j = 0;j < row;j++) { //打印数据 printf(" %c ", board[i][j]); //打印| if (j < col - 1) { printf("|"); } } printf("\n"); //打印分割线 if (i < row - 1) { for (j = 0;j < row;j++) { printf("---"); //打印| if (j < col - 1) { printf("|"); } } } printf("\n"); } printf("\n"); }
3 玩家下
这里我们用" * "代表玩家下的棋子。
//玩家下棋"*" void PlayMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下\n"); while (1) { printf("请输入坐标:>"); 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"); } } }
4 电脑下
这里我们就让电脑随机找个空位下,后期博主会继续完善代码,让电脑看起来跟加智能。
//电脑下 //电脑找空位置随机下 void ComputerMove(char board[ROW][COL], int row, int col) { printf("电脑下\n"); while (1) { int x = rand() % row;//生成0~2的数 int y = rand() % col;//生成0~2的数 if (board[x][y] == ' ') { board[x ][y ] = '#'; break; } } }
5 判断棋盘是否已满
我们规定 :
满了就返回 1
不满就返回 0
//判断棋盘是否满 //满了就返回 1 //不满就返回 0 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 判断输赢
我们规定:
玩家赢就返回:" * "
电脑赢就返回:" # "
平局就返回:" Q "
继续就返回:" C "
//判断输赢 //玩家赢返回 "*" //电脑赢 "#" //平局 "Q" //继续 "C" char IsWin(char board[ROW][COL], int row, int col) { //每行相等 int i = 0; int j = 0; int count = 0;//记录相同棋子数 for (i = 0;i < row;i++) { count = 0; for (j = 0;j < col - 1;j++) { if (board[i][j] == board[i][j + 1] && board[i][j] != ' ') { count++; } } if (count == row - 1) { return board[i][j]; } } //每列相等 for (i = 0;i < col;i++) { count = 0; for (j = 0;j < row - 1;j++) { if (board[j][i] == board[j+1][i] && board[j][i] != ' ') { count++; } } if (count == col - 1) { return board[j][i]; } } //对角线相等 //第一条 count = 0; for(i = 0,j = 0;i<row-1&&j<col-1;i++,j++) { if (board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ') { count++; } } if (count == col - 1) { return board[i][j]; } //第二条对角线 //此次要记得把count重新归零 count = 0; for (i = 0, j = col - 1;i < row - 1&& j > 0;i++, j--) { if (board[i][j] == board[i+1][j - 1] && board[i][j] != ' ') { count++; } } if (count == col - 1) { return board[i][j]; } if (IsFull(board, ROW, COL)) { return 'Q'; } return 'C'; }
到这里游戏的设计就完成了,大家心里有了一些理解吧,我们这个三字棋,不仅仅可以下三字棋,还可以下五字棋,甚至N字棋大家要改只要改变ROW和COL的定义的常量就可以了。
//定义行和列
#define ROW 3
#define COL 3