《综合程序练习题.ppt》由会员分享,可在线阅读,更多相关《综合程序练习题.ppt(66页珍藏版)》请在三一办公上搜索。
1、第5章 综合程序练习题,第5章 综合程序练习题,大型程序设计的要求,题目要求:每道题都给出了问题的描述、基本要求、高级要求、难点分析、主要数据结构及主要算法提示等,以便供大家选择练习。其中“基本要求”和“高级功能”是两个不同层次的功能要求。,第5章 综合程序练习题,大型程序设计的要求9个大型程序设计题目分析,第5章 综合程序练习题,大型程序设计题目分析:1 打字练习2 电子琴3 简易画图板4 贪吃蛇5 五子棋6 搬运工7 大富翁8 赛车9 坦克大战,1问题描述2基本功能3高级功能4难点分析5程序总体结构6主要数据结构提示7主要算法提示,第5章 综合程序练习题打字练习,1:问题描述 打字练习是一
2、个非常有用的小程序,电脑初学者可以借助它来熟悉键位,新手可以利用它来提高打字速度。2:基本功能 键位练习、单词练习、文本练习3:高级功能 增加音效、暂停功能、继续上次未完成的练习,第5章 综合程序练习题打字练习,难点分析,1)虚拟键盘由于有很多按键所以绘制时会比较繁琐。至于如何反像显示一个按键,我们会在在算法提示部分给出。2)键位练习部分由于有些键是没有对应的ASCII码的,所以我们无法使用ASCII码来识别用户的按键,应当使用键盘码来识别它。函数bioskey可以获得按键的键盘码。,第5章 综合程序练习题打字练习,设计及实现要点,打字练习程序的总体结构,第5章 综合程序练习题打字练习,主要数
3、据结构分析(一),1)struc rect结构代表屏幕上的一个矩形区域。它的结构如下:,struct rect int left,top;/*矩形左上角的坐标值*/int right,bottom;/*矩形右下角的坐标值*/,第5章 综合程序练习题打字练习,主要数据结构分析(二),2)在键位练习的部分,由于要经常对虚拟键盘上的某个键进行绘制,为了绘制时的方便我们可以使用一个结构来表示虚拟键盘上的每个按键。,struct key struct rect keyRect;int keyNum;char keyName10;;,keyRect就代表了按键在屏幕上占据的一个矩形区域。keyNum是按键
4、的键盘码。keyName是按键的名称,绘制时显示在按键上。,第5章 综合程序练习题打字练习,主要数据结构分析(三),3)使用struct key keyArrayMAXKEY数组来保存所有要绘 制的按键,struct key keyArrayMAXKEY;,第5章 综合程序练习题打字练习,主要算法提示,1)随机产生按键:通过产生一个随机数作为索引值访问keyArray数组,来随机产生需要用户输入的按键。然后将对应的按键反像显示。2)反像显示一个按键:假设 R1是我们要反像显示的按键在屏幕上占据的一个矩形区域。(注:R1是一个struct rect结构的对象,R1的值可以从keyArray数组中
5、获得。3)getimage的作用是将一个矩形区域的图像复制到buff中,而putimage的作用是将buff中的图像输出到屏幕中的某个位置。而参数NOT_PUT的作用是告诉putimage在输出时将图像反像显示。,第5章 综合程序练习题电子琴,1:问题描述 设计一个键盘电子琴,通过键盘输入来模拟敲击琴键,并发出对应的琴声,使用户能在PC机上弹奏电子琴。现要求利用Turbo C 2.0来实现该游戏。2:基本功能图形界面显示。界面分三部分,背景色为蓝色。菜单功能电子琴。系统分3种模式:实时模式、播放模式、编辑模式。3:高级功能 界面显示波形图、菜单帮助快捷键、鼠标功能,第5章 综合程序练习题电子琴
6、,难点分析,1)曲目文件的格式设计。业界广泛采用midi文件,但程序员新接触时,需要了解它的格式等技术,解码、编码也都存在难度。可自行设计一种格式,记录键盘按键及时间间隔。这样编码和解码都很简单。2)图形描绘。这是本程序最主要的工作。在考虑如何设计出一个美观的图形时,好要考虑其它很多方面:背景色、菜单颜色、菜单大小、琴键颜色、琴键的形状、显示琴键被按下、显示波形图等。3)响应鼠标事件。在DOS环境下响应鼠标操作比较有难度。,第5章 综合程序练习题电子琴,设计及实现要点,电子琴程序的总体结构,第5章 综合程序练习题电子琴,主要数据结构分析(一),/*系统状态*/enum sytem_status
7、 system_status_normal,system_status_paused,/*系统模式*/enum sytem_modul system_modul_intime,system_status_play,system_status_edit,/*定义颜色枚举*/typedef enum colorint blue,int red,.COLOR;,定义系统常量,第5章 综合程序练习题电子琴,主要数据结构分析(二),#define menu_item_height/*菜单项的高度*/#define menu_item_width/*菜单项的宽度*/#define menu_item_co
8、lor/*菜单项的颜色*/#define menu_group_distance/*菜单组间间隔*/,typedef struct ctrlKeychar*name;int firstkey;int secondkey;CTRL_KEY;,2)菜单的一些常量定义,3)定义控制键。一般是ctrl/alt和另外一个键的组合,第5章 综合程序练习题电子琴,主要数据结构分析(三),typedef struct menu_item_nodechar*name;CTRL_KEY hotkey;menu_item_node*next;MENU_ITEM;#define menu_item_list MENU
9、_ITEM,typedef struct menu_groupchar*name;CTRL_KEY hotkey;menu_item_list itemList;/*文件菜单组下有几个菜单项*/MENU_GROUP;,4)一个菜单项,5)定义菜单组,第5章 综合程序练习题电子琴,主要数据结构分析(四),typedef struct rectangle POSITION up_start,/上方的起始位置POSITION up_end,/上方的结束位置POSITION down_start,/下方的起始位置POSITION down_start/下方的结束位置 RECTANGLE;,typede
10、f struct coordinateint x;int y;POSITION;,6)定义某个点的坐标,7)定义一个形状的四个位置,注意边线均为直线,第5章 综合程序练习题电子琴,主要数据结构分析(五),typedef struct key_record int keynum,int timeintervalKEY_RECORD;,typedef struct graghRECTANGLE shape,COLOR frameColor,COLOR fillColorGRAGH;,8)定义一个图形,包括形状、边框色、填充色,9)定义一个击键记录,第5章 综合程序练习题电子琴,主要数据结构分析(六
11、),typedef struct configCOLOR background,COLOR hightlight,CONFIG;,typedef struct key_record_list_nodeKEY_RECORD key,key_record_list_node*nextLIST_NODE;,10)记录所有击键,11)记录配置信息,包括背景色、高亮色、菜单项的长宽等、键盘对应图的位置、波形图的文职、曲目列表的位置、菜单组信息等,自行补充:,第5章 综合程序练习题电子琴,主要算法提示,参考以下几个主要函数的定义:初始化函数:初始化全局配置信息int initConfig(CONFIG*p
12、Config);描绘界面:此函数可在初始化界面时用,也可在用户设置了选项后重新描绘界面时调用int paintFrame(CONFIG*pConfig);画一个图形int paintShape(GRAGH*pShape);在指定位置打一个指定大小的字int paintChar(GRAGH*pShape,char*name);一些大的处理函数,如处理新建文件,自行补充int onNewOpen();,第5章 综合程序练习题简易画图板,1:问题描述 简易画图板是一个简单的绘图工具,它提供了一些基本的画图功能。界面由工具栏、调色板和绘图区组成。2:基本功能绘制直线、矩形、椭圆、圆、橡皮擦、填充3:高
13、级功能支持对选定图像中的一个矩形区可以将绘制的图案保存为16色的BMP文件。可以打开一幅16色的BMP图片进行修改。,第5章 综合程序练习题简易画图板,难点分析,1)填充功能。虽然Tc图形库中有填充函数floodfill,但是这个填充函数不符合我们的要求。因为这个填充函数在调用时除了要指定填充区域中的一点,还需要指定要填充的区域边界的颜色,获取图像边界颜色的操作对于用户来说是比较麻烦的。此外,我们希望填充区域的边界可以是不同颜色的。所以,需要设计自己的填充函数。2)BMP文件的打开和保存。必须了解BMP文件的结构,以知道如何从文件中读出需要的数据以及如何将数据保存到bmp文件中。,第5章 综合
14、程序练习题简易画图板,设计及实现要点,简易画图板程序的总体结构,第5章 综合程序练习题简易画图板,主要算法提示,首先由用户指定填充区域中的任一点,以该点作为种子点,然后分别向上下左右四个方向检查该点的相邻点。如果这些点和种子点的颜色相同,则填充它,否则,就视为边界点。然后再以那些检测到的非边界点作为种子点,以同样的方式检查它们的相邻点。这样不断的检测、填充就可以将区域填充满。推荐使用队列来实现一个非递归的算法。非递归的填充算法:a、将第一个种子点放入队列b、当队列非空 b1、从队列中取出一点 b2、将该点置为填充色 b3、分别检查上下左右四点,如果是非边界点则将其放入队列中c、算法结束,第5章
15、 综合程序练习题贪吃蛇,1:问题描述 贪吃蛇游戏是一个深受人们喜欢的游戏:一条蛇在密闭的围墙内,在围墙内随机出现食物,通过按键控制蛇向上下左右四个方向移动,蛇撞到食物,则食物被吃掉,蛇的身体增加一节。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体)游戏结束。现要求利用Turbo C 2.0来实现该游戏。2:基本功能提供图形界面、键盘控制游戏、计分机制、结束判断3:高级功能暂停功能:能随时通过按键来暂停游戏,再按一次则继续游戏。速度调节功能奖励机制音效功能,第5章 综合程序练习题贪吃蛇,难点分析,1)表示蛇的图形以及蛇的移动。2)检测蛇有无撞到食物、围墙或是自己的身体。3)食物的随机
16、产生。4)蛇的移动速度调节。5)奖励食物的定时机制。,第5章 综合程序练习题贪吃蛇,设计及实现要点,贪吃蛇程序的总体结构,第5章 综合程序练习题贪吃蛇,主要数据结构提示(一),char GameBoard ROWCOL;/*游戏板所有单元的坐标*/,enum UnitStateFREE,BOARDER,SNAKE,FOOD,BONUS;,enum DirectionLEFT,RIGHT,UP,DOWN;,游戏场景用一个二维数组表示,2)游戏场景内各单元的状态用枚举类型来表示,3)移动方向利用枚举类型来表示,第5章 综合程序练习题贪吃蛇,主要数据结构提示(二),struct Food int x
17、;int y;int die;/*食物是否已经被吃*/int isBonus;/*是否为奖励食物*/;,struct SnakeNode int x;int y;struct SnakeNode*pre;struct SnakeNode*next;,4)利用结构体来表示蛇身体的一节,最后用循环链表来表示整条蛇,5)食物(包括奖励食物)用结构体来表示,第5章 综合程序练习题贪吃蛇,主要算法提示,碰撞检测模块:蛇移动模块:在程序中定义循环链表来表示蛇,并记录蛇头指针以及蛇尾指针、当前移动方向。若有方向按键信息:a1.按键方向跟当前方向相同或是相反,则不做处理;a2.否则将当前方向设置为新的方向;按
18、当前方向得到蛇头的下一位置;对该位置进行碰撞检测,判断该位置是什么状态c1.若是蛇身和墙壁,跳到步骤e;c2.若是空白,则将蛇尾设为蛇头,将倒数第二节设为蛇尾,更新蛇头的位置为当前的新位置。界面上就把当前最新位置用蛇的颜色画上,并把原蛇尾用背景色擦除。c3.若是食物,则新增加当前位置做为蛇头,蛇尾不变。利用记分模块更新分数。并再重新随机产生食物。返回a做循环;游戏结束,第5章 综合程序练习题五子棋,1:问题描述五子棋基本规则:棋盘上形成横向、竖向、斜向的连续的相同颜色的五个棋子称为“五连”。黑白双方先在棋盘上形成五连的一方为胜。若对局双方均认为不可能形成五连或是剩余棋盘空间已不足以形成五连则为
19、和棋。下棋过程中不考虑各种禁手规则。2:基本功能提供图形界面、键盘操作、人人对战、支持某方先下、棋盘15*15,显示网格线,黑白棋子、当前光标所在;显示当前执棋方3:高级功能支持人机对战,显示人机对子情况和胜负判别 悔棋功能音效功能,第5章 综合程序练习题五子棋,难点分析,1)胜负判别 2)悔棋功能 3)人机对战的人工智能部分 五子棋的人机对战是一个典型的博弈问题。博弈问题一般可用极大-极小法和-法求解(读者可找相关资料,一般人工智能或博弈论教材中会涉及这些内容)。而即便是用-法,五子棋的搜索空间还是相当庞大。,第5章 综合程序练习题五子棋,设计及实现要点,五子棋程序的总体结构,第5章 综合程
20、序练习题五子棋,主要数据结构提示(一),1)棋盘用15*15的二维数组表示,数组的每一个元素对应棋盘上的一个交叉点,用0表示空位、1代表玩家1的子、2代表玩家2的子:,char ChessBoard1515;,第5章 综合程序练习题五子棋,主要数据结构提示(二),2)用于搜索过程的结构体:,typedef struct five_chess*point;struct five_chess int x;int y;int layer;int value;int score;int chessLENGTHLENGTH;int recordLENGTHLENGTH;,其中,x,y表示在某个位置上扩展
21、出来的新节点,layer是表示第几层扩展,用于控制扩展深度。value表示该点上极大极小值,score表示叶子节点的得分,用于推算父辈节点的value,chess这个二维数组表示扩展出来的棋盘信息,record记录在x、y点上扩展过的节点,如果没有扩展record中对应某个值为0。如果record中没有可以扩展的节点,那么该层扩展结束,返回一个特定值。,第5章 综合程序练习题五子棋,主要算法提示(一),对棋盘的评分算法。评估一个棋盘的分数,主要通过扫描整个棋盘,对每个点评分。对某个点上评分从四个方向(角度分别为0、45、90、135的四个方向)分别统计,进而累积该点总分,最后得到整个棋盘的分数
22、。实际上对当前的局面按照下面规则的顺序进行比较,如果满足某一条规则的话,就给该局面打分并保存,然后退出规则的匹配。注意这里的规则是根据一般的下棋规律的一个总结,在实际运行的时候,可以添加规则和对评分机制加以修正。,第5章 综合程序练习题五子棋,主要算法提示(二),人工智能部分的搜索算法流程如下(以扩展两层为例):根据棋盘信息chessman1515建立根结点s0(数据结构:five_chesman),并把s0压入堆栈中扩展s1=top();判断s1-layer是否等于1s1-layer等于1,push(s1),扩展s2=top(),查看s2-layer是否1s2-layer!=-1,计算此时棋
23、盘得分score,并判断是否要更改上一层的极小值s2-layer=-1,pop():判断是否更改极大值,max_chess指向得分最高的棋盘如果s1-layer=-1,表示搜索结束,返回最大棋盘信息max_chess,第5章 综合程序练习题搬运工,1:问题描述 在一个四周有围墙的仓库的中,堆放着若干箱子、阻挡箱子前进的障碍物,以及标识出了箱子需要被推到的目标位置。游戏者通过观查分析,找到合适的策略,然后只能用推的方法把所有散落在场地中的箱子借助于空闲区间推到目标位置,即获得胜利;否则失败2:基本功能场地元素定义与设计、箱子的搬运动作、提供一定数量的按键功能实现游戏者对搬运工的多种操作 3:高级
24、功能提供多套场地 提供视听效果智能识别游戏的终止自动完成移动,第5章 综合程序练习题搬运工,难点分析,墙壁,箱子,x,y,死角判定:这里举一个例子,如下图所示:,死角判定,第5章 综合程序练习题搬运工,设计及实现要点,搬运工程序的总体结构,第5章 综合程序练习题搬运工,主要数据结构提示,系统的组成元素主要包含外围墙壁、内部障碍物、箱子、搬运工。我们先建立一个虚拟的元素(不妨称之为容器),它用来将整个图形界面网格化,并记录各种图形元素的位置等属性。然后,再为各个图形元素建立相应的保存其特有信息的数据结构。先定义两个基本结构,在后面也会用到:,typedef struct tagRect/*矩形*
25、/Point leftTop,rightButton;/*矩形左上定点和右下定点*/Rect;,typedef struct tagPoint/*直角坐标系点*/int x,y;Point;,第5章 综合程序练习题搬运工,主要数据结构提示,1)虚拟的容器结构体:typedef struct tagContainerRect cRect;/*确定整个容器在屏幕上的坐标*/int cBoardNM;/*N、M是事先设定的网格行数和列数*/Container;其中数组cBoard其取值代表各网格是何种图形元素:箱子、空格、障碍、目标位置,其它必要属性,可自行酌情添加。,第5章 综合程序练习题搬运工,
26、主要数据结构提示,2)搬运工和箱子的结构体:由于墙壁、障碍物和箱子的目标位置都是固定不变的,它们的图形可以在初始化时一次性完成,而其位置则可保存在上面的Container中,下面是搬运工和箱子的结构体:typedef struct tagObjectchar*oImage;/*指向图像缓冲区的指针*/size_t oImageSize;/*stddef.h中size_t 定义为unsigned,这里表示图像大小*/Point oLocation;/*记录对象在网格中的坐标*/Object;,第5章 综合程序练习题搬运工,主要算法提示,1)搬运工游戏的图形界面中除了搬运工和箱子,都是固定元素,因
27、此可以将整个场地网格化,对整个图形界面的管理简化为对各个网格的管理即可。2)对于搬运工和箱子的移动效果,可以直接在一个页面上(即无需使用换页机制)操作。3)对于智能识别和自动移动功能,只要根据网格的状态属性(即当前各网格是何种物体)加以处理即可。,第5章 综合程序练习题大富翁,1:问题描述本游戏基于双人游戏模式的简单版本。游戏在一个由城市、道路、及其他特殊建筑组成的地图上进行,游戏双方通过掷骰子获得的前进或后退步数不断地前进或后退,当落在可以购买空地的位置时,如果现金足够则可选择购买之;当落在自己已买下地产的位置时,如现金足够则可选择建设之;当落在对手地产的位置上时,则要支付相应的罚金;落在地
28、图中某些特殊位置还会有特殊的惩罚或奖励。最后当一方现金为零时游戏结束,现金为零的一方失败,另一方获,现金为零的一方失败,另一方获胜。2:基本功能游戏的环境地图构建、游戏状态显示、游戏阶段的输入只包含掷骰子及确定相关选项 3:高级功能提供更多的特殊地区,如旅馆、监狱、股票交易中心、银行,并为之设计相应的活动规则。在特殊位置提供更多的活动内容,如获得几轮之内不用交罚款、可以夺取他人地产等特权。提供游戏进度保存功能,第5章 综合程序练习题大富翁,难点分析,本游戏的难点主要集中在图形处理和数据处理的简化设计上。数据处理设计将在数据结构中提示,下面先提供一个简化图形处理的方案。由于实际活动的图形元素只有
29、游戏者代表人物,其移动只取决于当前位置和下一个位置。所以,实际编程时只需要把游戏中各个位置的坐标从初始位置开始,按实际到达顺序用一线性表来管理。每走一步就将线性表的指针后移一位,就可取得下一个城市的位置。当指针越过最后一位时,重新指到初始位置,进入下一轮循环。,第5章 综合程序练习题大富翁,设计及实现要点,大富翁程序的总体结构,第5章 综合程序练习题大富翁,主要数据结构提示(一),typedef struct tagCity Point cCenter;/*记录人物进入城市时,其图像左上角对应在当前图 形模式坐标系中的坐标*/int cSpecialEvent;/*该城市的特殊地区、特殊位置;
30、为了处理方便,可自行定义一组描述这些地区和位置的宏定义*/City;,1)城市和特殊地区的结构体:,前面提及的那个线性表就可以由City作为元素构成,这样只要在初始化时画出整个地图,然后将每个城市的City结构按“难点分析”中所说方法保存下来即可。,第5章 综合程序练习题大富翁,主要数据结构提示(二),2)人物的结构体:,typedef struct tagPeoplechar*pImage;/*指向人物图像缓冲区的指针*/char*pBackgroundImage;/*指向被人物图像覆盖的图像缓 冲区的指针*/size_t pImageSize;/*图像大小*/Point pCoordina
31、te;/*人物图像左上角坐标*/int pCash;/*记录该人物的剩余现金*/int pStatus;/*标示该人物的状态,即是处于可移动还是在医院状态中,当pStatus为0时可移动,正值表示住院,负值表示原地停留;绝对值为还需停留的天数*/People;,状态栏和消息栏的管理比较简单,只需要随游戏进行更新相关信息就可以了。,第5章 综合程序练习题大富翁,主要算法提示,通过位图在屏幕上显示出一个基本的环境地图、游戏双方的人物形象、状态栏和消息栏。注意:由于画面比较复杂,最好是调用位图或已转换成其它图像格式的文件,否则单独绘制一个地图就会有较大的工作量。同时应记录下各图形元素的位置,以供数据
32、处理模块使用。开始后轮流为每位游戏者提供一个前进的步数,游戏者到达一个地方后,系统根据游戏规则,做出相应的判定并调整其持有的现金数量。,第5章 综合程序练习题赛车,1:问题描述这里所讲的赛车是基于平面第三视角的,即在一个平面的跑道上,由游戏者操控一辆赛车,与电脑控制的多台赛车比赛。游戏者能对赛车的操作有:向左、向右、加速、减速、停车。比赛中如果游戏者的赛车与别的赛车相撞,则其速度均减为最小,游戏者必须重新开始加速。游戏者如果第一个到达终点,则获胜,否则失败。本游戏的动画处理较为复杂,要求能够显示出各赛车前进的动态效果,以及一定的视听功能。2:基本功能游戏环境、键盘控制赛车、视听效果、游戏控制、
33、动画效果显示3:高级功能高级视听效果 提供两人对阵游戏模式提供不同的游戏关卡,不同关卡的赛车数目和速度都可选择。,第5章 综合程序练习题赛车,难点分析,动画效果显示刷新赛车位置时,先画出游戏者赛车,然后计算出其他赛车相对游戏者赛车的位置,如果在屏幕范围内则画出,否则不画。注意,相对位置只应计算在屏幕上的垂直高度,水平位置应保留在各赛车的结构体中。为了方便作图,跑道最好使用同一种颜色,将赛车图像四周用这种颜色围上一圈,如宽度为两个像素点,这样每次移动两个像素点距离后的显示刷新只需直接对赛车图像进行一次putimage函数操作即可。用这方法可以避免图像闪烁现象。当然,更复杂的避免闪烁的方法是使用页
34、交替法。不过使用页交替法时仍应尽量减少作图以使画面显示流畅。,第5章 综合程序练习题赛车,设计及实现要点,赛车程序的总体结构,第5章 综合程序练习题赛车,主要数据结构提示(一),typedef struct tagContainer/*赛车场的容器,描述固定元素的位置*/Rect cRacingGround;/*赛车区域矩形*/Rect cAutodrome;/*赛车跑道矩形区*/Rect cColorStrip;/*跑道两旁的色道矩形区*/Container;,1)赛车场的容器结构体:描述固定元素的位置,typedef struct tagColorStripeunsigned csColo
35、rN;/*N是事先设定的色道条数,该表记录各色道颜色*/int csStripeOff;/*显示的最上面一条色道在csColor中的下标*/ColorStripe;,2)色道结构体:,第5章 综合程序练习题赛车,主要数据结构提示(二),typedef struct tagRacingCarchar*rcImage;/*指向赛车图像*/size_t rcImageSize;/*赛车图像大小*/unsigned rcSpeed;/*赛车速度*/unsigned rcDisplacement;/*相对原点位移*/unsigned rcVertical;/*水平位置*/Point rcAbosolut
36、eCoordiante;/*相对出发点的绝对距离即竖直位置*/int rcFlag;/*标识赛车身份*/RacingCar;,3)赛车结构体:,注意,rcAbosoluteCoordinate最好只是游戏赛车使用,其它赛车的位置根据前面 提到的方法来计算出其各自位置,这样可以简化数据处理过程。,第5章 综合程序练习题赛车,主要算法提示,为了数据处理的方便,采用直道作为赛车道,并以初始点作为原点。为了表现出赛车前进的效果,可以在车道两旁加上横向的颜色不同、相间排列的色道,然后将色道作周期性循环下移显示就可以实现动画效果。游戏中,始终保持游戏者赛车在屏幕上的垂直位置不变,这样,就可以将游戏者的赛车
37、作为其他物体的参照,方便各辆赛车座标位置的换算。车道两旁的色道后移速度即为游戏者赛车的前进速度。其它赛车始终保持同一速度,并保存其各自的相对原点的距离,根据游戏者赛车相对原点距离就可算出其他赛车在当前屏幕中的位置。,第5章 综合程序练习题坦克大战,1:问题描述游戏者操控一到两台坦克,抵抗电脑控制的多台坦克,保卫金鹰(特指一个游戏者需要保护的物体);双方通过火炮攻击对方,坦克被炮弹击中即被摧毁;对战双方如果还有在屏幕上活动的可用坦克,则在有坦克被摧毁后才能补充上来。游戏者坦克被全部摧毁或金鹰被摧毁则电脑方获胜,若电脑坦克被全部摧毁则游戏者获胜。2:基本功能游戏场景、游戏者控制的和电脑控制的坦克的
38、运动状况、游戏状态判别胜负、提供足够的按键实现游戏者对坦克的控制 3:高级功能视听效果鼠标控制电脑坦克智能化,第5章 综合程序练习题坦克大战,难点分析,本游戏难点主要集中在对坦克自动化控制的算法上。对于向固定目标前进的算法,可以先对N*M的网格做一次宽度优先搜索(BFS),算法中注意判重,避免消耗过多的搜索时间,这样可以在较短的时间内找出一条最短路径。由于游戏者坦克运动不确定性太高,为电脑坦克搜索一条正确的攻击游戏者坦克的路径难度较高。,第5章 综合程序练习题坦克大战,设计及实现要点,坦克大战程序的总体结构,第5章 综合程序练习题坦克大战,主要数据结构提示(一),typedef struct
39、tagContainerRect cRect;/*游戏框矩形区*/unsigned cBorderColor;/*游戏框边界颜色*/unsigned cBackgroundColor;/*游戏框背景颜色*/int cBoardNM;/*N,M是事先定义的游戏框网格数*/*cBoard主要记录各网格是何种元素,作为坦克前进的依据*/Container;,1)游戏框的结构体:,像前面讲述一样,固定的图形元素可以在初始化时一次性完成,其位置记录 在Container中即可。,第5章 综合程序练习题坦克大战,主要数据结构提示(二),typedef struct tagTankchar*tImage;/
40、*指向坦克图像缓冲区的指针*/size_t tImageSize;/*坦克图像大小*/Point tLocation;/*坦克在网格中的坐标*/char tDirctionOffMAX_STEP;/*坦克方向偏移数组,用以确定坦克路径,具体值自己确定*/char tFlag;/*标识坦克身份*/Tank;,2)坦克结构体:,另外,金鹰也可使用这一结构,只需用tFlag加以区别即可。,第5章 综合程序练习题坦克大战,主要数据结构提示(三),typedef struct tagStatusBoxRect sbRect;/*对话框矩形区*/char*sbTitle;/*对话框名*/char*sbSt
41、atusText;/*消息状态文本*/unsigned sbBackgroundColor;/*对话框背景色*/unsigned sbBorderColor;/*对话框边界颜色*/StatusBox;,3)基本对话框结构体(每个对话框只包含一类信息,这主要是为了从可扩展性考虑。同时,如果发现前期设计有疏漏,也便于更改):,如果对话框不多,可分别管理,如果较多,可以设计一个像游戏框(Container)那样的结构体来进行统一管理。,第5章 综合程序练习题坦克大战,主要算法提示,对于坦克大战中的固定元素和对话框等只改动消息栏文本的元素,可在初始化时统一输出到屏幕上,以后根据需要改变对话框的消息文本。对可摧毁障碍的管理,使用一个统一的过程,当某个单位网格状态改变时,调用该过程即可。坦克的管理较为复杂,不过对于其移动,也可使用一个统一的过程来管理,这个过程只接收当前位置和下一步的偏移。,第5章 综合程序练习题总结,通过以上大型程序的设计练习,可运用前几章讲述的高级程序设计思想和方法,使自己对复杂、综合性程序设计有一个全面的领会和把握,提高自身的设计能力。另外,也希望能充分发挥自我能动性,在大型程序的内容分解、算法设计、人机界面、执行效率等方面进行较深入的创新性思考与个性化设计。,