C程序课程设计报告扫雷游戏.docx
- 文档编号:11951173
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:24
- 大小:39.02KB
C程序课程设计报告扫雷游戏.docx
《C程序课程设计报告扫雷游戏.docx》由会员分享,可在线阅读,更多相关《C程序课程设计报告扫雷游戏.docx(24页珍藏版)》请在冰点文库上搜索。
C程序课程设计报告扫雷游戏
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.主要定义常用到的常量,全局变量,有关的函数原形说明。
然后随机布雷,统计好每个格子周围的雷数,画扫雷游戏界面,游戏接受鼠标操作,按任意键结束游戏,关闭图形系统,程序结束。
BYTEMouseState()/*等待接受鼠标命令函数*/
{
unionREGSregs;
regs.x.ax=3;
int86(MOUSE,®s,®s);/*鼠标端口*/
return(regs.x.bx);
}
voidMouseShow()/*鼠标显示函数*/
{
unionREGSregs;
regs.x.ax=1;
int86(MOUSE,®s,®s);
}
voidMouseHide()/*鼠标隐藏函数*/
{
unionREGSregs;
regs.x.ax=2;
int86(MOUSE,®s,®s);
}
BOOLInitMouse()/*取鼠标端口函数*/
{
unionREGSregs;
regs.x.ax=0;
int86(MOUSE,®s,®s);
return(regs.x.ax);
}
voidWaitMouse()
{
intxx,yy;
while(MouseState())
{
GetXY(&xx,&yy);
if(xx!
=x||yy!
=y)
SetXY(x,y);
}
}
voidPrt(intx,inty,BYTEch,BYTEcolor)/*定义雷区地址入口*/
{
pokeb(0xb800,y*160+x*2,ch);
pokeb(0xb800,y*160+x*2+1,color);
}
BYTEScr(intx,inty)/*返回雷区地址入口*/
{
returnpeekb(0xb800,y*160+x*2);
}
voidCursorHide()/*光标隐藏*/
{
_AH=3;
geninterrupt(0x10);
CursorMode=_CX;
_AH=1;
_CH=32;
geninterrupt(0x10);
}
voidCursorShow()/*光标显示*/
{
_AH=1;
_CX=CursorMode;
geninterrupt(0x10);
}
四、源程序如下:
#include
#include
#include
#include
#include
#include
#defineBYTEunsignedchar
#defineBOOLBYTE
#defineWORDunsignedint
#defineDWORDunsignedlong
#defineTRUE1
#defineFALSE!
TRUE
#defineMOUSE0x33
#defineLBUTTON1
#defineRBUTTON2
#defineSX35
#defineSY7
#defineMINE9/*在有雷的地方定义为MINE*/
BOOLInitMouse();/*初始化鼠标*/
BYTEScr(int,int);/*屏幕显示坐标函数*/
BYTEMouseState();/*等待接受鼠标命令*/
voidEdge(int,int);
voidTurnBack(int,int);
voidMouseShow();/*鼠标显示函数*/
voidMouseHide();/*鼠标隐藏函数*/
voidCursorShow();/*光标显示函数*/
voidCursorHide();/*光标隐藏函数*/
voidSetRange(int,int,int,int);
voidGetXY(int*,int*);
voidSetXY(int,int);
voidWaitMouse();
voidWaitKey();
voidPrt(int,int,BYTE,BYTE);/*雷区的图形和颜色*/
voidLocate(BYTE,BYTE);
voidFailExitGame();/*游戏失败*/
voidExitGame();/*游戏胜利*/
structSnow
{
intx;
inty;
intspeed;
}snow[100];
intsnownum=0;
intsize;
intchange=10;
void*save1,*save2;
voidCopy();
voidDrawSnow();
voidPr();
voidload();
voidwelcome1();
voidwelcome2();
voidwelcome3();
voidcontrol();
voidstar();
BOOLTurn[10][10];
BYTEMine[10][10];
BYTEMark[10][2];
WORDCursorMode;
intx,y;
voidmain()
{inti;
intTotal=0;
BYTEButton;
BOOLQUIT=FALSE;
time_tlt;/*定义时间变量*/
star();/*调用游戏前景动画函数*/
if(!
InitMouse())
{
printf("Mousenotinstalled!
");/*对鼠标端口进行判断*/
getch();
}
clrscr();/*清屏*/
CursorHide();
randomize();/*定义取随机数*/
Locate(36,20);/*定义屏幕坐标*/
printf("Mines:
%d",0);/*Mines表示做标记的次数*/
lt=time(NULL);
Locate(15,4);/*定义屏幕坐标*/
printf("TheCalendarTimenowis%s\n",ctime(<));
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);
else
TurnBack(x,y);
}
if(Button&RBUTTON)
{
if(!
(Turn[y][x]&1))
{
switch(Turn[y][x])
{
case0:
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;
case2:
Turn[y][x]=0;
MouseHide();
Prt(x+SX,y+SY,5,8);
Locate(36,20);
printf("Mines:
%d",--Total);
MouseShow();
break;
}
}
}
}
}
}
WaitKey();
MouseHide();
CursorShow();
}
BYTEMouseState()/*等待接受鼠标命令*/
{
unionREGSregs;
regs.x.ax=3;
int86(MOUSE,®s,®s);/*鼠标端口*/
return(regs.x.bx);
}
voidMouseShow()/*鼠标显示*/
{
unionREGSregs;
regs.x.ax=1;
int86(MOUSE,®s,®s);
}
voidMouseHide()/*鼠标隐藏*/
{
unionREGSregs;
regs.x.ax=2;
int86(MOUSE,®s,®s);
}
BOOLInitMouse()/*取鼠标端口*/
{
unionREGSregs;
regs.x.ax=0;
int86(MOUSE,®s,®s);
return(regs.x.ax);
}
voidSetRange(intstart_x,intstart_y,intend_x,intend_y)
{
unionREGSr;
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);
}
voidGetXY(int*x,int*y)
{
unionREGSireg,oreg;
ireg.x.ax=3;
int86(MOUSE,&ireg,&oreg);
*x=oreg.x.cx;
*y=oreg.x.dx;
}
voidSetXY(intx,inty)
{
unionREGSireg;
ireg.x.ax=4;
ireg.x.cx=x;
ireg.x.dx=y;
int86(MOUSE,&ireg,&ireg);
}
voidWaitMouse()
{
intxx,yy;
while(MouseState())
{
GetXY(&xx,&yy);
if(xx!
=x||yy!
=y)
SetXY(x,y);
}
}
voidPrt(intx,inty,BYTEch,BYTEcolor)/*定义雷区地址入口*/
{
pokeb(0xb800,y*160+x*2,ch);
pokeb(0xb800,y*160+x*2+1,color);
}
BYTEScr(intx,inty)/*返回雷区地址入口*/
{
returnpeekb(0xb800,y*160+x*2);
}
voidCursorHide()/*光标隐藏*/
{
_AH=3;
geninterrupt(0x10);
CursorMode=_CX;
_AH=1;
_CH=32;
geninterrupt(0x10);
}
voidCursorShow()/*光标显示*/
{
_AH=1;
_CX=CursorMode;
geninterrupt(0x10);
}
voidWaitKey()
{
_AH=0;
geninterrupt(0x16);
}
voidEdge(intxx,intyy)
{
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);
}
}
voidTurnBack(intxx,intyy)
{
if(!
Turn[yy][xx])
{
MouseHide();
Prt(xx+SX,yy+SY,Mine[yy][xx]+48,12);
MouseShow();
Turn[yy][xx]=Turn[yy][xx]||1;
}
}
voidLocate(BYTECol,BYTELine)
{
pokeb(0x0,0x450,Col);
pokeb(0x0,0x451,Line);
}
voidFailExitGame()
{/*显示游戏失败*/
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);
}
voidExitGame()/*显示游戏胜利*/
{
inti,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);
}
/*///////开机//////*/
voidstar()
{intgd=DETECT,gm;
initgraph(&gd,&gm,"c:
\\turboc2");
Copy();
DrawSnow();
welcome1();
welcome2();
welcome3();
control();
closegraph();/*关闭图形函数*/
}
voidCopy()
{
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);
}
voidPr()
{
ints[]={392,262,262,262,330,392,392,392,392,392,330,330,294,294,330,294,262,440,392,
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,"Welcometo");/*在屏幕上打印字符*/
outtextxy(200,240,"CGame!
");
sound(s[change/10]);/*释放声音*/
}
voidDrawSnow()
{inti;
intsx[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 putimage(snow[i].x,snow[i].y,save2,COPY_PUT); Pr();if(snownum! =100) snownum++;elseif(snownum>15)break; delay(300); setfillstyle(SOLID_FILL,15); for(i=0;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(); } voidwelcome1() {inta; for(a=0;a<450;a++) {textbackground(16); setcolor(15); circle(315,240,a); delay(100); setcolor(16); circle(315,240,a-10); } } voidwelcome2() {floatb;intc; 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); } } voidwelcome3() {intx,y=100,i,j; for(x=60;x<65;x++) {setcolor(4);/*定义要打印字体的颜色*/ setbkcolor (1);/*定义背景色*/ settextstyle(0,0,6);/*定义要打印字体的大小*/ outtextxy(x,y,"扫");/*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 课程设计 报告 扫雷 游戏