五子棋游戏——HGE

曾经用 HGE 做的一个五子棋游戏-。-今天偶然翻了出来, 给大家分享一下

//main.cpp
#include <hge.h>
#include <hgeSprite.h>
#include "menu.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	init();
	doit();
	delit();

	return 0;
}

//menu.h
HEFFECT papa, music;//下棋声音
HTEXTURE bg0, bg1, bg2, bg3, bg4;//背景更换
HTEXTURE bgbg, white, black, whitewin, blackwin;
HGE *hge = 0;
hgeSprite *s_bgbg, *s_bg, *s_white, *s_black, *s_whitewin, *s_blackwin;

bool mouse_lbtn = 0;//记录鼠标左键点击
bool isWhiteBlack = 0;//判断当前下子方
float wfx[205], wfy[205];//白子坐标
float bfx[205], bfy[205];//黑子坐标
int cntw = 0, cntb = 0;//白子数与黑子数
int qi[20][20];//棋盘
int over = 0;//是否结束
int bgrand;//背景随机数
int dir[8][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1}};

void boom()//点击声音
{
	hge->Effect_Play(papa);
}

int walk(int x, int y, int dx, int dy)
{
	int s = 0;
	int xx = x;
	int yy = y;
	while (1)
	{
		xx += dx;
		yy += dy;
		if (xx < 0 || yy < 0 || xx > 18 || yy > 18 || qi[xx][yy] != qi[x][y]) return s;
		s++;
	}
}

void judge(int x, int y)//判断是否五星连珠
{
	for (int i = 0; i < 8; i += 2)
	{
		if (walk(x, y, dir[i][0], dir[i][1]) + (walk(x, y, dir[i + 1][0], dir[i + 1][1])) >= 4)
		{
			over = qi[x][y];
			return;
		}
	}
}

void leftButtonLastState()
{
	bool mouse_lbtn0 = hge->Input_GetKeyState(HGEK_LBUTTON);
	if (mouse_lbtn == 1 && mouse_lbtn0 == 0)
	{
		if (over)
		{
			bgrand = rand() % 5;
			switch (bgrand)
			{
				case 0: s_bg = new hgeSprite(bg0, 0, 0, 1024, 768);break;
				case 1: s_bg = new hgeSprite(bg1, 0, 0, 1024, 768);break;
				case 2: s_bg = new hgeSprite(bg2, 0, 0, 1024, 768);break;
				case 3: s_bg = new hgeSprite(bg3, 0, 0, 1024, 768);break;
				case 4: s_bg = new hgeSprite(bg4, 0, 0, 1024, 768);break;
			}
			memset(qi, 0, sizeof(qi));
			cntw = 0;
			cntb = 0;
			over = 0;
			isWhiteBlack = false;
			mouse_lbtn = 0;
			return;
		}
		float x1, y1;
		hge->Input_GetMousePos(&x1, &y1);
		if (x1 < 100 && y1 < 100)
		{
			if (isWhiteBlack == false)
			{
				if (cntb == 0) return;
				cntb--;
				int xx = (bfx[cntb] + 10 - 450) / 30;
				int yy = (bfy[cntb] + 10 - 114) / 30;
				qi[xx][yy] = 0;
				isWhiteBlack = true;
			}
			else
			{
				if (cntw == 0) return;
				cntw--;
				int xx = (wfx[cntw] + 10 - 450) / 30;
				int yy = (wfy[cntw] + 10 - 114) / 30;
				qi[xx][yy] = 0;
				isWhiteBlack = false;
			}
		}
		if (isWhiteBlack == false)
		{
			if (x1 > 445 && x1 < 995 && y1 > 109 && y1 < 659)
			{
				x1 = (int)(x1 - 435) / 30 * 30 + 450;
				y1 = (int)(y1 - 99) / 30 * 30 + 114;
				int xx = (x1 - 450) / 30;
				int yy = (y1 - 114) / 30;
				if (qi[xx][yy] == 0)
				{
					wfx[cntw] = x1 - 10;
					wfy[cntw] = y1 - 10;
					qi[xx][yy] = 1;
					cntw++;
					isWhiteBlack = true;
					boom();
					judge(xx, yy);
				}
			}
		}
		else
		{
			if (x1 > 445 && x1 < 995 && y1 > 109 && y1 < 659)
			{
				x1 = (int)(x1 - 435) / 30 * 30 + 450;
				y1 = (int)(y1 - 99) / 30 * 30 + 114;
				int xx = (x1 - 450) / 30;
				int yy = (y1 - 114) / 30;
				if (qi[xx][yy] == 0)
				{
					bfx[cntb] = x1 - 10;
					bfy[cntb] = y1 - 10;
					qi[xx][yy] = 2;
					cntb++;
					isWhiteBlack = false;
					boom();
					judge(xx, yy);
				}
			}
		}
		mouse_lbtn = 0;
	}
}

bool RenderFunc()
{
	hge->Gfx_BeginScene();
	s_bg->Render(0, 0);
	//s_bgbg->Render(416, 80);
	for (int i = 0; i < 19; i++)
	{
		hge->Gfx_RenderLine(450.0, 114.0 + i * 30, 990.0, 114.0 + i * 30, 0xff000000, 0.5);
	}
	for (int i = 0; i < 19; i++)
	{
		hge->Gfx_RenderLine(450.0 + i * 30, 114.0, 450.0 + i * 30, 654.0, 0xff000000, 0.5);
	}
	for (int i = 0; i < cntw; i++)
	{
		s_white->Render(wfx[i], wfy[i]);
	}
	for (int i = 0; i < cntb; i++)
	{
		s_black->Render(bfx[i], bfy[i]);
	}
	if (over == 1)
		s_whitewin->Render(200, 200);
	if (over == 2)
		s_blackwin->Render(200, 200);
	hge->Gfx_EndScene();
	return false;
}

bool FrameFunc()
{
	if (hge->Input_GetKeyState(HGEK_LBUTTON)) mouse_lbtn = 1;
	if (mouse_lbtn == 1) leftButtonLastState();
	if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true;
	if (hge->Input_GetKeyState(HGEK_A)) hge->Effect_Play(music);
	return false;
}

void init()
{
	hge=hgeCreate(HGE_VERSION);
	hge->System_SetState(HGE_SHOWSPLASH, false);
	hge->System_SetState(HGE_SCREENWIDTH, 1024);
	hge->System_SetState(HGE_SCREENHEIGHT, 768);
	hge->System_SetState(HGE_SCREENBPP, 32);
	hge->System_SetState(HGE_LOGFILE, "Gobang.log");

	hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
	hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
	hge->System_SetState(HGE_TITLE, "Gobang");
	hge->System_SetState(HGE_WINDOWED, true);
	hge->System_SetState(HGE_USESOUND, true);
	hge->System_SetState(HGE_HIDEMOUSE, false);
}

void doit()
{
	if(hge->System_Initiate())
	{
		memset(qi, 0, sizeof(qi));
		// Load sounds and textures
		papa = hge->Effect_Load("menu.wav");
		music = hge->Effect_Load("music.mp3");
		bgbg = hge->Texture_Load("bgbg.png");
		bg0 = hge->Texture_Load("bg0.jpg");
		bg1 = hge->Texture_Load("bg1.jpg");
		bg2 = hge->Texture_Load("bg2.jpg");
		bg3 = hge->Texture_Load("bg3.jpg");
		bg4 = hge->Texture_Load("bg4.jpg");
		white = hge->Texture_Load("white.png");
		black = hge->Texture_Load("black.png");
		whitewin = hge->Texture_Load("whitewin.png");
		blackwin = hge->Texture_Load("blackwin.png");
		if (papa && bgbg && bg0 && bg1 && bg2 && bg3 && bg4 && white && black && whitewin && blackwin)
		{
			bgrand = rand() % 5;
			switch (bgrand)
			{
				case 0: s_bg = new hgeSprite(bg0, 0, 0, 1024, 768);
				case 1: s_bg = new hgeSprite(bg1, 0, 0, 1024, 768);
				case 2: s_bg = new hgeSprite(bg2, 0, 0, 1024, 768);
				case 3: s_bg = new hgeSprite(bg3, 0, 0, 1024, 768);
				case 4: s_bg = new hgeSprite(bg4, 0, 0, 1024, 768);
			}
			s_bgbg = new hgeSprite(bgbg, 0, 0, 608, 608);
			s_white = new hgeSprite(white, 0, 0, 24, 24);
			s_black = new hgeSprite(black, 0, 0, 24, 24);
			s_whitewin = new hgeSprite(whitewin, 0, 0, 250, 200);
			s_blackwin = new hgeSprite(blackwin, 0, 0, 250, 200);
			hge->System_Start();
		}
		else
		{
			MessageBoxA(NULL, "Can't load some sound(s) or texture(s)", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
		}
	}
}

void delit()
{
	hge->Texture_Free(bg0);
	hge->Texture_Free(bg1);
	hge->Texture_Free(bg2);
	hge->Texture_Free(bg3);
	hge->Texture_Free(bg4);
	hge->Texture_Free(bgbg);
	hge->Texture_Free(black);
	hge->Texture_Free(white);
	hge->Texture_Free(blackwin);
	hge->Texture_Free(whitewin);
	hge->Effect_Free(papa);
	delete s_bg;
	delete s_bgbg;
	delete s_black;
	delete s_white;
	delete s_blackwin;
	delete s_whitewin;
	hge->System_Shutdown();
	hge->Release();
}

当初代码写的比较烂,拿出来丢丢脸。 可怜

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值