涉及方面:面向对象思想在实际编程之中的运用
摘要:设计时候
1·找出应用中可能需要变化的地方,把他们独立出来。不要和不需要变化的代码放在一起
2·针对接口编程,不是针对实现编程
首先游戏一定会有主角,以及怪兽。所以一定要建立Role类和Monster类 那角色和怪物必然固有的属性是Hp,以及MP了。介于此首先想到的是定义一个生物(Creature),让Role类和Monster类都继承与它
public Class Creature{
private int hp;
private int mp;
}
public Class Role extends Creature{
private int exp;
}
public Class Monster{}
这个时候,突然想到,所有Role类和Monstar类必然要有名字,并且一定有攻击(Attack)以及被攻击的(BeAttack)方法。
既然这样可以采用更改Creature类达到目的
public Class Creature{
private int hp;
private int mp;
private String name;
public void Attack(){
// Do some things
}
public void BeAttack(){
// Do some things
}
}
貌似解决了问题。
不过里面还隐藏着另外的2个问题:
1:
当有更多的类继承自Creature时候就会发生问题,比如NPC。NPC是不应该有攻击以及被攻击的方法的。
错误的解决方法: 当然可以让NPC复写Attack方法以及BeAttack方法。
仍然存在的问题: 当Creature的特性变多,或者继承Creature的类增多的时候 需要复写以及更改的代码增多。维护起来有问题。
正确的解决方法: 将不变的属性以及方法封装,将易变的方法提取出来。即建立Attack类以及BeAttack类。
设计原则:找出应用中可能需要变化的地方,把他们独立出来。不要和不需要变化的代码放在一起
2:
对于每个角色必然有不同的攻击方式,比如魔法师必然使用魔法攻击,刺客可能存在二刀流(即一次进行两次攻击),弓手可能实行远程攻击,战士使用普通攻击。
错误的解决方法: 对攻击里面加入switch case语句,对于每种不同的攻击方式给出不同的效果
仍然存在的问题: 假如新加入一个职业呢?德鲁伊...&(*&&^^%*
正确的解决方法: 让Attack以及BeAttack变为接口,以不同的攻击方式去实现接口。
public interface Attack {
// Do some things
}
public interface BeAttack(){
// Do some things
}
public class SwordAttack implements Attack {}
public class MagicAttack implements Attack {}
现在就可以很好的解决问题了。组装一下代码:
public interface Attack {
// Do some things
}
public interface BeAttack(){
// Do some things
}
public class SwordAttack implements Attack {}
public class MagicAttack implements Attack {}
public Class Creature{
private int hp;
private int mp;
private String name;
}
public Class Role extends Creature{
private Attack attack;
private BeAttack beAttack;
private int exp;
}
public Class Monster extends Creature{
private Attack attack;
private BeAttack beAttack;
}
设计原则:针对接口编程,不是针对实现编程
这里指的是:Role 和Monstar 只包含Attack接口,而不是指定使用某种Attack,这样的好处是在运行中Attack的种类是可以改变的。
比如:当现在是剑士的时候可以使用SwordAttack,而当转职为魔法师时候就要使用MagicAttack。
这也就是实现了初步的动态绑定。
按上面组装完成后执行测试代码:
public class RoleTest {
private static Role role;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
role = new Role("崔斯特",100,100,0,new SwordAttack());
}
@Before
public void setUp() throws Exception {
System.out.println("===============测试开始============\n");
}
@After
public void tearDown() throws Exception {
System.out.println("\n===============测试结束============\n");
}
/**
* 目的:测试角色初始化,以及攻击方法
* 结果:成功
*/
@Test
public void testRoleAttack(){
System.out.println();
System.out.println(role.toString());
role.getAttack().attack();
}
/**
* 目的:测试角色运行时更换攻击方式
* 结果:成功
*/
@Test
public void testRoleChangeAttackWays(){
System.out.println("更换攻击方式前:");
System.out.println(role.getAttack().toString());
role.getAttack().attack();
role.setAttack(new MagicAttack()); //更换攻击方式
System.out.println("更换攻击方式后:");
System.out.println(role.getAttack().toString());
role.getAttack().attack();
}
}
执行结果:
===============测试开始============
崔斯特 现在的状态为:
血量:100
魔法:100
经验:0
使用大剑对单位造成攻击!
===============测试结束============
===============测试开始============
更换攻击方式前:
攻击方式:大剑攻击
使用大剑对单位造成攻击!
更换攻击方式后:
攻击方式:魔法攻击
使用魔法对单位造成攻击!
===============测试结束============
分享到:
相关推荐
* 游戏教学法 * Flash card * ppt * super E-book 教学过程: Procedure 1: Warm-up * 温暖活动:Hello how are you? 和 ABC song * 向学生问好,设计意图:通过歌谣调动课堂气氛及学生积极性。 Procedure 2: ...
Java面向对象编程(Object-Oriented Programming,简称OOP)是一种强大的编程范式,它将复杂的程序设计问题通过模拟现实世界中的对象来解决。在Java中,OOP主要包含四个核心概念:封装、继承、多态和抽象。下面将...
- Chapter 1: Welcome to the Jungle - 这一章可能是对整体的介绍,概述了iOS开发的环境、工具以及如何开始编写应用程序。 - Chapter 2: Appeasing the Tiki Gods - 这可能是对开发中会遇到的问题和挑战的调侃表达,...
Java以其简洁性、安全性、可移植性和高性能等特性,广泛应用于软件开发、移动应用、Web应用程序、企业级应用、游戏开发等多个领域。本章节我们将深入学习Java的第七章内容,这通常是关于高级特性和进阶主题的讨论。 ...
开发者可以学习到游戏开发的最佳实践,而学生和爱好者则可以通过实际项目来加深对编程和游戏设计的理解。 总的来说,《Aftermath - Chapter One: Charred Ash》的开源性质不仅让玩家能够体验到一个独特且富有深度的...
在游戏应用中,模型可能涉及关卡设计、玩家分数和怪物位置等。处理数据的业务规则或领域逻辑通常在这个层次进行,虽然这些术语听起来复杂,但实质上就是指如何操作和管理数据。 2. View对象:视图层是用户界面的...
- **灵活性与适应性**: 通用系统设计时考虑了多种用途和未来的扩展性,例如个人电脑需兼顾多媒体播放、游戏、办公等多种需求。 - **性能与价格**: 用户在购买通用系统时通常期望获得高性能配置,以满足当前及未来...
《VC网络游戏设计与实现》是一份关于利用Visual C++(简称VC)开发网络游戏的源代码集合,涵盖了多个关键章节的内容。这份资源对于那些希望深入理解网络游戏背后的编程原理和实践技术的开发者来说,是非常宝贵的参考...
1. **面向对象编程**:C++的核心是面向对象,因此设计游戏中的角色、敌人、物品等时,需要创建类来代表这些对象,定义它们的属性和行为。 2. **游戏循环**:所有游戏都有一个主循环,负责处理输入、更新游戏状态和...
1. 设计与规划:确定游戏类型、目标平台、主要功能和界面设计。 2. 创建项目:在Visual Studio中启动新的XNA项目,选择适当的模板。 3. 构建游戏世界:利用Content Pipeline导入和处理游戏资源,如地图、角色、道具...
1. **Windows Direct3D**: Direct3D是DirectX的一部分,专为3D图形设计,提供强大的图形渲染能力。游戏开发者通过Direct3D接口可以控制GPU,实现复杂的3D模型渲染、光照效果、纹理映射等。在Chapter 3中,可能会讲解...
开发者可以利用C++的面向对象特性来设计可扩展的游戏架构,同时通过VC++的调试工具进行高效的问题排查。 接下来是DirectX,它是Microsoft为Windows平台开发游戏和多媒体应用程序提供的一个关键组件。DirectX包括多...
1. **Chapter 5**: 通常在角色扮演游戏的设计中,第五章可能涵盖了游戏世界的构建,包括地图系统、场景切换和导航算法。这可能涉及到二维或三维图形渲染,如使用DirectX或OpenGL库。此外,章节可能讨论了如何实现...
综上所述,《Operating System(Chapter 1)》这一章节为我们提供了对操作系统的初步理解,介绍了其基本概念、功能及其在计算机系统中的重要作用。通过学习这些基础知识,初学者可以更好地理解操作系统如何帮助用户...
Game Theory Systems Chapter 20 Games as Systems of Conflict Chapter 21 Breaking the Rules Commissioned Game 2 Ironclad Unit 3 Play Chapter
《苹果电脑游戏设计》,英文名《mac game programming》,作者(美)Andre LaMothe,本书是为英文版,大小 34 MB。 由大师Andre LaMothe主编的游戏开发书籍.他写过一本叫做游戏开发大师技巧的书,好几千页,分上下卷,...
【标题】"配图片记单词游戏设计源码"所涉及的知识点主要集中在使用ActionScript 3(AS3)开发一款教育类游戏上。AS3是Adobe Flash Professional、Flex Builder等工具广泛使用的编程语言,用于创建交互式内容和游戏。...