700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言实现三子棋小游戏(编程思路以及代码详解)

C语言实现三子棋小游戏(编程思路以及代码详解)

时间:2021-07-08 00:35:53

相关推荐

C语言实现三子棋小游戏(编程思路以及代码详解)

目录

前言

一、三子棋游戏的实现逻辑

二、创建菜单并控制游戏开始或游戏结束

三、创建棋盘并且初始化棋盘

四、打印棋盘并验证打印棋盘和初始化棋盘模块的实现

五、玩家下棋

六、电脑下棋

六、输赢判断

七、三子棋游戏完整代码以及测试

总结

前言

通过了一段时间的C语言学习,我准备通过编写一个简单地三子棋小游戏,来对之前所学的C语言知识进行一个复习巩固。我使用的环境是VS。代码的书写我准备分两个模块,分别是测试模块(test.c)和游戏模块(game.c)。首先在测试模块实现菜单,通过菜单来进行游戏或者退出游戏。在测试模块调用游戏函数,并在游戏模块进行代码的实现。创建一个头文件"game.h"来存放引用的库函数头文件和函数的声明。

一、三子棋游戏的实现逻辑

1.创建菜单控制开始游戏或游戏结束

2.创建棋盘并且初始化棋盘

3.打印棋盘

4.玩家下棋

5.电脑下棋

6.判断胜负(胜、负、平局)

二、创建菜单并控制游戏开始或游戏结束

//我们将库函数头文件引用以及函数的声明放在game.h头文件中//这里只要引game.h这个头文件就可以实现游戏函数调用和库函数调用#include"game.h"//打印菜单函数void menu(){printf("**********************\n");printf("******** 1.play*******\n");printf("******** 0.exit*******\n");printf("**********************\n");}void test(){int input = 0;//当我们运行程序就会打印菜单,这里我们使用do while循环因为do while至少需要执行一次do{menu();printf("请选择:>");scanf("%d",&input);//通过switch语句来选择游戏开始或结束switch (input){default :printf("输入不合法\n");break;case 1:printf("三子棋游戏\n");break;case 0:printf("游戏结束\n");break;}} while (input);}int main(){test();return 0;}

书写完第一步的代码,我们来进行一下测试:

从运行结果中可以得知,代码的编写逻辑没有问题,接下来我们就要实现游戏模块的编写。这里我们就要通过修改Switch语句中case 1:语句来进行三子棋游戏的剩余逻辑的实现。

三、创建棋盘并且初始化棋盘

//以下是头文件中的代码:#pragma once#include<stdio.h>//这里我们通过#define定义两个常量来表示行和列#define ROW 3#define COL 3//初始化棋盘函数声明void Init(char board[ROW][COL], int row, int col);

//测试模块中创建数组,以及调用初始化棋盘函数void game(){char board[ROW][COL];Init(board,ROW,COL);}

//game.c游戏模块中的代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//初始化棋盘void Init(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++){board[i][j] = ' ';}}}

四、打印棋盘并验证打印棋盘和初始化棋盘模块的实现

首先使我们希望代码实现后的效果:

当我们菜单界面输入1时,屏幕输出初始化后的棋盘。 下面是代码:

void PrintBoard(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){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}}

下面是两个模块下的代码:

//游戏模块game.h头文件#pragma once#include<stdio.h>#define ROW 3#define COL 3void Init(char board[ROW][COL], int row, int col);//声明打印棋盘函数void PrintBoard(char board[ROW][COL], int row, int col);

//游戏模块game.c#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void Init(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++){board[i][j] = ' ';}}}void PrintBoard(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){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}}

//测试模块test.c#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu(){printf("**********************\n");printf("******** 1.play*******\n");printf("******** 0.exit*******\n");printf("**********************\n");}void game(){char board[ROW][COL];Init(board,ROW,COL);PrintBoard(board,ROW,COL);}void test(){int input = 0;do{menu();printf("请选择:>");scanf("%d",&input);switch (input){default :printf("输入不合法\n");break;case 1:game();break;case 0:printf("游戏结束\n");break;}} while (input);}int main(){test();return 0;}

下面是我们对目前编写的两个代码进行测试,这里由于我们初始化棋盘使用空格字符,为了方便我们进行观察我将初始化字符进行一个修改后进行测试。接下来是测试结果:

那么游戏的前两个模块我们就实现完成了,接下来就是进行下棋落子模块

五、玩家下棋

这里玩家需要输入行和列的坐标进行下棋,注意:由于并不是每个人都学过c语言,所以我们的坐标得是数组的下标+1。下面是函数代码:

void PlayerMove(char board[ROW][COL], int row, int col){while (1){int x = 0;int y = 0;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");}}}

我们也需要在测试模块中调用该函数,因为落子是一个重复的重复的过程,所以我们把它放进一个循环里:

//在调用前需要在头文件中声明PlayerMove函数void game(){char board[ROW][COL];Init(board,ROW,COL);PrintBoard(board,ROW,COL);while (1){PlayerMove(board, ROW, COL);//更新落子后的棋盘PrintBoard(board, ROW, COL);}}

下面运行代码进行测试:

六、电脑下棋

当我们要实现电脑下棋时,我们要通过生成随机数,并将随机数赋给行和列坐标来进行落子。

这里我们需要通过时间戳来生成随机数。需要借助rand函数、srand函数、time函数。这里也就需要引相应的头文件#include <stdlib.h> #include<time.h>。注意:由于time函数返回值为time_t 所以这里我们需要进行将值强制转成unsigned int。

下面是电脑下棋代码:

void ComputerMove(char board[ROW][COL], int row, int col){while (1){int x = rand() % 3;int y = rand() % 3;if (board[x][y] == ' '){board[x][y] = '#';break;}}}

下面测试一下玩家下棋以及电脑下棋模块:

六、输赢判断

代码实现

//判断棋盘是否满了int Full(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;}char Judge(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][0] != ' ')return board[i][0];}//判断三列for (i = 0; i < row; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')return board[0][i];}//判断对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')return board[0][0];if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')return board[0][2];//判断平局if (Full(board, row, col) == 1)return 'Q';//游戏继续return 'C';}

七、三子棋游戏完整代码以及测试

自定义头文件game.h:

#pragma once//引用库函数头文件#include<stdio.h>#include<stdlib.h>#include<time.h>//定义常量#define ROW 3#define COL 3//游戏模块函数声明void Init(char board[ROW][COL], int row, int col);void PrintBoard(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 Judge(char board[ROW][COL], int row, int col);

游戏测试模块test.c:

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//实现打印菜单函数void menu(){printf("**********************\n");printf("******** 1.play*******\n");printf("******** 0.exit*******\n");printf("**********************\n");}//游戏模块调用void game(){char board[ROW][COL];char ret = 0;//初始化并打印棋盘Init(board,ROW,COL);PrintBoard(board,ROW,COL);//下棋模块调用while (1){PlayerMove(board, ROW, COL);//更新落子后的棋盘PrintBoard(board, ROW, COL);//通过返回值进行输赢判断ret = Judge(board, ROW, COL);if (ret != 'C'){break;}ComputerMove(board, ROW, COL);PrintBoard(board, ROW, COL);ret = Judge(board, ROW, COL);if (ret != 'C'){break;}}//通过返回字符来判断//玩家赢了返回'*'//电脑赢了返回'#'//平局赢了返回'Q'//对局继续返回'C'if (ret == '#')printf("电脑赢\n");else if (ret == '*')printf("玩家赢\n");else if(ret == 'Q')printf("平局\n");}//菜单界面实现函数void test(){int input = 0;do{menu();printf("请选择:>");scanf("%d",&input);switch (input){default :printf("输入不合法\n");break;case 1:game();break;case 0:printf("游戏结束\n");break;}} while (input);}int main(){test();return 0;}

游戏模块game.c代码:

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//初始化棋盘函数void Init(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++){board[i][j] = ' ';}}}//打印棋盘函数void PrintBoard(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){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}}//玩家下棋函数void PlayerMove(char board[ROW][COL], int row, int col){printf("玩家下棋\n");while (1){int x = 0;int y = 0;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() % 3;int y = rand() % 3;if (board[x][y] == ' '){board[x][y] = '#';break;}}}//判断棋盘满了没有的函数int Full(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;}//判定输赢函数char Judge(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][0] != ' ')return board[i][0];}//判断三列for (i = 0; i < row; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')return board[0][i];}//判断对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')return board[0][0];if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')return board[0][2];//判定平局if (Full(board, row, col) == 1)return 'Q';return 'C';}

总结

通过编写这个三子棋游戏我们可以巩固的知识点有:

1.文件的创建:头文件(.h文件)和源文件(.c文件)

2.库函数的使用

3.如何创建并使用自定义函数

3.选择语句的使用

4.循环语句的使用

5.一维数组和二维数组的创建以及使用

6.#define定义的常量

以上就是我的三子棋游戏的实现过程。代码都是需要自己编写以及反复测试才能完成的,虽然测试时可能会碰到bug但是请一定不要放弃,攻克一个个问题才能持续进步。如果觉得本篇文章有用的话,请一定要点赞或留言支持我。你的支持是我最大的动力!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。