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

本文介绍了一款使用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;        

评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值