有个问题求大神解答
关于左键a按下,右键按下以及格子是否填满的算法实在看不懂,求大家解答,谢谢呀include<graphics.h>
#include<conio.h>
#defineMaxNum14//单边最大格子数
#defineG_length30//格子边长
#defineUSER_LBUTTONDOWN101
#defineUSER_RBUTTONDOWN102
#defineUSER_MBUTTONDOWN103
///////////////////////////////////////////////
voidPaintGrid(intMid_x,intMid_y,intnum,intcolor);// 绘制游戏格子,初始化格子
voidOnLButtonDown(MOUSEMSGm,intnum);// 左键按下
voidOnRButtonDown(intnum);// 右键按下
voidOnMButtonDown();// 中键按下*暂无定义*
voidwelcome();// 显示游戏主界面
voidgoodbye(intnum);// 显示结束画面
voidNextLevel(intnum);// 下一关
intGetMessage(MOUSEMSGm);// 获取鼠标信息
intDispatchMessage(MOUSEMSGm,intopt);// 分发鼠标信息
intJudgeFull(intnum,intarray[MaxNum][MaxNum]);// 格子是否填满
///////////////////////////////////////////////
// 定义游戏格子结构体
structGrid
{
intleft;// 游戏区域边界
intright;
inttop;
intbottom;
intarray[MaxNum][MaxNum];// 记录格子状态
intnum;// 记录边界格子数目
}grid;
///////////////////////////////////////////////
voidmain()
{
intopt,end=0;
grid.num=4;
welcome();
PaintGrid(320,240,grid.num,RGB(0,255,0));
MOUSEMSGm;
while(end!=1)
{
m =GetMouseMsg();
opt =GetMessage(m);
end=DispatchMessage(m,opt);
}
goodbye(grid.num);
closegraph();
}
///////////////////////////////////////////////
// 获取鼠标信息
intGetMessage(MOUSEMSGm)
{
//鼠标循环
switch(m.uMsg)
{
caseWM_LBUTTONDOWN:
returnUSER_LBUTTONDOWN;
caseWM_RBUTTONDOWN:
returnUSER_RBUTTONDOWN;
caseWM_MBUTTONDOWN:
returnUSER_MBUTTONDOWN;
}
return0;
}
///////////////////////////////////////////////
// 分发消息
intDispatchMessage(MOUSEMSGm,intopt)
{
switch(opt)
{
caseUSER_LBUTTONDOWN:
// 左键填色
OnLButtonDown(m,grid.num);
// 判断是否填满
if(JudgeFull(grid.num,grid.array)==1)
{
grid.num++;
// 格子数目超过最大值通关
if(grid.num>MaxNum)
{
return1;
break;
}
else
NextLevel(grid.num);
}
break;
caseUSER_RBUTTONDOWN:
// 右键清除
OnRButtonDown(grid.num);
break;
caseUSER_MBUTTONDOWN:
return1;
break;
}
return0;
}
///////////////////////////////////////////////
// 左键按下
voidOnLButtonDown(MOUSEMSGm,intnum)
{
intnx,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);
}
}
}
///////////////////////////////////////////////
// 右键按下清空
voidOnRButtonDown(intnum)
{
intx,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:下一关的边界格子数
voidNextLevel(intnum)
{
// 清屏
BeginBatchDraw();
for(inty=0;y<=480;y+=5)
{
setlinecolor(RGB(0,255,0));
settextcolor(RGB(0,255,0));
line(0,y,640,y);
line(0,480-y,640,480-y);
outtextxy(300,y,"下一关");
FlushBatchDraw();
Sleep(16);
setfillcolor(BLACK);
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:生成数组接收实参
intJudgeFull(intnum,intarray[MaxNum][MaxNum])
{
intc=-1;
intnx=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
returnc;
}
c=1;
returnc;
}
///////////////////////////////////////////////
// 绘制游戏格子,初始化格子
// 参数:
//Mid_x:屏幕中心 x 坐标
//Mid_y:屏幕中心 y 坐标
//num:单边格子数目
//color:格子线条颜色
voidPaintGrid(intMid_x,intMid_y,intnum,intcolor)
{
intx,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--)
{
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(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);
}
}
///////////////////////////////////////////////
// 显示游戏主界面
voidwelcome()
{
// 初始化窗口
initgraph(640,480);
// 输出屏幕提示
cleardevice();
settextcolor(RGB(0,255,0));
settextstyle(64,0,"黑体");
outtextxy(70,50,"涂格子游戏(点灯)");
settextcolor(WHITE);
settextstyle(16,0,"宋体");
outtextxy(100,200,"每点一个格子,上下左右的格子也会做出于现状相反的动作");
outtextxy(100,240,"总共11关,左键填色,右键重来,中键退出");
outtextxy(100,280,"只是一个功能演示版本,以后再改进");
outtextxy(400,320,"by:doufuguolyl");
settextstyle(16,0,"黑体");
outtextxy(400,340,"Ver 0.1");
// 实现闪烁的"按任意键继续"
intc=255;
while(!kbhit())
{
settextcolor(RGB(0,c,0));
outtextxy(280,400,"按任意键继续");
c -=8;
if(c <0)c =255;
Sleep(20);
}
getch();
cleardevice();
}
///////////////////////////////////////////////
// 显示结束画面
voidgoodbye(intnum)
{
intc=255;
// 清屏
BeginBatchDraw();
for(inty=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,"黑体");
outtextxy(280,200,"通关");
settextstyle(20,0,"黑体");
}
else
{
settextcolor(RGB(0,c,0));
settextstyle(48,0,"黑体");
outtextxy(200,200,"再接再厉");
settextstyle(20,0,"黑体");
}
while(!kbhit())
{
settextcolor(RGB(0,c,0));
outtextxy(400,400,"QQ: 372480348");
c -=8;
if(c <0)c =255;
Sleep(20);
}