Java实验——1

199 阅读4分钟

实验内容:

1、编写Java程序,贪心猪游戏,一个简单的两人掷色子游戏,先达到或者超过100分的玩家获胜。玩家轮流进行游戏,每次掷出一个六面色字。

如果玩家掷出1,不得分并换人。

如果玩家掷出2-6,就可以选择:再掷一次,或保留得分。这样的话会吧所有得分计入该玩家的成绩并换人。

请编写人家对贪心猪游戏程序。轮到玩家时,程序会显示双方成绩和之前的点数。玩家可以输入“r”重掷色子,或者输入“h”保留得分。

计算机程序会根据以下规则进行游戏:

轮到计算机游戏时候,持续掷色子,直到达到或者超过20分才予以保留。如果计算机获胜或掷出1,则本轮立即结束。

玩家先掷色子。

开始实验:

流程图:

给出程序源码

GreedyPig.java
/**
 * GreedyPig 类用于存储和操作分数,帮助进行玩家的替换。
 */
public class GreedyPig {
    private int score; // 存储分数的变量
    public static boolean person; // 标记是否是玩家的静态变量

    /**
     * GreedyPig 构造函数,初始化分数和玩家状态。
     */
    GreedyPig() {
        score = 0; // 初始化分数为0
        person = true; // 初始化玩家状态为true
    }
    /**
     * 获取当前分数。
     *
     * @return 返回当前的分数值。
     */
    public int getScore() {
        return score;
    }
    /**
     * 设置分数,实际上是增加分数,因为没有参数验证,应外部确保传入合法增量。
     *
     * @param score 为当前分数增加的值。
     */
    public void setScore(int score) {
        this.score += score; // 增加分数
    }
}
PlayGame.java
import java.util.Scanner;

/**
 * 游戏规则和逻辑类
 */
public class PlayGame {
    static final int VICTORY_CONDITIONS = 100; // 胜利条件:分数达到100分
    static final int COMPUTER_POINTS = 20; // 电脑得分阈值:达到20分时自动保留得分

    /**
     * 根据骰子点数决定是否保留得分或者重来。
     *
     * @param score            骰子的点数。
     * @param currentScore     当前玩家的得分。
     * @param person_1         玩家1对象。
     * @param person_2         玩家2对象。
     * @return                 根据当前得分和对应输入进行返回。
     */
    public int makeChoices(int score, int currentScore, GreedyPig person_1, GreedyPig person_2) {
        if (currentScore == 1) {
            // 骰子点数为1时,不加分,交换当前玩家
            System.out.println("不加分");
            person_1.person = !person_1.person;
            return -score;
        } else {
            // 骰子点数为2-6时,玩家(或电脑)做出选择:重来(r)或保留得分(h)
            System.out.println("请选择:     r:重来          h:保留得分,换人");
            char choice;
            Scanner sc = new Scanner(System.in);
            if (person_1.person) {
                // 玩家输入选择
                choice = sc.next().charAt(0);
            } else {
                // 电脑根据分数自动做出选择
                if (score + currentScore >= COMPUTER_POINTS)
                    choice = 'h';
                else
                    choice = 'r';
            }

            // 验证玩家输入的有效性,直到输入合法为止
            while (choice != 'r' && choice != 'h') {
                System.out.println("输入错误,请重新输入");
                choice = sc.next().charAt(0);
            }

            // 根据玩家的选择执行相应的操作
            if (choice == 'r') {
                System.out.println("准备重来");
                return currentScore;
            }
            if (choice == 'h') {
                // 加分并交换玩家
                if (person_1.person)
                    person_1.setScore(currentScore);
                else
                    person_2.setScore(score + currentScore);
                person_1.person = !person_1.person;
                System.out.println("已保留得分,换人");
            }
        }
        return -score;
    }

    /**
     * 判断游戏输赢
     *
     * @param person_1 第一个玩家对象。
     * @param person_2 第二个玩家对象。
     *                 该方法直接通过System.out.println输出游戏结果,不返回任何值。
     */
    public void CalculateWin(GreedyPig person_1, GreedyPig person_2) {
        // 判断游戏结果
        if (person_1.getScore() >= VICTORY_CONDITIONS && person_2.getScore() >= VICTORY_CONDITIONS)
            System.out.println("平局!");
        else if (person_1.getScore() >= VICTORY_CONDITIONS && person_2.getScore() < VICTORY_CONDITIONS)
            System.out.println("玩家胜利!");
        else
            System.out.println("电脑胜利!");
    }
}
GameTest.java
import java.util.Random;
/**
 * 游戏框架类,主要负责游戏的初始化和主循环。
 */
public class GameTest {
    static final int VICTORY_CONDITIONS = 100;  //胜利条件,即玩家需要达到的分数

    /**
     * 游戏的主方法
     * 初始化两个玩家和游戏控制器,通过随机数模拟掷骰子及玩家轮流游戏的过程,直到某玩家达到胜利条件。
     * @param args 命令行参数(未使用)
     */
    public static void main(String[] args) {  // 游戏的框架
        GreedyPig person_1 = new GreedyPig();  // 初始化玩家1
        GreedyPig person_2 = new GreedyPig();  // 初始化玩家2
        PlayGame play = new PlayGame();  // 初始化游戏控制器
        Random r = new Random();  // 初始化随机数生成器,用于模拟掷骰子
        int score = 0;  // 用于记录骰子点数的累积值
        int currentScore;  // 骰子当前点数

        // 游戏主循环,直到有一个玩家达到胜利条件
        while (person_1.getScore() < VICTORY_CONDITIONS && person_2.getScore() < VICTORY_CONDITIONS) {
            if (person_1.person) {  // 判断当前是否为玩家1的回合
                // 玩家1回合的处理逻辑
                System.out.println("\n玩家开始");
                System.out.println("玩家得分:" + person_1.getScore());
                System.out.println("电脑得分:" + person_2.getScore());

                // 模拟掷骰子并显示结果
                currentScore = r.nextInt(6) + 1;
                //System.out.println("玩家之前的色子点数为:" + score);
                System.out.println("电脑这次色子点数为:" + currentScore);

                // 处理玩家1的点数,更新得分
                score += play.makeChoices(score, currentScore, person_1, person_2);
            } else {  // 判断当前是否为玩家2的回合
                // 玩家2回合的处理逻辑
                System.out.println("\n电脑开始");

                // 模拟掷骰子并显示结果
                currentScore = r.nextInt(6) + 1;
                System.out.println("电脑之前的色子点数为:" + score);
                System.out.println("电脑这次色子点数为:" + currentScore);

                // 处理玩家2的点数,更新得分
                score += play.makeChoices(score, currentScore, person_1, person_2);
            }
        }
        System.out.println("游戏结束");
        play.CalculateWin(person_1, person_2);  // 调用方法判断游戏输赢,并输出结果
    }

}

程序运行结果