c语言实现,图形界面扫雷
来源:互联网 发布:下拉菜单获取数据库 编辑:程序博客网 时间:2024/05/16 14:24
时隔一年多,突然找到了大一暑假用c语言写的扫雷游戏,想起了那个大一的自己,额,15天写了一个扫雷也是蛮拼的,大一留下的东西,然而现在已经看不懂当时的代码代码了。就只剩当时的思路。
写这篇博客,附上代码,有兴趣的朋友可以玩玩,想写扫雷的同学,也可以借鉴下,特别是点击一下,出现大片空白区域,那个地方可以多看看,个人觉得很难,当时把我难得够呛。
代码命名成c++格式,如:1.cpp,主要是为了应用c++的一个图形库,但是其中的语法都是c的语法,
其中用到了一个图形库graphics.h,我用的是vc编辑器,没有这个库,所有需要补一个graphics库,这里下载
代码如下:
////////////////////////////程序名称:扫雷 ////作者: 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;}
编写大体思路是这样的,用一个二维数组模拟面板棋盘。每个位置都对应一个坐标,然后根据坐标个变化,去显示成图像就成了,大多数棋盘游戏都是这样。
2 0
- c语言实现,图形界面扫雷
- C语言实现扫雷
- c语言实现扫雷
- C语言实现扫雷
- C语言*扫雷实现
- C语言实现minesweeper扫雷
- 扫雷游戏 C语言实现
- c语言简单实现 扫雷
- C语言实现小游戏--扫雷
- C语言实现扫雷游戏
- C语言简单实现扫雷
- C语言实现扫雷游戏
- 用C语言实现扫雷
- C语言实现扫雷程序
- 【扫雷】编写一个小游戏--扫雷的c语言实现
- 小游戏:扫雷 (C语言实现扫雷的基本功能)
- c语言实现扫雷和俄罗斯方块
- 扫雷游戏(C语言实现)
- CODE[VS] 1404 字符串匹配
- 软考总结篇
- 定制 Project 内的特定资源 的 Inspector面板显示
- java泛型
- Zabbix 客户端自定义端口监控
- c语言实现,图形界面扫雷
- LeetCode题解——Flatten Binary Tree to Linked List
- QT 的信号与槽机制介绍
- Codeforces Round #325 (Div. 1) 解题报告
- HDU 2234 无题I
- 如何解决win7开机提示未能连接一个Windows服务
- C语言实现链表之单向链表(九)在任意位置插入结点
- Java Exception
- 快速排序