前言
家人们我只是单纯的分享一下自己学习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);
}
棋子输出
下一步就是鼠标点过的地方放下棋子,并且在放下过棋子的地方输出一个棋子,这个不能有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;
}
大家一起继续加油吧,我也是很菜的。