通过graphic库实现图像输出,加载图片。我的思路比较直接,通过大量的数组记录数据,没次鼠标点击在判断数据最后实现。当然还有许多功能未能完善。
代码:
//扫雷初级
//9*9,9个雷
//2016.3.1
//
//
#include
#include
#include
#include
#include
/****************************使用到的数据类型**************************/
int Array[9][9]={0}; //地图数据记录数组,记录横纵坐标;
POINT Array2[9]; //位置记录数组,记录地雷
int Judge1=0; //判断变量,记录标示个数
int Judge2=0; //判断变量,记录找出的地雷个数
bool flag=true; //判断标示,记录是否踩到地雷
bool flag1=true; //空白区域是否全部开启的判断
bool flag2[9][9]={false}; //记录九宫格中开启的位置,未开启为true
/*****************************函数声明*****************************/
void InitGraph(); //初始化图形
void InitData(); //初始化扫雷的记录数据
void Statistics(); //扫雷数据统计
void MouseMessageDeal(); //鼠标信息处理
void BlankDeal(int x,int y); //无数据区域的处理
void Mine(int x,int y); //地雷区域的处理
void MineCountDeal(int x,int y,int n); //地雷数量记录区域的处理
void RightButtonDeal(int x,int y,int n); //鼠标右击的处理
void WinFinish(); //胜利时的结束界面
void FailFinish(); //失败时的结束界面
void Game(); //扫雷游戏
/****************函数定义*************************/
//初始化界面;
void InitGraph()
{
//init the graph;
initgraph(225,225);
setbkcolor(BLACK);
cleardevice();
int i=0,j=0;
IMAGE img;
loadimage(&img,"res\\blank.bmp");
for(i=0;i<9;i++)
for(j=0;j<9;j++)
putimage(i*25,j*25,&img);
}//InitGraph;
//初始化数据,生成地雷位置,记录数字标示(标志附近地雷个数)
void InitData()
{
int i=0;
int x=0,y=0;
for(i=0;i<9;)
{
x=rand()%9;
y=rand()%9;
if(Array[x][y]==0)
{
Array2[i].x=x;
Array2[i].y=y;
Array[x][y]=9;
i++;
}
}
Statistics();
}
//统计并地雷数量
void Statistics()
{
int i=0;
int x=0,y=0;
for(i=0;i<9;i++)
{
for(x=Array2[i].x-1;x<=Array2[i].x+1;x++)
for(y=Array2[i].y-1;y<=Array2[i].y+1;y++)
Array[x][y]++;
}
for(i=0;i<9;i++)
{
Array[Array2[i].x][Array2[i].y]=9;
}
}
//处理鼠标信息
void MouseMessageDeal()
{
MOUSEMSG m;
int x=0,y=0;
while(Judge2<=10&&flag==true) //通过Judge2判断是否找完所有的,flag判断是否踩到地雷
{
m=GetMouseMsg();
x=m.x/25;y=m.y/25;
if(m.uMsg== WM_LBUTTONDOWN)
{
if(Array[x][y]<10||(Array[x][y]>=20&&Array[x][y]<=29))
{
switch(Array[x][y])
{
case 0:BlankDeal(x,y);break;
case 20:BlankDeal(x,y);break;
case 9:Mine(x,y);break;
case 29:Mine(x,y);break;
default:MineCountDeal(x,y,Array[x][y]);
}
}
}
if(m.uMsg==WM_RBUTTONDOWN)
if(flag2[x][y]==false)
RightButtonDeal(x,y,Array[x][y]);
}
if(Judge2==11)
WinFinish();
if(flag==false)
FailFinish();
}
//无雷区域处理函数
//遍历查早将所有无雷区域及无数字标示区域掀开
void BlankDeal(int x,int y)
{
IMAGE img;
loadimage(&img,"res//0.bmp");
putimage(x*25,y*25,&img);flag2[x][y]=true;
if(flag1==false) //判断无类区域是否已经掀开
{
return ;
}
x=0;y=0;
for(x=0;x<9;x++)
{
for(y=0;y<9;y++)
{
if(Array[x][y]==0)
{
putimage(x*25,y*25,&img);
flag2[x][y]=true;
}
}
flag1=false;
}
}
//地雷区域处理
void Mine(int x,int y)
{
IMAGE img;
loadimage(&img,"res//blood.bmp");
putimage(x*25,y*25,&img);
flag=false;
getch();
}
//地雷计数区域处理
//通过Array[][]输出图像表示附近地雷数量
void MineCountDeal(int x,int y,int n)
{
IMAGE img;
if(n<10)
switch(n)
{
case 1:loadimage(&img,"res//1.bmp");break;
case 2:loadimage(&img,"res//2.bmp");break;
case 3:loadimage(&img,"res//3.bmp");break;
case 4:loadimage(&img,"res//4.bmp");break;
case 5:loadimage(&img,"res//5.bmp");break;
case 6:loadimage(&img,"res//6.bmp");break;
case 7:loadimage(&img,"res//7.bmp");break;
case 8:loadimage(&img,"res//8.bmp");break;
}
if(n>10&&n<=19)
switch(n-10)
{
case 1:loadimage(&img,"res//1.bmp");break;
case 2:loadimage(&img,"res//2.bmp");break;
case 3:loadimage(&img,"res//3.bmp");break;
case 4:loadimage(&img,"res//4.bmp");break;
case 5:loadimage(&img,"res//5.bmp");break;
case 6:loadimage(&img,"res//6.bmp");break;
case 7:loadimage(&img,"res//7.bmp");break;
case 8:loadimage(&img,"res//8.bmp");break;
}
putimage(x*25,y*25,&img);
flag2[x][y]=true;
}
//鼠标右击处理函数
//通过价格Array数组中的数据加十循环实现标示,问号,及回到隐藏状态
//函数开始地雷为数字9,右击鼠标后标示图标数字加10,再次右击后问号图标加10,地三次右击后恢复隐藏状态数字减20
void RightButtonDeal(int x,int y,int n)
{
IMAGE img;
if(Judge1>11)
return;
if(n>=0&&n<=9)
{
Judge1++;
if(n==9)
Judge2++;
n+=10;
loadimage(&img,"res//flag.bmp");
putimage(x*25,y*25,&img);
Array[x][y]=n;
return;
}
if(n>=10&&n<=19)
{
Judge1--;
if(n==19) Judge2--;
n+=10;
loadimage(&img,"res//ask.bmp");
putimage(x*25,y*25,&img);
Array[x][y]=n;
return;
}
if(n>=20&&n<=29)
{
n-=20;
loadimage(&img,"res//blank.bmp");
putimage(x*25,y*25,&img);
Array[x][y]=n;
return;
}
}
//扫雷成功
void WinFinish()
{
cleardevice();
outtextxy(80,80,"game over");
outtextxy(70,100,"you are win");
getch();
closegraph();
}
void FailFinish()
{
cleardevice();
outtextxy(80,80,"game over");
outtextxy(70,100,"you are fail");
getch();
closegraph();
}
void Game()
{
InitData();
InitGraph();
MouseMessageDeal();
}
int main()
{
srand((unsigned)time(NULL));
Game();
return 0;
}