c语言基础五子棋,十分的易懂理解,详细解释,容易上手

2023-11-11


前言

提示:经过b站和视频学习后编程


提示:以下是本篇文章正文内容,下面案例可供参考

五子棋

本篇博客主要写了关于c语言的五子棋代码
思路:
五子棋我们可以将代码分成棋盘和棋子两大部分,理所当然的,我们需要知道棋子下棋的位置和棋盘的大小。然后在五子棋中,我们是每下完一次棋便需要进行一次胜负的判定虽然在生活当中,在五子棋刚开始我们不会去思考胜负,但下到后面,我们仔细想想,我们是不是每下一次棋,便会思考胜负。当然,在回过头去想,对于编程来说,下棋的位置也需要进行思考

头文件

因为是一个小程序,所以我并没有写在头文件中,而是和源文件放在一起,方便修改

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define Player1 1//这里表示游戏的三种情况:玩家1胜,玩家2胜,游戏继续
#define Player2 2
#define next 3
#define ROW 11//棋盘大小
#define COL 11

因为 我已注释,便不过多赘述

展示棋盘(display)

我是选择先做棋盘的展示,这样才会方便我之后写代码进行验证
因为我是喜欢从1开始计算,所以我让x和y从1开始计数
⭐注意:这里的x,y并不是全局变量中的x,y。对于函数来说,当名字重复时,会优先使用本函数内的变量,而不是全局变量的x,y
然后对于玩家1则用&表示,而玩家2则用*表示

void display(int board[][COL],int row,int col){//此函数用来展示棋盘
	int x;
	printf("\t");
	for (x = 1; x < row; x++) {
		printf("%d\t", x);
	}
	printf("\n");
	for (x = 1; x < row; x++) {
		int y = 1;
		printf("%d\t", x);
		for (; y < row; y++) {
			if (board[x][y] == Player1)
				printf("&\t");
			else if (board[x][y] == Player2)
				printf("*\t");
			else
				printf("#\t");
		}
		printf("\n");
	}
}

下棋(PlayMove)

在进行下棋代码前,我先展示了一下棋盘是否能成功,再进行下棋函数
我们需要把棋盘这个二维数组进行传入,然后who表示当前下棋的玩家,而who2是我为了避免棋盘上,若已有棋子,则无法在此位置上下棋
这里需要while进行循环,直到下棋成功(为了避免棋子越界或犯规)

void PlayMove(int board[][COL],int row,int col,int who,int who2) {
	//第一个who是来表示当前下棋的人,第二个who是避免在已有棋子的位置下棋
	while (1) {
		printf("玩家%d走:", who);
		scanf("%d%d", &x, &y);//这里的x,y是全局变量,用来获取下棋的位置
		if (x >= 1 && x < row && y >= 1 && y < col) {//不能越界
			if (board[x][y] != who && board[x][y] != who2) {
				board[x][y] = who;
				break;
			}
			else
				printf("位置已占!\n");
			
		}
		else
			printf("不在范围内!\n");
	}

}

主体函数(game)

首先开辟棋盘的内存,并展示棋盘,然后在while循环内进行下棋,展示棋盘
由于每次下完棋后必须要进行胜负判断,所以紧接Isover函数,只有Isover返回Player1或Player2时,才可以退出循环,并显示结果

void game() {//game函数是主体函数
	int board[ROW][COL];//定义棋盘大小
	memset(board, ROW, COL);//给棋盘开创内存
	int result = next;
	display(board, ROW, COL);
	while (1) {
		PlayMove(board,ROW,COL,Player1,Player2);//先玩家1走,再展示棋盘,在进行胜负判定,最后再返回结果
		display(board, ROW, COL);
		result = Isover(board, ROW, COL, Player1);
		if (result != next)//若result为next,则游戏继续,若不是next,则退出循环,返回结果
			break;
		PlayMove(board, ROW, COL, Player2,Player1);
		display(board, ROW, COL);
		result = Isover(board, ROW, COL, Player2);
		if (result != next)
			break;
	}
	printf("胜利者是Player%d",result);
}

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define Player1 1//这里表示游戏的三种情况:玩家1胜,玩家2胜,游戏继续
#define Player2 2
#define next 3
#define ROW 11//棋盘大小
#define COL 11

int x = 0;//全局变量x,y,用来确定当前下棋的位置
int y = 0;

void display(int board[][COL],int row,int col){//此函数用来展示棋盘
	int x;
	printf("\t");
	for (x = 1; x < row; x++) {
		printf("%d\t", x);
	}
	printf("\n");
	for (x = 1; x < row; x++) {
		int y = 1;
		printf("%d\t", x);
		for (; y < row; y++) {
			if (board[x][y] == Player1)
				printf("&\t");
			else if (board[x][y] == Player2)
				printf("*\t");
			else
				printf("#\t");
		}
		printf("\n");
	}
}

int Isover(int board[][COL],int row,int col,int who) {//此函数用来判断胜负
	int Place_x[8] = { 0,0,1,-1,-1,1,-1,1 };//Place_x和Place_y共同来表示当前棋子的八个方向
	int Place_y[8] = { -1,1,0,0,-1,1,1,-1 };
	int num[4] = { 1,1,1,1 };//num数组则用来计数4条直线上的棋子
	for (int i = 0; i < 8; i++) {
		if (x + Place_x[i] >= 1 && y + Place_y[i] >= 1 && x + Place_x[i] <= ROW && y + Place_y[i] <= COL) {
			int _x = x;//每次for循环开始都需要重新回到当前棋子的位置
			int _y = y;
			for (int j = 0; j <= 4; j++) {
				_x += Place_x[i];
				_y += Place_y[i];
				if (board[x][y] == board[_x][_y]) {//如果是同一个玩家下的棋,则num数组计数+1
					num[i / 2] += 1;
					
				}
				else break;
				
			}
		}
	}
	for (int i = 0; i < 4; i++) {//当num数组总数,即某条直线上的棋子数有5颗或超过5颗,则返回胜者
		if (num[i] >= 5) {
			return who;
		}
	}
	return next;//若上面的for函数未满足条件,则游戏继续
}

void PlayMove(int board[][COL],int row,int col,int who,int who2) {
	//第一个who是来表示当前下棋的人,第二个who是避免在已有棋子的位置下棋
	while (1) {
		printf("玩家%d走:", who);
		scanf("%d%d", &x, &y);//这里的x,y是全局变量,用来获取下棋的位置
		if (x >= 1 && x < row && y >= 1 && y < col) {//不能越界
			if (board[x][y] != who && board[x][y] != who2) {
				board[x][y] = who;
				break;
			}
			else
				printf("位置已占!\n");
			
		}
		else
			printf("不在范围内!\n");
	}

}

void game() {//game函数是主体函数
	int board[ROW][COL];//定义棋盘大小
	memset(board, ROW, COL);//给棋盘开创内存
	int result = next;
	display(board, ROW, COL);
	while (1) {
		PlayMove(board,ROW,COL,Player1,Player2);//先玩家1走,再展示棋盘,在进行胜负判定,最后再返回结果
		display(board, ROW, COL);
		result = Isover(board, ROW, COL, Player1);
		if (result != next)//若result为next,则游戏继续,若不是next,则退出循环,返回结果
			break;
		PlayMove(board, ROW, COL, Player2,Player1);
		display(board, ROW, COL);
		result = Isover(board, ROW, COL, Player2);
		if (result != next)
			break;
	}
	printf("胜利者是Player%d",result);
}

int main() {
	int a = 1;
	while(a){
		game();
		printf("继续请输1,退出请输0\n");
		scanf("%d", &a);
	}
	return 0;
}

这篇代码是参照了b站up主SunistC的视频和比特蛋哥的五子棋代码所写,感谢各位观看,觉得有帮助的小伙伴希望可以点个赞啊,感谢各位

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言基础五子棋,十分的易懂理解,详细解释,容易上手 的相关文章

  • 启动 NFS 守护进程:rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)

    启动 NFS 守护进程 rpc nfsd writing fd to kernel failed errno 111 Connection refused rpc nfsd unable to set any sockets for nfs
  • MQTT协议详解(完整版)

    1 MQTT协议概念 1 1 MQTT特点 基于Publish Subscribe 发布订阅 模式的物联网通信协议 简单易实现 支持Qos 服务质量 报文精简 基于TCP IP 发布订阅模式 客户端只需要订阅这个主题 当有其他客户端向这个服
  • Kafka 简易教程 C++ 实例

    转自 https www cnblogs com kaishan1990 p 7228683 html 但是其中实例有细微修改 Kafka 简易教程 1 初识概念 Apache Kafka是一个分布式消息发布订阅系统 Topic Kafka
  • STL案例一:评委打分

    STL案例一 评委打分 案例描述 选手ABCDE 10名评委分别为每一名选手打分 去除最高分 去除最低分 取平均分 1 实现步骤 创建五名选手 放到vector中 遍历容器 取每一位选手 执行for循环 可以把 10个评分存放到deque容

随机推荐

  • 本地安全策略

    本地安全策略的概述 1 概念 通过设置一系列的规则 影响当前计算机的安全设置 用户登录后会受安全策略的控制 从而保证本地计算机的安全 2 打开本地安全策略管理控制台 1 图形界面 开始 控制面板 系统和安全 管理工具 本地安全策略 2 命令
  • 无痛涨点:目标检测优化的实用Trick

    本文作者分享了自己在图像预处理调参 模型训练调参等方面中的技巧 并提醒读者要多注意数据的分布和呈现的状态 对卷积网络来说 所学习的就是数据集的数据分布 你的卷积核参数最后形成的也是对数据集中特征分布的认知 写这篇文章就是因为up主的邀请 然
  • ESXi8.0安装,实体机安装,IPMI远程安装实战笔记

    目录 1 前言 2 连接主板IMPI 3 硬件兼容及BIOS设置 4 从U盘安装ESXi ESXi8 0安装包下载 链接 https pan baidu com s 1 a3ka1TAScFPtAc29jcxzQ 提取码 qwhg 1 前言
  • LeetCode Longest Palindromic Substring 最长回文子字符串 两种方法分析解答

    Longest Palindromic Substring Given a stringS find the longest palindromic substring inS You may assume that the maximum
  • Java人机猜拳游戏 (完整代码+详细注释+粘贴即食)

    文章目录 游戏规则 代码 实现截图 参考博客 阿里嘎多 游戏规则 游戏结束条件 我赢 代码 package Hello 注意修改名称与文件名保持一致 import java util Scanner public class Hello p
  • Python selenium webdriver 基本使用

    系列文章目录 selenium webdriver 的常用示例 文章目录 系列文章目录 selenium webdriver 的常用示例 前言 一 Pip安装 创建Bowser对象 1 Pip install selenium 2 创建Bo
  • Java开发环境搭建,保姆级JDK下载,安装,环境变量配置,一系列的完整流程的操作截图以及详细文字说明,JDK,JRE环境变量怎么配?这一篇就够了。

    Java的基础开发环境搭建 前言 提前了解一下以下知识在操作过程中会更加流畅哦 文件目录 https baike baidu com item E6 96 87 E4 BB B6 E7 9B AE E5 BD 95 7204308 fr a
  • MCS51 系列单片机的最小系统

    让单片机工作的前提是为它添加必要的外围电路以构成单片机最小系统 初学者可能对 单片机最小系统感觉很神秘 其实单片机最小系统很简单 就是能使单片机工作的最少的器件构成的系统 最小系统虽然简单 但是却是大多数控制系统所必不可少的关键部分 对于
  • AGG简介

    AGG是一个开源 高效的跨平台2D图形库 AGG的功能与GDI 的功能非常类似 但提供了比GDI 更灵活的编程接口 其产生的图形的质量也非常高 自称超过GDI 使用前AGG的准备工作 下载AGG库 它的家在http www antigrai
  • 5. 使用PyTorch预先训练的模型执行目标检测

    5 使用PyTorch预先训练的网络执行目标检测 PyTorch是什么 使用PyTorch训练第一个神经网络 使用PyTorch训练第一个卷积神经网络 使用预训练网络进行PyTorch图像分类 使用预训练网络进行PyTorch目标检测 今天
  • 记录STM32各类串口中断实验

    STM32F407VG使用cubemx LL库 波特率115200 一位停止位 无校验 单片机初始化串口一 PA8高速推挽输出 使用逻辑分析仪100M采样捕获各类串口中断触发时的波形 首先是喜闻乐见的RXNE 理论是只要串口成功接收一byt
  • Cache 和 Buffer 有什么区别

    Cache 和 Buffer 有什么区别 转载 talkwithtrend https mp weixin qq com s YsEOBVS7fXgrGXnXH1I0MQ Cache和Buffer简单的说 Cache是加速 读 而buffe
  • android自定义可缩放,移动图像裁剪框

    在实际项目中 经常要制作一个简易的图像裁剪功能 即获取一张图片 并用一个遮罩层选择目标范围并截取保存的功能 如下图所示 在此分享下该自定义视图的制作过程 需求说明 整一个视图包含一个透明的遮罩层 一个透明带白色边框的矩形 要实现的功能是 点
  • oracle 问题 :Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

    使用mysql时使用的sql语句常有 结尾的语句 但oracle中不能出现 结尾 因为oracle解析器很严谨 不支持 结尾语句解析
  • C基础day6(2023.7.6)

    一 Xmind整理 二 课上练习 练习1 循环嵌套 三个循环结构可以任意嵌套 include
  • Python爬虫分析唯品会商品数据 +数据可视化

    目录 前言 数据来源分析 1 明确需求 2 抓包分析 通过浏览器自带工具 开发者工具 代码实现步骤 发送请求 gt 获取数据 gt 解析数据 gt 保存数据 发送请求 解析数据 保存数据 数据可视化 先读取数据 泳衣商品性别占比 商品品牌分
  • Springmvc+mybatis+Dubbo+ZooKeeper+Redis+KafKa

    开发工具 1 Eclipse IDE 采用Maven项目管理 模块化 2 代码生成 通过界面方式简单配置 自动生成相应代码 目前包括三种生成方式 增删改查 单表 一对多 树结构 生成后的代码如果不需要注意美观程度 生成后即可用 技术选型 只
  • Androidstudio快捷操作之多选

    如图 想要批量复制属性名 不需要一个一个的复制 只需按住alt 鼠标左键从上往下拉 将光标定位在每个属性名的前面 再按ctrl w就可以选中所有光标后面的单词了
  • QT里使用sqlite的问题,好多坑

    1 我使用sqlite 开发机上好好的 测试机上却不行 后来发现是缺少驱动 Driver not loaded Driver not loaded 代码检查了又检查 发现应该是缺少dll文件 系统不提示 是自己使用 QMessageBox
  • c语言基础五子棋,十分的易懂理解,详细解释,容易上手

    前言 提示 经过b站和视频学习后编程 提示 以下是本篇文章正文内容 下面案例可供参考 文章目录 前言 五子棋 头文件 展示棋盘 display 下棋 PlayMove 主体函数 game 完整代码 五子棋 本篇博客主要写了关于c语言的五子棋