大一c语言课设--五子棋(基于easyx库)

easyx实现超级简单五子棋 easyx实现五子棋(附完整代码) 寒假的时候啃了下《C Prime Plus》,但觉得成天面对黑乎乎的控制台太无趣,于是乎突发奇想在网上找了个关于图像作画的教程,最终了解到了easyx这个c++的类库。(大佬略过啊直接,已经过时了都) 相关教程: 优快云 Easyx Easyx基础入门 百度文库 学习完这些后了,再加上一点C语言的基础就可以轻松实现五子棋啦~~ 下面贴一下完整代码吧 #include<stdio.h> #include <graphics.h> #includ 阅读详情
AI摘要

本文介绍了一款使用C++ easyx库开发的五子棋项目,涵盖了从界面设计到AI算法实现的全过程。项目实现了人机对战及人人对战模式,并具备悔棋、复盘等功能。

前言

  本文介绍本人的大一课程设计作业项目:五子棋,本来准备挑战更有难度的机器视觉目标检测系统(对于我来说困难),但是在经历各种不可预测的事情(包括变成小🐏人)之后,还是放弃了,然后写了这个项目(之前就有写过一点,是在疯狂改进)。项目主要使用easyx库,具体知识大家可以自行搜索学习,在文章内就不大量解释了。写这篇文章主要是记录自己的人生第一个课设。

目录

前言

一、程序包含的库和全局变量

二、功能函数介绍

1.初始化界面、结束界面与棋盘绘制

2.棋子绘制和落子

3.模式展示

4.游戏数据初始化与悔棋

5.简单AI算法

6.复盘功能

7.背景音乐与音效设置

三、函数封装

1.开始函数

2.人人对战

3.人机对战

四、总结


一、程序包含的库和全局变量

  我使用的是vs2022,项目主要使用c++的库easyx,具体库的安装大家可以自行搜索(安装在vs上很简单),项目还引用了mmsystem.h库,主要用来播放音乐,注意还需包括一个语句#pragma comment(lib,"winmm.lib"),是为了告诉编译器,加载winmm. lib库文件,也可以在vs里链接器直接添加。

  具体的全局变量设置和作用,在下面的代码段中都有注释,大家可以直接看。接下来对函数的介绍就简单介绍一些easyx库函数的使用,具体大家自行学习,然后介绍一些注意事项。

#ifndef _STA_H//防止报错重复定义
#define _STA_H
#include<graphics.h>//引用图形库头文件
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<mmsystem.h>//播放音乐头文件
#pragma comment(lib,"winmm.lib")//告诉编译器,加载winmm. lib库文件
int chess[15][15] = { 0 };//定义棋盘数组,0表示没有棋子1表示白棋2表示黑棋
int Change_Chess = -1;//用于改变棋子颜色
int Current_color = 2;//代表棋子颜色,2表示黑色1表示白色(黑棋先走)
int AIx;//AIx_y在AI函数中获取人机判断出的优势位置然后下
int AIy;
int xx;//悔棋标志,在下棋过程中记录每一步的棋来实现悔棋函数
int yy;
int AIxx;
int AIyy;
int position[3];//AI算法中用来保存优势位置的行列坐标和分数
int win;//用来获取胜利一方的棋子颜色
int music;//背景音乐是否播放的标志 奇数时表示音乐在播放\偶数表示音乐关闭
int piece_num;//记录每一局的下棋总步数为了实现复盘
struct chess {
	int f_x;
	int f_y;
}fupan[225];//记录每一步棋的坐标,225表示棋盘可以下的最大步数
IMAGE Img;//存放开始界面图片
IMAGE MusicImg1;//存放正在播放音乐的图片
IMAGE MusicImg2;//存放音乐暂停的图片
MOUSEMSG Mouse_message = { 0 }; //定义一个与鼠标相关的全局结构体变量
......
#endif

二、功能函数介绍

首先是各类函数的声明

void Page_initialization1();//初始化(正在播放音乐菜单显示) 
void Page_initialization2();//初始化(音乐暂停菜单显示)
void Checkerboard_display_AI();//绘制人机对战棋盘 
void Checkerboard_display_Player();//绘制人人对战棋盘 
void f_Checkerboard_display();//绘制复盘时的棋盘
void Drawpiece(int x, int y, int color);//绘制棋子 
void Drawpiece_regret(int x, int y, int color);//悔棋时绘制棋子(去除了落子声音防止出现延迟)
/*easyx库内xy轴是原点在左上角,x轴横向且向右为正,y轴竖向且向下为正。
  与二维数组行和列的对应关系是:x对应列,y对应行
  所以在下面落子以及之后的AI判断等等函数需要考虑这个关系
*/
bool PieceSet(int y, int x, int color);//判断是否有棋子,给数组赋值然后落子
void Pieceset_fupan(int y, int x, int color);//复盘时给数组赋值
//模式展示:当鼠标移动到固定位置时字体变色
void Modelshow();//开始界面模式展示
void Modelshow_AI(MOUSEMSG m);//人机对战模式展示
void Modelshow_Player(MOUSEMSG m);//人人对战模式展示
//游戏数据初始化
void Game_Initialization();//每次对局开始前的初始化
void f_Game_Initialization();//复盘时的初始化(清空棋盘,恢复棋子最开始颜色)
int winner();//胜负判断(暴力判断)
void regret_AI();
void regret_Player();
void music_open();//播放背景音乐
void music_close();//关闭背景音乐
void music_set();//落子声音
//简单AI算法
void judge(int color);//寻找优势位置
int Data(int num, int count);//算分数来辅助judge函数
void AI();//分别判断黑子和白子的最大优势位置,然后判断是堵截还是进攻
//结束界面
void over_AI(int x);
void over_Player(int x);
void _fupan();
//对战界面
void playerVSplayer();//人人对战
void playerVSAI();//人机对战
void begin();//开始

1.初始化界面、结束界面与棋盘绘制

初始化界面包括背景音乐播放和背景音乐暂停两个,差别不大,只是一个图片不一样。

void Page_initialization1() {//初始化界面(音乐 播放状态)
	initgraph(950, 800); //创建窗口
	loadimage(&Img, _T("D:\\开始界面.jpg"), 950, 800);//加载图像
	loadimage(&MusicImg1, _T("D:\\播放.jpg"), 40, 40);//加载图像
	putimage(0, 0, &Img);//在窗口中打印图像
	putimage(900, 750, &MusicImg1);//在窗口中打印图像(音乐播放)
	setbkmode(TRANSPARENT);  //设置背景的风格 tranparent(透明的)
}
void Page_initialization2() {//初始化界面(音乐 暂停状态)
	initgraph(950, 800); //创建窗口
	loadimage(&Img, _T("D:\\开始界面.jpg"), 950, 800);//加载图像
	loadimage(&MusicImg2, _T("D:\\暂停.jpg"), 40, 40);//加载图像
	putimage(0, 0, &Img);//在窗口中打印图像
	putimage(900, 750, &MusicImg1);//在窗口中打印图像(音乐暂停)
	setbkmode(TRANSPARENT);  //设置背景的风格 tranparent(透明的)
}

  initgraph():创建初始化图形窗口。
  oadimage():从文件中读取图像。
  putimage():在窗口上绘制指定的图像。
  setbkmode():设置背景。

注意最后一句设置背景风格为透明是为了之后在上面输出文字的时候,文字的背景不会是黑框而是图片。容易遇到的问题就是创建窗口后输出图片还是一片黑,有可能是因为你图片的像素和窗口大小差距过大,建议改成和创建的窗口相同。

运行效果:

 这是没有包括音乐播放和暂停的图片,并且那些字是p上去的。

结束界面也包括两种,一种是人机对战的结束界面,另外一种是人人对战的结束界面。

void over_AI(int x)
{
	initgraph(400, 400);//;创建窗口
	settextstyle(50, 24, _T("宋体"));//设置字体格式
	settextcolor(RED);    //字体颜色
	if (x == 1)//判断胜利方
	{
		outtextxy(100, 50, _T("电脑获胜"));
	}
	else if (x == 2)
	{
		outtextxy(100, 50, _T("玩家获胜"));
	}
	settextcolor(WHITE);
	outtextxy(160, 200, _T("复盘"));//展示选项
	outtextxy(60, 300, _T("返回开始界面"));

	while (true)
	{
		MOUSEMSG n;//鼠标信息
		n = GetMouseMsg();//获取鼠标消息
		switch (n.uMsg) {
		case WM_LBUTTONDOWN://左键按下
			if (n.x <= 260 && n.x >= 160 && n.y <= 250 && n.y >= 200)
				_fupan();   //复盘游戏

			if (n.x <= 280 && n.x >= 60 && n.y <= 350 && n.y >= 300)
			{
				begin(); // 返回开始界面
			}
		}
	}
}
void over_Player(int x) {
	initgraph(400, 400);//创建窗口
	settextstyle(50, 24, _T("宋体"));//设置字体格式
	settextcolor(RED);    //字体颜色
	if (x == 2)//判断胜利方
	{
		outtextxy(100, 50, _T("黑棋获胜"));
	}
	else if (x == 1)
	{
		outtextxy(100, 50, _T("白棋获胜"));
	}
	settextcolor(WHITE);
	outtextxy(160, 200, _T("复盘"));//展示选项
	outtextxy(60, 300, _T("返回开始界面"));

	while (true)
	{
		MOUSEMSG n;//鼠标信息
		n = GetMouseMsg();//获取鼠标消息
		switch (n.uMsg) {
		case WM_LBUTTONDOWN://左键按下
			if (n.x <= 260 && n.x >= 160 && n.y <= 250 && n.y >= 200)
				_fupan();   //复盘游戏

			if (n.x <= 280 && n.x >= 60 && n.y <= 350 && n.y >= 300)
			{
				begin(); // 返回开始界面
			}
		}
	}
}

settextstyle():设置字体格式

settextcolor():设置字体颜色

outtextxy():在指定位置输出文字

MOUSEMSG鼠标信息变量(结构体)

struct MOUSEMSG
{
    UINT uMsg;                // 当前鼠标消息
    bool mkCtrl;            // Ctrl 键是否按下
    bool mkShift;        

easyx游戏编程:五子棋(C语言游戏开发) easyx游戏编程:五子棋(C语言游戏开发) 五子棋: 本游戏用到了图形界面库graphics.h,图形界面库下载安装: 下载链接: https://easyx.cn/downloads/. 下方有源码。 功能实现: 玩家对战,人机对战,音乐播放,重开,悔棋,投降等。 所以要完成上面的功能,我们要: 欢迎界面和游戏界面 游戏场景绘制(棋盘绘画) 玩家操作 游戏功能(重开,悔棋等) 对战模式(人机和双人) AI算法 具体实现: 界面: 我们先设置窗口背景颜色,清理画布,然后设置文字颜色,设置窗口透明,设 阅读详情

相关推荐

C语言---五子棋游戏之我的大一课程设计

五子棋游戏之我的课程设计

congfen214的博客 2514

基于easyx的五子棋对战

以前写过一个,只不过写的比较繁琐,这个能简单实现,去掉了各种花里胡哨(虽然都是简单的知识),本来是打算用c++实现的,发现还是c写起来好理解,毕竟学艺不精,哈哈哈 代码风格偏奇葩,接触编程时间不长,还有许多可以优化的地方,例如下方显示文字可以使用内联函数疯狂调用之类。 注释有的地方不太明确,如有bug可以反馈。 本人使用vs2017,如有编译错误,可修改项目属性 项目->属性-&gt...

illidan_d的博客 2026

C++ 利用EasyX库绘制五子棋功能

C++ 利用EasyX库绘制五子棋功能,需要先安装EasyX图形库,我是利用VS2017编译直接运行

c语言版easyx五子棋

能进行简单的人机对战,有简单的图形界面,添加了图片

C语言实现五子棋对弈(简单输入坐标下棋,可设置悔棋次数版)

题目:五子棋对弈 对弈规则如下: 主要功能是实现两人之间的对弈,在画好的棋盘上,两个玩家轮流选择自己的落子坐标,然后由五子棋系统自动识别判断游戏的进展,知道一方的五子连成一条线或者棋盘已经无法落子时游戏结束。 选定五子棋的棋盘大小为19*19,玩家可以在这个棋盘上选择落子坐标位置,通过在棋盘上显示不同的符号来代替不同玩家所下的棋子,“o”代表A玩家,“*”代表B玩家。玩家每次落子之后游戏系统都会对落子位置进行检查,如果落子坐标输入有错应提示错误,并要求玩家继续输入。 当出现同一玩家五子连成一线时,无论是行、列或是对角线的五子连线,都表示玩家游戏胜利,退出游戏 任务:编程实现以下功能 1. 欢迎主界面 提示玩家选择游戏开始,结束,设置悔棋次数等。 2. 绘制棋盘 该模块要求的功能是实现棋盘的显示及棋子的显示,,“o”代表A玩家,“*”代表B玩家。在每次下棋后要对棋盘进行刷新,将棋盘的状态变化为当前最新状态,然后等待另一个玩家下棋。 3. 玩家交替下棋 玩家能在棋盘上下棋,玩家每次选择好下棋的行和列坐标,并在该位置落子。 要求:a.提示当前玩家输入落子坐标 b.能判断用户输入的坐标是否正确(坐标超出范围或该处已有棋子) 4. 悔棋功能 玩家选择悔棋后刷新棋盘,删除前一次的落子,悔棋次数有限制。 5. 输赢判断 判断输赢模块的作用是每次玩家落子后判断是否已分出胜负,如果是,则返回胜利者相关信息。 6. 设计丰富的用户界面,方便用户操作 设计要求: ① 根据以上功能需求,自己定义合适的数据结构,并说明原因; ② 每个功能能提供友好的用户界面,方便用户操作。

利用EasyX图形库实现五子棋程序(C语言课程设计)C语言入门 言简意赅

C语言课程设计 五子棋 下载后安装EasyX图形库即可使用

电机控制个人学习路线及专业书籍资源分享

个人学习电机控制的学习路线,和相关专业书的电子文档分享

weixin_45182459的博客 9912

COMSOL模拟CO2驱替CH4:多物理场耦合建模与工程应用详解

在非常规天然气开发与碳封存工程中,多孔介质内的渗流、吸附与岩石变形相互耦合,使得CO2驱替CH4的产能预测和CO2封存评估无法仅靠经验公式完成。以达西定律描述裂隙流动、以扩展Langmuir方程刻画竞争吸附、用应力-吸附-渗透率关系关联煤岩变形,是多物理场耦合数值模拟的核心路径。COMSOL Multiphysics凭借内置渗流、固体力学与组分传递接口,能够将这些机制整合为可参数化扫描的仿真模型,为注气压力、井距、渗透率演化等方案设计提供量化依据。围绕CO2驱替CH4模拟的建模流程、参数取法与结果判读,可形

weixin_29574585的博客 158

2026年AI编程工作流实战:Claude Code与Open Code深度对比

AI编程已从代码生成工具升级为IDE级智能工作流核心能力。其本质是将大语言模型深度嵌入开发环境,通过语义理解、上下文感知与行动闭环重构传统编码范式。Claude Code以企业级知识图谱和双轨Code Review为代表,强调合规性、可审计与深度集成;Open Code则依托Skill可组合性、本地优先模型与ocp协议,实现开源驱动的灵活扩展。二者共同推动IDE从‘编辑器’进化为‘数字搭档’——能理解RFC文档、记住PR评论、自动补全带重试的fetch逻辑,并在Promise链发呆时一键重构为async/a

weixin_33739523的博客 458

超分算法 SwinIR: Image Restoration Using Swin Transformer

这篇文章结构比较简单,如果看过Swin-Transformer的话就没什么难点了。作者引入Swin-T结构应用于低级视觉任务,包括图像超分辨率重建、图像去噪、图像压缩伪影去除。网络由一个浅层特征提取模块、深层特征提取模块、重建模块构成。重建模块对不同的任务使用不同的结构。浅层特征提取就是一个3×3的卷积层。深层特征提取是k个RSTB块和一个卷积层构成。RSTB(Res- SwinIR: Image Restoration Using Swin Transformer[ICCV 2021]Abstract1.

qq_45122568的博客 1万+

LT9211 单路mipi转双路mipi芯片,方案成熟,提供技术支持

LT9211 单路mipi转双路mipi芯片

TEL15012949045的博客 5012

图像质量评估(5) -- 畸变(Distortion)

当图像中原本应该是直线的地方看起来发生了不自然的变形或扭曲时,我们称为图像畸变。有三种类型的镜头畸变:桶形畸变(后文使用英文barrel),枕形畸变(后文使用pincushion)和胡子畸变(后文使用英文wavef或mustache,这种畸变里包含了桶形畸变和枕形畸变)。有一个重要的点需要注意,根据透镜的类型以及透镜是否能够从相机中移除等条件不同,畸变会有不同的表现。 总的来说,旋转对称光学系统功能上会产生和物体几何相似的图形。但也有少数特殊的系统是例外,例如鱼眼镜头,这种镜头几何是故意设计为

vivo01的专栏 2万+

RDMA 出现背景、如何实现?如何测试连通性?

文章目录一、背景:1、传统的 网络通信:2、传统网络通信的问题:二、RDMA :1、出现背景:2、RDMA 简介:3、如何工作:4、RDMA 与 Infiniband 的关系:5、支持 RDMA 的其他协议:6、RDMA 的优势:7、通过 Infiniband 实现 RDMA :8、如何测试 RDMA 连通性:   一、背景: 1、传统的 网络通信:     &n...

郑泽林 2162

PY32F406K1CU6 FLASH模拟EEPROM

摘要:本文介绍了基于STM32 FLASH模拟EEPROM的实现方法。头文件flash.h定义了FLASH页大小(256字节)、用户存储区域(4页)及地址范围,提供了等待周期配置和地址校验宏,声明了EEPROM初始化、读写操作等函数接口。源文件flash.c实现了具体功能:配置FLASH等待周期(144MHz需3WS)、页读写擦除操作,以及EEPROM初始化(解锁-擦除-验证-锁定)和缓冲区读写功能。其中写操作采用"读页→更新→擦除→编程"的流程,确保数据安全写入。该方案适用于需要非易失

sam的博客 194

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

下一篇: 寒假学习记录一(linux学习笔记)
顽强的代码人
博客等级 码龄4年 441粉丝 16原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值