C程序课程设计报告扫雷游戏.docx

上传人:b****8 文档编号:11951173 上传时间:2023-06-03 格式:DOCX 页数:24 大小:39.02KB
下载 相关 举报
C程序课程设计报告扫雷游戏.docx_第1页
第1页 / 共24页
C程序课程设计报告扫雷游戏.docx_第2页
第2页 / 共24页
C程序课程设计报告扫雷游戏.docx_第3页
第3页 / 共24页
C程序课程设计报告扫雷游戏.docx_第4页
第4页 / 共24页
C程序课程设计报告扫雷游戏.docx_第5页
第5页 / 共24页
C程序课程设计报告扫雷游戏.docx_第6页
第6页 / 共24页
C程序课程设计报告扫雷游戏.docx_第7页
第7页 / 共24页
C程序课程设计报告扫雷游戏.docx_第8页
第8页 / 共24页
C程序课程设计报告扫雷游戏.docx_第9页
第9页 / 共24页
C程序课程设计报告扫雷游戏.docx_第10页
第10页 / 共24页
C程序课程设计报告扫雷游戏.docx_第11页
第11页 / 共24页
C程序课程设计报告扫雷游戏.docx_第12页
第12页 / 共24页
C程序课程设计报告扫雷游戏.docx_第13页
第13页 / 共24页
C程序课程设计报告扫雷游戏.docx_第14页
第14页 / 共24页
C程序课程设计报告扫雷游戏.docx_第15页
第15页 / 共24页
C程序课程设计报告扫雷游戏.docx_第16页
第16页 / 共24页
C程序课程设计报告扫雷游戏.docx_第17页
第17页 / 共24页
C程序课程设计报告扫雷游戏.docx_第18页
第18页 / 共24页
C程序课程设计报告扫雷游戏.docx_第19页
第19页 / 共24页
C程序课程设计报告扫雷游戏.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C程序课程设计报告扫雷游戏.docx

《C程序课程设计报告扫雷游戏.docx》由会员分享,可在线阅读,更多相关《C程序课程设计报告扫雷游戏.docx(24页珍藏版)》请在冰点文库上搜索。

C程序课程设计报告扫雷游戏.docx

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,"扫");/*

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2