首页 » 技术分享 » Java 小游戏(骑士大战魔王)

Java 小游戏(骑士大战魔王)

 

小组完成的java期中作业(也是我们第一次团队合作做的小程序,总体感觉不错分享一下)

总体架构是我们的组长,非本人,本人负责跑步模块和欢迎界面



前  言
这是第一次使用java语言和Myeclipse集成开发环境进行多人协作开发一款小游戏,其实,我之前就想让多个人开发一个小程序或软件。毕竟,以后到公司去,开发任何的软件都不是一个人能完成的,如何从现在开始就锻炼大家的团结协作的能力显得非常重要,如果能将多个人的力量有效地整合,就能实现1+1大于2的效果,否则,就无法进行软件的开发。即使一个人的能力很强,如果不能学会与人协作,在这样的社会恐怕不能够生存下去。
本次开发的游戏是RPG(角色扮演)游戏,这样的游戏我们经常见到。本来老师要求是文字版的RPG,我想尽量接近通常玩的那种游戏,尽量少使用文字,当然,如果以目前的知识无法实现的,可以用文字来描述。我们应该以高标准来要求自己,这样才能真正的锻炼自己。
1. 任务分工:(暂定)
张**(组长):负责整体的架构设计及主游戏模块。
房*(组员):跑步模块及游戏介绍模块。
南**(组员):智力闯关模块及帮助模块。
白*(组员):飞镖模块及地图模块。
2. 对所有成员要求:
1).小组成员必须按时完成各自的任务。
2).设计上与技术上有问题的先自行解决(看书、上网查),如不能解决的集体讨论解决。有其它的问题及时提出来!
3).必须写文档(写把各自模块的整体设计用UML图或Viso画的图(尽量不要只是简单的语言叙述)表达出来),学会用面向对象的思想来来设计,采用模块化的思想分解模块。(设计原则与设计模式能用的用)
4)每个类必须有类说明,每个函数也必须有函数说明,函数的具体设计也必须有必要的注释。
5)如果不能遵守规定或要求的可以提前退出,不强留。
(注:即使不会写代码,也没关系,只要一能用UML图或其他的图等表达出自己的设计思想及具体的实现设计也行)
3. 说明:
   运行环境:Myeclipse集成开发环境,jdk 1.6版本。
   使用语言:Java语言。
   版本控制:SVN进行版本控制。
   代码管理:Google Code 进行上传下载以实现多人同时开发。
一. 需求分析:  
1.1 游戏背景:
时代:剑与魔法的中古骑士时代。
国家:神圣的卡拉斯王国。
社会结构:卡拉斯王国是由多数农民和少数骑士所组成的王国,因此没有和魔王对抗的能力,
背景介绍:
卡拉斯王国的统治者是现任的国王卡拉斯七世,但由于由于受到魔王的危害,使得王国受到了威胁,整个王国实际上被魔王控制,小公主已经在上一次魔王手下的来袭时被抓走了。
一天,在一个残破的村庄,一名有名骑士的妻子生了四个孩子,三个男孩,一个女孩,据村里人说:这四个孩子可能是神之子,他们从小就各个力大无比、与众不同。他们分别是:
人物角色:恶灵骑士、幻影骑士、火龙骑士、玉女骑士。
 当他们长到十几岁时,父母告诉他们整个王国都被魔王所控制,国王和公主都被软禁。于是,他们立志要打败魔王,拯救自己的国家。
但他们现在年纪还小,且实力还无法与魔王抗衡。
必须先进行训练(跑步、智力闯关、飞镖练习),获得一定的体力值、智力值及武艺值后,才能出去征战,夺回被魔王占领的土地。要想打败魔王,必须先取得传说中的勇者之剑及勇者之铠。勇者之铠被放置在大陆西边的神殿里,那里已经被魔王的部下所占领了;勇者之剑则要取得大陆南边火山里的金属,再交给老铁匠来打造,老铁匠被魔王绑在大陆东边的暗室里。骑士先来到大陆西边的神殿,打败了占领此地的魔王手下,取得了勇者之铠。接下来南边的火山,在通过了迷宫洞窟的考验后,找到了可以打造勇者之剑的神秘金属。带着神秘的金属去解救被绑的老铁匠,将神秘金属交给他,就可以打造出勇者之剑。有了勇者之剑和勇者之铠之后,前往魔王的宫殿与魔王展开决战,在打败了魔王救回公主后,使王国恢复了和平,而骑士也和公主结婚成为下一任的国王。
1.2游戏设置:
可选人物角色:恶灵骑士、幻影骑士、火龙骑士、玉女骑士。
人物成长等级:0-13。
   普通装备:铠甲、盾牌、头盔、战靴、利剑、魔刀等。
             (这些装备可以在店铺使用金币购买)
   特殊装备:勇者之剑、勇者之铠。
   生存值:体力值(血量)、智力值(防御力)、武艺值(攻击力)。
           (体力值越高,血量越多;
            智力值越高,防御力越高。
            武艺值越高,攻击力越高)
   训练内容:跑步(获得血量值)
            智力闯关(获得防御值)
            飞镖练习(获得攻击值)
   地图:大陆西边(放着勇者之铠)
          大陆南边(铸造勇者之剑的金属)
          大陆东边(铸剑师)
          大陆北边(魔王的的宫殿)
          地图如下:(找个游戏地图)

1.3.功能需求:
A.任务整体分为两大块:
1) 训练阶段(跑步、智力闯关、飞镖练习)。
2) 征战阶段(到西边获取勇者之铠、到南边获取铸造勇者之剑的金属、到东边解救铸剑师、到北边大战魔王)。
B.设计需求:(单机版窗体显示)
1)显示各模块的窗体设计。
2)读文件或读数据库中数据的模块设计。
3)加载音乐的模块。
4)不同人物及资源类的设计。
C.用例图:

 




D.功能模块图:


二 、总体设计

1. 架构设计:
1) 采用MVC的架构模式
A. 包UI(视图、界面层):只负责界面的显示。
B. 包Business(业务逻辑层):核心业务的处理。
C. 包DataAccess(数据访问层):读写数据。
2) 文件组织结构:

2. 业务处理流程图:

3. UML图:
MVC架构图

A. 主模块设计:

B. 训练模块:
1)跑步模块:



 2)飞镖模块:

3)智力模块


 三. 详细设计:
1. UI包:
(1).CommonFrm类:
公共窗体,其他窗体都继承自它,保持窗体的一致性,其设置了窗体的大小和显示位置。
(2).JMainMenuFrm类:
显示游戏主菜单,包括:新建游戏、加载游戏、游戏设置、游戏帮助及退出按钮。
(3)JPlayGameFrm类:
主游戏显示窗口,主要显示游戏。
(4)JLaborTrainFrm类:
体力训练模块(跑步)界面。
(5)JIntelligenceTrainFrm类:
    智力训练界面(走迷宫)界面。
(6)MartialArtsTrainFrm类:
    武艺训练(射击)界面。
(7)JSettingFrm类:
    游戏设置界面。
(8)JSkillTraining类:
   选择开始主游戏还是个训练的界面。
(9)JGameDescription类:
    游戏简介。
2. Business大包:
A. 输入管理包(Business.Input)
(1).InputManager类:负责主游戏的键盘输入处理。

构造方法摘要

InputManager() 
          默认构造方法

InputManager(JMainGamePanel contentPanel, Knight knight) 
          带主面板类及骑士对象的构造方法

InputManager(Knight knight) 
          带骑士对象的构造方法

方法摘要

 Knight

GetKnight() 
          获得当前骑士对象

 boolean

IsFightPressed() 
          是否按下攻击键

 boolean

IsMovePressed() 
          是否按下移动键

 void

keyPressed(java.awt.event.KeyEvent e) 
          按键按下处理事件

 void

keyReleased(java.awt.event.KeyEvent e) 
          按键释放处理事件

 void

keyTyped(java.awt.event.KeyEvent e) 
          按键类型

(2) RunKeyDown类:跑步模块的输入类

 boolean

IsMovePressed() 
           是否按下按键

 void

keyPressed(java.awt.event.KeyEvent arg0) 
           按键按下处理事件

 void

keyReleased(java.awt.event.KeyEvent arg0) 
              按键释放处理事件

 void

keyTyped(java.awt.event.KeyEvent arg0) 
             按键类型

B. 面板管理包(Business.PanelManager)
(1).JMainGamePanel类:负责主游戏的面板业务逻辑,通过重写paintComponet(Graphics g)方法,来加载显示的界面。

构造方法摘要

JMainGamePanel(JPlayGameFrm playFrm, boolean isLoad) 
          构造方法(初始化游戏面板)

 

 

方法摘要

 void

display() 
          重新显示游戏界面

 void

drawBackGround(java.awt.Graphics g) 
          绘制背景

 void

drawGameOver(java.awt.Graphics g) 
          绘制人物死亡

 void

drawVictory(java.awt.Graphics g) 
          绘制胜利的场景

 Knight

getKnight() 
          获得当前骑士

 boolean

IsLive() 
          骑士是否还活着

 boolean

IsLivedemon() 
          当前的妖怪是否全死了

 boolean

isLoadData() 
          是否加载游戏

 void

NextGate() 
          下一关

 void

nextPerson() 
          玩家总共有三条命,下一条命

 void

paintComponent(java.awt.Graphics g) 
           

 void

readAtk() 
          读取攻击值

 void

readDfe() 
          读取防御值

 void

reSet() 
          重置

 void

reStart() 
          重新开始

 void

saveGame() 
          保存游戏

 
C. 人物类管理包(Business.PersonFile)
(1).Person类:

构造方法摘要

Person() 
           

 

 

方法摘要

 void

drawLevel(java.awt.Graphics g) 
           绘制等级

 void

DrawPerson() 
          绘制人物

 void

DrawWeapon() 
          绘制武器

 int

GetVit() 
          获得生命力

 void

MoveDown(int y) 
          人物下移

 void

MoveLeft(int x) 
          人物左移

 void

MoveRight(int x) 
          人物右移

 void

MoveUp(int y) 
          人物上移

 void

SetVit(int newVit) 
          设置生命力

 

 

 

(2).Knight类:

构造方法摘要

Knight() 
          默认构造方法

 

Knight(JMainGamePanel panel) 
          带参构造方法(初始化)

 

 

方法摘要

 void

actionChanged() 
          人物移动,改变显示图片,并设置步长

 void

addScore(int x) 
           

 void

changeWeapon(int weaponType) 
          换武器

 void

drawAttack(java.awt.Graphics g) 
          绘制攻击值

 void

drawBlood(java.awt.Graphics g) 
          绘制血量

 void

drawDefense(java.awt.Graphics g) 
          绘制防御值

 void

drawDied(java.awt.Graphics g) 
          绘制死亡状态图

 void

drawFight(java.awt.Graphics g) 
          绘制攻击画面

 void

drawGetHurt(java.awt.Graphics g) 
          绘制受伤状态的png图

 void

drawLevel(java.awt.Graphics g) 
          绘制等级

 void

drawPerson(java.awt.Graphics g) 
          绘制骑士

 void

drawPhoto(java.awt.Graphics g) 
          绘制人物大头贴

 void

drawPlace(java.awt.Graphics g) 
          绘制地点文字

 void

drawScore(java.awt.Graphics g) 
          绘制分数

 void

drawWeapon(java.awt.Graphics g) 
          绘制武器

 void

fight() 
          攻击(切换效果图及人物状态)

 java.awt.geom.AffineTransform

flip(javax.swing.ImageIcon icon, int x, int y) 
          实现图像的水平翻转

 int

getAtk() 
          获得攻击力

 int

getDfe() 
          获得防御力

 int

getDiedNum() 
           获得死亡数

 int

getDirection() 
           获得人物的方向

 void

getHurt() 
          是否受伤

 boolean

GetisFight() 
           是否在攻击

 boolean

GetisGethurt() 
           是否受伤

 boolean

getIsVictory() 
           是否胜利

 int

getLevel() 
          获得人物等级

 int

getPersonNum() 

获得人物数
           

 int

getScore() 
          获得分数

 int

getWeaponType() 
           

 int

getX() 
           获得X坐标

 int

getY() 
           获得Y坐标

 void

improveLevel() 
          人物等级提升

 void

improvevit(int vit) 
          提升生命力(血量)

 boolean

IsOver() 
           是否游戏结束

 boolean

IsPersonsub() 
           

 void

MoveDown(int y) 
          人物下移

 void

MoveLeft(int x) 
          人物左移

 void

MoveRight(int x) 
          人物右移

 void

MoveUp(int y) 
          人物上移

 void

setAtk(int atk) 
          设置攻击力

 void

setDemon(Demon[] demo, int num) 
           

 void

setDfe(int dfe) 
          设置防御力

 void

setIsPersonSub() 
           

 void

setLevel(int level) 
          设置等级

 void

setPerson(int x) 
           设置人物数

 void

setPosX(int x) 
           设置X坐标

 void

setPosY(int y) 
           设置Y坐标

 void

setScore(int score) 
          设置分数

 void

setVictory(boolean isvic) 
           设置是否胜利

 void

StateRun() 
          静态图的转换

 void

StaticState(java.awt.Graphics g) 
          绘制不动时的图片

 void

subVit() 
           减血量

 

(3).Demon类:

构造方法摘要

Demon() 
          默认构造方法

 

Demon(JMainGamePanel panel, int P_posx, int P_posy, int starttime) 
          构造方法

 

 

方法摘要

 void

drawPerson(java.awt.Graphics g) 
          绘制小恶魔

 java.awt.geom.AffineTransform

flip(javax.swing.ImageIcon icon, int x, int y) 
          实现图像的水平翻转

 void

getKnightPosXY(int x, int y) 
          设置骑士的XY坐标

 int

getPosX() 
          获得X坐标

 int

getPosY() 
          获得Y坐标

 int

getSpritetype() 
          获得妖怪类型

 boolean

IsOver() 
          游戏是否结束

 void

recover() 
          复活

 void

Run() 
          妖怪的状态(静止、走、攻击、受伤)

 void

setFullBlood() 
          设置满贯血量

 void

setKnight(Knight knight) 
          设置骑士

 void

setPosX(int x) 
          设置X坐标

 void

setPosY(int y) 
          设置Y坐标

 void

setspritetype() 
          更改妖怪

 void

setspritetype(int x) 
          设置妖怪类型

 void

spritegetHurt() 
          判断妖怪是否受伤

 void

subVit() 
          血量减少

D. 资源管理包(Business.ReourceManager)
(1).ResourceManager类:

构造方法摘要

ResourceManager() 
           

 

 

方法摘要

 javax.swing.ImageIcon

GetImage(java.lang.String imageName) 
          获得图片

 java.awt.Image

GetImage1(java.lang.String imageName) 
          获得图片

 

(2).SoundManager类:

构造方法摘要

SoundManager() 
           

 

 

方法摘要

 void

bgMusic() 
          功能:背景声音设置

 void

CloseGmMusic(java.lang.String str) 
          关闭音乐

static boolean

isGameMusic() 
          是否开启游戏音乐

 boolean

isOpenBgMusic() 
          是否播放背景音乐

 void

PlayGmMusic(int soundType) 
          播放音乐

 void

PlayGmMusic(java.lang.String str) 
          播放音乐

 

(3).FileManager类:

构造方法摘要

FileManager() 
           

 

 

方法摘要

 void

clearData(java.lang.String name) 
           

 void

readData(int[] data, int n) 
           

 int

readData(java.lang.String name) 
           

 java.lang.String

readfile(java.lang.String name) 
           

 void

writeData(int[] data, int n) 
           

 void

writeData(java.lang.String name, int data) 
           

E. 换武器包(Business.WeaponBehaviour)
(1).ChangeWeapon接口

方法摘要

 int

getWeaponType() 
           获得武器类型

 void

setFightEffect(int fightEffect) 
           设置武器使用效果

 void

setWeapon() 
           设置武器

 void

setWeaponEffect(int i) 
           设置武器效果

 void

setXY(int x, int y, int direction) 
           设置武器显示的X、Y坐标

 void

useWeapon(java.awt.Graphics g) 
          换武器接口

 

(2).AxeWeapon类:

实现以上接口。

(3).KnifeWeapon类:

实现以上接口。

(4).HammerWeapon类:

实现以上接口。

(5).Weapon类:

方法摘要

 int

getWeaponType() 
           获得武器类型

 void

setFightEffect(int fightEffect) 
           设置武器效果

 void

setWeapon() 
           设置武器

 void

setWeaponEffect(int i) 
           设置武器效果

 void

setWeaponType(int type) 
           设置武器类型

 void

setXY(int x, int y, int direction) 
           设置武器显示坐标

F. 跑步训练包(Business.LaborTrain)
(3) RunPanel类:

构造方法摘要

RunPanel(JLaborTrainFrm labor) 
          RunPanel 构造函数

 

 

方法摘要

 void

closePanel() 
          关闭窗口

 void

CompareScore(int score) 
          更改排行榜

 void

display() 
          重绘

 void

drawBackGround(java.awt.Graphics g) 
          绘制背景

 void

drawBlood(java.awt.Graphics g) 
          绘制血量

 void

drawCoins(java.awt.Graphics g) 
          绘制金币数量

 void

drawDistance(java.awt.Graphics g) 
          绘制距离

 void

drawJinbi(java.awt.Graphics g) 
          绘制金币图片

 void

drawPaiHangBang(java.awt.Graphics g) 
          绘制排行榜

 void

drawPerson(java.awt.Graphics g) 
          绘制人物

 void

drawShitou(java.awt.Graphics g) 
          画石块

 void

drawSun(java.awt.Graphics g) 
          画太阳

 void

drawZhangai(java.awt.Graphics g) 
          画障碍物

 void

init() 
          变量初始化

 void

MoveDown() 
          下蹲

 void

MoveJump() 
          跳

 void

paintComponent(java.awt.Graphics g) 
          (non-Javadoc) Title: paintComponent Description:

 void

PlayGame(java.awt.Graphics g) 
          游戏开始于暂停

 void

setBackGround(java.lang.String background) 
          设置背景

 void

setPerson(java.lang.String person) 
          设置人物

 void

storeScore(int score) 
           

G. 智力训练包(Business.Intelligence)
(1) showinteligence类:

方法摘要

 void

display() 
           

 void

drawmigongPhoto(java.awt.Graphics g) 
           

 void

drawpeoplePhoto(java.awt.Graphics g) 
           

 void

drawzhangaiwu(java.awt.Graphics g) 
           

 void

movedown() 
           

 void

moveleft() 
           

 void

moveright() 
           

 void

moveup() 
           

 void

paintComponent(java.awt.Graphics g) 
           

 void

storeScore(int score) 
           

H. 射箭训练包(Business.MartarialArt)
(1)主要的类和接口:
      武艺训练窗体类:Class JMartialArtsTrainFrm{};
  武艺训练面板类:Class JMartialArtsTrainPanel{};
  接口:interface Draw{};
(2)主要的方法有:
  2.1构造方法public JMartialArtsTrainPanel(){};
       
     2.2飞镖的计时器
      timer1.schedule(new TimerTask() {

2.3 盘的计时器
timer2.schedule(new TimerTask() {
 2.3 绘制骑士最后输赢状态
public void drawGame(Graphics g) 
2.4 判断飞镖是否可以移动
public boolean JianMove() 
2.5 设置计分制,飞镖射击靶数等
public void drawValue(Graphics g) 
2.6 显示当前分数
public void drawScore(Graphics g) 
  2.7从JPanel派生子类,复写父类中paintComponent(Graphics g)方法。
@Override
protected void paintComponent(Graphics g) 

3. DataAcess包:
(1). 加载文件类(LoadImage)
主要方法

方法摘要

 java.awt.Image

loadImage(java.lang.String name) 
           

 javax.swing.ImageIcon

LoadImageIcon(java.lang.String name) 
           

 (2). 加载音乐类(LoadMusic)

方法摘要

static void

closeMusic() 
           

static boolean

isBgMusic() 
           

static boolean

isGameMusic() 
           

static void

playMusic(java.lang.String str) 
           

static void

setBgMusic(boolean bgMusic) 
           

static void

setGameMusic(boolean gameMusic) 
           

(3). 读文本文件类(ReadData)

 

方法摘要

 java.lang.String

read(java.lang.String name) 
           读字符串数据

 void

readData(int[] a, int n) 
           读整型数组数据

 int

readData(java.lang.String name) 
           读整型数据

 

(2)写文本文件类(WriteData)

方法摘要

 void

clearData(java.lang.String name) 
           清除数据

 void

write(int value) 
           写字符串数据

 void

writeData(int[] data, int n) 
           写整型数据

 void

writeData(java.lang.String name, int data) 

写整型数据

四. 测试与实现:
1. 欢迎界面


     2、游戏主菜单界面


新建游戏,进入游戏简介

3. 游戏选择菜单界面


4. 主游戏界面


5. 跑步训练游戏界面

6. 射箭训练游戏界面

7. 智力训练游戏界面

8. 游戏设置界面

9. 帮助界面

五. 总结:
**的总结:
通过对RPG游戏的开发,使我学到了很多东西,但我认为最重要的是如何多人协作共同开发一款软件,这是最重要的东西,因为现在的软件的都是多人同时并行开发,没有单打独斗的软件了,学会与人协作就显得十分重要了。如何有效的协调每个人的任务,如何使得四个人相加的结果大于4.这是一门很深的学问,还需要继续学习。但我觉得我们这一组,不管是任务分工,还是沟通交流都还不错,大家也都很尽力。从最后完成的作品来看,效果还不错。
我们在软件的架构初期,就用了MVC这样的好的框架,这为后面的不同类之间的访问和协调都提供了好的框架基础。这一点我觉得做的比较好。也有效的分装了变化,为软件的扩充打下了坚实的基础。在软件的设计过程中也是遇到了各种问题,从最初的什么都不会,到遇到各种困难然后逐一解决,再到最后完成了整个软件,在这其中有最初的BUG到处有的痛苦、也有解决了某个问题时的激动等酸甜苦辣。正是由于我们不惧困难,坚持不懈,有着不解决它就誓不罢休的精神,才使得我们坚持到最后,并很好地完成它。当然,学到的东西只有自己清楚,不光是java的技术,更是软件设计及沟通协作的思想和技巧。
*的总结:
    通过这次小组一起开发RPG游戏,总体感觉学了不少知识,一些通过组长的讲解整体架构和参看组长的代码,另外通过自己查找资料,感觉组长的整体架构非常好,同时也感觉到java语言编程比较容易上手,更加增加我对java语言的学习兴趣。 在编写代码过程中遇到过不少的问题,通过不段的思考,反复修改和寻求组长等组员帮助,最终解决了问题。感觉在小组中,相互之间学到很多,而且编起代码来更有激情,看到了别人的编程思想,学习他人,改进自己,学习非常高效。
**总结:
    这次RPG游戏的制作,非常的感谢组长的努力,为我们的整体构架打下了非常好的基础,运用了mvc架构方式,第一次了解到,感觉整体架构非常清晰,修改和添加都非常容易,是一个非常好的架构模式,并且在主框架下,用到了组长所写的的一些函数,使我的智力模块的编写如雨得水,通过此次的RPG游戏编写,熟悉了封装类的实现,不仅使代码非常清晰,而且容易读懂,这次的编写让我对java产生了深深的兴趣,更会激励我在未来的路上好好学习    
*总结:
飞镖模块的整体设计过程还算是比较顺利的,没有什么过多的算法,就只要实现分数的计算就行。在一开始还没有学习Java Swing图形用户界面的时候,觉得游戏无从下手,在组长已经设计好整个框架的时候还是不知道怎么做,我的模块也就做的有点晚了,开始只实现了飞镖的移动,盘没有设置成移动的,游戏玩起来玩家只可以控制飞镖的发射,操作是否进行下一轮的游戏,而且分数都是随机生成的,这样一来,感觉整个游戏失去了趣味性。后来在组长的审查和小组讨论后,对游戏做了进一步改进,首先让盘也动起来,然后让玩者控制什么时候发射飞镖,并且可以对飞镖的速度进行操控,这样便使得游戏玩着更有趣了。整个飞镖模块的游戏界面友好,符合主题,基本功能也实现了。期间遇到了各种各样的问题,但是在请教我们的组长和其他成员之后,问题得到了解决,通过这些错误的修改,个人的分析能力也得到了加强。对于我们小组的整个RPG游戏设计,由我们组长精心策划,为我们设计出了MVC这样好的框架,并为大家分配好了每个人的任务,我们都在组长的指导下顺利的完成了我们的任务。以后希望还会有这样的合作学习,向大家学习更多的东西,不断扩展自己的知识面。

软件的优点:有漂亮的图形界面,有很好的架构设计,用户体验较好,功能多样以满足不同玩家的需求,有游戏帮助及游戏设置等完善的功能等。
软件的缺点:部分功能还未实现,如商店购买装备等。有些地方还可以进一步改进。
    总体而言,软件较好的完成了功能需求!***


源代码:http://download.csdn.net/detail/fangxin205/7337163

转载自原文链接, 如需删除请联系管理员。

原文链接:Java 小游戏(骑士大战魔王),转载请注明来源!

0