C语言程序设计扫雷游戏试验报告_第1页
C语言程序设计扫雷游戏试验报告_第2页
C语言程序设计扫雷游戏试验报告_第3页
C语言程序设计扫雷游戏试验报告_第4页
C语言程序设计扫雷游戏试验报告_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中南大学程序设计基础实践报告题 目设计一个和window系统类似的小游戏【挖地雷】 学生姓名张兰兰学 院信息科学与工程学院专业班级物联网工程1301班完成时间2014.1计算机程序设计实践报告 班级_学号姓名目 录1. 课程设计内容 32. 课程设计目的 33. 背景知识 34. 工具/准备工作 55. 设计步骤、方法 55.1. 步骤1 :步骤名称(二级标题)错误!未定义书签。5.1.1. 步骤1.1:步骤名称(三级标题)55.2. 步骤2 :步骤名称 错误!未定义书签。5.3. 步骤n:步骤名称 错误!未定义书签。6. 设计结果及分析 57. 设计结论 158. 问题及心得体会 169.

2、对本设计过程及方法、手段的改进建议 1710. 参考文献 17第27页共25页报告名称1. 课程设计内容在计算机逐步渗入社会生活各个层面的今天, 计算机已经成为人们日常生活 的一分,越来越多的人使用计算机办公、娱乐等等。扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows 操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是 这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。我利 用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。即:设计一个功能与 Windows中的挖雷游戏相同的小游戏。2. 课程设计目的1 培养学生综合运用

3、所学知识独立完成课题的能力。2试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和 方法。3提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素 质。4培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论, 全方位考虑问题等科学技术人员应具有的素质。5培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到 解决问题的新途径的悟性,初步培养工程意识和创新能力。6对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计 能力、书面及口头表达能力进行考核3. 背景知识游戏玩法:以windows XP自带扫雷winmine.exe为例游戏区包括雷区、地雷计数器

4、(位于左上角,记录剩余地雷数)和计时器(位 于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷 (初 级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。游戏的基本操作包括左键单击(Left Click)、右键单击(Right Click)、双击 (Chordi ng)三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标 记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标 记完时,相

5、当于对数字周围未打开的方块均进行一次左键单击操作:左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块 上出现数字,则该数字表示其周围 3 >3区域中的地雷数(一般为8个格子,对于 边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为 8);如果方块 上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏 结束。双击:同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位 置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。 地雷未标记完全时使用双击无效。若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“>”

6、(见下图)扫雷的设计原理:扫雷游戏分为几个步骤:第一步,使用二维数组表示地图;第二步,随机生成几个地雷;第三步,点击方格的反应,计算每个非雷区方格点开后的数字;第四步,当方格数字为0的情况;第五步,当方格为地雷的情况。第一步地图的大小和第二步地雷的数量都应该是程序中给定的,或者玩家输入的这个是多少自己决定吧。第三步,计算非雷区方格点开后的数字就把这个方格在 二维数组中周围八个方向的方格是否是地雷都检查一遍,一定要注意不要越出数组边界。这个数字可以在游戏初始化时全都计算好, 也可以在玩家点击的时候再 计算。点击非雷区方格,显示数字,这个方格标记为已点过”第四步,当方格 数字为0时,这里要用到递归

7、调用,就是让程序自动 点击”这个数字为0方格周围 的八个方格,然后再看结果,如果不是0,就停止,如果是0,依然递归调用,直 到没有0为止,或者直到点遍所有方格为止,一定要注意不要越出数组边界。第 五步,很简单,宣布玩家死亡就可以了。4. 工具/准备工作查阅相关资料,了解扫雷的的玩法,了解扫雷的设计思想方法。借鉴他人写 过的程序,从中找到突破口。从程序中了解需要的各种函数准备, 再进一步获悉 该函数的功能与使用方法。对自己要设计的挖地雷游戏进行功能分析,大致如下:总体游戏过程分析:在屏幕上显示一个游戏界面,雷区范围内预先埋设了一 定数量的随机分布的地雷(用数字 9代替地雷);玩家通过从键盘中输入

8、(行数 X列数丫)/进行点击;若能点中所有非雷区,则游戏胜利;否则踩雷,游戏失败。简易版扫雷游戏要具备以下功能:1)开局:首先选择游戏等级,然后生成不同等级的雷区界面。游戏等级分为三级:各等级行列数为:简单:10X 10、普通:15X15、困难:20 X 20;雷区每个*号下面或埋藏有1个地雷,或者没有地雷;2)挖雷:从键盘中输入(行数X,列数丫),并按回车键,可挖开它;若所揭 方块下有9,则踩雷,此时所有含地雷的块都出现 9,该局游戏失败; 如果方块上出现数字,它代表在它周围的 8个方块中共有多少颗地雷;3)输入:通过键盘输入相关指示信息;4)输出:提示游戏失败,是否继续再来一遍;5. 设计

9、步骤、方法5.1主函数第一步,写出主程序的基本框架,确定各子模块名字和参数。具体的函数流程如图5-3所示:MainQInitOCwitrolO C GanieBegiiiO 游戏开始界面 上函数 初始化游戏控制GzuPlayO r GanmOcrO游戏光败 游戏过程L GrmicWinQ游戏胜利图5-3程序运行流程閤定义使用到的常数、全局变量、函数原型说明。然后初始化图形系统,调用游戏 控制函数,游戏只接受键盘,通过鼠标结束游戏,关闭系统,退出游戏。mai n()int i,j;/* 定义 i,j 变量*/int NO;int begi n=1;int h;/* 确定雷的个数*/while(b

10、egi n)printf ("nnnnnnnnn"ttt|"ttt|"ttt"ttt欢迎进入扫雷按回车键继续nn"|nnn" |nn" nnnn" nnnn");请选择游戏难度:nn");简单难度nn");普通难度nn");困难难度nn");本程序由张兰兰和杜宏亮完成getchar(); /* 游戏开始界面*/system("cls");printf(” nnnnnnnnnprin tf("1prin tf("2pr

11、in tf("3prin tf("4scan f("%d",&h);getchar();/*if(0<h&&h<5)switch(h)case 1:x=10;y=10;b=10;break;/*case 2:x=15;y=15;b=40;break;/*自定义难度nn");确定游戏难度*/简单难度*/普通难度*/case 3:x=20;y=20;b=60;break;/* 困难难度*/case 4:system("cls");printf("请输入棋盘行列数(小于20且用逗号隔开

12、):");/*从键盘输入坐标*/scan f("%d,%d", &x, &y);getchar();printf("请输入雷的个数:");/*从键盘输入雷的个数*/scan f("%d",&b);getchar();break;break;elseprintf("输入错误请重新输n");while(begi n)system("cls");InitialValue_game(&g);/*棋盘初始化 */InitialMine_game(&g);/

13、*随机布雷 */print_game(&g,2);/*打印棋盘 */NO=1;while(NO)prin tf("Please choose:");scan f("%d,%d",&i,&j);getchar();if(-1<i-1 && i-1<x && -1<j-1 && j-1<y)switch(ope nm ap(&g,i-1,j-1)case 1:prin t_game(&g,1);printf(”游戏结束!按回车键再来一局n"

14、;);if(getchar()='n') begi n=1;else begi n=0;NO=0;break;case 2:if(judge_game(&g)=b)printf("win! n");prin t_game(&g,1);printf("按回车键再来一局n");/* 是否再来一局*/if(getchar()='n') beg in=1;else beg in=0;NO=0;break;else prin t_game(&g,2);NO=1;break;default:break;else

15、printf("你输入错误!请重新输入n");主控模块的各子模块说明:void InitialValue_game()用于棋盘初始化; Ini tialMi ne_game()用于棋盘的随机布雷; void prin t_game()用于打印棋盘; int judge_game() 用于判断游戏是否结束; int openmap ()用于点开地图;5.2定义全局变量#include <stdio.h>#include "stdlib.h"#i nclude"time.h"# define s 20int x;/*棋盘行数*

16、/int y;/*棋盘列数*/int b;/*选择游戏难度1简单2普通3困难4自定义*/int h;/*雷的个数*/struct Games g;struct Gamesint game_i ntss;char game_charss;使用结构体数组来完成棋盘的定义,引用时间头文件来完成对随机布雷的随时 性。5.3各个函数的分析5.3.1棋盘初始化程序:void In itialValue_game(struct Games *g) int i,j;for(i=0;i<x;i+)for(j=0;jvy;j+)(*g).game_i ntij=0;(*g).game_charij='

17、;*'5.3.2随机布雷:In itialMi ne_game(struct Games *g)int i,j, nextl, next2;int sum=0;sran d( un sig ned)time(NULL);while(1)i=ra nd()%x;j=ra nd()%y;if(*g).game_i ntij=9) con ti nue;(*g).game_i ntij=9;+sum;for(n ext1=-1; next1<2; next1+)for(n ext2=-1; next2<2; next2+)&& j+next2<y )if(

18、-1<i+next1 &&next1+i<x&& -1<j+next2if(*g).game_i nti+next1j+nex t2!=9)(*g).game_i nti+next1j+nex t2+=1;if(sum=b) break;实现雷的随机分布和各个点周围雷数的计算。srand ()随机布雷,5.3.3打印棋盘:void prin t_game(struct Games *g,i nt Logo)int i,j;int as;for(i=0;i<x;i+)ai=i+1;if(Logo=1)printf(" %d&quo

19、t;,a0);for(i=1;i<x;i+)prin tf(i<10? " %d" :" %d",ai);prin tf("nn");for(i=0;i<x;i+)if(i+1<10)prin tf("%d ",i+1);for(j=0;j<y;j+) pri ntf("%d ",(*g).game_i ntij); prin tf("n");elseprin tf("%d ",i+1);for(j=0;j<y;j+)

20、pri ntf("%d ",(*g).game_i ntij); prin tf("n");if(Logo=2)printf(" %d",a0);for(i=1;i<x;i+)prin tf(i<10? " %d" :" %d",ai);prin tf("nn");for(i=0;i<x;i+)if(i+1<10)prin tf("%d ",i+1);for(j=0;jvy;j+)pri ntf("%c ",(*

21、g).game_charij); prin tf("n");elseprin tf("%d ",i+1);for(j=0;j<y;j+)pri ntf("%c ",(*g).game_charij); prin tf("n");5.3.4判断结束,点开地图:int judge_game(struct Games *g)int sum=0;int i,j;for(i=0;i<x;i+)for(j=0;j<y;j+)if(*g).game_charij='*') sum+=1;retu

22、rn sum;int ope nm ap(struct Games *g,i nt i,i nt j)system("cls");int n extl, next2;if(*g).game_i ntij=9) return 1;elseif(*g).game_i ntij!=0)(*g).game_charij=(char)(*g).game_i ntij+48);return 2;else(*g).game_charij='0'for(n ext 1=-1; next1<2; next1+)for(n ext2=-1; next2<2; nex

23、t2+)if( -1<i+next1 &&next1+i<x && -1<j+next2 &&j+n ext2<y)if(*g).game_chari+next1j+next2='*')ope nm ap(g,i+next1,j+next2);return 2;点开地图,即实现:当输入坐标处为0,打开周围同样情况的坐标点。即实现和Windows扫雷游戏同样的功能。6.设计结果及分析运行第一步:按ENTER键进入:选择游戏难度,按ENTER键进入:游戏界面,开始从键盘输入数字,格式为(3,6),点击ENTER

24、®:游戏失败显示,并提示再来一局,程序完毕。7.设计结论本程序在刚开始调试时有许多错误,但都被一 一克服,现在在操作本程序时可根据提示进行相关操作,能正确输出结果。在刚开始的几次调试中曾经出现过不能运行、不能产生随机数字、不会正确输出结果、不能进行循环等等问题。经 同学的帮助,这些问题得到克服,并且使程序的功能也得到了一定的完善。在这次设计过程中,不仅复习课本上所学知识, 还通过查资料、问同学学到了课本 上没有的知识。从而启发我,要想写好程序,在写好课本知识的同时还需要多读 和专业有关的一些书籍,同时还需要多动脑子,尽量把所学的知识综合起来应用, 力争写出完美的程序。除此之外,我还得

25、到了一些有用的教训:写程序时必须要细心,不能输错一个字符标点,就连全角半角也得注意。在修改时要有耐心,编 译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误。8问题及心得体会问题:在本次实习过程中碰到的编译、连接的错误主要有:缺少变量定义,定义 位置不正确、语法错误、注释的位置等。错误解决方法。(1)缺少变量定义,定义位置不正确;由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错 误信息的提示下一般还是很容易找到。不过需要注意的是在定义的时候有些函 数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位 置要特别留意。为减少这样的错误我后来还是用

26、不同的变量名来表示,结果引 起的那些错误解决了(2)语法错误;大多的语法错误在通过书本参考下能够修改。主要是平时缺乏锻炼、不太 注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号 的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将 文件先打开,对打开的方式(3)注释的位置;程序设计中在注释的时候不能同我们平常写字一样随心所欲,我们应该注 意注释的格式。注释中不能含有 c语言可执行的语句!心得体会课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这 次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态, 和实际设计 的结合锻炼了

27、我的综合运用所学的基础知识,解决实际问题的能力,同时也提高 我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控, 对局部的取舍,以及对细节的斟酌处理, 都使我的能力得到了锻炼,经验得到了 丰富。这是我们都希望看到的也正是我们进行课程设计的目的所在。虽然设计内容繁多,过程繁琐但我的收获却更加丰富。各种组件的运用,各 种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌 握的。和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识 也对自己提出了新的要求。提高是有限的但提高也是全面的, 正是这一次设计让我积累了许多实际经验, 也必然会让我在未来的工作学

28、习中表现出更高的应变能力和理解力。顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方, 学习其实就是一个不断完善的过程, 正视自己的不足之处,在以后的工作和学习 中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善 自己。9.对本设计过程及方法、手段的改进建议我们认为此程序太过简单,应该更进一步把扫雷界面输出为图型图案。也即是能够使用方块,然后调用graphics.h库函数rectangle(x,y,xx,yy)画一格矩形,setfillstyle(SOLID_FILL,color)设置填充方式,floodfill(x+1,y+1,WHITE)填充方块。让方块看

29、起来有立体感,将矩形上方和左方的边线设为白色,下方和右方的边线设为黑色。使扫雷界面更加美观。再此基础上增加标记地雷的功能, 比如说使用小红旗,使玩家能够跳过地雷。如果可以的话,可以考虑使用鼠标来控制点击位置,如果更好的话可以加入声音,比如没有点到雷的开心的声音,点到雷后的倒霉声。通过老师的指导,这个软件的设计要更趋于人性化,也即是加入提示输入格式,以解决输入格式错误问题,而不是直接结束,重启。10.参考文献郭翠英主编的c语言课程设计实例精编; 张芳妮 吕波 译C语言编程常见问题解答; 谭浩强C程序设计题解与上机指导(第二版)。伍俊良.VB课程设计与系统开发案例M.北京附:源程序代码:s#i n

30、clude <stdio.h>#include "stdlib.h"# in elude "time.h"# define s 20int x;/*棋盘行数*/int y;/*棋盘列数*/int b;/*选择游戏难度1简单2普通3困难4自定义*/int h;/*雷的个数*/struct Games g;struct Gamesint gamentss;char game_charss;void In itialValue_game(struct Games *g)/*棋盘初始化*/int i,j;for(i=0;i<x;i+)for(j

31、=0;jvy;j+)(*g).game_i ntij=0;(*g).game_charij=#;In itialMi ne_game(struct Games *g)/*随机布雷*/int i,j, nextl, next2;int sum=O;sran d( un sig ned)time(NULL);while(1)i=ra nd()%x;j=ra nd()%y;if(*g).game_i ntij=9) continue;(*g).game_i ntij=9;+sum;for(n ext1=-1; next1<2; next1+)for(n ext2=-1; next2<2;

32、 next2+)if( -1<i+next1 && next1+i<x&& -1<j+next2 && j+n ext2<y )if(*g).game_i nti+next1j+next2!=9)(*g).game_i nti+next1j+next2+=1;if(sum=b) break;void prin t_game(struct Games *g,i nt Logo)/*打印棋盘*/int i,j;int as;for(i=0;i<x;i+)ai=i+1;if(Logo=1)printf(" %d&

33、quot;,aO);for(i=1;i<x;i+)prin tf(i<10? "%d" :" %d",ai);prin tf("nn");for(i=0;i<x;i+)if(i+1<10)prin tf("%d",i+1);for(j=0;j<y;j+) pri ntf("%d",(*g).game_i ntij);prin tf("n");elseprin tf("%d ",i+1);for(j=0;j<y;j+) p

34、ri ntf("%d",(*g).game_i ntij);prin tf("n");if(Logo=2)printf(" %d",a0);for(i=1;i<x;i+)prin tf(i<10? "%d" : " %d",ai);prin tf("nn");for(i=0;i<x;i+)if(i+1<10)prin tf("%d",i+1);for(j=0;jvy;j+)pri ntf("%c ",(*g).g

35、ame_charij); prin tf("n");elseprin tf("%d ",i+1);for(j=0;j<y;j+)pri ntf("%c ",(*g).game_charij); prin tf("n");int judge_game(struct Games *g)/*判断游戏是否结束*/int sum=0;int i,j;for(i=0;i<x;i+)for(j=0;j<y;j+)if(*g).game_charij='#') sum+=1;return sum;

36、int ope nm ap(struct Games *g,i nt i,i nt j)/*点开地图 */system("cls");int n ext1, next2;if(*g).game_i ntij=9) return 1;elseif(*g).game_i ntij!=0)(*g).game_charij=(char)(*g).game_i ntij+48);return 2;else(*g).game_charij='0'for(n ext1=-1; next1<2; next1+)for(n ext2=-1; next2<2; ne

37、xt2+)if( -1<i+next1 && next1+i<x && -1<j+next2 && j+n ext2<y)if(*g).game_chari+next1j+next2='#')ope nm ap(g,i+next1,j+next2);return 2;mai n()int i,j;int NO;int begi n=1;int h;while(beg in)printf ( "nnnnnnnnttt=nn""ttt|欢迎进入扫雷|nnn""ttt|按回车键继续|nn""ttt=nnnn");getchar();system("cls");printf(” nnnnnnnnn请选择游戏难度:nn");prin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论