想起大一的时候写的c语言代码现在又写了一遍.无聊ing
//
//程序名称:扫雷 //
//作者: ys //
//
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
void draw_circul(int x,int y,int row,int col);
int init_system();
void draw_mode(int x,int y,int wm_wh,int type);
void draw_framework();
void set_mine(int num);
void draw_min_max_framework(int x1,int y1,int x2,int y2);
void draw_happyface(int type);
void draw_clock_score();
void draw_mine(int row,int col);
void mouse_clear_mine();
void round_mine_num();
int deal_space(int x, int y);
void deal_situation(int y,int x);
void output_num();
void show_space(int y,int x);
void show_num(int y,int x);
#define FLAG 20
#define win m_col*m_row
#define mine_num 20 //雷的数目
int m_maxx,m_maxy;
int m_row,m_col,m_wh;
int x0,y0,num=0;
int **p;
int main(void)
{
init_system(); //初始化系统
if(!init_system())
exit(0);
x0=(m_maxx-m_col*(m_wh+1))/2;
y0=(m_maxy-m_row*(m_wh+1))/2;
draw_circul(x0,y0,m_row,m_col); //初始化界面
draw_framework(); //框架
set_mine(mine_num); //布雷
round_mine_num(); //计算周围雷数
mouse_clear_mine(); //鼠标清雷
getch();
closegraph();
return 0;
}
//鼠标清雷
void mouse_clear_mine()
{
MOUSEMSG m;
m=GetMouseMsg();
int x,y;
while(1)
{
m=GetMouseMsg();
x=(m.x-x0)/(m_wh+1);
y=(m.y-y0)/(m_wh+1);
switch(m.uMsg)
{
case WM_LBUTTONDOWN:
{
if (x0<m.x && m.x<((m_wh+1)*m_col+x0) && m.y>y0 && m.y<(y0+(m_wh+1)*m_row) && p[y][x]<8 && p[y][x]>-3)
{
if (p[y][x]==-1)
{
draw_happyface(2);
for (int j=0;j<m_col;j++)
for (int i=0;i<m_row;i++)
{
if (p[i][j]==-1)
draw_mine(j,i);
p[i][j]+=FLAG;
}
setlinecolor(RED);
line(x0+x*(m_wh+1)+2,y0+y*(m_wh+1)+2,x0+(x+1)*(m_wh+1)-2,y0+(y+1)*(m_wh+1)-2);
line(x0+(x+1)*(m_wh+1)-2,y0+y*(m_wh+1)+2,x0+x*(m_wh+1)+2,y0+(y+1)*(m_wh+1)-2);
}
if (p[y][x]==0)
{
show_space(y,x);
}
if(p[y][x]>0 && p[y][x]<9)
{
show_num(y,x);
}
}
else if (m.x>m_maxx/2-m_wh-5 && m.x<m_maxx/2+m_wh+5 && m.y>y0-m_wh*5/2-5 && m.y<y0-m_wh/2+5)
{
draw_mode(m_maxx/2-m_wh-5,y0-m_wh*5/2-5,2*m_wh+10,1);
Sleep(20);
main();
}
else if (num==win)
{
exit(1);
}
else
{
;
}
}break;
case WM_RBUTTONDOWN:
{
if (x0<m.x && m.x<((m_wh+1)*m_col+x0) && m.y>y0 && m.y<(y0+(m_wh+1)*m_row))
{
if (p[y][x]>15 || p[y][x]==-2)
{
;
}
else if (p[y][x]<-10)
{
draw_mode(x0+(m_wh+1)*x,y0+(m_wh+1)*y,m_wh,1);
p[y][x]+=FLAG;
}
else
{
setlinecolor(RED);
line(x0+(m_wh+1)*x+3,y0+(m_wh+1)*y+3,x0+(m_wh+1)*x+3,y0+(m_wh+1)*(y+1)-6);
rectangle(x0+(m_wh+1)*x+3,y0+(m_wh+1)*y+3,x0+(m_wh+1)*(x+1)-8,y0+(m_wh+1)*y+8);
setfillstyle(SOLID_FILL);
setfillcolor(RED);
floodfill(x0+(m_wh+1)*x+4,y0+(m_wh+1)*y+4,RED);
p[y][x]-=FLAG;
}
}
else
{
;
}
}break;
}
}
}
void show_space(int y,int x)
{
if(y>=0 && y<m_row && x>=0 && x<m_col && p[y][x]==0)
{
draw_mode(x0+x*(m_wh+1),y0+y*(m_wh+1),m_wh,2);
p[y][x]+=FLAG;
num++;
show_space(y-1,x);
show_space(y,x-1);
show_space(y+1,x);
show_space(y,x+1);
}
if(y>=0 && y<m_row && x>=0 && x<m_col && p[y][x]>0 && p[y][x]<=8)
{
show_num(y,x);
num++;
}
}
void show_num(int y,int x)
{
draw_mode(x0+x*(m_wh+1),y0+y*(m_wh+1),m_wh,2);
if (p[y][x]==1)
settextcolor(RED);
if (p[y][x]==2)
settextcolor(GREEN);
if (p[y][x]==3)
settextcolor(BLUE);
if (p[y][x]==4)
settextcolor(YELLOW);
if (p[y][x]==5)
settextcolor(BROWN);
if (p[y][x]==6)
settextcolor(RED);
if (p[y][x]==7)
settextcolor(GREEN);
if (p[y][x]==8)
settextcolor(BLUE);
setbkmode(TRANSPARENT);
outtextxy(x0+x*(m_wh+1)+m_wh/3,y0+y*(m_wh+1)+m_wh/8,p[y][x]+48);
p[y][x]+=FLAG;
}
//布雷
void set_mine(int num)
{
int k,i,j;
int m=0;
srand((unsigned)time(NULL));
while(m<num)
{
k=rand()%(m_row*m_col);
j=k%m_col;
i=k/m_col;
if(p[i][j]!=-1)
{
p[i][j]=-1;
m++;
}
}
}
//显示雷数
void round_mine_num()
{
int i,j;
for (i=0;i<m_row;i++)
for (j=0;j<m_col;j++)
{
if (j<m_col-1 && i<m_row-1 && p[i][j]==-1 && p[i+1][j+1]!=-1)
p[i+1][j+1]++;
if (i<m_row-1 && p[i][j]==-1 && p[i+1][j]!=-1)
p[i+1][j]++;
if (i<m_row-1 && j>0 && p[i][j]==-1 && p[i+1][j-1]!=-1)
p[i+1][j-1]++;
if (j>0 && p[i][j]==-1 && p[i][j-1]!=-1)
p[i][j-1]++;
if (i>0 && j>0 && p[i][j]==-1 && p[i-1][j-1]!=-1)
p[i-1][j-1]++;
if (i>0 && p[i][j]==-1 && p[i-1][j]!=-1)
p[i-1][j]++;
if (i>0 && j<m_col-1 && p[i][j]==-1 && p[i-1][j+1]!=-1)
p[i-1][j+1]++;
if (j<m_col-1 && p[i][j]==-1 && p[i][j+1]!=-1)
p[i][j+1]++;
}
}
//画一个雷
void draw_mine(int col,int row)
{
draw_mode(x0+col*(m_wh+1),y0+row*(m_wh+1),m_wh,2);
setcolor(BLACK);
circle(x0+m_wh/2+col*(m_wh+1),y0+m_wh/2+row*(m_wh+1),5);
setfillstyle(SOLID_FILL);
setfillcolor(BLACK);
floodfill(x0+m_wh/2+col*(m_wh+1),y0+m_wh/2+row*(m_wh+1),BLACK);
}
//画界面模式
void draw_mode(int x,int y,int wm_wh,int type)
{
if (type==1)
{
setcolor(WHITE);
rectangle(x,y,x+wm_wh,y+wm_wh);
setfillstyle(SOLID_FILL);
setfillcolor(LIGHTGRAY);
floodfill((x+x+wm_wh)/2,(y+y+wm_wh)/2,WHITE);
setlinecolor(WHITE);
line(x,y,x+wm_wh,y);
line(x,y,x,y+wm_wh);
setlinecolor(DARKGRAY);
line(x+wm_wh,y,x+wm_wh,y+wm_wh);
line(x,y+wm_wh,x+wm_wh,y+wm_wh);
setlinecolor(WHITE);
line(x+1,y+1,x+wm_wh-1,y+1);
line(x+1,y+1,x+1,y+wm_wh-1);
setlinecolor(DARKGRAY);
line(x+wm_wh-1,y+1,x+wm_wh-1,y+wm_wh-1);
line(x+1,y+wm_wh-1,x+wm_wh-1,y+wm_wh-1);
}
else
{
setcolor(WHITE);
rectangle(x,y,x+m_wh,y+m_wh);
setfillstyle(SOLID_FILL);
setfillcolor(LIGHTGRAY);
floodfill((x+x+m_wh)/2,(y+y+m_wh)/2,WHITE);
setlinecolor(DARKGRAY);
line(x,y,x+m_wh,y);
line(x,y,x,y+m_wh);
setlinecolor(WHITE);
line(x+m_wh,y,x+m_wh,y+m_wh);
line(x,y+m_wh,x+m_wh,y+m_wh);
}
}
//画整个雷区界面
void draw_circul(int x,int y,int row,int col)
{
int i,j;
for (i=0;i<row;i++)
{
x=(m_maxx-m_col*(m_wh+1))/2;
for (j=0;j<col;j++)
{
draw_mode(x,y,m_wh,1);
x+=m_wh+1;
}
y+=m_wh+1;
}
}
//画外围框架界面
void draw_framework()
{
int x1,y1,x2,y2;
x1=x0-m_wh;
y1=y0-3*m_wh;
x2=x0+(m_col*(m_wh+1))+m_wh;
y2=y0+(m_row*(m_wh+1))+m_wh;
draw_min_max_framework(x1,y1,x2,y2);
draw_happyface(1);
draw_clock_score();
}
//大框小框
void draw_min_max_framework(int x1,int y1,int x2,int y2)
{
setlinecolor(WHITE);
rectangle(x0,y0,x0+m_col*(m_wh+1),y0+m_row*(m_wh+1));
setlinecolor(WHITE);
rectangle(x1,y1,x2,y2);
setfillstyle(SOLID_FILL);
setfillcolor(LIGHTGRAY);
floodfill(x1+2,y1+2,WHITE);
}
//笑脸
void draw_happyface(int type)
{
draw_mode(m_maxx/2-m_wh-5,y0-m_wh*5/2-5,2*m_wh+10,1);
setlinecolor(RED);
circle(m_maxx/2,y0-m_wh*3/2,m_wh);
setfillstyle(BS_SOLID);
setfillcolor(YELLOW);
floodfill(m_maxx/2,y0-m_wh*3/2,RED);
setlinecolor(BLACK);
circle(m_maxx/2-m_wh/2,y0-2*m_wh+2,2);
setfillstyle(BS_SOLID);
setfillcolor(BLACK);
floodfill(m_maxx/2-m_wh/2,y0-2*m_wh+2,BLACK);
circle(m_maxx/2+m_wh/2,y0-2*m_wh+2,2);
floodfill(m_maxx/2+m_wh/2,y0-2*m_wh+2,BLACK);
setlinecolor(RED);
if (type==1)
arc(m_maxx/2-m_wh/2,y0-m_wh*2,m_maxx/2+m_wh/2,y0-m_wh,3.4,6);
else
{
arc(m_maxx/2-m_wh/2,y0-m_wh*3/2+2,m_maxx/2+m_wh/2,y0-m_wh/2+2,0.3,2.85);
}
}
//时钟和计时器
void draw_clock_score()
{
setlinecolor(WHITE);
rectangle(x0,y0-2*m_wh,x0+3*m_wh,y0-m_wh);
setlinecolor(DARKGRAY);
line(x0,y0-2*m_wh,x0+3*m_wh,y0-2*m_wh);
line(x0,y0-2*m_wh,x0,y0-m_wh);
setlinecolor(WHITE);
rectangle(x0+(m_col-3)*(m_wh+1),y0-2*m_wh,x0+m_col*(m_wh+1),y0-m_wh);
setlinecolor(DARKGRAY);
line(x0+(m_col-3)*(m_wh+1),y0-2*m_wh,x0+(m_col-3)*(m_wh+1),y0-m_wh);
line(x0+(m_col-3)*(m_wh+1),y0-2*m_wh,x0+m_col*(m_wh+1),y0-2*m_wh);
}
//初始化系统
int init_system()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode," ");
m_maxx=getmaxx();
m_maxy=getmaxy();
m_row=10;
m_col=15;
m_wh=20;
int i,j;
p=(int **)malloc(sizeof(int *)*m_row);
if (!p)
return 0;
for(i=0;i<m_row;i++)
{
p[i]=(int *)malloc(sizeof(int)*m_col);
if(!p[i])
return 0;
}
for (i=0;i<m_row;i++)
for (j=0;j<m_col;j++)
p[i][j]=0;
return 1;
}