目录

前言

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

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

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

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

五、玩家下棋

六、电脑下棋

六、输赢判断

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

总结



前言

通过了一段时间的C语言学习,我准备通过编写一个简单地三子棋小游戏,来对之前所学的C语言知识进行一个复习巩固。我使用的环境是VS2019。代码的书写我准备分两个模块,分别是测试模块(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但是请一定不要放弃,攻克一个个问题才能持续进步。如果觉得本篇文章有用的话,请一定要点赞或留言支持我。你的支持是我最大的动力!

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

  1. 使用C语言编写三子棋小游戏

    使用C语言编写三子棋小游戏: 首先进行分析: 1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试. 2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构. 3.游戏 ...

  2. 趣讲用c语言实现三子棋小游戏

    目录 直接先看看最后运行效果吧 三子棋如何设计的,及其步骤 1,源文件已经头文件的创建 2.创建主函数 3.test函数的创建 4.game函数的创建和运行 5.五个函数的实现 a.init_boar ...

  3. 用C语言实现三子棋小游戏(C语言菜单创建--设置光标,隐藏光标)

    文章目录 前言 一.菜单设置 二.三子棋游戏 1.各部分代码 2.运行结果 总结 前言 本文主要用C语言实现三子棋(简易版)小游戏,同时介绍C语言中的菜单设置. 一.菜单设置 我们在C语言中设置菜单一 ...

  4. C语言实现三子棋小游戏(源码+教程)

    我猜中了开头,却猜不到这结局.--<大话西游> 目录 1.设计框架 2.设计流程 2.1菜单 2.2初始化棋子 2.3初始化棋盘 2.4玩家输入落子的坐标 2.5电脑随机生成棋子 2.6判 ...

  5. 【C++小游戏】推箱子代码+详解

    这是一个以生活为灵感的游戏! 注:本程序完全原创,如果有BUG,欢迎私信投诉. 一.功能: 共40关,1~6关较为简单,后面的比较难: 可以新建文件作为存档: 关卡内部可以用Z键撤销: 可以疯狂跳关. ...

  6. C语言实现三子棋小游戏---超详细讲解

    实现步骤 第1步---打印一个菜单提示选择是否进入游戏 第2步---创建棋盘 第3步---初始化棋盘 第4步---打印棋盘 第5步---下棋,并判断输赢 第6步---将上述函数做成项目 完整代码 第1 ...

  7. 呆头呆脑的电脑----三子棋小游戏(C语言版)

    目录 1.需求分析 2.程序架构 3.代码实现(分函数呈现) (1)主函数代码实现 分析: 异常处理: (2)菜单函数的实现 分析: (3)游戏函数的实现 分析: (4)棋盘的初始化 分析: (5)棋 ...

  8. 三子棋小游戏带你走进编程世界(c语言版)

    目录 一.游戏实现的整体思路 二.实现游戏大体框架 二.游戏函数的实现 1.初始化键盘 2.打印棋盘 3.下棋及胜负判断 (1)玩家下棋 (2)电脑下棋 (3)判断输赢 三.结语及源码 三子棋想必大家 ...

  9. 【牛客刷题】上手用C语言写一个三子棋小游戏超详解哦(电脑优化)

    作者:[南航科院小张 南航科院小张的博客 专栏:从c语言的入门到进阶 学习知识不只是要懂,还要会用:想要找到好的工作,这里给大家介绍一件可以斩获诸多大厂offer的利器–牛客网 点击免费注册和我一起开 ...

最新文章

  1. jquery 取消 radio checked 属性,重新选中的问题解决
  2. JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念...
  3. golang 结构体断言_Golang中的reflect原理
  4. Qt Quick学习笔记
  5. day33-进程池和线程池
  6. 地域跨度入手的8zsb
  7. pandas.Series.asfreq
  8. 【论文】基于层次化注意力图网络和多视角学习的商品推荐(附论文下载链接)...
  9. [官版翻译ing]OpenStack云计算快速入门之一:OpenStack及其构成简介
  10. C语言实现行列式和代数余子式
  11. 初识 Powershell 5.0 class
  12. DTFT和DFT有何区别?一文为你讲解清楚
  13. 开源 | 写了个微博去广告、屏蔽拉黑插件
  14. 内存卡提示要格式化怎么办?
  15. office常用技巧总结【word篇】
  16. [VRFC 10-529] concurrent assignment to a non-net an is not permitted [C:/Users/chenxy/Desktop/digit
  17. 联接无止境!500万台AP潜在大数据流量入口
  18. UVA 10881 Piotr‘s Ants
  19. FBI网站被黑致数据泄露?官方称这根本是个骗局
  20. 整理总结:机器学习常用九大算法

热门文章

  1. 废品回收小程序搭建是如何实现运营方案整合以及利润的产生
  2. 二进制部署k8s1.18(下)
  3. CV_AA未声明的标识符问题
  4. 三星 9810 android 9,三星S9双版本对比:骁龙845碾压Exynos 9810
  5. 华容道(4x4)教学(最难(最后两行))
  6. 智能化实验室设计是什么
  7. 什么是支撑位和阻力位
  8. 利用 ransac 算法拟合平面
  9. python乒乓球比赛规则介绍_乒乓球比赛规则常识大全
  10. 2013年王道论坛研究生机试练习赛(一)东邪他爹解答