基于MOTOROLA手机的五子棋游戏开发技术设计书.docx

上传人:b****0 文档编号:9855363 上传时间:2023-05-21 格式:DOCX 页数:33 大小:115.95KB
下载 相关 举报
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第1页
第1页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第2页
第2页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第3页
第3页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第4页
第4页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第5页
第5页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第6页
第6页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第7页
第7页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第8页
第8页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第9页
第9页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第10页
第10页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第11页
第11页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第12页
第12页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第13页
第13页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第14页
第14页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第15页
第15页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第16页
第16页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第17页
第17页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第18页
第18页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第19页
第19页 / 共33页
基于MOTOROLA手机的五子棋游戏开发技术设计书.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于MOTOROLA手机的五子棋游戏开发技术设计书.docx

《基于MOTOROLA手机的五子棋游戏开发技术设计书.docx》由会员分享,可在线阅读,更多相关《基于MOTOROLA手机的五子棋游戏开发技术设计书.docx(33页珍藏版)》请在冰点文库上搜索。

基于MOTOROLA手机的五子棋游戏开发技术设计书.docx

基于MOTOROLA手机的五子棋游戏开发技术设计书

基于MOTOROLA手机的五子棋游戏开发技术设计书

第一章背景与意义

1.1手机业的情况

2007年全球共销售了大约11.5亿部手机,手机市场主要靠非洲和亚洲手机销量上升拉动,欧洲的手机销量保持稳定。

2007年中国的手机年销售量达到1.9亿部,手机的普及率是39%,拥有5.25亿用户。

中国在手机生产制造领域的优势不断加强,手机在中国自身的信息技术市场扮演的角色也越来越重要。

经过五年的规模化发展,中国手机市场已进入成熟期,2007年销量将达1.5亿部,同比增长23.1%;销售额将达1661亿元,受低端手机份额扩大的影响,销售额同比下降0.3%。

2007年,诺基亚生产了4亿3710万手机,三星生产了1亿6120万部手机,摩托罗拉生产了1亿5900万,紧挨着的是索尼爱立信,生产了1亿340万部手机,而且LG生产了8050万。

其他公司生产了1亿8430万部手机,所有的公司将总共出售12亿4千万部手机。

2007年,各大手机厂商采用不同策略推动市场发展,导致品牌竞争激烈。

诺基亚推动娱乐市场战略并涉足互联网服务领域;索尼爱立信弥补智能手机软肋;三星放下架子攻低端;摩托罗拉发展受阻,其他国外品牌如LG、飞利浦等表现不佳。

多普达锋芒毕露,其他国产品牌在生死线上挣扎。

手机市场再现黑马,苹果高调入市,魅族、纽曼先后进入手机市场。

预计到2011年,全球市场售出的手机中有四分之一的产品将是超低价手机。

未来五年,印度将是超低价手机的最大市场,其超低价手机年销量将从2006年的900万部增加到2011年的1.16亿部。

1.2JAVA手机的优点

Java手机软件平台采用的基本Java平台是CLDC(ConnectedLimitedDeviceConfiguration)和MIDP(MobileInformationDeviceProfile),是J2ME(Java2MicroEdition)的一部分,在中国一般称为“无线Java”技术。

此前,有人把它叫做“K-Java”;其实,K-Java的叫法只是Sun公司在开发KVMJava虚拟机时的项目代号,在该技术被正式命名为KVM后,就不再用K-Java了。

KJava即J2ME(Java2MicroEdition),是Sun公司专门用于嵌入式设备的Java软件。

以KJava编程语言为手机开发应用程序,可以为手机用户提供游戏、个人信息处理、电子地图、股票等服务程序。

J2ME(Java2MicroEdition)是致力于消费产品和嵌入式设备的最佳解决方案。

J2ME在设计其规格的时候,遵循着“对于各种不同的装置而造出一个单一的开发系统是没有意义的事”这个基本原则。

于是J2ME先将所有的嵌入式装置大体上区分为两种:

一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA、手机);另外一种是运算能力相对较佳、并且在电力供应上相对比较充足的嵌入式装置(比方说冷气机、电冰箱)。

因为这两种区分,所以Java引入了一个叫做Configuration的概念,然后把上述运算功能有限、电力有限的嵌入式装置定义在ConnectedLimitedDeviceConfiguration(CLDC)规格之中;而另外一种装置则规范为ConnectedDeviceConfiguration(CDC)规格。

也就是说,J2ME先把所有的嵌入式装置利用Configuration的概念区隔成两种抽象的型态。

Java技术的开放性、安全性和庞大的社会已有资源,以及其跨平台性,即“编写一次,到处运行”的特点,使Java技术成为智能手机软件平台的事实标准。

采用Java技术后,编写应用程序和提供服务的人就不必关心接受其服务的手机采用的是什么操作系统和芯片,只要按照Java的要求去写程序就好了;同样,生产手机的厂商也不必顾虑将来谁来提供增值服务。

可以看出,采用Java技术,可以建立完整、高效的无线数据增值服务产业链,从而为用户提供灵活、个性化、内容方式多样的服务。

1.3Java手机发展现状

到今年6月,全世界已经有大约1亿部Java手机在使用,除中国大陆外共有53个移动运行商正式推出了基于Java技术的无线数据增值服务。

中国移动通信集团已经建立了无线Java增值服务体系,并推出了“百宝箱”等服务品牌,包括游戏百宝箱、娱乐百宝箱、商务百宝箱、生活百宝箱等,已经于2003年7月10日开始正式商用。

手机游戏开发一般都是开放式的开发平台,例如流行的开发平台,如J2ME。

开发人员能够从网络方便的得到相应的开发资料,不论你的资金实力如何,只要你有兴趣,就能够迈入这个新兴的行业。

而相关的厂商,例如通信设备厂家对于手机游戏开发秉承一种开发的态度,鼓励开发者在手机设备上开发游戏,通常都在网络中提供了自己手机的技术资料。

下文对目前市面上流行的手机游戏平台做一个简单的介绍。

·嵌入/内置式游戏

早期的手机功能简单、屏幕也仅仅是单色,手机厂商能做的,就是在手机内置一些简单的游戏。

这些游戏都是厂商以自己的专属平台所开发的,这些发售时就内置的游戏在手机预存了多少就是多少,用户无法自己新增或删除。

·In-FusioExEn娱乐平台

即使是手机屏幕变成了彩色,内置游戏如何好玩,但总而也有玩腻的时候。

因此用户们也希望能够玩新的游戏或者象下载图片、铃声那样通过无线网络下载新的游戏。

法国In-Fusio公司看中了这个市场,在2001年推出了ExEn(ExecutionEngine)游戏平台。

通过把专属的ExEn芯片加入手机内,赋予手机彩色画面与流畅的执行速度,让手机也有掌上游戏机那样的效果。

·J2ME平台

J2ME(Java2MicroEdition)平台是目前最火暴的手机游戏平台,尽管它还可以下载和安装一些小的应用程序。

J2ME简单的可以理解为Java的移动版本,其MIDP(MobileInformationDeviceProfile,移动信息装置简表)架构就是专门为手机与PDA而设计。

目前MIDP有1.0和2.0之分,后者在兼容性以及游戏的多媒体表现力如音效和振动方面有更好的效果,此外通过测试软件显示,支持MIDP2.0的JAVA游戏在图形运行能力对比1.0版本也有更优秀的表现。

由于J2ME的技术先进,而且又能跨平台运行,因此受到了众多手机厂家的支持,甚至成为现在用户购买手机的一项比较重要的技术指标。

所以到目前为止,手机的游戏应用平台中,以支持J2ME的最多,而且J2ME软件开发商也有越来越多的趋势,J2ME已成为2002年下半年之后的行动游戏平台主流。

·SynergenixMophun平台

Mophun是瑞典Synergenix公司于2002年开发出的全新移动游戏娱乐平台。

Mophun的发音类似MoreFun,主要就是针对游戏平台而设计的游戏语言,采用C程序代码来开发游戏,运行起来最稳定,速度上也比JavaVM快许多倍(厂商宣称快100倍),可发挥出手机硬件的极限。

同时,mophun游戏平台能在极其有限的硬件资源上运作,其最低硬件需求是以12MHz运行的8位处理器,因而适用于现有的2G手机。

由于Mophun的API功能齐全,加上是采用本地代码,运行速度快的优势显而易见,这点对于支持Mophun和Java双游戏平台的索爱手机尤其明显。

通常情况下排除其他因素,索爱手机在运行Mophun游戏时速度远远超过手机的Java游戏运行时的速度。

另外,Mophun游戏在一次下载后就不须再付费(这点跟ExEn的理念一样),同时Mophun还具备安全机制(防盗版),主游戏程序无法从手机中拷出,只提供游戏存盘转存到电脑中。

Mophun游戏平台因为具备在极其有限的硬件资源上运行高效性能,可说是目前手机最佳的游戏平台之一。

·BREW游戏平台

BREW是无线二进制运行环境(BinaryRuntimeEnvironmentforWireless)的缩写。

是高通公司2001年推出的基于CDMA网络的一个增值业务开发运行的基本平台。

相对Java,BREW是一个更底层的技术。

严格的说游戏仅仅是BREW的一部分内容而已。

BREW提供的功能环境就好像PC机上的操作系统一样,可以通过服务提供商下载指定类型的应用程序或游戏来使用。

对于支持BREW的手机终端,在手机出厂时已经预安装了两个应用。

分别为应用管理器(ApplicationManager)和移动商店(MobileShop)。

·未来手机游戏趋势

未来的手机游戏平台因为ATI和nVIDIA两大PC显示芯片厂商专业级水准的加入而更为热闹。

在ATI推出手机和PDA手机3D多媒体芯片(包含专用的媒体处理器MediaProcessor及3D加速器3DAccelerator)后,老对头NVIDA也毫不示弱,公布了他们的3D多媒体芯片,并且应用于三菱和神达MiTAC的智能手机上。

这些芯片在植入手机后能够有效的提升图形显示性能,使手机在进行多媒体演示和游戏时更够有出色显示效果。

不过这些厂家提供的都是硬件芯片,要完全发挥其在3D图形的表现能力还需要相应支持的API才能相辅相成,而目前主要的API包括2003年7月发表的OpenGLES(OpenGLforEmbeddedSystems),就是OpenGL的嵌入式版本,是为嵌入系统而开发的小型标准三维(3D)图形应用编程接口(API),并受到那些意图将3D游戏引入移动设备的游戏开发商、手机厂商、游戏引擎供应商和3D图形芯片公司的热烈追捧。

目前已知NVIDIAAR10与ATIImageon23xx3D芯片,已符合OpenGLES1.0的标准。

而最新SymbianOS8.0版本也将支援OpenGLESAPI。

相信不久后,手机上也能玩像是CS、DOOM、Quake的FPS游戏了。

第二章J2ME综述

2.1J2ME简介

J2ME即JAVA2MicroEdition,它是Java2的组成部分,与J2SE、J2EE并称。

J2ME是一种高度优化的Java运行环境,应用于大量的消费类电子设备,如CellularPhones(蜂窝电话)、ScreenPhones(可视电话)、DigitalSet-topBoxes(数字机顶盒)、CarNavigationSystems(汽车导向系统)等,同时也广泛被移动通信设备所采用,如移动电话、双向寻呼机、智能卡、个人电脑记事本(PersonalOrganizer)和掌上电脑(Palmtop)等。

J2ME技术将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。

J2ME使用配置和简表定制Java运行时环境(JRE)。

作为一个完整的JRE,J2ME由配置和简表组成,配置决定了使用的JVM,而简表通过添加特定于域的类来定义应用程序。

与以前Sun公司推出的J2EE(Java2EnterpriseEdition,Java2企业版)、J2SE(Java2StandardEdition,Java2标准版)规范相比,J2ME不是一个单独的技术规范,而是一系列技术规范总称。

这些规范定义了Java技术在资源限制的设备中的表现形式。

J2ME主要适用于小型嵌入式设备,这些设备与PC或是服务器设备相比没有统一的硬件标准、外观与操作方式,其功用也是千差万别。

但是J2ME在适用于这些设备的同时也保留了Java的传统特性,即任何时间和任何地点的代码具有可移植性、部署灵活性、安全的网络传输性,以及代码稳定性。

正是因为如此,开发人员才可以借助J2ME力量让编写的程序能够运行在其他型号或厂商的设备上。

2.2J2ME的相关特性

2.2.1Configuration简介

J2ME在设计其规格的时候,遵循着「对于各种不同的装置而造出一个单一的开发系统是没有意义的事」这个基本原则。

于是J2ME先将所有的嵌入式装置大体上区分为两种:

一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA、手机);另外一种则是运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置(比方说冷气机、电冰箱、电视机上盒(set-topbox))。

因为这两种型态的嵌入式装置,所以Java引入了一个叫做Configuration的概念,然后把上述运算功能有限、电力有限的嵌入式装置定义在ConnectedLimitedDeviceConfiguration(CLDC)规格之中;而另外一种装置则规范为ConnectedDeviceConfiguration(CDC)规格。

也就是说,J2ME先把所有的嵌入式装置利用Configuration的概念区隔成两种抽象的型态。

 

其实在这里大家可以把Configuration当作是J2ME对於两种类型嵌入式装置的规格,而这些规格之中定义了这些装置至少要符合的运算能力、供电能力、记忆体大小等规范,同时也定了一组在这些装置上执行的Java程序所能使用的类别函式库、这些规范之中所定义的类别函式库为Java标准核心类别函式库的子集合以及与该型态装置特性相符的扩充类别函式库。

比方就CLDC的规范来说,可以支援的核心类别函式库为java.lang.*、java.io.*、java.util.*,而支援的扩充类别函式库为java.microedition.io.*。

区分出两种主要的Configuration之後,J2ME接著在定义出Profile的概念。

Profile是架构在Configuration之上的规格。

之所以有Profile的概念,是为了要更明确地区分出各种嵌入式装置上Java程序该如何开发以及它们应该具有哪些功能。

因此Profile之中定义了与特定嵌入式装置非常相关的扩充类别函式库,而Java程序在各种嵌入式装置上的使用者介面该如何呈现就是定义在Profile里头。

Profile之中所定义的扩充类别函式库是根据底层Configuration内所定义的核心类别函式库所建立。

 

2.2.2Profile简介

Profile是建立在某个configuration之上的特定API集合。

一个configuration只定义虚拟机和基本的API集合,不定义建立应用程序的细节。

因此Profiles往往包括应用程序生命周期的API,用户界面API以及存储API。

一个Profile既可直接建立在Configuration上,也可建立在另一个Profile之上。

为了在不改动Profile的前提下增加设备的功能,在Profile之外又提出了可选包,可将它们看成Profile的扩展,每个可选包对某个或某些profiles增加特定的功能。

当对某个profile需要增加一个新的API时首先将它定义为可选包。

如果随着时间的推移该可选包被广泛采用,它则可能成为某个或某些profiles的一部分。

某些厂家特定的API与可选包起相似功能。

J2ME的这种结构很好的适应了嵌入设备的巨大多样性。

从低到高,您可根据设备的情况可采用不同的configuration,在同一configuration中您又可根据设备的用途选用不同的Profile,在您的设备中您还可采用多个Profile,如果您还嫌功能不够,尚有可选包可用。

J2ME中第一个正式发布的Profile是MIDP,而且随后比较长的时间内未有其它Profile发布,以至有人把MIDP等同于J2ME了,有人把WTK等同于J2MESDK(由于J2ME包含的范围很广,所以不太可能有厂商推出能支持各种Profile的开发工具)。

MIDP只是J2ME中的一员,我们来看看到写本文为止有哪些Profile。

由于每个Profile是建立在特定的Configuration之上的,所以我们在Profile后注明其基于的Configuration。

目前已有的基于CLDC的Profile有MIDP,基于CDC的Profile有FP、PBP。

第三章需求分析

3.1基本需求分析

手机屏幕尺寸分为物理尺寸和显示分辨率两个概念。

物理尺寸是指屏幕的实际大小。

大的屏幕同时,要配备高分辨率,也就是在这个尺寸下可以显示多少个像素,显示的像素越多,可以表现的余地自然越大。

现在手机行业发展迅速,不同大小屏幕的手机迅速发展,鉴于不同手机屏幕尺寸不同,我们在设计游戏的时候有一下一些要求:

一软件的界面简洁明了,操作简单容易。

受手机屏幕大小和显示的影响,我们设计的软件界面必须是简洁的;手机键盘的不方便,游戏需要设计得易操作。

二软件具有人工智能算法原理要简单,并且运行快速。

游戏是需要快速反应的。

手机处理器的频率直接要求我们需要使用简单实用的智能算法。

三游戏要设置几个难度,便于不同玩家选择.玩家的游戏水平不一样,我们设置不同难度供各个水平的玩家选择。

四游戏棋盘的大小要灵活,根据不同手机屏幕可以调节。

3.2游戏玩法及规则

现代五子棋专用棋盘为十五路(15X15),共225个交叉点。

棋盘正中一点为天元。

对局开始时,先由执黑棋一方将一枚棋子落在天元点上,然后由执白棋一方在黑棋周围的交叉点上落子。

但是,为了尊重对方和礼貌起见,持白棋的一方通常将盘面的第二着棋布在自己河界的一侧,即直止或斜止。

此后黑白双方轮流落子,直到某一方首先在棋盘的横线、纵线或斜线上形成连续五子或五子以上〔仅对白棋而言〕,则该方就算获胜。

连珠五子棋的一个特点是先行的一方优势很大,因此在职业比赛中对黑方做了种种限制,以利公平竞争。

五子棋的比赛规则如下:

〖1〗黑先、白后,从天元开始相互顺序落子;

〖2〗最先在棋盘横向、纵向或斜向形成连续的同色五个棋子的一方为胜;

〖3〗黑棋禁手判负、白棋无禁手。

黑棋禁手有“三、三”、“四、四”和“长连”,

包括“四、三、三”和“四、四、三”。

黑棋只能以“四、三”取胜;

〖4〗如分不出胜负,则到为平局;

〖5〗五连与禁手同时形成,判胜;

〖6〗黑方禁手形成时,白方应立即指出。

若白方未发现或发现后不立即指出,反而继续落子,则禁手失效,不再判黑方负。

在本游戏中,没有采用职业比赛的规则,直接采用明间规则,一人一手棋,先成5为胜。

另外,我们把游戏棋盘设置为可以调节大小,设置游戏难度以便适用不同手机。

第四章游戏设计分析

4.1软件总体框架图

4.1.1驱动循环及类图

 

图1驱动循环图

棋类游戏通常具备两个重要特性,首先是对战双方轮流落子,其次是落子间隔通常是不确定的,尤其是对战后期,可能每一步都需要经过深思熟虑,无论是人方还是计算机方,都无法对间隔时间有事先的预期。

基于以上两个特性,本游戏摒弃了大多游戏采用的线程或者定时器驱动游戏的方法,而采用了事件驱动方法,即玩家的键盘或触摸笔出发游戏的下一步动作。

事件驱动大大减少了不必要的工作量。

软件的类结构:

 

图2软件类结构

整个游戏由11个类组成。

这个游戏共有三个版本:

单机挑战版,双人对战版,蓝牙终极版。

单机挑战版由Gobang1Canvas类和Chesses类组成,Gobang1Canvas类负责游戏界面的绘制,游戏落棋的控制,游戏规则的控制,游戏算法的控制,游戏胜负的控制。

Chesses类是棋子类,提供棋子,每当下一个棋子的话,就生成一个棋子对象。

双人对战版由GobangCanvas类和Chesses类组成。

GobangCanvas类负责游戏界面的绘制,游戏落棋的控制,游戏规则的控制,游戏算法的控制,游戏胜负的控制。

Chesses类是棋子类,提供棋子,每当下一个棋子的话,就生成一个棋子对象。

蓝牙终极版是由Chess类、Client类、Connection类、Control类、GameWorld类和Server类组成,Chess类提供蓝牙版的棋子,每当下一个棋子的时候,生成一个棋子对象。

Client类和Server类是建立蓝牙协议的客户端和服务端,当服务端启动后,不断地监听来自客户端的请求,如果监听到,则连接协议,准备进行通信,客户端则在启动后向服务器端发送连接请求,如果被服务端监听到,则配合服务器端连接。

Connection类是负责连接客户端和服务器端的。

Control类负责判断是启动服务器端还是客户端,对应游戏中的正方和反方。

GameWorld类是负责绘制棋盘,游戏规则的控制,以及游戏胜负的控制,游戏进行的控制。

4.2单机挑战版

4.2.1单机挑战版的程序分析与具体实现

进入游戏前的选择画面。

游戏前我们要选择游戏的版本,这里有三个版本,单机挑战版,双人对战版,蓝牙终极版,可以操作手机的上下左右键进行选择。

图3开机选择版本

单机挑战版有三个等级的游戏,分别是初级、中级、高级。

由于时间的原因,目前只完成了初级的开发,中级和高级留作日后进一步开发。

图4进行等级的选择

进入游戏,开始单机挑战版的游戏。

图5开始游戏

4.2.2单机挑战版的核心类及逻辑实现

Gobang1Canvas类是主要的实现类。

以下是在游戏中需要用到的变量设置:

intempty;//游戏界面到屏幕边缘的留空

intcanvasW,canvasH;//画布的长和宽

intchessLength;//棋子的直径

intchessMapLength,chessMapGrid,chessGridLength;

//棋盘的边长,棋盘一边格子数,每格宽度

intchessMapX,chessMapY;//棋盘左上角x,y坐标

intselectedX,selectedY;//选择框在棋盘格局上的x,y位置

booleanisPlayer1;//是否是玩家1

Chesses[][]chesses;//棋子数组

booleannewGame;//是否是新的游戏

booleanisWin=false;//是否已经胜利?

int[]chessesPoint;//存放要走的棋子的位置

staticintchessesNum=3;//判断有几个棋子就开始堵了

下面这个构造函数对游戏进行初始化,包括棋盘的大小,界面的绘制,游戏的加载:

主要程序如下:

publicGobang1Canvas(Gobanggobang){

this.gobang=gobang;

newGame=true;

empty=10;

canvasW=getWidth()-empty;canvasH=getHeight()-empty;

chessMapGrid=15;

chesses=newChesses[chessMapGrid+1][chessMapGrid+1];

if(canvasW>canvasH){

chessMapLength=canvasH-canvasH%chessMapGrid;

chessMapX=(canvasW-chessMapLength)/2+empty/2;

chessMapY=(canvasH%chessMapGrid)/2+empty/2;

}

else{

chessMapLength=canvasW-canvasW%chessMapGrid;

chessMapX=(canvasW%chessMapGrid)/2+empty/2;

chessMapY=(canvasH-chessMapLength)/2+empty/2;

}

chessGridLength=chessMapLength/chessMapGrid;

chessLength=chessGridLength-1;

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

当前位置:首页 > 小学教育 > 语文

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

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