← 返回首页
面向对象之小游戏案例(三国群英传)
发表时间:2024-10-30 03:27:32
面向对象之小游戏案例(三国群英传)

综合应用面向对象编程思想实现一款基于控制台的小游戏。

1.程序项目结构

2.代码实现

游戏玩家父类 Player.java

package entity;

/*
 * 游戏玩家类设计
 * */
public abstract class Player {

    protected String name; //玩家的昵称;
    protected int score; //玩家的得分
    protected static final String[] handsTypes = {"石头", "剪刀", "布"};

    //出拳的方法
    public abstract String showHand();


    public Player(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

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

游戏玩家类的子类,人类游戏玩家和电脑游戏玩家类设计。

//ComputerPlayer.java

package entity;

import java.util.Random;

public class ComputerPlayer extends Player{

    public ComputerPlayer(String name) {
        super(name);
    }

    //电脑玩家每次是通过生成一个随机数返回一个出拳结果
    @Override
    public String showHand() {

        return Player.handsTypes[ new Random().nextInt(3)];
    }
}

//HumanPlayer.java

package entity;

import java.util.Scanner;

public class HumanPlayer extends Player{

    public HumanPlayer(String name) {
        super(name);
    }

    @Override
    public String showHand() {
        System.out.println("请选择您的出拳:1.石头  2.剪刀  3.布");
        int choice = new Scanner(System.in).nextInt();
        choice--;
        return Player.handsTypes[choice];
    }
}

游戏逻辑类GameLogic.java

package logic;

import entity.ComputerPlayer;
import entity.HumanPlayer;

/*
 * 游戏逻辑类
 * */
public class GameLogic {

    private static final int WIN_SCORE = 3; //五局三胜制,先得三分的玩家胜利。。
    private HumanPlayer humanPlayer; //人类玩家
    private ComputerPlayer computerPlayer; //电脑玩家

    public GameLogic(HumanPlayer humanPlayer, ComputerPlayer computerPlayer) {
        this.humanPlayer = humanPlayer;
        this.computerPlayer = computerPlayer;
    }


    public void startPK() {
        int iCount = 0;
        do {
            String humanHand = humanPlayer.showHand();
            String computerHand = computerPlayer.showHand();
            System.out.println("-----------第" + (++iCount) + "回合------------");
            System.out.println(humanPlayer.getName() + "的出拳是:" + humanHand);
            System.out.println(computerPlayer.getName() + "的出拳是:" + computerHand);
            if (humanHand.equals(computerHand)) {
                System.out.println("不分胜负呀,咱们再战三百回合.....");
            } else if (humanHand.equals("石头")) {
                if (computerHand.equals("剪刀")) {
                    System.out.println("小样看你还嚣张不....");
                    humanPlayer.setScore(humanPlayer.getScore() + 1);
                } else {
                    System.out.println("你不过是运球好点罢了....");
                    computerPlayer.setScore(computerPlayer.getScore() + 1);
                }
            } else if (humanHand.equals("剪刀")) {
                if (computerHand.equals("布")) {
                    System.out.println("小样看你还嚣张不....");
                    humanPlayer.setScore(humanPlayer.getScore() + 1);
                } else {
                    System.out.println("你不过是运球好点罢了....");
                    computerPlayer.setScore(computerPlayer.getScore() + 1);
                }
            } else if (humanHand.equals("布")) {
                if (computerHand.equals("石头")) {
                    System.out.println("小样看你还嚣张不....");
                    humanPlayer.setScore(humanPlayer.getScore() + 1);
                } else {
                    System.out.println("你不过是运球好点罢了....");
                    computerPlayer.setScore(computerPlayer.getScore() + 1);
                }
            }
            System.out.println("---------------当前比分---------------");
            System.out.println(humanPlayer.getName() + " " + humanPlayer.getScore() + ":" + computerPlayer.getScore() + " " + computerPlayer.getName());

        } while (!this.isGameOver());

        //如果PK结束显示游戏结果.
        this.showResult();
    }

    //判断游戏是否结束
    public boolean isGameOver() {
        return humanPlayer.getScore() >= WIN_SCORE || computerPlayer.getScore() >= WIN_SCORE;
    }

    //显示游戏结果
    public void showResult() {
        if (humanPlayer.getScore() >= WIN_SCORE) {
            System.out.println("别羡慕哥,哥只是个传说....");
        } else {
            System.out.println("君子报仇十年不晚,咱们后会有期....");
        }
    }
}

游戏主界面类GuessGame.java

import entity.ComputerPlayer;
import entity.HumanPlayer;
import logic.GameLogic;

import java.util.ArrayList;
import java.util.*;
public class GuessGame {

    public static final Scanner scanner = new Scanner(System.in);
    public static final String[] heros={"曹操","刘备","周瑜"};

    private static GameLogic gameLogic;

    //游戏初始化方法
    private static void init(){
        System.out.println("请选择电脑玩家角色:1.曹操  2.刘备  3.周瑜");
        int herosChoice = scanner.nextInt();
        herosChoice--;
        ComputerPlayer computerPlayer = new ComputerPlayer(heros[herosChoice]);
        System.out.println("请输入您的昵称:");
        String alias = scanner.next();
        HumanPlayer humanPlayer = new HumanPlayer(alias);
        GuessGame.gameLogic = new GameLogic(humanPlayer,computerPlayer);
    }


    public static void main(String[] args) {
        GuessGame.init();
        GuessGame.gameLogic.startPK();
    }
}

运行效果:

请选择电脑玩家角色:1.曹操  2.刘备  3.周瑜
1
请输入您的昵称:
王大锤
请选择您的出拳:1.石头  2.剪刀  3.布
1
-----------第1回合------------
王大锤的出拳是:石头
曹操的出拳是:石头
不分胜负呀,咱们再战三百回合.....
---------------当前比分---------------
王大锤 0:0 曹操
请选择您的出拳:1.石头  2.剪刀  3.布
1
-----------第2回合------------
王大锤的出拳是:石头
曹操的出拳是:剪刀
小样看你还嚣张不....
---------------当前比分---------------
王大锤 1:0 曹操
请选择您的出拳:1.石头  2.剪刀  3.布
1
-----------第3回合------------
王大锤的出拳是:石头
曹操的出拳是:布
你不过是运球好点罢了....
---------------当前比分---------------
王大锤 1:1 曹操
请选择您的出拳:1.石头  2.剪刀  3.布
1
-----------第4回合------------
王大锤的出拳是:石头
曹操的出拳是:布
你不过是运球好点罢了....
---------------当前比分---------------
王大锤 1:2 曹操
请选择您的出拳:1.石头  2.剪刀  3.布
1
-----------第5回合------------
王大锤的出拳是:石头
曹操的出拳是:石头
不分胜负呀,咱们再战三百回合.....
---------------当前比分---------------
王大锤 1:2 曹操
请选择您的出拳:1.石头  2.剪刀  3.布
1
-----------第6回合------------
王大锤的出拳是:石头
曹操的出拳是:布
你不过是运球好点罢了....
---------------当前比分---------------
王大锤 1:3 曹操
君子报仇十年不晚,咱们后会有期....