基于嵌入式的贪食蛇的设计和实现文档格式.docx

上传人:b****5 文档编号:19146639 上传时间:2023-01-04 格式:DOCX 页数:13 大小:71.29KB
下载 相关 举报
基于嵌入式的贪食蛇的设计和实现文档格式.docx_第1页
第1页 / 共13页
基于嵌入式的贪食蛇的设计和实现文档格式.docx_第2页
第2页 / 共13页
基于嵌入式的贪食蛇的设计和实现文档格式.docx_第3页
第3页 / 共13页
基于嵌入式的贪食蛇的设计和实现文档格式.docx_第4页
第4页 / 共13页
基于嵌入式的贪食蛇的设计和实现文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于嵌入式的贪食蛇的设计和实现文档格式.docx

《基于嵌入式的贪食蛇的设计和实现文档格式.docx》由会员分享,可在线阅读,更多相关《基于嵌入式的贪食蛇的设计和实现文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

基于嵌入式的贪食蛇的设计和实现文档格式.docx

随着计算机技术的快速发展,嵌入式技术也相应的取得了突破性的进展,嵌入式设备正日益渗透到人们的日常生活中,默默地为我们提供连接和服务,嵌入式设备往往是一个资源有限的系统,它们追求的是在有限的价格上满足一定的功能性要求。

通常它们采用那些功能并不强大的CPU,这也是开发者不得不尽可能地压缩嵌入式系统性能的原因。

最初的嵌入式设备是单一用途的,它们拥有各自独特的显示方式和用户界面,而今天它们变成了类似PC系统。

它们可以运行很多相同的应用程序。

针对嵌入式资源的限制,如何将对资源有很大依赖性的大规模的计算,成功的移植到嵌入式系统中,并能使其达到类似与在PC上计算的效果。

针对此问题,必须对原适用于PC上的游戏引擎做出修改,才能使其在嵌入式系统中成功的运行。

因此需要在特定的环境下开发相应的游戏,这样才能在以后下载到相应的板子上进行效果演示。

目前嵌入式行业在中国得到了有效发展,但是规模相应的还与国际上有很大的差距,因此,为了能够让大家对基于嵌入式wince开发游戏得到有效的理解,本论文以贪吃蛇游戏为详细的例子,完整的阐述了嵌入式游戏的开发流程,以及演示结果,还有中间特别要注重的难点疑点的解析。

本文对具体的开发流程都做了很详细的阐述,从编码到仿真,然后在定制系统内核,最后进行应用程序的下载,完成贪吃蛇游戏的具体效果演示,论文的后续都做了相当详细的解释。

1系统概要设计

系统的整体结构

系统的定制

首先所需winCE系统内核的定制,通过来定制自己所需要的系统内核,根据自己程序设计时所用到的win32程序的接口,以及用到的库函数,类库,各种所需要的驱动,例如USB驱动,屏幕显示驱动,鼠标驱动,键盘驱动等,来定制自己所需要的系统内核,系统不必过于繁琐,达到自己所需要的功能即可,因为我们所强调的是嵌入式,嵌入式是以方便为前提的,定制的系统是以简洁方便为目的的,具体的定制细节我们在第四章将会详细介绍。

程序的编写

程序的名称是《贪吃蛇游戏》,采用的是VC++语言,MFC微软基础类库环境的单文档窗体。

程序的大体思想是:

采用一个二维数组(这里我们采用的是24*24的整形数组)作为贪吃蛇游戏的背景地图,数组的每个值代表地图上每个小矩形,而每个小矩形连续组成贪吃蛇的蛇身,在程序初始化窗体时候调用这个函数,刷新出程序的背景地图;

程序贪吃蛇的蛇身用一个Cpoint类的一位连续数组,Cpoint类是一个结构体类型,结构体类型里包含着两个整形参数x和y代表的是屏幕窗体上的某一个对应的点的坐标,我们在得知点的坐标的同时,就明确了对应二维数组地图上的某个矩形区域的坐标值,这样用Cpoint类的一位数组我们可以存放蛇身的每个节点的坐标,于此同时,我们在程序snake类里面设定蛇头和蛇尾的坐标变量、蛇身长度的坐标变量,这样在程序调用Timer()系统函数定时刷新时,每次刷新只需要改变蛇头和蛇尾的坐标即可,每次刷新时,根据舍身前进方向判断下一个头节点的坐标值,然后添加到Cpoint类定义的蛇身节点,而蛇尾节点坐标值是前一个状态的倒数第二个节点,然后调用库函数FillSolildRect()函数刷新头节点为蛇的自身颜色,而尾节点是地图背景颜色,这样我们在外观看起来就是蛇身前进的效果。

那么,我们怎么判断蛇头前进的方向呢?

这个问题的解决方式是,在定义snake类的同时,定义了一个私有变量Direction为蛇动态前进的方向,而每次Timer()刷新时,动态的根据键盘响应函数来判断前进方向,并同时给Direction赋值,这样每次刷新的同时Direction为四个方向(上、下、左、右)其中的一个方向,蛇头前进的方向在此时已经确定,这样就动态的根据输入的键盘值来改变蛇的前进方向,我们就可以控制蛇的移动啦!

最后,在蛇动态效果显示出来的同时,我们也应该考虑到蛇的生命周期问题,就是蛇在什么情况下会死亡,在什么情况下会得分,在什么情况下会自身长度增加等一系列相关问题。

这里我们首先考虑到一个十分重要的问题,就是蛇遇到食物(这里我们用一个蓝色的小矩形表示蛇的食物苹果)同时,将食物吃掉并且动态自身增加一节,这里我们是这样实现的:

首先实现的是食物的随机出现,在某个食物被吃掉的同时,我们要立即产生出下一个食物的坐标,我们用到的是一个随机函数产生出下一个食物的坐标,但是这个坐标必须仅仅在0—23之间,因为我们地图采用的是一个24维的二维数组表示的,地图每个横坐标纵坐标的范围是0—23,但是,这里注意一个特别重要的问题,就是每次随机产生的食物坐标不能出现在当前蛇身上,我们必须加一个判断,如果产生的坐标在蛇身上,必须重新生成,一直到产生一个在地图上并且不在蛇身上的食物坐标为止;

当蛇头坐标的下一个前进方向的坐标和食物坐标相等时,我们在这里是将食物坐标改变成当前蛇头坐标,并且蛇尾坐标不变,蛇身长度增加一个单位,这样就动态的现实出来蛇吃食物自身增加一个的效果。

生命周期的问题:

在我们解决上述功能的同时,我们不得不考虑一个问题,那就是蛇的生命周期问题,就是蛇在身条件下会死亡,死亡的结果会是怎么样,我们在这里做了一个判断,就是蛇遇到地图周围的墙和遇到自己的身体蛇会死亡,生命周期结束,于此同时记录下当前玩家所得的分数,比较分数来判断玩家的能力程度,那么我们怎么判断蛇头撞墙和蛇头撞到自身呢?

继承上一个问题的解决方式,蛇身用到的是Cpoint类的一个一维数组表示,地图用到的是一个二维数组表示,当蛇头节点的左边和二维数组边界值相等时,或者蛇头坐标变为蛇自身的坐标时,蛇死亡,生命周期结束,关闭定时器函数Timer(),初始化游戏界面,记录当前分数,重新等待游戏开始。

到此为止,贪吃蛇游戏的大概思路就解决了。

系统的硬件构建

硬件环境分析:

系统硬件平台采用的是PXA270-S实验开发板,开发板提供了多种CPU内核共大家使用,具体的内核信息详细如下:

X86:

支持的处理器包括486、586、Geode、PentiumI/II/III/IV。

ARM:

支持的处理器包括ARM720T、ARM920T、ARM1020T、StrongARM、Xscale。

SHx:

支持的处理器包括SH-3、SH-3DSP、SH-4。

MIPS:

支持的处理器包括MIPSII/32(带浮点运算)、MIPSII/3(不带浮点运算)、MIPS16、MIPSIV/64(带浮点运算)、MIPSIV/6(不带浮点运算)。

软件环境分析:

PC机操作系统Win2000或以上,开发环境,WinCE500标准SDK,PXA270-S平台SDK。

系统的软件组成

2.系统的详细设计

定制winCE内核

winCE内核定制原理以说明

定制winCE内核之前,我们首先要做的准备工作详见下:

首先是安装PB工具,我们这里之前已经提及,所以就不再过多叙述。

在实际操作中,我们主要有如下的注意事项:

(1)推荐安装在分区根目录下。

并且分区需要保持足够大的硬盘空间,一般需要5G以上,PB和运行在PC的WinCE环境需要安装在一个分区内。

安装时间通常较长,网络安装的版本同时依赖网络的速度。

以下是微软推荐的最小配置,低于该配置PB工具将不能正常安装或使用;

处理器:

至少266MHzPentiumII以上;

推荐使用500MHzPentiumIII以上CPU;

操作系统:

Windows2000SP2以上;

WindowsXP;

内存要求:

至少128M;

使用模拟器时候至少192M(不包括操作系统本身占用的内存)硬盘:

典型安装时,选择一种处理器需至少空间;

若要包含PlatformBuilder的完整工具组在内需要至少12G的硬盘空间。

光驱:

可以使用与桌面系统相兼容的CD-ROM或DVD-ROM等。

(2)在安装过程中,会提示选择处理器体系结构,务必选中ARMV4I和XSCALE两项,否则无法支持PXA270处理器。

(3)如果PC上使用的操作系统为WindowsXPSP2,可能出现严重安装问题,最好不要采用WindowsXPSP2,或者在微软网站上搜索相关的指导文档。

安装过程中请关闭系统防火墙。

然后需要建立系统最基本的配置。

打开PB,首先导入我们提供的BSP包。

导入BSP的过程很简单,只需要安装光盘中提供的up270classic_BSP文件就可以实现,可以由指导教师提前完成。

安装完,会发现在系统的\WINCE500\Platform\路径下出现“Up_PXA270cl”文件夹,这个就是安装好的BSP了。

之后建立UP-TECHS2410/P270DVP的WinCE工程,都需要建立在这个BSP的基础上。

(类似地,你也可以自己构建系统自带的MainstoneII的工程,但是它不能运行在UP-TECHS2410/P270DVP实验箱上)。

winCE内核定制

我们在编译winCE内核镜像前,需要添加特性目录(Catalog)的一些组件来定制内核,我们在本系统需要添加以下的组件:

(1)添加鼠标键盘控制驱动;

(2)添加USB主控制器驱动;

(3)添加USB从控制器驱动(建立与PC机的Activesyn。

连接需要此特性);

(4)添加串口驱动;

(5)添加触摸屏驱动;

(6)添加浏览器驱动;

(7)添加拨号网络组件驱动;

(8)添加Fat文件系统;

.(9)加入对HIVE注册表的支持;

(10)加入对Mediaplayer播放器;

(11)加入对本地存储器中的mp3和wMA文件播放的支持。

除了上述所需的添加组件外,我们还需要一些另外的组件。

贪吃蛇游戏详细设计开发

贪吃蛇游戏的可行性分析

通过查找相关文档和技术支持,了解了EVC环境下的开发过程,熟悉了VC++语言的开发技巧,通过以下几个方面,进行可行性分析:

1.参考《贪吃蛇游戏用户描述文档》、《软件工程》等书,确定自己能够在自己能力范围内开发出这个贪吃蛇游戏项目。

2.功能要求:

在进行整个项目开发之前,必须要做的就是确定贪吃蛇游戏的主要功能,必须明确贪吃蛇游戏的功能,因为要进行游戏功能可行性分析,经过自己的查阅相关资料,确定了贪吃蛇游戏的具体功能,详见后续部分详细设计。

3.性能需求:

必须保证自己开发的贪吃蛇游戏能够整体尽可能做到高效快速,不占用大量的使用资源,因为我做的是一个嵌入式的游戏开发项目,必须要考虑资源使用情况,要求尽可能少用资源,在有限的资源范围内实现最大的可利用价值。

4.运行环境:

PXA270-S开发板,EVC++开发平台,模拟器上进行调试,经过安装软件,确定可以进行项目程序的编写。

5.界面要求:

采用Windows标准界面,只需要使用键盘和鼠标。

6.完成期限,一个学期完成整个系统,包括程序的编写,硬件板子的下载,以及最终的调试,测试阶段。

贪吃蛇游戏的需求分析

文档包括了嵌入式技术领域的介绍,嵌入式国内外环境的探索与简介,主要从我国嵌入式领域发展的最新阶段来探讨,与国际对比得出相应发展的前景,同时,针对自身对嵌入式方面的兴趣爱好,以及自己所掌握的有限知识来对嵌入式方面的一些看法等,另外还有winCE环境的简介,以及用法,还有关于嵌入式基于winCE的开发流程的一些相关文档,还有EVC++开发工具的使用方法的介绍,以及游戏的详细代码的功能简介等。

游戏功能:

能够实现贪吃蛇自动前线移动,也就是贪吃蛇能够“活动”的外观效果,根据相同的时间间隔,每一次将贪吃蛇自身的蛇头向前移动一个小格子,同时蛇尾向前移动一个小格子,移动方向为贪吃蛇行走的方向。

对游戏中规则进行判断,当游戏中的贪吃蛇遇到墙壁和自身时,根据规则判断应为死亡,宣告当前游戏结束,记录当前游戏的分数值。

根据每次所得的分数值不同,判断玩家的能力,来显示玩家的效果。

贪吃蛇的相关操作,根据键盘上的上、下、左、右四个键来控制贪吃蛇游戏的前进方向,同时,根据空格键来开始游戏,空格键在游戏开始时,还有另外一个功能,那就是暂停游戏功能,这样玩家就可以根据暂停游戏来处理当前需要处理的事情,当游戏结束时,按回车键就可以重新开始游戏的初始化界面。

果实的出现,每次贪吃蛇吃到果实时,于此同时,应该出现一个果实在地图中,那么怎么实现这个功能呢?

我采用的是随机函数出现果实的横纵坐标,然后判断这个店得坐标是不是在蛇身上,如果是那么就得重现出现上一个过程,直到食物的坐标不在蛇身上为止。

这样就出现了果实。

游戏分数的统计方法,当贪吃蛇吃到果实时,玩家的分数就应该随着吃到的果实而增加,增加的规则就是贪吃蛇的身体长度乘以等级得到分数。

这样就可以根据游戏的难度对应得到分数。

贪吃蛇游戏的总体功能图

贪吃蛇功能图

贪吃蛇游戏的实现的功能模块

在贪吃蛇游戏中,本论文设计的贪吃蛇游戏的大致可以分为五个功能模块,以下是对这五个模块的具体介绍:

游戏规则模块功能设计:

游戏规则包括蛇的运动范围、蛇的生命周期问题、分数统计、关卡判断。

其中蛇的运动范围是一个33*57的ListBox,蛇运动的地图抽象成为一个33*57的ListBox,当蛇遇到ListBox边界值(我们在这里抽象成为上、下、左、右四个边界,其中上边界坐标值中纵坐标都是20,横坐标任意,下边界为纵坐标是53,同理横坐标不变,左边界为横坐标为20,纵坐标任意,同理右边界为横坐标为77,纵坐标任意)时,宣告蛇生命周期结束,贪吃蛇死亡,这个是第一个规则;

另外,当蛇自己吃到自己身体的某一部分时,也宣告游戏结束,在程序里通过循环判断蛇头下一个前进方向的节点是不是蛇身上的某一部分节点即可,如果是那么蛇死亡,否则继续运行游戏。

分数统计算法的思想是每次蛇吃到一个果实时,相加的分数为蛇身长度乘以一个定值来记录分数,这样可以随着游戏难度的增加,分数值也随之增多。

关卡功能设置通过与分数相关联而体现的,初始化游戏为第一关,分数为0,当玩家玩到一定的分数时(例如是500)关卡加一,变为第二关,同时,蛇前进速度相应增加一个等级,这样就实现了不同关卡,不同速度的贪吃蛇,从而增加了游戏的难度。

蛇身操作模块功能的设计:

首先得到当前按下的移动方向,此时有两种情况需要考虑,如果遇到的是一个果实,则蛇身长度增加一个单位,表现在程序中是存放蛇身数组值增加一位,如果没遇到果实,则不断更新蛇身数组中的相应坐标值。

按键功能模块:

游戏是通过键盘按键控制,其中空格键控制游戏开始和暂停,上、下、左、右键控制蛇头前进方向,回车键控制游戏重新开始,程序内部是通过消息响应函数实现。

主界面地图模块:

贪吃蛇游戏的主界面是通过窗体初始化事件进行实现的,运用MFC类库中的FillSoldRect()库函数通过程序内部的二维数组进行绘制地图,地图然后可以改变,这样在游戏运行后就会在窗体上显示游戏初始化的效果。

帮组模块:

通过窗体的调用另外一个帮组窗体显示游戏的规则,游戏的计分公式,游戏的玩法等等。

贪吃蛇游戏的主要功能设计思路

WindowsMFC在程序执行时,会动态的调用窗口资源,在程序自动生成函数中,添加相应的函数实现程序初始化界面,本程序的具体思路是:

程序在开始执行时会调用BOOLCSnakeDlg:

:

OnInitDialog()函数,进行窗体的初始化,我们在此窗体客户区求得窗体长和宽的最小值,记录在WIDTHOFBRICKS和HEIGHTOFBRICKS变量中,因为我们设计的游戏地图是一个33*57的矩形区域,在这,根据WIDTHOFBRICKS和HEIGHTOFBRICKS等分,求出每个小矩形的边长存放在HEIGHTOFBRICKS和WIDTHOFBRICKS变量中,然后调用绘图函数voidCSnakeDlg:

MyDraw()进行地图的绘制,这样在程序执行时,就动态绘制了贪吃蛇游戏地图。

首先,食物时通过一个坐标记录下在地图上的位置,通过绘图函数绘制这点坐标的小矩形,程序中采用的是随机数生成食物出现的坐标。

其次,程序中必须增加一个判断,判断当前生成的食物坐标是否在贪吃蛇身体范围内,如果当前生成的坐标在蛇身坐标范围内,那么必须重新随机产生食物坐标直到不在为止。

如果坐标不在蛇身坐标范围内,则把坐标位置返回给调用对象。

程序中本模块具体功能是在voidInitFoods()函数中实现。

具体代码参见程序主要代码说明。

程序执行的步骤:

首先接受玩家按下方向键消息,并把当前要前进的方向保存在方向变量snake_direct中,记录贪吃蛇下一个状态前进的方向,通过方向判断头节点下一个节点的坐标值。

先判断下一个节点坐标值是不是符合游戏规则之内(也就是判断蛇是不是死亡)的坐标,此时调用IS_GameOver()函数判断游戏是否结束,如果结束宣告游戏结束,否则程序继续执行;

如果下一个节点的坐标值与当前食物节点坐标值(snake_foods)相同,则调用voidMyDraw()函数重绘蛇头和蛇尾节点颜色,因为此时蛇吃到一个果实,蛇身长度加一,动态的现实,将果实重绘为蛇身颜色(红色),蛇尾节点颜色不变,蛇身变量长度snake_body_length自加,动态记录当前蛇头节点snake_head和蛇尾节点snake_rear的坐标;

如果下一个节点不是食物节点,重绘蛇头蛇尾颜色,蛇身长度不变,动态的蛇头和蛇尾节点坐标改变。

分数统计和改变关卡的设计思路:

在本程序设计的贪吃蛇游戏中,分数统计采用的是如下公式进行的统计,贪吃蛇游戏分数=贪吃蛇蛇身长度*定制变量(本程序设置的是整形常量5),这样可以动态的根据蛇身长度不同,每次得到果实的分数也就随之不同,体现了游戏难度的差异;

另外游戏关卡的设计与分数统计有着密切的关系,关卡是通过玩家玩得的分数而自动晋级的,换句话说,例如:

游戏的初始化分数为0,游戏关卡为第一关,当玩家玩到1000分数时根据程序内部定义,关卡增加一级,同时,游戏难度也要随之增加,体现在程序中就是,定时器变量刷新间隔要变小,也就是类中定义的TimerInterval变量要随之相应的变小。

这样,在玩家看来,蛇的刷新速度就会变得越来越快。

按键响应功能的设置思路:

贪吃蛇游戏的控制通过键盘按键来控制,所以必须实现键盘响应功能,程序规定,上、下、左、右按键控制贪吃蛇的前进方向,空格键控制游戏开始和暂停,当按下回车键时,游戏重新进行初始化,重新开始游戏,此时需要重复上一个过程。

这些按键消息响应是通过函数BOOLCSnakeDlg:

PreTranslateMessage(MSG*pMsg)来实现,内部通过case语句进行相应按键的响应,从而实现按键响应功能

贪吃蛇游戏界面的实现

贪吃蛇游戏界面是通过MFC初始化窗口实现,地图是通过初始化窗体时,计算窗体客户区高度和宽度,然后取其中最小值,等分为24部分,记录下每部分的长度,这就是地图中每个小矩形的长度。

具体界面详见下图:

如上图:

游戏界面左边为地图部分,是一个33*的二维数组抽象出来的,右面有七个按钮部分,分别对应着上诉部分按键功能。

贪吃蛇游戏主要代码说明

下面函数是游戏开始函数,主要功能是初始化游戏的状态,开启计时器函数,实现游戏的开始。

voidCSnakeDlg:

Start()

{

Level=1;

Score=0;

TimerInterval=200;

GameState=RUNNING;

dead_flag=1;

统整合及测试

系统整合

通过前几章的叙述,我们已经把系统的各个部分分别作了非常详细的论述,我们已经将上述过程中定制好的winCE系统下载到PXA270-S实验箱上,于此同时我们已经在EVC++开发平台上运用VC++语言开发好贪吃蛇游戏的详细代码,剩下的就是将上诉三个过程最终整合在一起,达到编制好的程序最终在开发板上运行的一种嵌入式程序设计的效果。

我们将开发板接好电源,下载好winCE系统,后,将数据线连接好,启动同步软件,进行连接,直到同步软件显示连接成功之后,浏览板子内容,选择PXA270-S开发板SDK,进行编译,将C:

\DocumentsandSettings\lining\桌面\Snake_no_dead\ARMV4Irel目录下的可执行文件加入到实验箱目录下,然后连接键盘和鼠标到开发板上的USB上,点击可执行程序Snake文件,运行开发完成的贪吃蛇游戏程序,这样,整个系统整合完成。

系统整体测试

系统规则测试

本程序制定的规则是贪吃蛇撞墙死亡,撞到自己身体任意一部分死亡。

按照预先设计应出现的结果是当蛇头下一个移动节点的位置是地图四周的墙壁时,或者是蛇自身的某一个位置节点时,应该显示出一个对话框,标志着蛇死亡。

下面我们进行测试。

我们运行程序,然后按空格键开始游戏,让蛇自身开始移动,我们首先让蛇头撞到地图周围的墙壁,观察结果是不是出现应该出现的结果。

下图是我们运行程序后的结果截图,观察出现的结果如图所示:

通过上图我们可以发现,当贪吃蛇由于“贪吃”而不小心撞到了地图周围的墙壁上,出现了一个对话框,宣告程序游戏结束,玩家记录分数如上图右面部分所示。

根据游戏规则,当贪吃蛇吃到自己身体的某一部分时,也应该出现一个对话框,显示游戏结束,标志着游戏的结束,玩家重新开始游戏。

测试用例:

让蛇吃到自己身体的某一个部分,观察出现的结果是不是根据游戏规则应该出现的。

开始游戏,然后让蛇吃到自己的身体某一部分,结果如下图所示:

通过上图,我们发现,当蛇头吃到自己身体的某一部分时,贪吃蛇死亡,游戏结束,说明此功能正确,测试结束。

按键功能测试

贪吃蛇的控制是通过键盘上的按键来进行控制的,我们需要对相应的按键进行功能测试,看相应的按键对应的功能是不是正确。

一共有5个按键与贪吃蛇游戏相关,分别是,上、下、左、右按键,还有空格按键。

其中空格按键的功能是开始游戏,同时还有当游戏在进行时可以暂停游戏的功能,对应测试图如下:

我们可以通过上图看到,在按下空格键时游戏开始,同时按下空格键,游戏暂停,停留在如图所示的状态。

下面我们来进行上、下、左、右功能键的按键测试,如下图所示:

通过观察上图和前一个状态的变化,我们发现此图显示了按上功能键后,贪吃蛇蛇头向上移动,说明向上按键功能正确。

通过观察上图和前一个状态的变化,我们发现此图显示了按下功能键后,贪吃蛇蛇头向下移动,说明向下按键功能正确。

通过观察上图和前一个状态的变化,我们发现此图显示了按左功能键后,贪吃蛇蛇头向左移动,说明向左按键功能正确。

通过观察上图和前一个状态的变化,我们发现此图显示了按右功能键后,贪吃蛇蛇头向右移动,说明向右按

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

当前位置:首页 > 高等教育 > 军事

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

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