【C语言】三子棋

 

前言:

三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小,三子棋在很多时候会出现和棋的局面。

设计思路:

先开一个test.c文件用来进行游戏的逻辑测试,再开一个game.h头文件和game.c文件分别用来进行函数声明和实现游戏的逻辑,然后就是打印菜单、生成棋盘、实现玩家下棋、实现电脑下棋、判断游戏的输赢、游戏优化。

1. 打印菜单

test.c

void menu()
{printf("***************************\n");printf("********   1.play  ********\n");printf("********   2.exit  ********\n");printf("***************************\n");
}int main()
{int input = 0;do{menu();printf("请选择>:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏.\n");break;default:printf("输入有误,请重新输入.\n");}} while (input);return 0;
}

2. 生成棋盘

2.1 初始化棋盘

我们可以用空格将每一个格子初始化。

test.c文件:

board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);

 game.c文件:

void InitBoard(char board[ROW][COL], int row, int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){board[i][j] = " ";}}
}

其中的ROW和COL是两个宏定义。

 game.h

#define ROW 3
#define COL 3

2.2 打印棋盘

打印棋盘时我们可以一些符号隔开不同的空格,这样就会使我们的棋盘更加美观。比如我们可以使用“|”将同一行的空格分开,用“-”将不同行的空格分开,这样我们就可以得到一个如下的九宫格了。

 

 game.c文件:

void DisplayBoard(char board[ROW][COL], int row, int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){printf("   ");if (j < col - 1){printf("|");}}printf("\n");if (i < row - 1){for (int j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}

 3. 实现玩家下棋和电脑下棋

为了游戏的可实行性,当玩家或电脑下完一个棋子后我们需要考虑以下两点:

1.玩家或电脑所下的坐标是否在棋盘的范围内。

2.玩家或电脑所下的位置是否已经被下过棋子了。

依据上面的两点条件的我们需要分别写一个条件语句,判断玩家是否合法下棋。

3.1 玩家下棋

game.c文件:

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

3.2 电脑下棋

思路: 

我们可以在让电脑生成随机数,这样就可以使其随机生成一个坐标下棋子,那么我们就可以简单的实现电脑下棋的效果了。

随机数的生成则可以使用rand函数、srand函数以及time函数。

game.c文件:

void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");while (1){int x = rand() % row;int y = rand() % row;if (x <= row && x >= 1 && y <= row && y >= 1){if (board[x][y] == ' '){board[x][y] = '#';break;}}}
}

test.c文件:

srand((unsigned int)time(UNLL))

game.h文件:

#include<time.h>
#include<stdlib.h>

为了实现玩家下一个棋,然后电脑下一个棋的功能我们还需加上一个while循环。如下:

test.c文件:

while(1)
{//玩家下棋PlayerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//电脑下棋ComputerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);
}

 4. 判断游戏的输赢

 思路:

此游戏无非只有三种结果:要么玩家赢,要么电脑赢,要么平局。所以我们可以写一个函数判断是这几种结果的哪一种,然后规定如果是玩家赢此函数返回“*”,如果是电脑赢则返回“#”,平局则返回“Q”,这几种都不是就说明游戏继续,那么就返回“C”.

要判断是否有赢的一方,无非就是判断是否出现了三个相同的棋子练成一条直线,而棋子连成的线无非就只有三种情况:竖线、横线、对角线。所以我们只需要判断是否出现了这三种情况的其中一种就可以了。而要判断是平局,则判断九宫格是否还有没有空格。

game.c文件:

int ItFull(char board[ROW][COL], int row, int col)
{for (int i = 0; i < row; i++){for (int j = 0;j < col; j++){if (board[i][j] == ' '){return 0;}}}return 1;
}
char ItWin(char board[ROW][COL], int row, int col)
{//行for (int i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ')return board[i][1];}//列for (int j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ')return board[1][j];}//对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != 0){return board[1][1];}if (ItFull(board, row, col)){return 'Q';}return 'C';
}

test.c文件:

	//玩家下棋PlayerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//判断输赢char ret = ItWin(board, ROW, COL);if (ret != 'C'){if (ret == '*'){printf("玩家赢了!!!\n");}break;}//电脑下棋ComputerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//判断输赢ItWin(board, ROW, COL);if (ret != 'C'){if (ret == '#'){printf("电脑赢了!!!\n");}break;}

完整代码:

game.h文件:


#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define ROW 3
#define COL 3void 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 ItWin(char board[ROW][COL], int row, int col);

test.c文件:

#include"game.h"void menu()
{printf("***************************\n");printf("********   1.play  ********\n");printf("********   2.exit  ********\n");printf("***************************\n");
}
void game()
{//第一步打印棋盘。char board[ROW][COL] = { 0 };//初始化棋盘InitBoard(board, ROW, COL);//打印棋盘DisplayBoard(board, ROW, COL);char ret;while(1){//玩家下棋PlayerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//判断输赢char ret = ItWin(board, ROW, COL);if (ret != 'C'){if (ret == '*'){printf("玩家赢了!!!\n");}break;}//电脑下棋ComputerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//判断输赢ItWin(board, ROW, COL);if (ret != 'C'){if (ret == '#'){printf("电脑赢了!!!\n");}break;}}
}
int main()
{srand((unsigned int)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");}} while (input);return 0;
}

game.c文件:

#include"game.h"void InitBoard(char board[ROW][COL], int row, int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){board[i][j] = ' ';}}
}void DisplayBoard(char board[ROW][COL], int row, int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){printf(" %c ",board[i][j]);if (j < col - 1)printf("|");}printf("\n");if (i < row - 1){for (int 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, 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;int y = rand() % row;if (x <= row && x >= 1 && y <= row && y >= 1){if (board[x][y] == ' '){board[x][y] = '#';break;}}}
}int ItFull(char board[ROW][COL], int row, int col)
{for (int i = 0; i < row; i++){for (int j = 0;j < col; j++){if (board[i][j] == ' '){return 0;}}}return 1;
}
char ItWin(char board[ROW][COL], int row, int col)
{//行for (int i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ')return board[i][1];}//列for (int j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ')return board[1][j];}//对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != 0){return board[1][1];}if (ItFull(board, row, col)){return 'Q';}return 'C';
}

运行图:

游戏优化: 

让电脑生成一个数的方式来实现一个电脑下棋的效果,肯定是没有什么可玩性的,等后面学习算法之后,我们就加入一些算法将其变为一个棋艺高超的棋手了。

以上就是使用c语言写三子棋的全部内容啦,如果上述内容对你有帮助的话不要忘记点上一个小小的赞和关注呦,期待我们下次再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/266784.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java-常用集合

Jva常用集合 一、Java 集合框架体系二、Collection接口和方法1. List接口List 接口主要实现类&#xff1a;ArrayListList 的实现类之二&#xff1a;LinkedListList 的实现类之三&#xff1a;Vector 2. Set接口Set 主要实现类&#xff1a;HashSetSet 实现类之二&#xff1a;Link…

抽象类与抽象方法

文章目录 抽象类抽象类的特点 抽象方法抽象方法的特点 模板设计模式模板设计模式能解决的问题示例 #抽象类与抽象方法 抽象类 用abstract关键字来修饰一个类时&#xff0c;这个类就叫抽象类。 public abstract 类名{... }抽象类的特点 1&#xff09;抽象类不能被实例化。 2&…

基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面

目录 简介注册与软件获取工程配置设计 UI导出源码板级验证更多内容 简介 SquareLine Studio 是一款专业的 UI 设计软件&#xff0c;它与 LVGL&#xff08;Light and Versatile Graphics Library&#xff0c;轻量级通用图形库&#xff09;紧密集成。LVGL 是一个轻量化的、开源的…

[HackMyVM]靶场 Adria

kali:192.168.56.104 主机发现 arp-scan -l 靶机:192.168.56.108 端口扫描 nmap -p- 192.168.56.108 开启了 22 80 139 445端口 进入web 编辑 /etc/hosts&#xff0c;把192.168.56.108 adria.hmv添加进去重新访问 里面没什么有用的东西&#xff0c;注册需要邮箱&#xff0c;…

字典树基础,朴素字符串查找

字典树基础&#xff0c;朴素字符串查找 空间&#xff08;o(n*m)&#xff09; #include<bits/stdc.h> using namespace std; ​ const int N 2e6 9; int nex[N][26]; int cnt[N]; int idx 2; void insert(char s[]){int x 1;for (int i 0; s[i]; i){//判断x是否存在是…

Docsify部署IIS

什么是Docsify&#xff1f; 一个神奇的文档网站生成器。docsify 可以快速帮你生成文档网站。不同于 GitBook、Hexo 的地方是它不会生成静态的 .html 文件&#xff0c;所有转换工作都是在运行时。如果你想要开始使用它&#xff0c;只需要创建一个 index.html 就可以开始编写文档…

2024年腾讯云服务器优惠活动,3月份价格曝光可领代金券

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

cpp基础学习笔记03:类型转换

static_cast 静态转换 用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的&#xff1b;down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。用于基本数据类型之间的转换&#xff…

java-ssm-jsp房屋中介服务平台的设计与实现

java-ssm-jsp房屋中介服务平台的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

基于springboot+html实现的衣物捐赠平台

一、系统架构 前端&#xff1a;html | layui | jquery | css 后端&#xff1a;springboot | thymeleaf | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 注册 03. web页-首页 04. web页-捐赠衣服 05. web页-论坛交流…

C++:String类的使用

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 在C语言中&#xff0c;我们想要存储字符串的话必须要用字符数组 char str[]"hello world"这其实是将在常量区的常量字符串拷贝到数组中&#xff0c;我们会在数组的结尾多开一个空间存储\0&#xff0c;这样我…

数据结构从入门到精通——算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度 前言一、算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 二、时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例2.4等差数列计算公式2.5等比数列计算方法 三、空间复杂度四、 常见复杂度对比五、 复杂度的oj练习…

Data Leakage and Evaluation Issues inMicro-Expression Analysis 阅读笔记

IEEE Transactions on Affective Computing上的一篇文章&#xff0c;做微表情识别&#xff0c;阅读完做个笔记。本文讨论了Data Leakage对模型准确度评估的影响&#xff0c;及如何融合多个微表情数据集&#xff0c;从而提升模型的准确度。工作量非常饱满&#xff0c;很认真&…

蓝桥杯算法 一.

分析&#xff1a; 本题记录&#xff1a;m个数&#xff0c;异或运算和为0&#xff0c;则相加为偶数&#xff0c;后手获胜。 分析&#xff1a; 369*99<36500&#xff0c;369*100>36500。 注意&#xff1a;前缀和和后缀和问题

C++数据结构与算法——二叉搜索树的属性

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

获取PDF中的布局信息——如何获取段落

PDF解析是极其复杂的问题。不可能靠一个工具解决全部问题&#xff0c;尤其是五花八门&#xff0c;格式不统一的PDF文件。除非有钞能力。如果没有那就看看可以分为哪些问题。 提取文本内容&#xff0c;提取表格内容&#xff0c;提取图片。我认为这些应该是分开做的事情。python有…

[VNCTF2024]-PWN:preinit解析(逆向花指令,绕过strcmp,函数修改,机器码)

查看保护&#xff1a; 查看ida&#xff1a; 这边其实看反汇编没啥大作用&#xff0c;需要自己动调。 但是前面的绕过strcmp还是要看一下的。 解题&#xff1a; 这里是用linux自带的产生随机数的文件urandom来产生一个随机密码&#xff0c;然后让我们输入密码&#xff0c;用st…

msvcr120.dll丢失的解决办法的详细步骤,简单有效的解决msvcr120.dll丢失

当我们遇到电脑提示msvcr120.dll文件不见了时&#xff0c;无需过分紧张&#xff0c;因为这个问题有众多解决方案可供我们选择。今天我特意准备了一些应对这一问题的经验分享&#xff0c;并给大家带来一些独到的解决思路。让我们一起来探讨吧&#xff01; 一、先了解一下什么是m…

Swagger3 使用详解

Swagger3 使用详解 一、简介1 引入依赖2 开启注解3 增加一个测试接口4 启动服务报错1.5 重新启动6 打开地址&#xff1a;http://localhost:8093/swagger-ui/index.html 二、Swagger的注解1.注解Api和ApiOperation2.注解ApiModel和ApiModelProperty3.注解ApiImplicitParams和Api…

Huggingface初上手即ERNIE-gram句子相似性实战

大模型如火如荼的今天&#xff0c;不学点语言模型&#xff08;LM&#xff09;相关的技术实在是说不过去了。只不过由于过往项目用到LM较少&#xff0c;所以学习也主要停留在直面——动眼不动手的水平。Huggingface&#xff08;HF&#xff09;也是现在搞LM离不开的工具了。 出于…