涂格子
#include <easyx.h>
#include <conio.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;
case WM_RBUTTONDOWN:
return USER_RBUTTONDOWN;
case WM_MBUTTONDOWN:
return USER_MBUTTONDOWN;
}
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);
}
}
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, 480 - y, 640, 480 - y + 5);
}
EndBatchDraw();
PaintGrid(320, 240, num, RGB(0, 255, 0));
}
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;
}
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);
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);
}
}
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();
}