02 Java面向对象—第4节 面向对象高级~综合案例——猜拳游戏

1、猜拳游戏

问题描述

今天的任务是通过控制台方式实现一个人机对战的猜拳游戏,用户通过输 入(1.剪刀 2.石头 3.布),机器随机生成(1.剪刀 2.石头 3.布),胜者积分, n 局以后通过积分的多少判定胜负。

分析方法

拿道题目,首先分析题意,然后看看能抽象出来几个类,对应的属性和方法(注意:属性和方法可以边写边定义,包括方法的返回值类型都是写到后面才知道要不要有返回值),最后就不断完善它。

代码

Person.java

import java.util.Scanner;

public class Person {
    private int score;//表示用户赢的积分

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    /**
     * 人出拳的方法
     * @return
     */
    public int inputShow(){
        Scanner input = new Scanner(System.in);
        while(true){
            System.out.println("请输入您的猜拳:(1.剪刀 2.石头 3.布)");
            int num = input.nextInt();
            switch(num){
                case 1:
                    System.out.println("用户出拳:剪刀");
                    break;
                case 2:
                    System.out.println("用户出拳:石头");
                    break;
                case 3:
                    System.out.println("用户出拳:布");
                    break;
                default:
                    System.out.println("您输入有误,游戏重新开始!");
                    continue;
            }
            return num;
        }

    }
}

Computer.java

public class Computer {
    private int score;//表示机器赢的积分

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    /**
     * 机器出拳的方法
     * @return
     */
    public int inputShow(){
        int num = (int)(Math.random()*3+1);
        switch(num){
            case 1:
                System.out.println("机器出拳:剪刀");
                break;
            case 2:
                System.out.println("机器出拳:石头");
                break;
            case 3:
                System.out.println("机器出拳:布");
                break;
        }
        return num;
    }
}

PerComGame.java

import java.util.Scanner;

/**
 * 人机猜拳类
 */
public class PerComGame {
    private int js;//游戏的局数
    private Person person;//参与游戏的用户
    private Computer computer;//参与游戏的机器

    /**
     * 构造方法,给属性赋初值
     */
    public PerComGame(){
        js = 0;
        this.person = new Person();
        this.computer = new Computer();
    }

    /**
     * 最终输出界面
     */
    public void menu(){
        Scanner input = new Scanner(System.in);
        System.out.println("------欢迎来到爱摸鱼的TT~猜拳游戏------");
        System.out.println("开始游戏,用户先开始");
        loop:while(true){
            startGame();
            js++;
            System.out.println("是否继续游戏(y/n)");
            String c = input.next();
            if(c.equals ("n") || c.equals("否")){//结束游戏
                break loop;
            }
        }
        System.out.println("本次游戏已结束!");
        System.out.println("最终对战结果如下:");
        System.out.println("用户\tVS\t机器");
        System.out.println("总共游戏局数:" + js);
        System.out.println("用户的积分:" + person.getScore());
        System.out.println("机器的积分:" + computer.getScore());
        System.out.println("由以上积分得最终赢家为  " + winner());

    }

    /**
     * 游戏比拼开始
     */
    public void startGame(){
        int pNum = person.inputShow();
        int cNum = computer.inputShow();
        //比较结果
        if((pNum == 1 && cNum == 3) || (pNum == 2 && cNum == 1) || (pNum == 3 && cNum == 2)){//用户赢
            System.out.println("用户赢!");
            person.setScore(person.getScore() + 1);
        }else if(pNum == cNum){//平局
            System.out.println("二者平局!");
        }else{
            System.out.println("机器赢!");
            computer.setScore(computer.getScore() + 1);
        }
    }

    /**
     * 用于判断赢家
     * @return
     */
    public String winner(){
        if(person.getScore() > computer.getScore()){
            return "用户";
        }else if (person.getScore() == computer.getScore()){
            return "用户和机器打平";
        }else{
            return "机器赢";
        }
    }
}

TestGame.java

public class TestGame {
    public static void main(String[] args) {

        PerComGame game = new PerComGame();
        game.menu();
    }
}

运行结果:
在这里插入图片描述
在这里插入图片描述

总结

该题可以认为是纯面向对象的,慢慢地掌握分析方法,做这种面向对象的题目要多分析多练,把思路理透彻(从内到外)。本题的难点在于人机猜拳这个类里,采用了自定义一个类对象,然后用构造方法给属性赋初值。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页