easyx为基础的五子棋游戏

前言

家人们我只是单纯的分享一下自己学习easyx时创造的小作品,水平不高,而且做的比较粗糙。做的比我好的大有人在加油兄弟们,希望能和大家共同分享一起进步。(这个需要easyx)兄弟们直接去官网下吧,这个很好玩的。

一,关于easyx

关于easyx这是一款基于C/C++的图形库,EasyX Graphics Library 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022,简单易用,学习成本极低,应用领域 广泛。目前已有许多大学将 EasyX 应用在教学当中。
EasyX 含有一些简单的函数集合,几乎不用学习,直接翻看参考手册就可以直接使用。在线参考手册地址 https://docs.easyx.cn

正因为 EasyX 足够简单,在进行 C/C++、图形学、图像学、分形学等课程实验时,可以专注在课程知识上,不被绘图部分牵扯太多精力。以下是 EasyX 的使用演示:

在 VC6 的控制台程序中使用 EasyX,请参考 https://easyx.cn/used-in-vc6-console
在 VC6 的窗口程序中使用 EasyX,请参考 https://easyx.cn/used-in-vc6-win32
在 VC2010 的控制台程序中使用 EasyX,请参考 https://easyx.cn/used-in-vc2010-console
在 VC2010 的窗口程序中使用 EasyX,请参考 https://easyx.cn/used-in-vc2010-win32
在其它各版本 VC 中使用 EasyX,和 VC2010 区别不大,不再演示。

二,初始界面

开始游戏

首先创建一个界面来开始游戏,这个没什么难度;
开始游戏
这个只需要initgraph一个界面以及一个方块就行,看看代码

initgraph(640, 640);
setbkcolor(BLACK);
cleardevice();
setbrick(260, 290, 120, 100, "双方对战");

基本函数

这上面设置的一些方块都是用的函数解决这个方块是圆角方块
大家看看

void setbrick(int x,int y,int w,int h,const char a[])
{
	setbkmode(TRANSPARENT);//颜色透明
	setfillcolor(WHITE);//这个是填充颜色

	fillroundrect(x, y, x + w, y + h, 10, 10);
	int tx, ty;
	settextcolor(RED);
	settextstyle(30, 0, "仿宋");//字体
	tx = x + (w - textwidth(a)) / 2;
	ty = y + (h - textheight(a)) / 2;

	outtextxy(tx, ty, a);
}

三,游戏本身

棋盘设置

五子棋肯定得有棋盘,设置棋盘肯定得有,棋盘得先有格子那么我们来设置格子大概是这样:

initgraph(720, 720);
setbkcolor(BLUE);
cleardevice();
for (int i = 0; i < 30; i++)
	for (int j = 0; j < 30; j++)
		brick(j * 24 + x, i * 24 + y, 24, 24);

这个brick函数我给兄弟们看看,原理也很简单就是设置无填充矩形

void brick(int x, int y, int w, int h)//画出方格
{
	setlinecolor(WHITE);
	rectangle(x, y, x + w, y + h);
}

蓝色的棋盘hhh

棋子输出

下一步就是鼠标点过的地方放下棋子,并且在放下过棋子的地方输出一个棋子,这个不能有900个if,毕竟我的棋盘是30*30的,这900个不多,可肝起来费劲,那就有鼠标的坐标/24,也就是方块的宽度,在该位置上输出圆圈,大家看看

ExMessage mou;
int temp = 1,swap=0;
while (true)
{
	if (peekmessage(&mou, EX_MOUSE))
	{
		short xm = mou.x / 24, ym = mou.y / 24;
		switch (mou.message)
		{
		case WM_LBUTTONDOWN:
		 	
			if (temp == 1)
			{
				if (board[xm][ym] > 0)
				{
					continue;
				}
				board[xm][ym] = 1;
				creatcircle(24 * xm, 24 * ym, 12, temp);
				if (check(xm, ym) != 0) swap = 1;
				temp = 2;
			}
			else if (temp == 2)
			{
				if (board[xm][ym] > 0)
				{
					continue;
				}
				board[xm][ym] = 2;
				creatcircle(24 * xm, 24 * ym, 12, temp);
				if (check(xm, ym) != 0) swap = 2;
				temp = 1;
				//if (check(xm, ym)) swap = 2;
			}
			//这里!!!!
			break;
		default:
			break;
		}
	}
	if (swap == 1 || swap == 2)
	{
		closegraph();
		break;
	}
}

这段代码长是因为我这里面有判断胜负的代码,大家见谅,这上面肯定先读鼠标信息,并判断位置坐标,并设置一个数组来判断棋盘状态,每当这个格子有棋时不交换下棋顺序,让他接着下

short xm = mou.x / 24, ym = mou.y / 24;

这个就是直接将棋盘缩小到1,这个方便数组的录入判断这是第几个方块;

creatcircle(24 * xm, 24 * ym, 12, temp);

这个就是画出圆即为棋子,自此全部棋盘部分结束,看看效果:
这个像素难评

胜负判断

自此只是能在棋盘上下棋而已,不能有明确的规则来看判断输赢,那么我们就需要一个函数来判断是否有胜利条件,这个是这个游戏中最为关键的部分,这个用bfs算法可以快速判断,当有落子时判断他的横向,纵向,斜向上,斜向上,四个方向是否有棋子。这个check函数就是用来看他是否成立:大家看看代码hh:

int check(int x, int y)
{
	int i, j;

	// 横向判断
	for (i = 0; i < 30; i++) 
	{
		for (j = 0; j < 26; j++) {
			if (board[i][j] != 0 && board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] && board[i][j] == board[i][j + 3] && board[i][j] == board[i][j + 4]) {
				return board[i][j];
			}
		}
	}

	// 纵向判断
	for (i = 0; i < 26; i++) {
		for (j = 0; j < 30; j++) {
			if (board[i][j] != 0 && board[i][j] == board[i + 1][j] && board[i][j] == board[i + 2][j] && board[i][j] == board[i + 3][j] && board[i][j] == board[i + 4][j]) {
				return board[i][j];
			}
		}
	}

	// 左上到右下斜线判断
	for (i = 0; i < 26; i++) {
		for (j = 0; j < 26; j++) {
			if (board[i][j] != 0 && board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] == board[i + 3][j + 3] && board[i][j] == board[i + 4][j + 4]) {
				return board[i][j];
			}
		}
	}

	// 右上到左下斜线判断
	for (i = 0; i < 26; i++) {
		for (j = 4; j < 30; j++) {
			if (board[i][j] != 0 && board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] && board[i][j] == board[i + 3][j - 3] && board[i][j] == board[i + 4][j - 4]) {
				return board[i][j];
			}
		}
	}

	return 0; // 没有胜利者
}

这个在if else判断一下就可以break了然后输出那个哪一方胜利hhh;

四,结束游戏

这个游戏结束相较于上面就会比较简单:

if (swap == 1)
{
	initgraph(320, 320);
	setbkcolor(WHITE);
	cleardevice();
	setbrick(0, 0, 320, 320, "白方胜利");
}
else if (swap == 2)
{
	initgraph(320, 320);
	setbkcolor(BLACK);
	cleardevice();
	setbrick(0, 0, 320, 320, "黑方胜利");
}

这个比较没那么难,我也是刚刚学easyx起步,这个寒假easyx的游戏写的会多些

代码

最后大家康康代码吧,好累啊家人们!!

#include<easyx.h>
#include<iostream>
#include<graphics.h>
#include<conio.h>
using namespace std;
#define SIZE 30;
int board[30][30];
void brick(int x, int y, int w, int h)//画出方格
{
	setlinecolor(WHITE);
	rectangle(x, y, x + w, y + h);
}
void creatcircle(int x, int y, int r, int temp)//画出圆
{
	if (temp == 1)
	{
		setfillcolor(WHITE);
		setlinecolor(WHITE);
		fillcircle(x + r, y + r, r);
	}
	else if (temp == 2)
	{
		setfillcolor(BLACK);
		setlinecolor(BLACK);
		fillcircle(x + r, y + r, r);
	}
}
int check(int x, int y)
{
	int i, j;

	// 横向判断
	for (i = 0; i < 30; i++) 
	{
		for (j = 0; j < 26; j++) {
			if (board[i][j] != 0 && board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] && board[i][j] == board[i][j + 3] && board[i][j] == board[i][j + 4]) {
				return board[i][j];
			}
		}
	}

	// 纵向判断
	for (i = 0; i < 26; i++) {
		for (j = 0; j < 30; j++) {
			if (board[i][j] != 0 && board[i][j] == board[i + 1][j] && board[i][j] == board[i + 2][j] && board[i][j] == board[i + 3][j] && board[i][j] == board[i + 4][j]) {
				return board[i][j];
			}
		}
	}

	// 左上到右下斜线判断
	for (i = 0; i < 26; i++) {
		for (j = 0; j < 26; j++) {
			if (board[i][j] != 0 && board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] == board[i + 3][j + 3] && board[i][j] == board[i + 4][j + 4]) {
				return board[i][j];
			}
		}
	}

	// 右上到左下斜线判断
	for (i = 0; i < 26; i++) {
		for (j = 4; j < 30; j++) {
			if (board[i][j] != 0 && board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] && board[i][j] == board[i + 3][j - 3] && board[i][j] == board[i + 4][j - 4]) {
				return board[i][j];
			}
		}
	}

	return 0; // 没有胜利者
}
void setbrick(int x,int y,int w,int h,const char a[])
{
	setbkmode(TRANSPARENT);
	setfillcolor(WHITE);

	fillroundrect(x, y, x + w, y + h, 10, 10);
	int tx, ty;
	settextcolor(RED);
	settextstyle(30, 0, "仿宋");
	tx = x + (w - textwidth(a)) / 2;
	ty = y + (h - textheight(a)) / 2;

	outtextxy(tx, ty, a);
}
int main()
{
	initgraph(640, 640);
	setbkcolor(BLACK);
	cleardevice();
	setbrick(260, 290, 120, 100, "双方对战");
	int x = 0, y = 0;
	ExMessage ttt;
	int te = 0;
	while (true)
	{
		if (peekmessage(&ttt, EX_MOUSE))
		{
			switch (ttt.message)
			{
			case WM_LBUTTONDOWN:
				if (ttt.x >= 260 && ttt.x <= 260 + 120 && ttt.y >= 290 && ttt.y <= 290 + 80)
				{
					closegraph();
					te = 1;
				}
				break;
			default:
				break;
			}
		}
		if (te == 1) break;
	}
	initgraph(720, 720);
	setbkcolor(BLUE);
	cleardevice();
	for (int i = 0; i < 30; i++)
		for (int j = 0; j < 30; j++)
			brick(j * 24 + x, i * 24 + y, 24, 24);
	
	ExMessage mou;
	int temp = 1,swap=0;
	while (true)
	{
		if (peekmessage(&mou, EX_MOUSE))
		{
			short xm = mou.x / 24, ym = mou.y / 24;
			switch (mou.message)
			{
			case WM_LBUTTONDOWN:
			 	
				if (temp == 1)
				{
					if (board[xm][ym] > 0)
					{
						continue;
					}
					board[xm][ym] = 1;
					creatcircle(24 * xm, 24 * ym, 12, temp);
					if (check(xm, ym) != 0) swap = 1;
					temp = 2;
				}
				else if (temp == 2)
				{
					if (board[xm][ym] > 0)
					{
						continue;
					}
					board[xm][ym] = 2;
					creatcircle(24 * xm, 24 * ym, 12, temp);
					if (check(xm, ym) != 0) swap = 2;
					temp = 1;
					//if (check(xm, ym)) swap = 2;
				}
				//这里!!!!
				break;
			default:
				break;
			}
		}
		if (swap == 1 || swap == 2)
		{
			closegraph();
			break;
		}
	}
	if (swap == 1)
	{
		initgraph(320, 320);
		setbkcolor(WHITE);
		cleardevice();
		setbrick(0, 0, 320, 320, "白方胜利");
	}
	else if (swap == 2)
	{
		initgraph(320, 320);
		setbkcolor(BLACK);
		cleardevice();
		setbrick(0, 0, 320, 320, "黑方胜利");
	}
	getchar();
	return 0;
}

大家一起继续加油吧,我也是很菜的。

  • 38
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值