冒险岛小游戏

1.1游戏简介

   基于Java面向对象编程、使用greenfoo等工具设计的一款冒险岛小游戏,谨以此作献给那个儿时的童年。(如需要可自取冒险岛小游戏)。

1.1.1游戏背景

     欢迎来到我们精彩的冒险游戏世界!在这个充满挑战和惊喜的世界里,你将扮演一位勇敢的骑士,踏上一段充满奇幻和刺激的冒险之旅。然而,这个世界并不太平,到处都潜伏着各种怪物和危险,它们正等待着阻止你完成冒险任务。但别害怕,你拥有强大的技能和勇气,还有各种道具可以帮助你战胜困难,最终实现自己的目标!

1.1.2游戏规则

在这个游戏中,你将扮演角色,通过左右箭头键控制角色左右移动,上箭头键可使角色跳跃,空格键能发动攻击并发射雪球同时播放攻击音效。冒险中会发现散布世界的金币,碰到可获 25 分,且会随机生成新金币,有一定延迟。初始拥有 100 点生命值,受怪物攻击会减 5 点生命值且被击退,生命值为 0 则游戏失败,角色消失,但可通过点击药水恢复 10 点生命值。可攻击怪物保护自己,要注意躲避其攻击,合理利用地形和跳跃技能收集金币。

1.2核心玩法设计

1.玩家(Player):玩家是游戏的主角,可通过键盘控制,使用左右箭头键控制左右移动,上箭头键在站于特定平台(如 Tile 类或 Grass 系列对象)上时进行跳跃。 玩家初始拥有 100 点生命值,以一个可爱的形象出现在游戏世界中,如使用 lwe1.png、rle1.png 等一系列图片表示不同状态(站立、移动、跳跃等)。 玩家可以通过按下空格键发动攻击,攻击时会发射出雪球,为角色添加战斗元素,同时播放攻击音效,增强游戏的战斗体验。 玩家还可以收集金币,与怪物战斗,寻找并使用药水恢复生命值,是游戏的核心角色,其行动和决策将影响游戏的进程和最终结果。

2.怪物(Monster 系列): 具有一定的智能,会在游戏世界中自动行走,当到达一定边界(如 getX() > 400 或 getX() < 800)时会自动改变方向,移动速度为 3。 有自己的生命值,初始为 100 点,使用 pl1.png 至 pl4.png 和 pr1.png 至 pr4.png 等一系列图片表示不同状态(正常、受伤),并且会显示血条(HealthBar2)显示其当前生命值。 怪物会对玩家造成伤害,当玩家与之接触时,玩家的生命值会减少,同时玩家会被击退,增加了游戏的挑战性。 当怪物被击败(生命值降为 0)时,会从世界中消失,并在其位置掉落一个药水,为玩家提供恢复生命值的机会。

3.金币(Coins):散落在游戏世界各处,玩家碰到金币时会获得 25 分,同时播放 “eat.mp3” 音效,是玩家获取分数的重要来源。

4.药水(Potion):以 ys.png 作为图像,玩家与之接触时会恢复 10 点生命值,玩家需要在游戏世界中寻找药水,以保证自己在与怪物战斗和冒险过程中存活。

5.梯子(Ladder):玩家可以在按下上箭头键且能看到梯子时攀爬,为玩家的移动提供了更多维度,如使用 cri.png 和 cri1.png 等图片表示玩家在梯子上的状态。

1.3交互规则

1.角色控制交互

玩家通过键盘输入与游戏世界进行交互,其操作会影响角色的位置和状态,例如跳跃、移动、攻击等动作。玩家的移动会受到地形的限制,如只能在特定平台上跳跃,增加了操作的复杂性和策略性。玩家攻击时会发射雪球,雪球的方向会根据玩家的朝向决定,攻击会对怪物造成伤害,为玩家提供了主动战斗的手段。

2.战斗交互

玩家与怪物之间存在战斗关系,当玩家碰到怪物时,玩家会受到伤害,玩家需要躲避怪物的攻击,同时利用跳跃和地形优势避免受伤。玩家可以通过攻击怪物来保护自己,当怪物被攻击时,其生命值会减少,同时会显示受伤状态,当生命值降为 0 时,怪物死亡并掉落药水。玩家可以通过拾取药水恢复生命值,药水的使用能帮助玩家更好地应对怪物的攻击,提高生存能力。

3.物品收集交互

玩家可以收集金币,收集金币会获得分数,分数的积累是玩家实现胜利目标的重要指标。玩家需要时刻关注自己的生命值,通过收集药水来恢复,同时要注意怪物的攻击,合理利用地形和战斗技巧来避免生命值降为 0,因为生命值为 0 时玩家会失败。

1.4游戏目标

1.主要目标

玩家需要到达出口(Portal),这是游戏胜利的最终目标。在这个过程中,玩家需要在复杂的游戏世界中探索,包括各种地形和场景,面对怪物的威胁和金币的诱惑,合理规划自己的行动路线。

2.次要目标

尽可能多地收集金币,以获得更高的分数,同时避免受到怪物的攻击,保持自己的生命值不为 0。巧妙利用地形和战斗技巧,消灭怪物,以获得更多的生存空间和药水掉落,提高自己的生存能力和游戏分数。

  • 游戏实现

2.1 玩家攻击功能实现

2.1.1实现思路

1.触发攻击

玩家通过按下空格键触发攻击动作。使用 Greenfoot.isKeyDown("space") 来检测按键输入。为避免多次触发攻击,使用 isAttacking 标志来标记玩家是否正在攻击。 当玩家开始攻击时,播放攻击音效,增强游戏的沉浸感。

2.攻击动画

准备多组攻击图像,根据玩家的朝向(向左或向右)显示不同的攻击动画。 使用 attackFrame 变量来控制当前显示的攻击动画帧,实现动画的连续播放。 当攻击动画播放完毕后,重置 isAttacking 标志和 attackFrame。

3.发射雪球攻击

玩家攻击时会发射一个雪球,雪球的方向根据玩家的朝向确定。 雪球被添加到游戏世界,并从玩家的位置发射出去,为了让雪球看起来像是从玩家手中发出,可以调整其初始位置,使其出现在玩家的前方。

  

2.2 玩家跳跃功能实现

2.2.1.实现思路

跳跃触发条件:玩家按下上箭头键时,需要检查玩家是否站在可站立的平台上,可站立平台包括 Tile1、Tile2 等 Tile 类对象以及 Grass 及其系列对象。使用 canSee() 或 getOneObjectAtOffset() 方法来检测玩家下方是否有这些平台。 仅当玩家站在这些平台上时,允许玩家跳跃,避免玩家在空中或其他不允许跳跃的位置进行跳跃操作,增加游戏的物理真实性。

 跳跃的实现: 给玩家一个向上的初速度(vSpeed),使玩家开始向上运动。 在 act() 方法中,根据重力效果更新玩家的垂直速度(vSpeed),使其产生下落效果。 使用 setLocation() 方法根据 vSpeed 更新玩家的位置,实现跳跃和下落的动画效果。

2.3 怪物功能实现

2.3.1. 实现思路

怪物的移动: 怪物会在游戏世界中自动移动,为其设置一个速度属性,通过 act() 方法不断更新位置。 可以使用 dir 属性表示怪物的移动方向(例如,dir = 1 表示向左,dir = 2 表示向右)。 当怪物到达游戏世界的边界时,改变其移动方向,使其在一定范围内来回移动,以增加游戏的挑战性。

怪物的动画效果: 为怪物准备多组动画图像,例如,向左移动时的一组图像和向右移动时的一组图像。 使用一个变量(如 currentImageIndex)来控制当前显示的动画帧,实现动画效果。 通过 animate() 方法更新动画帧,根据设定的动画延迟,切换不同的动画图像,让怪物的移动更加生动。

怪物的伤害和生命值: 为怪物设定一个初始生命值(如 health),并在受到玩家攻击时减少生命值。 当生命值小于或等于 0 时,移除怪物并可能触发一些事件,如掉落物品(如药水)或得分等。 当怪物与玩家碰撞时,玩家受到伤害,使用 isHurt 标志和 hurtTimer 控制玩家受伤的持续时间。

 3.1测试内容

  1. 测试方法

 单元测试: 对每个类的关键方法进行单独测试,确保它们在各种输入情况下都能正确执行。 使用 Greenfoot 的测试框架或 JUnit 测试框架(如果适用),模拟不同的场景和条件。 对于涉及玩家、怪物、道具等类的测试,重点关注其核心行为,如玩家的移动、攻击、跳跃,怪物的移动、受伤和死亡,道具的拾取等。 对于涉及交互的测试,如玩家与怪物、玩家与道具、怪物与攻击道具(如雪球)之间的交互,检查交互的结果是否符合预期。

集成测试: 将多个组件组合在一起进行测试,检查它们之间的协作是否正常。 测试游戏的整体流程,包括玩家的完整游戏过程,从开始游戏、移动、攻击、收集物品、与怪物战斗,直到胜利或失败。 观察游戏元素的相互作用,如玩家在场景中移动时与各种地形、道具和怪物的交互是否流畅和符合逻辑。

4.收获总结及未来展望                    

   虽然游戏已经基本完成,但还有很多可以改进的地方,如增加更多的关卡、新的怪物和道具、更复杂的地形等。希望未来有机会可以继续完善这个游戏,为玩家带来更好的游戏体验。在这个游戏项目中,我们不仅学到了很多游戏开发的知识,还培养了团队协作能力和解决问题的能力。在对游戏世界、游戏角色、游戏道具等游戏元素分离开发的过程,对程序的一个解耦分离开发,也让我了解到了设计模式的重要性,一个好的设计模式可以大大的简化冗余代码的开发。

   最后也要感谢老师孜孜不倦的教导以及队友们的相互包容相互鼓励,通过大家的共同努力,我们完成了这个充满乐趣的游戏项目,这将是我们在游戏开发道路上的一个重要起点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值