初学程序设计的人经常会不理解面向对象的很多规则有什么用。总觉得是又麻烦又不好记,希望这个像游戏的小例子可以说明一些问题:
我现在要写一个小例子来模拟武器的进化与发展,首先,在最初,人类的武器就是自己,所以,我们要有人类:
... {
}
有了人类了,我们该怎么去设计这个人类呢?我们要有战斗的用例:“在这个战斗中,要有两个人。战斗是回合制的,每一轮双方互相攻击一次。只要有一个生存,那么继续下一轮。直到有一人倒下。”那么根据我们的用例,我们编写代码如下:
... {
public static void main(String[] args)
...{
Person p1 = new Person();
Person p2 = new Person();
while (p1.alive() && p2.alive())
...{
// 这个玩法不太公平,不过这不是问题的关键
p1.attack(p2);
if (p2.alive())
...{
p2.attack(p1);
}
}
}
}
从上面的代码可以看出,我们的Person类需要有两个方法,attack和alive,很好,我们扩展Person类。从上面的代码可以看出,alive方法是判断该Person实例(以后称“玩家”)是否生存的方法。attack是用来进攻的方法。仅有方法是不够的,所以我们还要加入一些域,那么代码如下:
... {
//不要吃惊我可以访问target的私有成员,因为私有的概念本来就是本类可以访问
public void attack(Person target)
...{
this.hp -= this.offense - target.defense;
}
public boolean alive()
...{
return hp > 0;
}
private int offense;
private int defense;
}
现在我们再回去运行Game的main方法。没有任何异常。很好,接下来,还有一个问题,我们想知道到底谁被打败了。(说句题外话,在实际开发中,这就是需求的变化的一种,开始你可没说要看这个。)那么我们需要给Person类加入name属性。(我个人认为一个私有域加get/set方法才叫一个属性,所以此处我说加一个name属性)
... {
public void attack(Person target)
...{
target.hp -= this.offense - target.defense;
}
public boolean alive()
...{
return hp > 0;
}
//新加的Getter和Setter
public String getName()
...{
return name;
}
public void setName(String name)
...{
this.name = name;
}
private int hp;
private int offense;
private int defense;
//新加的域
private String name;
}
Game类也要做相应的修整
... {
public static void main(String[] args)
...{
Person p1 = new Person();
Person p2 = new Person();
p1.setName("张三");
p2.setName("李四");
while (p1.alive() && p2.alive())
...{
p1.attack(p2);
if (p2.alive())
...{
p2.attack(p1);
}
}
}
public static void showWinner(Person p1, Person p2)
...{
if (!p1.alive() && p2.alive())
...{
System.out.println(p1.getName() + "被打败了");
}
if (!p2.alive() && p1.alive())
...{
System.out.println(p2.getName() + "被打败了");
}
}
}
到此为止,一切似乎都OK了。嗯,总觉得忘了点什么。。。。。。。啊,忘了初始化生命力(hp),攻击力(offense),防御力(defense)。两个0血0攻0防的人打个什么劲。好的,我们修改它:
【Person】
... {
//新加的构造器
public Person(int hp, int attack, int defense)
...{
this.hp = hp;
this.offense = attack;
this.defense = defense;
}
public void attack(Person target)
...{
this.hp -= this.offense - target.defense;
}
public boolean alive()
...{
return hp > 0;
}
public String getName()
...{
return name;
}
public void setName(String name)
...{
this.name = name;
}
private int hp;
private int offense;
private int defense;
private String name;
}
... {
public static void main(String[] args)
...{
//新的初始化
Person p1 = new Person(100, 10, 5);
Person p2 = new Person(100, 9, 6);
p1.setName("张三");
p2.setName("李四");
while (p1.alive() && p2.alive())
...{
// 这个玩法不太公平,不过这不是问题的关键
p1.attack(p2);
if (p2.alive())
...{
p2.attack(p1);
}
}
showWinner(p1, p2);
}
public static void showWinner(Person p1, Person p2)
...{
if (!p1.alive() && p2.alive())
...{
System.out.println(p1.getName() + "被打败了");
}
if (!p2.alive() && p1.alive())
...{
System.out.println(p2.getName() + "被打败了");
}
}
}
运行->控制台打印出:
李四被打败了 ......(待续)
下一节
武器的进化与OO(二)需求变化与武器的诞生