分析参与者:
因为人和电脑有共同的属性和方法,得出需要父类,又因为人的出拳和选择角色和电脑有差异,因此,需要一个抽象类。
一、创建玩家抽象类:
只要是玩家就会具有的属性:角色、出拳、积分。
只要是玩家就会具有的方法:选择角色、出拳。
public abstract class Person {
private String name;//角色
private int punch;//出拳
private int integral;//积分
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIntegral() {
return integral;
}
public void setIntegral(int integral) {
this.integral = integral;
}
public abstract void chooseName();//选择角色的方法,待子类重写
public abstract int Punch();//出拳的方法,待子类重写
}
二、创建人类
人类玩家重写了玩家类的抽象方法punch() ——出拳的方法,chooseName()——选择角色的方法。
人类玩家的出拳是由用户随机出的,因此定义了一个字符串数组,定义一个整型变量接收用户选择的出拳 ,出拳数(1、2、3)对应数组下标减1 。
返回值为 int ,代表了人类玩家的出拳。
public class Player extends Person {
Scanner input=new Scanner(System.in);
@Override
public void chooseName() {
System.out.println("----------请用户选择角色【1.李鬼 2.李逵 3.吴用】--------");
String [] jue={"李鬼","李逵","吴用"};
int num=input.nextInt();
setName(jue[num-1]);
System.out.println("用户选择角色为: "+jue[num-1]);
}
@Override
public int Punch() {
System.out.println("----------请用户选择出拳【1.石头 2.剪刀 3.布】--------");
String [] jre={"石头","剪刀","布"};
int num=input.nextInt();
System.out.println(getName()+"出了: "+jre[num-1]);
return num;
}
}
三、创建电脑玩家类
电脑玩家重写了玩家类的抽象方法punch() ——出拳的方法,chooseName()——选择角色的方法。
电脑玩家的出拳是由电脑随机出的,因此定义了一个字符串数组,定义一个整型变量接收随机数 ——[0,3),可以取到0、1、2,对应数组下标正好可以取到其中的值。
返回值为 int ,代表了电脑玩家的出拳。
public class Computer extends Person{
Scanner input=new Scanner(System.in);
@Override
public int Punch() {
String [] jue={"石头","剪刀","布"};
int num=ThreadLocalRandom.current().nextInt(0,3);
System.out.println(getName()+"出了: "+jue[num]);
return num+1;
}
@Override
public void chooseName() {
String [] jue={"王维","杜甫","李白"};
int num= ThreadLocalRandom.current().nextInt(0,3);
setName(jue[num]);
System.out.println("电脑选择角色为: "+jue[num]);
}
}
四、创建裁判类
裁判类具有两个私有属性,电脑玩家和人类玩家,在创建裁判对象时,将电脑玩家和人类玩家的实例对象作为构造方法的实参传入, 代表者这个裁判和这两个玩家在一局游戏中。
裁判类具有两个公共方法,判断两个玩家每一局胜负的方法every()、判断最终结果的方法result()。
public class Judge {
private Player player;
private Computer computer;
public Judge(Player player, Computer computer) {
this.player = player;
this.computer = computer;
}
public void every(int x) {
int y = player.Punch();
int d = computer.Punch();
if ((y == 1) && (d == 2) || (y == 2) && (d == 3) || (y == 3) && (d == 1)) {
player.setIntegral(player.getIntegral() + 1);
System.out.println("第" + x + "局 " + player.getName() + "胜利");
} else if ((d == 1) && (y == 2) || (d == 2) && (y == 3) || (d == 3) && (y == 1)) {
computer.setIntegral(computer.getIntegral() + 1);
System.out.println("第" + x + "局 " + computer.getName() + "胜利");
} else {
System.out.println("第" + x + "局平局");
}
}
public void result() {
if (player.getIntegral() > computer.getIntegral()) {
System.out.println(player.getName() + "胜利");
} else if (player.getIntegral() < computer.getIntegral()) {
System.out.println(computer.getName() + "胜利");
} else {
System.out.println("平局");
}
}
}
五、创建游戏类
进行三局游戏,谁的分数高谁获胜。
public class Game {
public static void main(String[] args) {
Player player=new Player();//创建人类玩家
Computer computer= new Computer();//创建电脑玩家
player.chooseName();//用户选择角色
computer.chooseName();//电脑选择角色
Judge judge=new Judge(player,computer);//创建裁判对象,并传入玩家
for (int i = 1; i <4 ; i++) {//玩三局
judge.every(i);//第i局
}
judge.result();//返回比赛结果
}
}