武器的进化与OO(一)游戏规则的搭建

 初学程序设计的人经常会不理解面向对象的很多规则有什么用。总觉得是又麻烦又不好记,希望这个像游戏的小例子可以说明一些问题:

我现在要写一个小例子来模拟武器的进化与发展,首先,在最初,人类的武器就是自己,所以,我们要有人类:

public class  Person
{
}


有了人类了,我们该怎么去设计这个人类呢?我们要有战斗的用例:“在这个战斗中,要有两个人。战斗是回合制的,每一轮双方互相攻击一次。只要有一个生存,那么继续下一轮。直到有一人倒下。”那么根据我们的用例,我们编写代码如下:

 

public class  Game
{

    
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是用来进攻的方法。仅有方法是不够的,所以我们还要加入一些域,那么代码如下:

public class  Person
{

    
//不要吃惊我可以访问target的私有成员,因为私有的概念本来就是本类可以访问
    public void attack(Person target)
    
{
        
this.hp -= this.offense -
 target.defense; 
    }


    
public boolean alive()
    
{
        
return hp > 0
;
    }
 
    private int hp;

    
private int
 offense;

    
private int
 defense;
    

}

现在我们再回去运行Game的main方法。没有任何异常。很好,接下来,还有一个问题,我们想知道到底谁被打败了。(说句题外话,在实际开发中,这就是需求的变化的一种,开始你可没说要看这个。)那么我们需要给Person类加入name属性。(我个人认为一个私有域加get/set方法才叫一个属性,所以此处我说加一个name属性) 

public class  Person
{
    
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 class  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 class  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;
}
【Game】
public class  Game
{

    
public static void
 main(String[] args)
    
{
        
//新的初始化

        Person p1 = new Person(100105);
        Person p2 
= new Person(10096
);
        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(二)需求变化与武器的诞生

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值