C程序设计扫雷游戏一、设计题目:扫雷游戏二、设计目的1.使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养学生综合运用所学知识独立完成课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
三、设计要求1.汪洋和孔维亮组成设计小组。
小组成员分工协作完成。
要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。
2.查阅相关资料,自学具体课题中涉及到的新知识。
3.采用结构化、模块化程序设计方法,功能要完善,界面要美观。
4.按要求写出课程设计报告,并于设计结束后1周内提交。
一概述1)掌握数组指针的概念及其应用2)培养团结合作精神2. 课程设计的要求要求我们有扎实的C语言知识,以及良好的编程习惯,能够熟练的应用循环,有毅力,还要求我们有较强的合作精神,善于总结。
同时还要求我们自学C语言作图部分知识。
在必要时还要上网查相关资料。
3.课程设计的主要设计思想扫雷游戏主要用了一个10行10列的二维数组,刚开始利用random随机布雷。
每一个程序最主要的是算法。
扫雷游戏算法的重点是一开始统计好每个格子周围有多少雷,当鼠标左键点在格子上时做出判断,如果周围8个格子有雷则显示出雷数,如果没有雷则显示空白格(在四个角的格子显示周围3个格子,其它边缘的格子显示周围5个的状态),我们在主函数中用两个for语句来判断周围雷数。
我们还加了鼠标处理函数。
如果格子上有雷则调用函FailExitGame(),显示“Fail!”,游戏结束。
若所有的雷都标出,且所有的格子都处理过,则调用函数ExitGame(),显示“OK,Good!”,游戏结束。
游戏结束后,按任意键出去。
二总体方案设计封面是由图形和动态文字,伴随声音接替出现。
程序用了一个10行10列的二维数组表示扫雷界面。
在游戏中要随机步雷,游戏开始前要统计好每个格子周围的雷数,游戏开始后可以点击鼠标玩游戏,游戏结束后,按任意键结束跳出游戏界面。
整体框图三详细设计程序流程以下是主函数中的一些主要的。
1.主函数2.主要定义常用到的常量,全局变量,有关的函数原形说明。
然后随机布雷,统计好每个格子周围的雷数,画扫雷游戏界面,游戏接受鼠标操作,按任意键结束游戏,关闭图形系统,程序结束。
BYTE MouseState() /*等待接受鼠标命令函数*/{union REGS regs;regs.x.ax = 3;int86(MOUSE, ®s, ®s); /*鼠标端口*/return(regs.x.bx);}void MouseShow() /*鼠标显示函数*/{union REGS regs;regs.x.ax = 1;int86(MOUSE, ®s, ®s);}void MouseHide() /*鼠标隐藏函数*/{union REGS regs;regs.x.ax = 2;int86(MOUSE, ®s, ®s);}BOOL InitMouse() /*取鼠标端口函数*/ {union REGS regs;regs.x.ax = 0;int86(MOUSE, ®s, ®s);return (regs.x.ax);}void WaitMouse(){int xx,yy;while (MouseState()){GetXY(&xx,&yy);if (xx!=x||yy!=y)SetXY(x,y);}}void Prt(int x,int y,BYTE ch,BYTE color) /*定义雷区地址入口*/ {pokeb(0xb800,y*160+x*2,ch);pokeb(0xb800,y*160+x*2+1,color);}BYTE Scr(int x,int y) /*返回雷区地址入口*/ {return peekb(0xb800,y*160+x*2);}void CursorHide() /*光标隐藏*/{_AH=3;geninterrupt(0x10);CursorMode=_CX;_AH=1;_CH=32;geninterrupt(0x10);}void CursorShow() /*光标显示*/{_AH=1;_CX=CursorMode;geninterrupt(0x10);}四、源程序如下:# include <dos.h># include <time.h># include <conio.h># include <stdio.h># include <stdlib.h># include <graphics.h># define BYTE unsigned char# define BOOL BYTE# define WORD unsigned int# define DWORD unsigned long# define TRUE 1# define FALSE !TRUE# define MOUSE 0x33# define LBUTTON 1# define RBUTTON 2# define SX 35# define SY 7# define MINE 9 /*在有雷的地方定义为MINE*/ BOOL InitMouse(); /*初始化鼠标*/BYTE Scr(int,int); /*屏幕显示坐标函数*/BYTE MouseState(); /*等待接受鼠标命令*/void Edge(int,int);void TurnBack(int,int);void MouseShow(); /*鼠标显示函数*/void MouseHide(); /*鼠标隐藏函数*/void CursorShow(); /*光标显示函数*/void CursorHide(); /*光标隐藏函数*/void SetRange(int,int,int,int);void GetXY(int*,int*);void SetXY(int,int);void WaitMouse();void WaitKey();void Prt(int,int,BYTE,BYTE); /*雷区的图形和颜色*/ void Locate(BYTE,BYTE);void FailExitGame(); /*游戏失败*/void ExitGame(); /*游戏胜利*/struct Snow{int x;int y;int speed;}snow[100];int snownum=0;int size;int change=10;void *save1,*save2;void Copy();void DrawSnow();void Pr();void load();void welcome1();void welcome2();void welcome3();void control();void star();BOOL Turn[10][10];BYTE Mine[10][10];BYTE Mark[10][2];WORD CursorMode;int x,y;void main(){ int i;int Total=0;BYTE Button;BOOL QUIT=FALSE;time_t lt; /*定义时间变量*/star(); /*调用游戏前景动画函数*/if (!InitMouse()){printf("Mouse not installed!"); /*对鼠标端口进行判断*/getch();}clrscr(); /*清屏*/CursorHide();randomize(); /*定义取随机数*/Locate(36,20); /*定义屏幕坐标*/printf("Mines:%d ",0); /* Mines表示做标记的次数*/lt = time(NULL);Locate(15,4); /*定义屏幕坐标*/printf("The Calendar Time now is %s\n", ctime(& lt));for (y=0;y<10;y++)for (x=0;x<10;x++){Mine[y][x]=NULL;Turn[y][x]=FALSE;}for (i=0;i<10;i++) /*随机产生地雷坐标*/{x=random(10);y=random(10);while (Mine[y][x]){x=random(10);y=random(10);}Mine[y][x]=MINE; /*定义在有了雷的地方坐标值为MINE*/ }for (y=0;y<10;y++)for (x=0;x<10;x++){i=0; /*判断每个格子周围的雷数*/ if (Mine[y][x]!=MINE){if ((Mine[y][x-1]==MINE)&&((x-1)>=0)) i++;if ((Mine[y][x+1]==MINE)&&((x+1)<10)) i++;if ((Mine[y-1][x]==MINE)&&((y-1)>=0)) i++;if ((Mine[y+1][x]==MINE)&&((y+1)<10)) i++;if ((Mine[y-1][x-1]==MINE)&&((x-1)>=0)&&((y-1)>=0)) i++;if ((Mine[y-1][x+1]==MINE)&&((x+1)<10)&&((y-1)>=0)) i++;if ((Mine[y+1][x+1]==MINE)&&((x+1)<10)&&((y+1)<10)) i++;if ((Mine[y+1][x-1]==MINE)&&((x-1)>=0)&&((y+1)<10)) i++;Mine[y][x]=i;}Prt(x+SX,y+SY,1,15); /*雷区的图形和颜色*/}MouseShow();while(!QUIT){if (kbhit()) if (getch()==27) QUIT=TRUE;Button=MouseState()&3;if (Button){GetXY(&x,&y);WaitMouse();x>>=3;y>>=3;x-=SX;y-=SY;if (x>=0&&x<10&&y>=0&&y<10){if (Button&LBUTTON){if (Mine[y][x]==MINE)FailExitGame();if (Mine[y][x]==NULL)Edge(x,y);elseTurnBack(x,y);}if (Button&RBUTTON){if (!(Turn[y][x]&1)){switch (Turn[y][x]){case 0:Turn[y][x]=2;MouseHide();Prt(x+SX,y+SY,'*',15);Locate(36,20);printf("Mines:%d ",++Total);MouseShow();Mark[Total][0]=x;Mark[Total][1]=y;if (Total==10) ExitGame();break;case 2:Turn[y][x]=0;MouseHide();Prt(x+SX,y+SY,5,8);Locate(36,20);printf("Mines:%d ",--Total);MouseShow();break;}}}}}}WaitKey();MouseHide();CursorShow();}BYTE MouseState() /*等待接受鼠标命令*/{union REGS regs;regs.x.ax = 3;int86(MOUSE, ®s, ®s); /*鼠标端口*/return(regs.x.bx);}void MouseShow() /*鼠标显示*/{union REGS regs;regs.x.ax = 1;int86(MOUSE, ®s, ®s);}void MouseHide() /*鼠标隐藏*/{union REGS regs;regs.x.ax = 2;int86(MOUSE, ®s, ®s);}BOOL InitMouse() /*取鼠标端口*/ {union REGS regs;regs.x.ax = 0;int86(MOUSE, ®s, ®s);return (regs.x.ax);}void SetRange(int start_x,int start_y,int end_x,int end_y){union REGS r;r.x.ax=7;r.x.cx=start_x;r.x.dx=end_x;int86(0x33,&r,&r);r.x.ax=8;r.x.cx=start_y;r.x.dx=end_y;int86(MOUSE,&r,&r);}void GetXY(int *x,int *y){union REGS ireg,oreg;ireg.x.ax=3;int86(MOUSE,&ireg,&oreg);*x=oreg.x.cx;*y=oreg.x.dx;}void SetXY(int x,int y){union REGS ireg;ireg.x.ax=4;ireg.x.cx=x;ireg.x.dx=y;int86(MOUSE,&ireg,&ireg);}void WaitMouse(){int xx,yy;while (MouseState()){GetXY(&xx,&yy);if (xx!=x||yy!=y)SetXY(x,y);}}void Prt(int x,int y,BYTE ch,BYTE color) /*定义雷区地址入口*/ {pokeb(0xb800,y*160+x*2,ch);pokeb(0xb800,y*160+x*2+1,color);}BYTE Scr(int x,int y) /*返回雷区地址入口*/ {return peekb(0xb800,y*160+x*2);}void CursorHide() /*光标隐藏*/{_AH=3;geninterrupt(0x10);CursorMode=_CX;_AH=1;_CH=32;geninterrupt(0x10);}void CursorShow() /*光标显示*/{_AH=1;_CX=CursorMode;geninterrupt(0x10);}void WaitKey(){_AH=0;geninterrupt(0x16);}void Edge(int xx,int yy){if (xx<0||xx>9||yy<0||yy>9||Turn[yy][xx]) return;TurnBack(xx,yy);if (Mine[yy][xx]==NULL){Edge(xx+1,yy);Edge(xx-1,yy);Edge(xx,yy+1);Edge(xx,yy-1);}}void TurnBack(int xx,int yy){if (!Turn[yy][xx]){MouseHide();Prt(xx+SX,yy+SY,Mine[yy][xx]+48,12);MouseShow();Turn[yy][xx]=Turn[yy][xx]||1;}}void Locate(BYTE Col,BYTE Line){pokeb(0x0,0x450,Col);pokeb(0x0,0x451,Line);}void FailExitGame(){ /*显示游戏失败*/sound(1000);delay(500);nosound();for (y=0;y<10;y++)for (x=0;x<10;x++)if (Mine[y][x]==MINE) Prt(x+SX,y+SY,'*',14+128);MouseHide();CursorShow();printf("\nFail!\n");getch();exit(0);}void ExitGame() /*显示游戏胜利*/{int i,m=0;for (i=0;i<10;i++)if (Mine[Mark[i][1]][Mark[i][0]]) m++;if (m<9) FailExitGame();MouseHide();CursorShow();printf("\nOK,Good!\n");getch();exit(0);}/* /////// 开机////// */ void star(){int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\turboc2");Copy();DrawSnow();welcome1();welcome2();welcome3();control();closegraph(); /*关闭图形函数*/}void Copy(){setcolor(0); /*涂色*/setfillstyle(SOLID_FILL,15);fillellipse(200,200,1,1); /*画椭圆*/size=imagesize(196,196,204,204);save1=malloc(size);save2=malloc(size);getimage(196,196,204,204,save1);getimage(96,96,104,104,save2);}void Pr(){ints[]={392,262,262,262,330,392,392,392,392,392,330,330,294,294,330,294,262,440,3 92,392,262,262,262,330,392,392,392,392,392,330,330,294,294,330,294,262,440,392};/*定义声音函数数组*/setcolor(change); /*字体颜色变换*/settextstyle(0,0,4); /*字体大小*/outtextxy(150,200,"Welcome to"); /*在屏幕上打印字符*/outtextxy(200,240,"C Game!");sound(s[change/10]); /*释放声音*/}void DrawSnow(){int i;int sx[62];randomize();for(i=0;i<62;i++)sx[i]=(i+2)*10;cleardevice(); /*清屏*/while(!kbhit()){Pr();if(snownum!=100){snow[snownum].speed=2+random(5);i=random(62);snow[snownum].x=sx[i];snow[snownum].y=10-random(100);}for(i=0;i<snownum;i++)putimage(snow[i].x,snow[i].y,save2,COPY_PUT); Pr(); if(snownum!=100)snownum++;else if(snownum>15) break;delay(300);setfillstyle(SOLID_FILL,15);for(i=0;i<snownum;i++){snow[i].y+=snow[i].speed;putimage(snow[i].x,snow[i].y,save1,COPY_PUT); if(snow[i].y>500)snow[i].y=10-random(200);}change++;if(change==140)change=10;}nosound();}void welcome1(){int a;for(a=0;a<450;a++){textbackground(16);setcolor(15);circle(315,240,a);delay(100);setcolor(16);circle(315,240,a-10);}}void welcome2(){float b;int c;for(b=0;b<320;b=b+0.5){setcolor(11);rectangle(0,240,b,240);rectangle(630,240,640-b,240);}for(c=0;c<240;c++){rectangle(0,240,640,240-c);rectangle(0,240,640,240+c);}}void welcome3(){int x,y=100,i,j;for(x=60;x<65;x++){setcolor(4); /*定义要打印字体的颜色*/ setbkcolor(1); /*定义背景色*/ settextstyle(0,0,6); /*定义要打印字体的大小*/ outtextxy(x,y,"扫"); /*在x,y位置打印汉字*/ delay(6000); /*延时*/}for(x=190;x<195;x++){setcolor(4);setbkcolor(1);settextstyle(0,0,6);outtextxy(x,y,"雷");delay(6000);}for(x=320;x<325;x++){setcolor(4);setbkcolor(1);settextstyle(0,0,6);outtextxy(x,y,"游");delay(6000);}for(x=480;x<485;x++){setcolor(4);setbkcolor(1);settextstyle(0,0,6);outtextxy(x,y,"戏");delay(6000);}sleep(0.5);setcolor(4);settextstyle(0,0,2);outtextxy(130,205,"制作组人员:范金龙闫佳佳");outtextxy(230,250,"倾");for(i=0;i<10;i=i+1){for(j=0;j<i/2;j=j+1){setcolor(4);setbkcolor(14);circle(282-j,256-j,i); /*画圆*/circle(286+j,256-j,i);delay(20);}}outtextxy(315,250,"打");outtextxy(350,250,"造");outtextxy(200,280,"1 . star the game");outtextxy(200,310,"2 . exit pattern");outtextxy(550,450,"V1.90");}void control() /*从键盘接受命令函数*/{int key;key=getch();switch(key) /*等待接受命令*/{case '1':load();break;case '2':exit(0);default:exit(0);}}void load(){float k;setcolor(4);rectangle(205,365,392,381);outtextxy(220,350,"loading...");for(k=0;k<187;k=k+0.2){rectangle(205,365,205+k,381); /*画矩形*/ delay(1000);}}。