涂格子
2012-9-3 ~ 2023-9-8
(0)
涂格子游戏。游戏规则:
- 单击空格子,同时给上下中左右的空格子换色。
- 全部格子都上完颜色过关。
- 按任意键退出游戏。
- 右击重来,Ctrl 作弊键。
以下是该游戏的 VC++ 源代码:
/****************************************************************
* *
* 程序名称: 《涂格子游戏》 *
* 编译环境: VC++6.0 && && EasyX_v20120603b *
* 作者相关: Made In China by xiongfj <837942056@qq.com> *
* 最后修改: 2012.09.12 *
* *
****************************************************************/
#include <graphics.h>
#include <conio.h>
// 常量定义
#define GLENGTH 30 // 每个小格子的边长
#define MAXGRID 15 // 最大单边格子数
// 全局变量定义
int i, numgrid = 4, level = 4; // 初始格子数与级别
int xleft, xright, yup, ydown; // 分别代表正方形框架的左右上下四个顶点的坐标
MOUSEMSG m;
// 函数申明
bool grid[MAXGRID][MAXGRID]; // 格子状态
void Draw(int numgrid); // 游戏框架
int SetMouseMsg(); // 总的鼠标信息
int Lbutton(int numgrid, MOUSEMSG); // 鼠标左键信息
int Pass(); // 检查是否通关
int Cheat(); // 作弊函数,不怕不通关
// 主函数
void main()
{
initgraph(780, 640);
Draw(numgrid);
int x=0;
while (!kbhit()) // 单击一次,函数走完一循环
{
if (numgrid > 15)
{
setfont(20, 0, "黑体");
setcolor(LIGHTGREEN);
setwritemode(R2_XORPEN);
outtextxy(20, 580, "按任意键退出。");
outtextxy(630, 610, "小熊出厂(⊙o⊙)");
while(!kbhit())
{
outtextxy(x, 320, "真是千年难见天才也,这都能通关!");
Sleep(14);
outtextxy(x, 320, "真是千年难见天才也,这都能通关!");
x+=2;
if(x>780)
x=0;
}
break;
}
// 如果 numgrid++ 进入下一关
if (numgrid > level)
{
Draw(numgrid);
level = numgrid;
}
SetMouseMsg();
}
getch();
closegraph();
}
// 画游戏基本框架
void Draw(int numgrid)
{
cleardevice();
xleft = 390 - numgrid * GLENGTH / 2; // 格子最左边界的 x 坐标
xright = 390 + numgrid * GLENGTH / 2;
yup = 320 - numgrid * GLENGTH / 2; // 格子最上边界的 y 坐标
ydown = 320 + numgrid * GLENGTH / 2;
setlinestyle(PS_SOLID, NULL, 1);
setcolor(LIGHTGREEN);
for (i = xleft; i <= xright; i += GLENGTH) line(i, yup, i, ydown); // 画竖线
for (i = yup; i <= ydown; i += GLENGTH) line(xleft, i, xright, i); // 画横线
setfont(15, 0, "楷体");
setcolor(RGB(111, 211, 0));
// 输出操作说明
outtextxy(11, 10, "1、单击空格子,同时给上下中左右的空格子换色。");
outtextxy(11, 27, "2、全部格子都上完颜色过关。");
outtextxy(11, 44, "3、按任意键退出游戏。");
outtextxy(11, 61, "4、右击重来,Ctrl 作弊键。");
setlinestyle(PS_SOLID, NULL, 10);
setcolor(LIGHTGREEN);
// 框架边边加粗(纯修饰)
line(xleft - 5, yup - 5, xright + 5, yup - 5);
line(xleft - 5, ydown + 5, xright + 5, ydown + 5);
line(xleft - 5, yup - 5, xleft - 5, ydown + 5);
line(xright + 5, yup - 5, xright + 5, ydown + 5);
// 每次重绘框架时标记每个格子,0 为空,1 为有色
for (i = 0; i < numgrid; i++)
for (int y = 0; y < numgrid; y++)
grid[i][y] = 0;
}
// 分解鼠标按键信息
int SetMouseMsg()
{
m = GetMouseMsg();
switch (m.uMsg)
{
case WM_LBUTTONDOWN:
if(m.mkCtrl)
Cheat(); // 作弊函数
else
Lbutton(numgrid, m); // 左击函数
break;
// 右击重绘格子
case WM_RBUTTONDOWN:
Draw(numgrid);
break;
default:
break;
}
return 0;
}
// 左击函数实现
int Lbutton(int numgrid, MOUSEMSG m)
{
for (i = 0; i < numgrid; i++) // 判断 x 方向
{
if (m.x > xleft + GLENGTH * i && m.x < xleft + GLENGTH * (i + 1)) // 如果 m.x 在某格子内
{
for (int y = 0; y < numgrid; y++) // 判断 y 方向,
if (m.y > yup + GLENGTH * y && m.y < yup+GLENGTH * (y + 1)) // 如果 m.y 也在某个格子内
{
if(grid[i][y] == 0) // 如果鼠标所在格子未填色
setfillstyle(RED);
else
setfillstyle(0);
bar(xleft + GLENGTH * i + 1, yup + GLENGTH * y + 1,
xleft + GLENGTH * (i + 1)- 1, yup + GLENGTH * (y + 1) - 1);
grid[i][y] = !grid[i][y];
// 涂左
if (m.x - xleft > GLENGTH)
{
if (grid[i - 1][y] == 0)
setfillstyle(RED);
else
setfillstyle(0);
bar(xleft + GLENGTH * (i - 1) + 1, yup + GLENGTH * y + 1,
xleft + GLENGTH * i - 1, yup + GLENGTH * (y + 1) - 1);
grid[i - 1][y] = !grid[i - 1][y];
}
// 涂右
if (xright - m.x > GLENGTH)
{
if (grid[i + 1][y] == 0)
setfillstyle(RED);
else
setfillstyle(0);
bar(xleft + GLENGTH * (i + 1) + 1, yup + GLENGTH * y + 1,
xleft + GLENGTH * (i + 2) - 1, yup + GLENGTH * (y + 1) - 1);
grid[i + 1][y] = !grid[i + 1][y];
}
// 涂上
if (m.y - yup > GLENGTH)
{
if (grid[i][y - 1] == 0)
setfillstyle(RED);
else
setfillstyle(0);
bar(xleft + GLENGTH * i + 1, yup + GLENGTH * (y - 1) + 1,
xleft + GLENGTH * (i + 1) - 1, yup + GLENGTH * y - 1);
grid[i][y - 1] = !grid[i][y - 1];
}
// 涂下
if (ydown - m.y > GLENGTH)
{
if (grid[i][y + 1] == 0)
setfillstyle(RED);
else
setfillstyle(0);
bar(xleft + GLENGTH * i + 1, yup + GLENGTH * (y + 1) + 1,
xleft + GLENGTH * (i + 1) - 1, yup + GLENGTH * (y + 2) - 1);
grid[i][y + 1] = !grid[i][y + 1];
}
// 检查是否过关
Pass();
}
}
}
return 0;
}
// 检测是否过关
int Pass()
{
int a = 1;
for (i = 0; i < numgrid; i++) // 扫描所有格子状态
{
for (int y = 0; y < numgrid; y++)
a = a * grid[i][y];
}
if (a == 1) // 如果格子全部上色
{
numgrid++; // 下一关格子数
setfont(20, 0, "宋体");
outtextxy(250, 30, "喵了个咪咪,这也行!即将进入下一关。");
for (i = 0; i < 780; i++)
{
setcolor(LIGHTGREEN);
line(i, 237, i, 243);
Sleep(2);
}
return 1;
}
else
return 0;
}
// 作弊函数的实现
int Cheat()
{
// 扫描 m.x 在哪一竖格子内
for (i = 0; i < numgrid; i++)
{
if (m.x > xleft + GLENGTH * i && m.x < xleft + GLENGTH * (i + 1))
{
// 扫描 m.y 在哪一行格子内
for (int y = 0; y < numgrid; y++)
{
if (m.y > yup + GLENGTH * y && m.y < yup + GLENGTH * (y + 1))
{
setfillstyle(GREEN);
bar(xleft + GLENGTH * i + 1, yup + GLENGTH * y + 1,
xleft + GLENGTH * (i + 1) - 1, yup + GLENGTH * (y + 1) - 1);
if (grid[i][y] == 0) // 如果单击的格子未标记为 1
grid[i][y] = !grid[i][y]; // 将该格子标记为 0
// 检查是否过关
Pass();
}
}
}
}
return 0;
}
添加评论
取消回复