C语言程序设计扫雷游戏试验报告.docx

上传人:b****5 文档编号:4704616 上传时间:2022-12-07 格式:DOCX 页数:22 大小:136.72KB
下载 相关 举报
C语言程序设计扫雷游戏试验报告.docx_第1页
第1页 / 共22页
C语言程序设计扫雷游戏试验报告.docx_第2页
第2页 / 共22页
C语言程序设计扫雷游戏试验报告.docx_第3页
第3页 / 共22页
C语言程序设计扫雷游戏试验报告.docx_第4页
第4页 / 共22页
C语言程序设计扫雷游戏试验报告.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

C语言程序设计扫雷游戏试验报告.docx

《C语言程序设计扫雷游戏试验报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计扫雷游戏试验报告.docx(22页珍藏版)》请在冰豆网上搜索。

C语言程序设计扫雷游戏试验报告.docx

C语言程序设计扫雷游戏试验报告

中南大学

程序设计基础实践报告

题目设计一个和window系统类似的小游戏【挖地雷】学生姓名张兰兰

学院信息科学与工程学院

专业班级物联网工程1301班

完成时间2014.1

1.课程设计内容3

2.课程设计目的3

3.背景知识3

4.工具/准备工作5

5.设计步骤、方法5

5.1.步骤1:

步骤名称(二级标题)错误!

未定义书签。

5.1.1.步骤1.1:

步骤名称(三级标题)5

5.2.步骤2:

步骤名称错误!

未定义书签。

53步骤n:

步骤名称错误!

未定义书签。

6.设计结果及分析5

7.设计结论15

8.问题及心得体会16

9.对本设计过程及方法、手段的改进建议17

10.参考文献17

报告名称

1.课程设计内容

在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。

扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。

我利用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。

即:

设计一个功能与Windows中的挖雷游戏相同的小游戏。

2.课程设计目的

1•培养学生综合运用所学知识独立完成课题的能力。

2•试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。

3•提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。

4•培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

5•培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。

6•对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核

3.背景知识

游戏玩法:

以windowsXP自带扫雷winmine.exe为例

游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初

级为9*9个万块10个雷,中级为16*16个万块40个雷,咼级为16*30个万块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。

游戏的基本操作包括左键单击(LeftClick)、右键单击(RightClick)、双击(Chording)三种。

其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:

左键单击:

在判断出不是雷的方块上按下左键,可以打开该方块。

如果方块上出现数字,则该数字表示其周围3X3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。

所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。

双击:

同时按下左键和右键完成双击。

当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。

地雷未标记完全时使用双击无效。

若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“X”见下图)

扫雷的设计原理:

扫雷游戏分为几个步骤:

第一步,使用二维数组表示地图;

第二步,随机生成几个地雷;

第三步,点击方格的反应,计算每个非雷区方格点开后的数字;

第四步,当方格数字为0的情况;

第五步,当方格为地雷的情况。

第一步地图的大小和第二步地雷的数量都应该是程序中给定的,或者玩家输入的。

这个是多少自己决定吧。

第三步,计算非雷区方格点开后的数字就把这个方格在二维数组中周围八个方向的方格是否是地雷都检查一遍,一定要注意不要越出数组边界。

这个数字可以在游戏初始化时全都计算好,也可以在玩家点击的时

候再计算。

点击非雷区方格,显示数字,这个方格标记为已点过”第四步,当

方格数字为0时,这里要用到递归调用,就是让程序自动点击”这个数字为0方格周围的八个方格,然后再看结果,如果不是0,就停止,如果是0,依然递归调用,直到没有0为止,或者直到点遍所有方格为止,一定要注意不要越出数组边界。

第五步,很简单,宣布玩家死亡就可以了。

4.工具/准备工作

查阅相关资料,了解扫雷的的玩法,了解扫雷的设计思想方法。

借鉴他人写过的程序,从中找到突破口。

从程序中了解需要的各种函数准备,再进一步获悉该函数的功能与使用方法。

对自己要设计的挖地雷游戏进行功能分析,大致如下:

总体游戏过程分析:

在屏幕上显示一个游戏界面,雷区范围内预先埋设了一定数量的随机分布的地雷(用数字9代替地雷);玩家通过从键盘中输入(行数X,列数丫)/进行点击;若能点中所有非雷区,则游戏胜利;否则踩雷,游戏失败。

简易版扫雷游戏要具备以下功能:

1)开局:

首先选择游戏等级,然后生成不同等级的雷区界面。

游戏等级分

为三级:

各等级行列数为:

简单:

10X10、普通:

15X15、困难:

20X20;雷区每个*号下面或埋藏有1个地雷,或者没有地雷;

2)挖雷:

从键盘中输入(行数X,列数丫),并按回车键,可挖开它;若所揭方块下有9,则踩雷,此时所有含地雷的块都出现9,该局游戏失败;如果方块上出现数字,它代表在它周围的8个方块中共有多少颗地雷;

3)输入:

通过键盘输入相关指示信息;

4)输出:

提示游戏失败,是否继续再来一遍;

5.设计步骤、方法

5.1主函数第一步,写出主程序的基本框架,确定各子模块名字和参数。

具体的函数流程如图5-3所示:

MainO^InitO^ControlOfGaineBegiiiO主函数初始化游戏控制1GamePlayOI游戏过程

游戏开始界面

GaimOvreib0游戏失败GameWinO游戏胜利

国5-3程!

了运彳亍流程图

定义使用到的常数、全局变量、函数原型说明。

然后初始化图形系统,调用游戏

控制函数,游戏只接受键盘,通过鼠标结束游戏,关闭系统,退出游戏main()

{

inti,j;/*定义i,j变量*/

intNO;

intbegin=1;

inth;/*确定雷的个数*/

while(begin)

{

printf("\n\n\n\n\n\n\n\n\n======================\n\n"

"\t\t\t|欢迎进入扫雷|\n\n\n"

"\t\t\t|按回车键继续|\n\n"

"\t\t\t=================================\n\n\n\n"

"\t\t\t本程序由张兰兰和杜宏亮完成\n\n\n\n");

getchar();/*游戏开始界面*/

请选择游戏难度:

\n\n");简单难度\n\n");普通难度\n\n");困难难度\n\n");自定义难度\n\n");

system("cls");

printf("\n\n\n\n\n\n\n\n\n

printf("1

printf("2

printf("3

printf("4

scanf("%d",&h);

getchar();/*确定游戏难度*/if(0

{

switch(h)

{

case1:

x=10;

y=10;

b=10;

break;/*简单难度*/

case2:

x=15;y=15;

b=40;

break;/*普通难度*/

case3:

x=20;y=20;b=60;

break;/*困难难度*/

case4:

system("cls");

printf("请输入棋盘行列数(小于20且用逗号隔开):

");

/*从键盘输入坐标*/scanf("%d,%d",&x,&y);

getchar();

printf("请输入雷的个数:

");/*从键盘输入雷的个数*/scanf("%d",&b);

getchar();

break;

}

break;

}

else

{

printf("输入错误请重新输\n");

}

}while(begin)

{system("cls");

InitialValue_game(&g);/*棋盘初始化*/

InitialMine_game(&g);/*随机布雷*/

print_game(&g,2);/*打印棋盘*/

NO=1;

while(NO)

{

printf("Pleasechoose:

");

scanf("%d,%d",&i,&j);

getchar();

if(-1

{

switch(openmap(&g,i-1,j-1))

{

case1:

print_game(&g,1);

printf("游戏结束!

按回车键再来一局\n");if(getchar()=='\n')begin=1;

elsebegin=0;

NO=0;

break;

case2:

if(judge_game(&g)==b)

{

printf("win!

\n");

print_game(&g,1);

是否再来一局*/

printf("按回车键再来一局\n");/*if(getchar()=='\n')begin=1;

elsebegin=0;

NO=0;

break;

}

elseprint_game(&g,2);NO=1;break;

default:

break;

}

}

else

{

printf("你输入错误!

请重新输入\n");

}

}

}

}

主控模块的各子模块说明:

voidInitialValue_game()用于棋盘初始化;InitialMine_game()用于棋盘的随机布雷;voidprint_game()用于打印棋盘;intjudge_game()用于判断游戏是否结束;intopenmap()用于点开地图;

5.2定义全局变量

#include

#include"stdlib.h"

#include"time.h"

#defines20

intx;

/*

棋盘行数*/

inty;

/*

棋盘列数*/

intb;

/*

选择游戏难度1简单2普通3困难4自定义*/

inth;

/*

雷的个数*/

structGamesg;

structGames

{

intgame_int[s][s];

chargame_char[s][s];

};

使用结构体数组来完成棋盘的定义,引用时间头文件来完成对随机布雷的随时性。

5.3各个函数的分析

5.3.1棋盘初始化程序:

voidInitialValue_game(structGames*g)

{

inti,j;

for(i=0;i

{

for(j=0;j

{

(*g).game_int[i][j]=0;

(*g).game_char[i][j]='*';

}

}

}

5.3.2随机布雷:

InitialMine_game(structGames*g)

{

inti,j,next1,next2;

intsum=0;

srand((unsigned)time(NULL));

while

(1)

{

i=rand()%x;

j=rand()%y;

if((*g).game_int[i][j]==9)continue;

(*g).game_int[i][j]=9;

++sum;

for(next1=-1;next1<2;next1++)

{

for(next2=-1;next2<2;next2++)

{

&&j+next2

if(-1

{

if((*g).game_int[i+next1][j+next2]!

=9)

{

(*g).game_int[i+next1][j+next2]+=1;

}

}

}

}

if(sum==b)break;

}

}实现雷的随机分布和各个点周围雷数的计算。

srand()随机布雷,

5.3.3打印棋盘:

voidprint_game(structGames*g,intLogo)

{

inti,j;

inta[s];

for(i=0;i

{a[i]=i+1;

}

if(Logo==1)

{

printf("%d",a[0]);

for(i=1;i

printf(i<10?

"%d":

"%d",a[i]);

printf("\n\n");

for(i=0;i

{if(i+1<10){printf("%d",i+1);

for(j=0;j

}

else

{

printf("%d",i+1);

for(j=0;j

}

}

}

if(Logo==2)

{

printf("%d",a[0]);

for(i=1;i

printf(i<10?

"%d":

"%d",a[i]);printf("\n\n");

for(i=0;i

{

if(i+1<10)

{printf("%d",i+1);

for(j=0;j

}

else

{

printf("%d",i+1);

for(j=0;j

}

}

}

}

5.3.4判断结束,点开地图:

intjudge_game(structGames*g)

{

intsum=0;

inti,j;

for(i=0;i

{

for(j=0;j

{

if((*g).game_char[i][j]=='*')sum+=1;

}

}

returnsum;

intopenmap(structGames*g,inti,intj)

{

system("cls");

intnext1,next2;if((*g).game_int[i][j]==9)return1;

else

{

if((*g).game_int[i][j]!

=0)

{(*g).game_char[i][j]=(char)((*g).game_int[i][j]+48);

return2;}else{

(*g).game_char[i][j]='0';for(next1=-1;next1<2;next1++)

{for(next2=-1;next2<2;next2++)

{

if(-1

{openmap(g,i+next1,j+next2);

}

}

}

}

return2;

}

}

}点开地图,即实现:

当输入坐标处为0,打开周围同样情况的坐标点。

即实现和Windows扫雷游戏同样的功能。

6.设计结果及分析

运行第一步:

按ENTER键进入:

选择游戏难度,按ENTER键进入:

 

 

游戏界面,开始从键盘输入数字,格式为(3,6),点击ENTER键:

游戏失败显示,并提示再来一局,程序完毕。

7.设计结论

本程序在刚开始调试时有许多错误,但都被一■一克服,现在在操作本程序时可根据提示进行相关操作,能正确输出结果。

在刚开始的几次调试中曾经出现过不能运行、不能产生随机数字、不会正确输出结果、不能进行循环等等问题。

经同学的帮助,这些问题得到克服,并且使程序的功能也得到了一定的完善。

在这次设计过程中,不仅复习课本上所学知识,还通过查资料、问同学学到了课本上没有的知识。

从而启发我,要想写好程序,在写好课本知识的同时还需要多读和专业有关的一些书籍,同时还需要多动脑子,尽量把所学的知识综合起来应用,力争写出完美的程序。

除此之外,我还得到了一些有用的教训:

写程序时必须要细心,不能输错一个字符标点,就连全角半角也得注意。

在修改时要有耐心,编译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误。

8.问题及心得体会①问题:

在本次实习过程中碰到的编译、连接的错误主要有:

缺少变量定义,定义位置不正确、语法错误、注释的位置等。

错误解决方法。

(1)缺少变量定义,定义位置不正确;由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错误信息的提示下一般还是很容易找到。

不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。

为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了。

(2)语法错误;大多的语法错误在通过书本参考下能够修改。

主要是平时缺乏锻炼、不太注意而产生的。

如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式

(3)注释的位置;程序设计中在注释的时候不能同我们平常写字一样随心所欲,我们应该注

意注释的格式。

注释中不能含有c语言可执行的语句!

②心得体会课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。

这是我们都希望看到的也正是我们进行课程设计的目的所在。

虽然设计内容繁多,过程繁琐但我的收获却更加丰富。

各种组件的运用,各种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌握的。

和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。

提高是有限的但提高也是全面的,正是这一次设计让我积累了许多实际经验,也必然会让我在未来的工作学习中表现出更高的应变能力和理解力。

顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方,学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善自己。

9.对本设计过程及方法、手段的改进建议

我们认为此程序太过简单,应该更进一步把扫雷界面输出为图型图案。

也即是能够使用方块,然后调用graphics.h库函数rectangle(x,y,xx,yy)画一格矩形,setfillstyle(SOLID_FILL,color)设置填充方式,floodfill(x+1,y+1,WHITE)

填充方块。

让方块看起来有立体感,将矩形上方和左方的边线设为白色,下方和右方的边线设为黑色。

使扫雷界面更加美观。

再此基础上增加标记地雷的功能,比如说使用小红旗,使玩家能够跳过地雷。

如果可以的话,可以考虑使用鼠标来控制点击位置,如果更好的话可以加入声音,比如没有点到雷的开心的声音,点到雷后的倒霉声。

通过老师的指导,这个软件的设计要更趋于人性化,也即是加入提示输入格式,以解决输入格式错误问题,而不是直接结束,重启。

10.参考文献

郭翠英主编的《C语言课程设计实例精编》;张芳妮吕波译《C语言编程常见问题解答》;谭浩强《C程序设计题解与上机指导(第二版)》。

伍俊良.VB课程设计与系统开发案例[M].北京

附:

源程序代码:

s

#include

#include"stdlib.h"

#include"time.h"

#defines20intx;/*棋盘行数*/

inty;/*棋盘列数*/

intb;/*选择游戏难度1简单2普通3困难4自定义*/inth;/*雷的个数*/

structGamesg;

structGames

{

intgame_int[s][s];

chargame_char[s][s];

};

voidInitialValue_game(structGames*g)

/*棋盘初始化*/

{

inti,j;

for(i=0;i

{

for(j=0;j

{

(*g).game_int[i][j]=0;

(*g).game_char[i][j]='#';

}

}

}

InitialMine_game(structGames*g)/*随机布雷*/

{

inti,j,next1,next2;

intsum=0;

srand((unsigned)time(NULL));

while

(1)

{

i=rand()%x;

j=rand()%y;

if((*g).game_int[i][j]==9)continue;(*g).game_int[i][j]=9;

++sum;

for(next1=-1;next1<2;next1++)

{

for(next2=-1;next2<2;next2++)

{

if(-1

{

if((*g).game_int[i+next1][j+next2]!

=9)

{

(*g).game_int[i+next1][j+next2]+=1;

}

}

}

}

if(sum==b)break;

}

}

voidprint_game(structGames*g,intLogo)

/*打印棋盘*/

{

int

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

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1