涂格子

这是一个基于C++的涂格子游戏,玩家通过左键填色,右键消除,目标是填满所有格子以过关。游戏包含动态效果,共11个等级,难度逐渐提升。通过左键填色和右键重置,玩家需策略性地操作以达到通关条件。游戏还提供了一个简单的中键退出功能。
摘要由CSDN通过智能技术生成

涂格子

/**********************************************************
 * 程序功能:涂格子游戏(修改:原.豆腐果)
 * 程序版本:基本功能演示版本,简单动态效果,可以过关
 * 编译环境:Visual C++ 2019,EasyX_20200820
 * 最后更新:2021-1-14
 **********************************************************/
#include	<easyx.h>
#include	<conio.h>
//#include    <tchar.h>
#define		MaxNum				4		//单边最大格子数
#define		G_length			30		//格子边长
#define		USER_LBUTTONDOWN	101
#define		USER_RBUTTONDOWN	102
#define		USER_MBUTTONDOWN	103


 ///
void PaintGrid(int Mid_x, int Mid_y, int num, int color);	// 绘制游戏格子,初始化格子
void OnLButtonDown(MOUSEMSG m, int num);					// 左键按下
void OnRButtonDown(int num);								// 右键按下
void OnMButtonDown();										// 中键按下*暂无定义*
void welcome();												// 显示游戏主界面
void goodbye(int num);										// 显示结束画面
void NextLevel(int num);									// 下一关
int	 GetMessage(MOUSEMSG m);								// 获取鼠标信息
int  DispatchMessage(MOUSEMSG m, int opt);					// 分发鼠标信息
int  JudgeFull(int num, int array[MaxNum][MaxNum]);			// 格子是否填满

///
// 定义游戏格子结构体
struct Grid
{
	int left;	// 游戏区域边界
	int right;
	int top;
	int bottom;
	int array[MaxNum][MaxNum];	// 记录格子状态
	int num;	// 记录边界格子数目
}grid;


///
int main()
{
	int opt, end = 0;
	grid.num = 4;
	welcome();
	PaintGrid(320, 240, grid.num, BLUE);
	MOUSEMSG m;
	while (end != 1)
	{
		m = GetMouseMsg();
		opt = GetMessage(m);
		end = DispatchMessage(m, opt);
	}
	goodbye(grid.num);
	closegraph();
}


///
// 获取鼠标信息
int GetMessage(MOUSEMSG m)
{
	//鼠标循环
	switch (m.uMsg)
	{
	case WM_LBUTTONDOWN:						
		return USER_LBUTTONDOWN;				// 101
	case WM_RBUTTONDOWN:						
		return USER_RBUTTONDOWN;				// 102
	case WM_MBUTTONDOWN:
		return USER_MBUTTONDOWN;				// 103
	}
	return 0;
}


///
// 分发消息
int DispatchMessage(MOUSEMSG m, int opt)
{
	switch (opt)
	{
	case USER_LBUTTONDOWN:
		// 左键填色
		OnLButtonDown(m, grid.num);
		// 判断是否填满
		if (JudgeFull(grid.num, grid.array) == 1)
		{
			grid.num++;
			// 格子数目超过最大值通关
			if (grid.num > MaxNum)
			{
				return 1;
				break;
			}
			else
				NextLevel(grid.num);
		}
		break;

	case USER_RBUTTONDOWN:
		// 右键清除
		OnRButtonDown(grid.num);
		break;

	case USER_MBUTTONDOWN:
		return 1;
		break;
	}

	return 0;
}


///
// 左键按下
void OnLButtonDown(MOUSEMSG m, int num)
{
	int nx, ny, x, y;
	if (m.x > grid.left && m.x<grid.right && m.y>grid.top && m.y < grid.bottom)
	{
		// 计算位置
		nx = (int)(m.x - grid.left) / G_length;
		ny = (int)(m.y - grid.top) / G_length;
		// 转换格子状态
		grid.array[nx][ny] = -grid.array[nx][ny];
		if (nx >= 0 && nx < num - 1) grid.array[nx + 1][ny] = -grid.array[nx + 1][ny];
		if (nx > 0 && nx <= num - 1) grid.array[nx - 1][ny] = -grid.array[nx - 1][ny];
		if (ny >= 0 && ny < num - 1) grid.array[nx][ny + 1] = -grid.array[nx][ny + 1];
		if (ny > 0 && ny <= num - 1) grid.array[nx][ny - 1] = -grid.array[nx][ny - 1];
		// 扫描填色
		for (nx = 0; nx < num; nx++)
			for (ny = 0; ny < num; ny++)
			{
				if (grid.array[nx][ny] == 1)
					setfillcolor(GREEN);
				else
					setfillcolor(BLACK);
				x = nx * G_length + grid.left;
				y = ny * G_length + grid.top;
				solidrectangle(x + 1, y + 1, x + G_length - 1, y + G_length - 1);
			}
	}
}


///
// 右键按下清空
void OnRButtonDown(int num)
{
	int x, y, nx, ny;

	for (x = 0; x < num; x++)
		for (y = 0; y < num; y++)
			grid.array[x][y] = -1;

	for (nx = 0; nx < num; nx++)
		for (ny = 0; ny < num; ny++)
		{
			setfillcolor(BLACK);
			x = nx * G_length + grid.left;
			y = ny * G_length + grid.top;
			solidrectangle(x + 1, y + 1, x + G_length - 1, y + G_length - 1);
		}
}


///
// 显示下一关
// 参数:
//	num:	下一关的边界格子数
void NextLevel(int num)
{
	// 清屏
	BeginBatchDraw();
	for (int y = 0; y <= 480; y += 5)
	{
		setlinecolor(BLACK);
		settextcolor(RGB(0, 255, 0));
		line(0, y, 640, y);
		line(0, 480 - y, 640, 480 - y);
		outtextxy(300, y, _T("下一关"));
		FlushBatchDraw();
		Sleep(16);
		setfillcolor(RED);
		//solidrectangle(0, y + 4, 640, y - 5);
		solidrectangle(0, 480 - y, 640, 480 - y + 5);
	}
	EndBatchDraw();

	// 绘制下一关格子
	PaintGrid(320, 240, num, RGB(0, 255, 0));
}


///
// 判断格子是否填满
// 参数:
//	num:	单边格子数目
//	array:	生成数组接收实参
int JudgeFull(int num, int array[MaxNum][MaxNum])
{
	int c = -1;
	int nx = 0, ny = 0;
	while (nx < num && ny < num)
	{
		for (nx = 0; nx < num; nx++)
			for (ny = 0; ny < num; ny++)
				if (array[nx][ny] == 1)
					continue;
				else
					return c;
	}
	c = 1;
	return c;
}


///
// 绘制游戏格子,初始化格子
// 参数:
//	Mid_x:	屏幕中心 x 坐标
//	Mid_y:	屏幕中心 y 坐标
//	num:	单边格子数目
//	color:	格子线条颜色
void PaintGrid(int Mid_x, int Mid_y, int num, int color)
{
	int x, y, nx, ny;
	// 游戏区域大小
	grid.left = Mid_x - num * G_length / 2;
	grid.right = Mid_x + num * G_length / 2;
	grid.top = Mid_y - num * G_length / 2;
	grid.bottom = Mid_y + num * G_length / 2;
	// 绘制格子
	setlinecolor(color);
	for (x = grid.left; x <= grid.right; x += G_length)
	{
		line(x, grid.top, x, grid.bottom);
		Sleep(10);
	}
	for (y = grid.top; y <= grid.bottom; y += G_length)
	{
		line(grid.left, y, grid.right, y);
		Sleep(10);
	}
	// 外边框
	for (x = 20; x > 10; x-=2)
	{
		line(grid.left - x, grid.top - x, grid.right + x, grid.top - x);
		line(grid.left - x, grid.bottom + x, grid.right + x, grid.bottom + x);
		line(grid.left - x, grid.top - x, grid.left - x, grid.bottom + x);
		line(grid.right + x, grid.top - x, grid.right + x, grid.bottom + x);
		Sleep(5);
	}
	// 清空单元格
	for (x = 0; x < num; x++)
		for (y = 0; y < num; y++)
			grid.array[x][y] = -1;
	for (nx = 0; nx < num; nx++)
		for (ny = 0; ny < num; ny++)
		{
			setfillcolor(RED/*getbkcolor()*/);
			x = nx * G_length + grid.left;
			y = ny * G_length + grid.top;
			solidrectangle(x + 3, y + 3, x + G_length - 3, y + G_length - 3);//后面3是不覆盖格子线
		}
}


///
// 显示游戏主界面
void welcome()
{
	// 初始化窗口
	initgraph(640, 480);

	// 输出屏幕提示
	cleardevice();  //清屏
	settextcolor(BLUE);
	settextstyle(64, 0, _T("楷体"));
	outtextxy(70, 50, _T("涂格子游戏(点灯)"));
	settextcolor(WHITE);
	settextstyle(16, 0, _T("宋体"));
	outtextxy(100, 200, _T("每点一个格子,上下左右的格子也会做出于现状相反的动作"));
	outtextxy(100, 240, _T("总共11关,左键填色,右键重来,中键退出"));
	outtextxy(100, 280, _T("只是一个功能演示版本,以后再改进"));
	outtextxy(400, 320, _T("原:豆腐果"));
	settextstyle(16, 0, _T("黑体"));
	outtextxy(400, 340, _T("修改版"));

	// 实现闪烁的"按任意键继续"
	int c = 255;
	MOUSEMSG m;						// 定义鼠标消息
	while (!_kbhit())
	{
		settextcolor(RGB(0, c, 0));
		outtextxy(280, 400, _T("按任意键继续"));
		c -= 8;
		if (c < 0) c = 255;
		Sleep(20);
	}

	_getch();
	cleardevice();
}


///
// 显示结束画面
void goodbye(int num)
{
	int c = 255;

	// 清屏
	BeginBatchDraw();
	for (int y = 0; y <= 480; y += 5)
	{
		setlinecolor(RGB(0, 255, 0));
		line(0, y, 640, y);
		line(0, 480 - y, 640, 480 - y);
		FlushBatchDraw();
		Sleep(16);
		setfillcolor(BLACK);
		
		solidrectangle(0, y + 4, 640, y - 5);
		solidrectangle(0, 480 - y, 640, 480 - y + 5);
	}
	EndBatchDraw();

	//判断显示文字
	if (num == MaxNum + 1)
	{
		settextcolor(RGB(0, c, 0));
		settextstyle(48, 0, _T("黑体"));
		outtextxy(280, 200, _T("通关"));
		settextstyle(20, 0, _T("黑体"));
	}
	else
	{
		settextcolor(RGB(0, c, 0));
		settextstyle(48, 0, _T("黑体"));
		outtextxy(200, 200, _T("再接再厉"));
		settextstyle(20, 0, _T("黑体"));
	}

	while (!_kbhit())
	{
		settextcolor(RGB(0, c, 0));
		outtextxy(400, 400, _T("TAT"));
		c -= 8;
		if (c < 0) c = 255;
		Sleep(20);
	}

	_getch();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值