石头剪刀布2.0(面向对象)

发布于:2022-07-28 ⋅ 阅读:(320) ⋅ 点赞:(0)

分析参与者:

               因为人和电脑有共同的属性和方法,得出需要父类,又因为人的出拳和选择角色和电脑有差异,因此,需要一个抽象类。

             

一、创建玩家抽象类:

        只要是玩家就会具有的属性:角色、出拳、积分。

        只要是玩家就会具有的方法:选择角色、出拳。

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();//返回比赛结果

    }
}