首页 java语言设计俄罗斯方块(含代码)精要

java语言设计俄罗斯方块(含代码)精要

举报
开通vip

java语言设计俄罗斯方块(含代码)精要java语言设计俄罗斯方块(含代码)精要 宁 夏 大 学 数学计算机学院 计算机及应用专业二学位 题目:基于java语言的俄罗斯方块设计与实现 专 业 计算机及应用 准考证号 学生姓名 指导教师 2013年 12月 20日 宁 夏 大 学 摘要 在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的设计、艺术、声音和软件,所以并不是人人皆知。直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展...

java语言设计俄罗斯方块(含代码)精要
java语言 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 俄罗斯方块(含代码)精要 宁 夏 大 学 数学计算机学院 计算机及应用专业二学位 题目:基于java语言的俄罗斯方块设计与实现 专 业 计算机及应用 准考证号 学生姓名 指导教师 2013年 12月 20日 宁 夏 大 学 摘要 在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的设计、艺术、声音和软件,所以并不是人人皆知。直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如家电、汽车等传统行业,也正因为如此,游戏人才的教育、培养远落后于产业的发展。 俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的事件处理实现)。然后程序根据这七种方块堆叠成各种不同的模型。俄罗斯方块游戏具有广泛的游戏人群,因为它比较简单有趣,无论老少都比较适合。俄罗斯方块游戏的设计对于每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。 俄罗斯方块游戏的设计工作是非常复杂和重要的,它涉及面逛,牵涉面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,将牵涉到图形界面的显示与更新,数据的收集与更新并且在这个游戏的开发中还会应用类的继承 机制 综治信访维稳工作机制反恐怖工作机制企业员工晋升机制公司员工晋升机制员工晋升机制图 以及一些设计模式。因此,如何设计和开发好这个俄罗斯方块游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。在设计开发过程中,开发者需要处理好各个类之间的集成关系,还要处理各个类的相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。 论文描述了游戏的历史,开发此游戏的环境,游戏开发的意义。遵循软件工程的知识,从软件问题定义开始,接着进行可行性研究、需求分析、概要设计、详细设计,最后对软件进行了测试,整个开发过程贯穿软件工程的知识体系。 此次设计在Microsoft Windows XP系统下,以Java为开发语言,在eclipse开发平台上进行游戏的设计与实践。 关键词:游戏设计;算法;数组;事件 宁 夏 大 学 目 录 第1章 绪论................................................................................................................ III 1.1 背景以及现状...................................................................................................... III 1.2 课程设计内容............................................................................................... III 第2章 俄罗斯方块概述............................................................................................ IV 2.1 游戏的历史................................................................................................... IV 2.1.1从头谈起............................................................................................. IV 2.1.2图形硬件的革命................................................................................. IV 2.2游戏的意义与内涵......................................................................................... V 2.2.1游戏的组成要素......................................................................................... V 2.3俄罗斯方块游戏............................................................................................. V 第3章 可行性研究..................................................................................................... V 3.1 设计目的........................................................................................................ V 3.2 可行性研究前提........................................................................................... VI 3.3 可行性分析................................................................................................... VI 3.4 结论............................................................................................................... VI 第4章 俄罗斯方块游戏的设计................................................................................ VI 4.1游戏功能需求................................................................................................ VI 4.2 运行环境及系统性能的需求......................................................................VII 4.3 详细设计......................................................................................................VII 4.3.1音效播放控制模块设计......................................................................VII 4.3.2背景音乐播放控制模块设计............................................................ VIII 4.3.3旋转方块的设计................................................................................... IX 4.3.4方块的翻转与移动................................................................................ X 4.3.5满行消除............................................................................................ XIII 第5章 系统的具体实现......................................................................................... XVI 5.1界面设计..................................................................................................... XVI 5.1.1用户登陆界面图.............................................................................. XVI 5.1.2 系统主界面..................................................................................... XXI 5.2程序设计及调试运行.............................................................................. XXIV 5.2.1 测试的意义及注意事项.............................................................. XXIV 5.2.2测试的步骤.................................................................................... XXV 5.2.3 测试结果...................................................................................... XXVI 第6章 结束语...................................................................................................... XXVI 致 谢................................................................................................................... XXVII 参考文献............................................................................................................... XXVII 宁 夏 大 学 第1章 绪论 1.1 背景以及现状 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢?帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。 俄罗斯方块曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。 俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。但是,谁知道这么优秀的娱乐工具,出自哪位神人之手呢, 顾名思义,俄罗斯方块自然是俄罗斯人发明的。这位伟人叫做阿列克谢?帕基特诺夫。 俄罗斯方块原名是俄语Тетрис(英语是Tetris),这个名字来源于希腊语tetra,意思是“四”,而游戏的作者最喜欢网球(tennis)。于是,他把两个词tetra和tennis合而为一,命名为Tetris,这也就是俄罗斯方块名字的由来啦。 1.2 课程设计内容 1.游戏界面主框架 游戏界面主框架主要包括游戏图形区域界面,游戏速度的选择更新界面,,游戏分 数的显示更新界面,下一个图形方块的显示更新区域,开始游戏按钮,重新开始游戏按 钮以及退出游戏按钮 2(游戏图形区域界面的显示更新功能 游戏图形区域界面主要是一个图形显示更新区域,主要包括游戏方块显示更新,整 行方块的删除和更新,进行中和游戏结束时的分数更新和游戏图形区域界面的清除。 在这个游戏图形区域界面中,主要是一个表格,根据相应格子的设置标志来显示相应的 图形图片,这样就实现了俄罗斯方块的实时显示。 3(游戏方块的设计 在俄罗斯方块游戏中,具体的游戏方块图形的设计是比较重要的一个方面。因为俄罗斯方块游戏中主要的动作就是控制游戏方块的移动和翻转,以便于组成一行行连续的方块从而增加游的分数。 由于主要的游戏动作都集中在这个游戏方块上,因此游戏方块的设计就显得格外重要了。为了增加程序的可扩展性,这里设计一个游戏方块的基类,各个具体的游戏方块都从这个基类开始继承。这样,当需要增加游戏方块时就不用重新设计新的类,只需要从这个基类集成出一个类就可以了。 4.系统功能设计分析 俄罗斯方块游戏根据游戏界面布局的不同,将系统划分为如下几个功能部分。 (1) 游戏显示更新功能。游戏显示更新功能主要是更新显示游戏区域的方块显示,包括 控制游戏方块的下落速度,下落方向以及形状改变,并且还需要判断当前游戏方块是 否满足消除一行的条件。GameAreaPanel类就是游戏显示更新的控制类, paint(Graphics g)方法主要负责游戏区域的实时重绘。 (2) 游戏方块预览功能。 在游戏过程中,当在游戏区域中出现一个游戏方块时,必须在游戏预览区域出现下 一个游戏方块,这样有利于游戏者控制游戏的策划。由于在此游戏中存在8中不同 的游戏方块,所以在游戏方块预览中就需要显示随机生成游戏方块。PreviewPanel 宁 夏 大 学 类是游戏预览控制类,在painting(Graphics g)方法中,将根据生成的随机数字 显示不同的游戏方块。 (3) 游戏方块控制功能。 给各种游戏方块设置一个基类,主要包括begin()(初始化显示)方法,down() (向下移动)方法,left()(向左移动)方法,right()(向右移动)方法,change ()(变换角度)方法,downto()(一下到底)方法。在各个游戏子类中,需要具 体实现这些方法。 (4) 游戏速度分数更新功能。 在游戏者进行游戏的过程中,需要按照异地昂的游戏规则给游戏规则给游戏者计算 游戏分数,当游戏分数达到一定数量后,就需要给游戏者增加难度,即提高游戏中 游戏方块的下落速度。 第2章 俄罗斯方块概述 2.1 游戏的历史 游戏是人类生活的重要组成部分,从第一个电子游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。 2.1.1从头谈起 真正的电子游戏机产生于20世纪70年代。1971年,麻省理工学院的学生Nolan Bushnell设计了世界上的第一个业务用游戏机(俗名街机),叫做《电脑空间》。这台游戏机用一台黑白电视机作为显示屏,用一个控制柄作为操纵器,不过由于市场因素这款游戏以失败告终。但是最后他在电子游戏的发展上取得了非凡的成就。 上面介绍的是专用机游戏的历史,而最早的电脑游戏可以追溯到1972年,一个叫Crowther的工程师用当时最流行的主机――DEC公司的PDP,10编写一段简单的FORTRAN程序。在这个程序里,Crowther设计了一张地图,地图上不规则的分布着陷阱,游戏者必须寻找路径避开陷阱。这个程序被公认为是最早的电脑游戏程序。 1989年,BroderBund公司的设计师乔丹.麦克纳根据阿拉伯民族的古老传说《一千零一夜》在Apple平台上制作了一部动作冒险相结合的电脑游戏――波斯王子。这个游戏获得了第一作,它代表了当时电脑技术的最高水平。 1986年,任天堂公司发售了一款真正的游戏巨作――超级马里奥。 20世纪80年代IBM PC兼容机的出现打破了Apple公司的垄断地位。 到了20世纪90年代,游戏业才真正成熟起来,成为了一种产业。 由于PC机价格非常低而且硬件速度越来越快,游戏逐渐成为人们生活中不可缺少的一部分。游戏产业也逐渐发展成熟。 2.1.2图形硬件的革命 图形硬件的飞速发展是近些年来的事情,部分原因是来自工业方面的压力,例如在军事和医疗方面对于实时图形的需求很强烈,而交互娱乐产业也极大的推动了图形硬件的发展。技术上的因素同样也推动着图形硬件的发展,许多图形算法可以很容易地表达为并行方式,这样硬件执行的效率变得很高。摩乐定律也起了作用,越来越多的晶体管可以集成到一块单独的芯片上。 在所谓的GPU(图形处理器)概念出现以前,特殊的图形硬件只出现在诸如SGI和E&S系统里面,这些硬件价格太昂贵,不过这些公司提供了第一代基于硬件的顶点变换和纹理映 宁 夏 大 学 射的解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。 2.2游戏的意义与内涵 游戏这个名称一直就存在于每个人的日常生活中,如猜拳游戏、猜谜游戏、大地游戏、球类游戏等,林林总总,不胜枚举,甚至于有些流行歌曲把人生也比喻为游戏,好比“一场游戏一场梦” 。因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色。 2.2.1游戏的组成要素 “游戏”,最简单的定义,就是一种供人们娱乐休闲的快乐元素。从更专业的角度形容, “游戏”是具有特定行为模式、规则条件、身心娱乐及输赢的一种行为表现。这种行为表现具备以下4个要素。 行为模式:“游戏”最简单的要素就是游戏有特定的流程模式,这种流程模式贯穿于整个游戏的行为,用户必须依照它的模式流程来执行。倘若一种游戏没有了特定的行为模式,那么就没有执行的行为;在没有执行的行为之后,这个游戏也玩不下去了。举个例子来说,如果猜拳游戏没有了剪刀、石头、布等行为模式,那么这还能叫做“猜拳游戏” 吗?所以不管游戏的流程有多么复杂还是多么简单,一定要有特定的行为模式。 条件规则:当游戏有了一定的行为模式后,接着就必须制定出一系列的条件规则。简单来说,这些游戏的条件规则就是大家必须去遵守的游戏行为守则,只要是大家一致以为的游戏行为,在游戏中,玩家就必须遵守它,如果不遵守这种游戏行为,那么就失去了公平性。如同一种简单的球赛,打球的英文解释可以用PLAY GAME来加以说明,按照英文字面上的解释,它就是执行游戏的行为,而球赛必须有一定的条件规则,并且参与者都要必须去遵守它,不能遵守它就叫作“犯规”。所以不管是什么游戏,它都会具备一组规则条件,在游戏进行的时候才会有足够的公平性。 娱乐身心:一种游戏所带来的娱乐性,关键就在于为玩家所带来的刺激感,这也是游戏的精华所在。简单来说,不管是很多人玩的游戏,还是一个人玩的单机游戏,游戏本身就会存在它的娱乐和刺激性,使得玩家们想要去玩它。 输赢:其实针对游戏而言,输赢是所有游戏的最终目的。一个没有输赢的游戏,也就没有了它存在的意义,如同我们常常接触到的猜拳游戏,说穿了最终目的就是为了分出胜负而己。 一般而言,游戏又可以分为动态和静态两种形态。动态的游戏必须配合肢体动作,如猜拳游戏;而静态游戏则是较偏向思考的行为,如同纸上游戏。然而不管是动态或是静态游戏,只要具备上述4项组成要素,都可以将它称为“游戏”。 2.3俄罗斯方块游戏 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。 但是经过时代的变迁,当初简单却变化无穷的俄罗斯方块游戏如今却已失去了它的市场,究其原因,主要是因为游戏硬件以及技术的革新使得优秀的游戏接二连三地推出,而俄罗斯方块游戏作为一款形式、内容过于简单的游戏势必经受不住时间的冲击的。 现在作者将改写这个固定的游戏模式,通过增加一系列的新功能,开发出一种全新的俄罗斯方块游戏,使游戏用户重新燃起对俄罗斯方块游戏的热爱。 第3章 可行性研究 3.1 设计目的 综合运用在校期间所学理论知识和技能,设计开发俄罗斯方块,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力,为将来实际 宁 夏 大 学 工作打下坚实的基础。 3.2 可行性研究前提 基本需求:系统开发的总体任务是实现游戏的可操作性、美观性、及时性,及适当的功能扩展。 主要开发目标:采用结构化设计方法,开发出一个可操作性、美观性、及时性的游戏,并通过此次软件开发过程全面提高自身的综合素质。 可行性研究所采用的方法和步骤:通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个有一定可玩性的游戏软件。 评价 LEC评价法下载LEC评价法下载评价量规免费下载学院评价表文档下载学院评价表文档下载 尺度:本游戏尽量追求游戏操作的合理性及正确性,但是仍不排除会出现一些偶然性的错误;同时游戏也尽量追求界面的美观性及功能的丰富性,但是基于时间的关系,可能会有极少数的拓展功能不能实现。 3.3 可行性分析 管理可行性: 本游戏设计的目的只在于提高自身实践水平,并不对外发布,因此完全具有管理可行性。 经济可行性:由于本游戏的主要背景是毕业课程设计,不注重直接的经济效益和其后的发展方向,只在注重自身水平和能力的提高,对自身的经济要求也不高,只要有一台电脑便可,所以不用考虑到经济问题。 技术可行性:可用与本游戏的编程语言有VB,VC,Java,Delphi等,考虑到用于编写程序的困难度,和对语言的了解程度,选择JAVA作为编程语言。需要对图形界面设计、事件处理、多媒体、网络编程等有一定了解。 社会可行性:本游戏的开发作为毕业课程设计以巩固先前所学的知识,以个人为单位,仅供个人平常娱乐所用,无须考虑有可能造成的社会影响,不用考虑到法律、版权等的社会因素,所以在这方面是完全可行的。 3.4 结论 综上所述,本游戏软件的技术成熟、完备。各方面均无重大问题,因此本游戏软件可开始着手编写 第4章 俄罗斯方块游戏的设计 这一章是俄罗斯方块游戏的设计,从系统需求分析开始,介绍开发环境和用到的开发工具,系统主要的功能设计,系统的数据流程图。 4.1游戏功能需求 4.1.1游戏界面需求 良好的用户界面设计。本游戏主要有三个界面,一是用于主游戏区的游戏画布,用来显示游戏时运动和落下去的方块,二是用于控制游戏的各种控件以及显现游戏信息的一些组件,这是一个面板,三是进行网络对战时用以显示对方游戏信息的面板。 4.1.2游戏控制需求 方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。 4.1.3图形显示需求 随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,一共设置十关,每关方块下落的速度不同,游戏中方块碰到顶部则游戏结束。 4.1.4音乐播放需求 宁 夏 大 学 本游戏,具备播放背景音乐效果。 4.2 运行环境及系统性能的需求 本游戏对运行环境及系统性能的需求如表3.2所示: 表4.2 游戏对运行环境及系统性能需求分析表 操作系统 Windows98/me/2000/XP/2003 内存容量 64MB 显卡要求 8M 声卡要求 支持DirectX 8.0 声卡 交互工具 键盘/鼠标 CPU 奔腾133以上 光驱 8倍速以上 硬盘空间 400MB 显示器 VGA以上显示器 开发及运行软件 JDK1.5以上版本 4.3 详细设计 4.3.1音效播放控制模块设计 本游戏的音效播放采用剪辑及多线程的方式实现。音频播放需要用到JAVA中的sound 包。首先,利用AudioSystem这个音频工厂的getAudioInputstream()方法从音频文件中取 得一个音频输入流,其次,从这个音频输入流创建一个Clip,然后打开这个Clip。这样, 当需要时,就可以利用Clip中的start()方法播放这个剪辑,重复播放,可以用 setFramePosition(0)这个方法将剪辑的位置重新置为0。 音效剪辑的播放控制流程图如图3.3所示: 开始 满足音效播放条件 Notify音效播放线程,游戏线程进入wait状态 播放音效 Notify游戏线程,音效播放线程进入wait状态 宁 夏 大 学 结束 图4.3 音效播放流程图 4.3.2背景音乐播放控制模块设计 同音效的播放,背景音乐的播放也应当采用剪辑的形式,以方便音乐的循环多次播放,同样,背景音乐播放也要单独的线程进行控制。 前面概要设计提出了一个问题。因为背景音乐采用单独线程播放,当用户选择暂停背景音乐播放时,背景音乐播放线程如果以进入wait状态来暂停的话,则当用户取消暂停时必须还需要一个线程来唤醒它,额外增加一个线程的话,不免浪费系统资源,而且也会增加编写的难度。 从另一个角度来说,背景音乐极可能在玩家的整个游戏过程中都处在播放状态,当暂停时,玩家也随时会取消暂停,因此,可以让背景音乐线程从游戏开始后就一直处在执行状态,如果用户暂停播放,可以让线程转去循环处理检测用户是否取消暂停,当检测到用户取消暂停时,继续播放音乐。 背景音乐播放控制的算法流程如图3.4所示: 开始 背景音乐播放控制线程 否 是否处在 是否接受到 暂停状态 恢复信息 是 否 是 播放背景音乐 接受到暂停信息 暂停播放 结束 图4.4 背景音乐播放控制流程图 宁 夏 大 学 4.3.3旋转方块的设计 旋转方块的出现是随机的,而随着游戏级别的提升,每一关出现的旋转方块的数量也会不同,对于七种方块来说,它们在任何一段时间内出现的概率都是一致的,再者,旋转方块需要两个定时器,定时下落和定时旋转。旋转方块的这个性质要求它必须要两个线程才能控制,但是为了充分利用资源,我们可以利用方块控制线程去控制旋转方块定时下落,然后只需再创建一个线程控制它定时旋转即可。 确定了两个线程共同控制旋转方块,就会出现一个线程协调工作的问题。如果一个新方块出现的时机正好也是旋转方块出现的时机,程序就会出现紊乱,所以必须保证,在同一时间,正常方块和旋转方块只能出现一个。 因为两个线程需要共同控制旋转方块,所以不能用wait()和notify()这两个方法去协调线程,而应当利用其它条件去协调两个线程。 首先,游戏开始后,旋转方块控制线程可以随机休眠一定时间(这个休眠时间应该是随着游戏级别的提升而缩短的)。休眠时间结束后,循环检测正常方块是否已经落下,当检测到方块落下后,马上得到一个新方块,然后开启一个循环,在方块没有落下之前让它按一定的时间频率旋转,成为一个旋转方块。 对于方块控制线程,在方块落下时应该休眠一定数量的时间,以让旋转方块控制线程有得到旋转方块的机会,如果超出这个休眠时间,旋转方块控制线程还没有得到新方块,则可以认为旋转方块控制线程还处在休眠中,方块控制线程得到一个新方块。 相应的算法流程如图4.6和图4.7所示: 宁 夏 大 学 开始 随机休眠一定时间 休眠时间结束 否 检测现有方块休眠一定时间 是否已经落下 是 得到新方块 是 否 方块是否 游戏是否 已经落下 结束 否 是 是否能够消行 休眠一定时间 结束 旋转方块 图4.6 旋转方块控制线程工作图 4.3.4方块的翻转与移动 是否能够消行 是否能够消行 方块的翻转与移动比较容易实现,方块移动只需要改变方块的横坐标或纵坐标,然后重新绘制方块即可。方块翻转也只需要改变方块数据第二维turnstate的值,然后重新绘制方块即可。但是,这里边也会出现一个问题,这何种时候,方块不能再翻转和移动, 很显然,当方块移动到地图的左右边界处,或者落下去后,不能再继续移动;另一种情况就是,当方块要移动的方向被其他方块挡住时,方块不能再移动。 确定方块移动的规则后,接下来就是如何将这种规则用算法表示的问题了。比如,当方块移动的左边界处时,方块不能再继续往左移动了,这个时候,肯定有一个条件成立,那就是方块的横坐标必定是小于或者等于零的。 如果方块的横坐标等于0,方块就不能再移动,那么方块数组的第一列至少有一个值 宁 夏 大 学 为1,这种情况比较简单,但是,如果方块数组的第一列全为0时,也就是说,当方块数组有1的那列碰到边界时,方块才不能移动,这个时候,首次出现1的那列的横坐标为0,而方块数组的横坐标肯定已经小于0了。 假定我们以x 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 方块数组的横坐标,以j记录方块不能移动时,方块数组中首次出现1的那列,当方块不能移动时,x+j的值必定是等于0的。 同理,当方块到达右边界不能移动时,我们可以从方块数组的右边开始检测,记录下首先出现1的那列的值,这个时候,x+j一定是等于14的。 当方块落下后,方块同样不能再移动。这又分为两种情况,一种是要坠下的地方还没有方块,这个时候,只要可以记录下方块数组中最后出现1的那一行,假定那是第i行,这样,只要y+i等于24,就可以认定方块已经落到游戏地图的底部,不能再继续下落。 当要方块下边或者左右有方块时,可以确定下边有方块的那一格在游戏地图中的纵坐标是横坐标或纵坐标是x+j+1或者y+i+1,假定那一格的纵坐标坐标或者横坐标为y或x,那么游戏地图数组中[x+j+1][y]或者[x][y+i+1]这个元素的值必定是2。 综合以上几种情况,我们可以列出方块移动条件判定表,如表5.1所示: 表 4.1 方块移动条件判定表 1 2 3 4 5 6 7 8 是否有阻隔 T T T T T T T F 条 x+j=0||gamearea[y+i][x+j+1]=2 T F T T T F T 件 x+j=14||gamearea[y+i][x+j-1]=2 F T F T F T T y+i=24||gamearea[y+i+1][x+j]=2 F F F F T T T 动 左移动 ? ? ? 作 右移动 ? ? ? ? 下移动 ? ? ? ? ? 大多数的俄罗斯方块游戏的翻转判定条件都比较简单,即方块处在边界处时就不能再翻转,因为这种时候翻转会发生数组越界错误。试想一下,当方块移动到边界处,甚至还没有到边界处时,就不能再翻转了,无疑会给操作带来大大地不方便性。 方块翻转的另一个问题就是,当方块下落过程中,左右两边都有方块,周围的空间不能再容许它翻转,往往很多游戏没有注意到这一点,这就导致,方块翻转之后把原来存在的方块给挤掉了,这个问题本质上也是翻转越界。 为了解决以上问题,游戏设计中应该增加一个对于方块能否翻转的判定以及翻转越界纠正功能。 1(方块翻转判定 如上所述,在两种情况下一种是方块落下去固定住以后,第二种是周围的空间不允许它进行翻转。 第一种情况好办,只要参考方块落下去后不能够再移动的判定即可。 对于第二种情况,在每次方块翻转前,必须首先计算出方块周围的空间,如果空间允许则翻转,否则,不能翻转。 这里面又出现一个棘手的问题,因为七种方块是不规则的,每种方块要求的翻转空间都是不一样的,甚至是在它的不同翻转状态下,所要求的翻转空间也是不一样的,首先想到的自然就是为每一种方块,方块的每一种状态都写一个判定条件,然后根据当前的blocktype和turnstate值,选择哪种判定条件进行判定,但是这样做未免过于麻烦。 宁 夏 大 学 表4.2 方块翻转条件判定表 1 2 3 4 5 6 7 8 落下 T F F F F F F F 田字形方块 T 所 有 长条形方块 1x4形态 T T 条 4x1形态 T 件 其它五种 2x3形态 T T 方块 3x2形态 T 第y行, x、x+3列空 T F 第y、y+1行x、x+2列空 T F 所有 翻转 ? ? ? ? ? 动作 不能翻转 ? ? ? 根据观察,不难发现,七种形态的方块,长条形的方块如果以横条的形态下落,则只有能够下落,就能翻转,如果以竖条的形态下落,那么它翻转后所处的位置必须要有4x1个格子的空间才能够翻转;对于田字形的方块,只有能够继续下坠,就一定能够翻转,所以田子型的方块只要没有落下,就一直能够翻转;而其它五种形态的方块,又有一个共同点,就是它们都有两种翻转状态横向占三个格子的空间,竖直方向占两个空间,另外两种翻转状态横向占两个格子的空间,竖直方向占三个格子空间,如果他们是以横向占三个格子的状态下落,那么只要能下落,就一定能够翻转,如果是以横向两个格子的状态下落,那么在翻转后,周围必须要有3x2个格子的空间。 所以,方块翻转的判定,要分三种情况。第一种情况是方块落下去后不能翻转;第二种情况是对竖直状态出现的长条形的方块进行翻转判定;第三种情况是对除长条形和田字形之外的其它五种以横向占两个格子的状态出现的方块进行翻转判定。 何种情况下方块能够翻转的问题解决了,接下来,我们就应该解决方块翻转后所处的位置的问题了,因为只有事先知道方块翻转后所处的位置,才能够对那个位置的空间范围进行判定,判定它是否能够容纳方块。 可以确定的是,无论方块怎么翻转,都处在方块数组中,也就是说方块必定是在游戏地图中某一4x4个格子的空间范围内。 方块数组在游戏地图中的坐标是确定的,不确定的是方块翻转后到底处在方块数组的哪个位置,为了解决这个问题,我们可以限定方块在方块数组中的存储原则是靠左、靠上,这样,无论翻转怎么翻转,方块数组中第一行和第一列都是有方块的,这样也就确定了方块在方块数组中的位置,也就可以得知方块翻转后在游戏地图中的位置了。 假定方块数组的横纵坐标是x和y,那么,这个位置就是,长条形的方块翻转后所处的那一行是游戏地图的第y行,所占的列是第x到x+3列,长条形和田字形以外的五种方块翻转后的所占的行数是游戏地图的第y和第y+1行,所占的列是第x到x+2列。 所以,如果以上空间有空格子,方块就能够翻转。 2(翻转越界纠正 由上述判定表可以看出,只要方块翻转后所处的空间足够,方块就能够翻转,但是,如果方块翻转后所处的空间不足够,而在它的另一边却有足够的空间呢, 比如,一个方块在它左边正好差一个格子的空间才能够翻转,但是它的右边恰好有一 宁 夏 大 学 个格子的空间,这种情况,如果方块不能够翻转,就不方便用户操作,如果能够翻转,就会发生越界,将已经存在的方块挤占掉。要想实现翻转又不发生越界,那么,就应该在方块翻转后把它往右边移动一个格子,然后再绘制方块,这样,方块就不会挤占掉其它已经固定住的方块了。 同样,方块在边界处时,翻转后不仅可能翻出地图外,还可能发生数组越界,当然,只需要将地图数组定义得大一些,就能够避免数组越界错误,对于方块越界,如果在它的另一边有足够空间,那么,就应该把方块往另一个方向移动适当的单位,纠正方块越界错误。 结合上述判定表,可以列出方块翻转-越界纠正判定表,如表4.3所示: 4.3.5满行消除 JAVA图形类中提供了一个方法,copyArea(int x, int y, int width, int height, int dx, int dy),这个方法的作用是将组建的某一区域复制到由dx和dy指定的水平距离和垂直距离所在的区域。利用这个方法,可以消除满行。 那么,当方块落下去后,如何判断有行需要消除呢, 如概要设计中所述,游戏地图中有方块的区域可以用2表示,当方块落下去后,判断某一行是否全部为2,如果全为2,即表示这一行已满,需要消除,这个时候,就可以利用copyArea这个方法将这一行消去了。 消去一行后,要继续向下检测,如果下一行是满行,消除,否则再往下检测,一直将落下的方块所占的行数全部检测完为止。 假定,以竖直状态落下一个长条形的方块,很显然,方块一共占据了四行。这时候,应该从长条形的方块占据的第一行开始检测,不管期间是否有消行,都必须将长条形的方块所占据的四行全部检测完为止。并且记录下消去的行数,方块消行完成后,增加相应积分。 但是,这里面又会遇到一个问题,因为并不是所有方块所占的行数都一样,方块落下后到底该检测多少行呢,考虑到方块落下后最多占据四行,以及计算机运算的高速性,可以设定每一次方块落下后都往下检测四行。 宁 夏 大 学 方块消行的流程图如图4.13所示: 落下 T F F F F F F F F F F 田字形方块 T 开始 方块落下 结束 检测第一行 是 统计所消行数,是否有消行 消去该行 增加相应积分 否 检测第二行 消去该行 消去该行 是否有消行 是 否 是否有消行 检测第三行 否 是 检测第四行 是否有消行 消去该行 图4.13 方块消行流程图 宁 夏 大 学 所 长条形方块 1x4形态 T T T T 有 4x1形态 T 条 其它五种 2x3形态 T T T T 件 方块 3x2形态 第y行, x、x+3列空 T F F F 第y、y+1行x、x+2列空 T F F F 另一边有足够空间 T F T F 翻转 ? ? ? ? ? 所有 不能翻转 ? ? ? ? 动作 翻转越界纠正 ? ? 表4.3 方块翻转-越界纠正判定表 方块翻转处理的流程图如图4.12所示: 结束 接收到翻转信息 是 方块是否落下 不能翻转 否 否 翻转后是否有足够不能翻转 空间 是 否 翻转后是否越界 直接翻转 是 翻转越界纠正 结束 图4.12 方块翻转处理流程图 宁 夏 大 学 开始 方块下落 否 检测方块是 否已经落下 是 结束 休眠一定时间,让旋 转方块控制线程有得到新方块 得到方块的机会 休眠时间结束 是否能够消行 是 否 旋转方块控制线程 是否得到新方块 图4.7 方块控制线程对旋转方块的控制示意图 第5章 系统的具体实现 界面是系统之间最直接的交互界面,界面的友好性体现了软件设计的质量, 并在很大程 度上决定了软件是否成功。 5.1界面设计 5.1.1用户登陆界面图 是否能够消行 成功界面: 宁 夏 大 学 登陆失败界面: 如图5.1.1和图5.1.2所示 登录界面 宁 夏 大 学 输入 自 动 跳 用户信息转 验 证 否 输入信息是否弹出错误信息合法 图5.1.1 用户登录模块框图 图5.1 用户登陆界面 此JavaScript函数的作用是检测用户登陆的合法性,并确认用户输入了合法的登录名和口是 令。 部分代码: import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; 用户登录到主界面 public class LoginIn extends JFrame{ JTextField f1; JTextField f2; JButton b1; JButton b2; String power;//表示权限 String imgePath = "e:/workspace/GUI/14.gif"; JPanel p5; Image img = Toolkit.getDefaultToolkit().createImage(imgePath); LoginIn(){ Container cp=getContentPane(); 宁 夏 大 学 Label l1=new Label("用户:"); Label l2=new Label("密码:"); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JPanel p4=new JPanel(); p5=new JPanel(){ protected void paintChildren(Graphics g) { g.drawImage(img,0,0,this); super.paintChildren(g); } }; f1=new JTextField(15); f2=new JPasswordField(15); b1=new JButton("登录"); b2=new JButton("重置"); p1.setBackground(Color.orange); p2.add(l1); p2.add(f1); p2.setBorder(new MatteBorder(0,0,0,0,Color.BLACK)); p2.setBackground(Color.ORANGE); p3.add(l2); p3.add(f2); p3.setBackground(Color.ORANGE); p3.setBorder(new MatteBorder(0,0,0,0,Color.BLACK)); p4.add(b1); p4.add(b2); p4.setBorder(new MatteBorder(-3,-3,-3,-3,Color.CYAN)); p4.setBackground(Color.ORANGE); p5.setLayout(new FlowLayout(FlowLayout.CENTER,20,20)); p5.add(p2); p5.add(p3); p5.add(p4); cp.add(p5,BorderLayout.CENTER); b1.addActionListener(new Enter()); b2.addActionListener(new ReWrite()); 宁 夏 大 学 addWindowListener(new winClose()); } public static void main(String[] args) { LoginIn log=new LoginIn(); log.setTitle("系统登录"); log.setSize(600,400); log.setVisible(true); } class Enter implements ActionListener{ public void actionPerformed(ActionEvent e) { if((f1.getText()).equals("admin")&&(f2.getText()).equals("123")) { JOptionPane.showMessageDialog(null, "登录成功~用户权限是adimistrator"); power="adminstrator"; } else if((f1.getText()).equals("snake")&&(f2.getText()).equals("123456")) { JOptionPane.showMessageDialog(null, "登录成功!登录成功~用户权限是user"); power="adminstrator"; } else JOptionPane.showMessageDialog(null, "登录失败,请重新登录~"); } } class ReWrite implements ActionListener{ public void actionPerformed(ActionEvent e) { f1.setText(""); f2.setText(""); f1.requestFocus(); } } class winClose extends WindowAdapter { public void windowClosing(WindowEvent e) { (e.getWindow()).dispose(); System.exit(0); 宁 夏 大 学 } } } 5.1.2 系统主界面 宁 夏 大 学 图5.2 系统主界面 关键代码: 宁 夏 大 学 public class ErsBlocksGame extends JFrame{ //每填满一行计多少分 public final static int PER_LINE_SCORE=100; //积多少分后能升级 public final static int PER_LEVEL_SCORE=PER_LINE_SCORE*20; //最大级数是10 public final static int MAX_LEVEL=10; //默认级数是5 public final static int DEFAULT_LEVEL=5; private GameCanvas canvas; private ErsBlock block; private boolean playing=false; private ControlPanel ctrlPanel; private JMenuBar bar=new JMenuBar(); /*private*/ JMenu mGame=new JMenu(" 游戏"), mControl=new JMenu(" 控制"), mWindowStyle=new JMenu(" 游戏风格"), mInfo=new JMenu(" 信息"); /*private*/ JMenuItem miNewGame=new JMenuItem(" 新游戏"), miSetBlockColor=new JMenuItem(" 设置方块颜色"), miSetBackColor=new JMenuItem(" 设置背景颜色"), miTurnHarder=new JMenuItem(" 升高游戏难度"), miTurnEasier=new JMenuItem(" 降低游戏难度"), miExit=new JMenuItem(" 退出"), miPlay=new JMenuItem(" 开始"), miPause=new JMenuItem(" 暂停"), miResume=new JMenuItem(" 恢复"), miStop=new JMenuItem(" 中止游戏"), miAuthor=new JMenuItem(" 版本:俄罗斯方块1.0"), miSourceInfo=new JMenuItem(" 源代码由Java实现"); private JCheckBoxMenuItem miAsWindows=new JCheckBoxMenuItem(" Windows"), miAsMotif=new JCheckBoxMenuItem(" Motif"), miAsMetal=new JCheckBoxMenuItem(" Metal",true); //主游戏类的构造方法@param titke String,窗口标题 public ErsBlocksGame(String title){ super(title); setSize(365,392); 宁 夏 大 学 Dimension scrSize= Toolkit.getDefaultToolkit().getScreenSize(); setLocation((scrSize.width-getSize().width)/2, (scrSize.height-getSize().height)/2); createMenu(); Container container=getContentPane(); container.setLayout(new BorderLayout(6,0)); canvas=new GameCanvas(20,12); ctrlPanel=new ControlPanel(this); container.add(canvas, BorderLayout.CENTER); container.add(ctrlPanel, BorderLayout.EAST); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ stopGame(); System.exit(0); } }); addComponentListener(new ComponentAdapter(){ public void componentResized(ComponentEvent e){ canvas.fanning(); } }); canvas.fanning(); //setVisible(true); } 5.2程序设计及调试运行 5.2.1 测试的意义及注意事项 软件测试是软件工程中及其重要的一个环节,目的是保证软件的质量。测试的好坏将直 接影响软件的好坏,进行测试可以找出其中的错误及不足加以改进,从而得到一个高效、可 靠的系统。进行软件测试主要作用有以下几点: 1(软件测试是为了发现程序中的错误而执行程序的过程。 2(好的软件测试方案是极可能发现尚未发生错误的方法。 3(程序的测试是发现了至今尚未发现的错误。 软件应从多角度进行测试和分析,这样才能找出其中错误的地方。测试的时间最好找一 些与设计系统无关的人员,或者分析人员。因为在开发软件的时候,开发人员已经形成了自 己的思维定势,在测试的时候始终受到这种思想的束缚,很难找出其中的错误而与设计无关 的人员和那些分析人员很容易找出错误所在。 在程序调试过程中一定要耐心仔细,一个细微的错误将会导致整个功能不能实现会浪费 宁 夏 大 学 很多的时间来修改。应在以下几方面加以注意: ?语法错误 语法错误是经常碰到的错误。例如,命令拼写错误或传递给函数的参数不正确都将产生错误。语法错误可能导致不能继续编写代码。 ?逻辑错误 逻辑错误通常可能是潜在和难以检测的。当有因键入错误或程序逻辑流程引起的逻辑错误,可能会成功运行,但产生的结果却是错的。例如,当本应使用小于符号比较数值,但却使用了大于符号时,那么将返回不正确的结果。 ?运行时错误 运行时错误是在执行过程中指令试图执行不可能的动作而导致的,必须纠正运行时产生的错误,这样才能保证软件运行的可靠性。 本游戏在开发过程中采用了多种有效的措施保证软件质量,例如,边界处旋转、游戏翻转越界纠,等等,极大地方便了用户操作,但是系统中通常可能还存在着一些错误和缺陷,因此,游戏必须要经过反复的运行测试,尽最大量将bug减到最少。 5.2.2测试的步骤 通常,软件测试的过程可以划分为单元测试、集成测试、确认测试和系统测试,本游戏将以这四个步骤进行测试。 1(单元测试 单元测试又称为模块测试,是针对软件设计的最小单位——程序模块进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。可以应用人工测试和计算机测试两种不同类型的测试方法。 单元测试需要从程序的内部结构出发设计测试用例,即采用白盒测试技术。多个模块可以平行独立地进行测试。 在这个测试过程中所发现的往往是编码和详细设计中的错误。传统的最小可编译单元通常指模块、函数或子程序等,而在面向对象技术中通常是指类。 单元测试的重点是模块接口测试、局部数据结构测试、重要的执行通路测试、出错处理通路测试、边界条件测试。 2(集成测试 集成测试分为子系统测试和系统测试。 子系统测试是把经过测试运行正常的模块放在一起形成子系统后再测试。这个步骤着重测试模块的接口,测试模块之间能否相互斜体哦以及通信时有无问题。 系统测试就是把经过测试运行正常的子系统组装成完整的系统后再进行测试。系统测试是测试整个软件和硬件系统,验证系统是否满足规定的要求。这个阶段发现的问题往往是需求说明和软件系统设计时产生的错误。 一般,集成测试采用渐增式组装方法组装系统,渐增式组装方式有自顶向下和自底向上两种继承策略。 自顶向下集成是从主模块开始,沿着程序的控制层次向下移动,逐渐把哥哥模块结合起来。在把附属于主模块的那些模块组装到程序结构中去时,或者使用深度优先的策略,或者使用宽度优先策略。 深度优先策略是先组装在软件结构的一条主控制通路上的所有模块。选取一条主控制通路取决于应用的特点,并且有很大的任意性。而宽度优先的结合方法是沿软件结构水平地移动,把处于同一个控制层次上的所有模块组装起来。 自底向上集成从原子模块开始组装和测试。因为是从底部向上结合模块,总能得到所需 宁 夏 大 学 的下层模块处理功能,所有不需要存根模块。 3(确认测试 确认测试是在软件开发过程结束时对软件进行评价,以确认它和软件需求是否一致的过程。确认测试也称验收测试,其目标是验证软件的有效性。 4(系统测试 系统测试,是将通过确认测试的软件作为真个基于计算机系统的一个元素,与计算硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。 系统测试的目的在于与系统的需求定义进行比较,发现软件与系统定义不符合或与之矛盾的地方。系统测试的测试用例应根据需求分析规格说明来设计,并在实际使用环境下运行。 5.2.3 测试结果 测试过程中,本游戏发现了一些错误,经过修正,最后本游戏完全能够正常运行。至此,游戏初级版本的开发工作结束。 第6章 结束语 经过一个月的努力,本游戏的开发工作至此告一段落,游戏能够正确运行,虽然说本游戏还只是一个初级产品,但是比起很多俄罗斯方块游戏,它的功能算是比非常丰富的,界面也具有一定的美观度,可以说取得了初步性的成功。 这一个月来,我学到了很多东西。先前,对于JAVA,基本上还停留在理论阶段,但是通过这一个月的努力,完成了代码超过数千行的俄罗斯方块游戏,在JAVA学习方面,我能够感觉到自己的进步。 例如,JAVA是纯面向对象的语言,通过这次的JAVA游戏开发,我深刻体会到了面向对象的编程思想,本游戏中设计的各个模块的独立性比较高,这就是我对面向对象编程思想体会的一个应用。 还有,JAVA这门技术,很多要用到的应用程序接口,都被封装在了某个类里边,所以,学习JAVA,就是学会如何去用它已经存在的某个接口,而不是去研究如何实现这个接口。这也造成了JAVA的类库非常庞大,即使是娴熟的JAVA开发人员要记全它的API也是不可能的,而初学者乍看下去总会产生一种望而生畏的心理。这一个月的开发工作,让我对JAVA的类库有了个基本的了解,使我在以后的JAVA开发工作中知道如何去查找自己所需要的API。 当然,在这期间,我也遇到了不少问题,如方块的绘制上,曾出现过太闪烁,刷新不彻底等问题。还有,图像截屏传输时编译器总是提示端口号已经被占用,经过检查,原来是我每次截屏发送图像数据时,都重新构造端口号,这是因为变量定义的错误,将变量定义成全局变量,问题就解决了。 总得来说,大的问题没有遇到,遇到的都是一些逻辑、算法上以及变量定义的错误问题,通过程序测试,这些问题都很容易地解决了。 宁 夏 大 学 致 谢 毕业设计是大学里的最后一堂课,从开始进入课题研究到论文顺利完成的两个周的时间里,我经历了大学期间最为难忘的一段时光。在这段时间里,我学到了很多以前不曾接触的东西,这两个月经历对我未来的人生都会有很大的帮助和影响。 首先衷心感谢我的指导老师姜柳老师给予我的无微不至的关怀和细心的指导。在设计过程中姜老师为我们提出了许多宝贵的意见和建议,在此我要由衷的向姜老师致以最衷心的感谢和深深的敬意。 在此过程中同学们也给予我很大帮助,感谢我的同学们。在我遇到的一个又一个问题时同学们都热心的帮助我,帮我分析和我探讨,提出了许多解决问题的好方法和建议,使我最终解决了一个又一个问题,感谢我的同学们。 由于我的学识有限,加之时间仓促,文中不免有错误和待改,不足之处,真诚欢迎各位师长、同学提出宝贵意见。最后,祝愿所有的教师和同学们,愿你们身体健康,工作顺利~ 参考文献 [1] 计世咨询(CCW Research).2006制药信息化:在消化调整中缓行[J]. 中国制造业信息化, 2006(12):33. [2] 袁美建. 基于JSP的B/S动态网站开发及数据库连接.[J].计算机技术与发 展,2007,17(06):23-27. [3] (美) R.Klemm, N.Singh. Enhancing Java Server Avilability [J]. Software Practice&Experience. 2008,10(21):89-92. [4] Jeanne W.Ross, Michael R.Vital . The ERP Revolution:Surviving vs. Thriving [J]. Information Systems Frontiers. 2008:233-241 [5] 谷宝磊等. 基于B/S结构的企业进销存管理系统[J].附件电脑,2008, (12):8-11. [6] 王玉珍. 我国EPR应用现状分析[J]. 办公室自动化. 2008,(14):46-47. [7] 黄理,李积善.用JSP轻松开发Web网站[M].希望电子出版社,2006,119-162. [8] 刘欢,廖其龙. 我国企业发展与实施ERP的现状分析[J] .攀枝花学院报. 2007,(02): 51. [9](美)Karl Avedal , Danny Ayers, Timothy Briggs. JSP编程指南[M]. 电子工业出版社, 2004,47-125. [10](美)Mark Linsenbardt. JSP在数据库中的应用与开发[M]. 希望电子出版社, 5,210-236. 200 [11] Dianne Phelan,Building a simple web database application[C].IEEE International Professional Communication Conference, 2004, 79-86. [12] 田辉等. 基于Hibernate的进销存管理系统的设计与实现[J]. 机械工程与自动化, 2008, (02):2-6. [13](美)Karl Avedal,Danny Ayers,Timothy Briggs.JSP编程指南[M].电子工业出版 社,2006,47-125.
本文档为【java语言设计俄罗斯方块(含代码)精要】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_729658
暂无简介~
格式:doc
大小:184KB
软件:Word
页数:43
分类:
上传时间:2017-09-30
浏览量:120