实验内容:
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); // 调用方法判断游戏输赢,并输出结果
}
}