【Java实验】贪心猪游戏

一、 实验目的

熟悉 Java 语言的编程、编译、运行、调试过程,掌握 Java 的控制流和随机数的方法。

二、实验性质

设计

三、实验内容

编写 Java 程序完成贪心猪游戏,规则如下:
(1)一个简单的两人掷色子游戏,玩家轮流进行游戏,每次掷出一个[1,6] 的整数,先达到或者超过 100 分的玩家获胜,普通玩家先掷色子。
(2)对于普通玩家,若掷出 1 不得分并换人,如果玩家掷出 2-6,就可以选可以输入“r”重掷色子,或者输入“h”保留得分。
(3)对于计算机,轮到其进行游戏,需持续掷色子直到达到或者超过 20
分才予以保留得分。如果计算机获胜或掷出 1,则本轮立即结束。
(4)轮到玩家时,程序会显示双方成绩和之前的点数。

四、实验环境

1.计算机一台;
2.中文 Windows 操作系统;安装 JDK1.6 以上版本,安装 EclipseIDE 软件。

五、实验主要步骤

1.问题分解

(1)类和继承关系

贪心猪游戏的执行主体为“玩家”,其状态可用“当前得分”与“当前回合”描 述,在游戏过程中玩家可执行的动作为“玩游戏”和“掷色子”。在每轮游戏中,具体进行游戏的“玩家”根据游戏规则的不同分为“计算机玩家”和“普通玩家”。则在游戏中,应将玩家类(GamePlayer)作为父类,其具有的成员变量为分数(score) 和当前回合(state),具有的方法为掷色子(dice)和玩游戏(play)。由于规则

中每次掷骰子得到的分数为一个[1,6]的整数,故将 score 定义为整型(int)。同时,每名玩家对于回合的判定仅有两种结果,即是否处在本人回合,则可将 state 定义为布尔型(boolean)。不同的玩家均需执行掷骰子和玩游戏这两个动作,因而将其设置成公有类型(public)。由于普通玩家和计算机玩家在具体规则上的差异,可设置普通玩家(Player)和计算机玩家(Machine)两个类继承自 Gameplayer 类,对其中的 play 函数进行重写,类图如下。

【Java实验】贪心猪游戏_第1张图片
类图

如图 5.1-1 所示,在本实验中除测试类外共涉及 GamePlayer、Player 和 Macine 三个类,其中后二者分别为 GamePlayer 的子类。由于规则的不同,两子类对父类中的 play 函数进行重写,且在构造函数中对父类的两成员变量赋初值。此外, Player 类在执行时,需由用户判断是否娇羞投掷色子,因而添加了 willContinue 方法,用以判断是否继续。

(2)循环控制

规则中玩家先手,则初始化时将普通玩家的回合状态设为假(false),将计算机玩家的回合状态设为真(true),其分数均为 0。游戏在任意玩家分数达到一百及以上时停止,当没有玩家满足条件时始终继续。则主循环可采用 while 型循环,结束条件为普通玩家或计算机玩家总分大于等于一百。其中,每个玩家结束自己的回合后将自己的回合状态设为假(true)并将对方状态设为真(true),用以实现二人的轮换状态。若其中任意玩家分数满足条件,可提前跳出循环。

【Java实验】贪心猪游戏_第2张图片
贪心猪游戏流程图
如图 5.1-2 所示,程序开始运行后,需判断是否有玩家分数大于等于一百, 若有跳出循环判断其是否为普通玩家,并输出普通我那家获胜或机器获胜。若没有玩家分数满足条件,则判断是否为某个玩家回合,执行游戏。

2.程序源码

/**
*贪心猪游戏(测试类)
*贪心猪游戏的测试类,开始游戏时分别生成机器玩家和用户玩家,轮流进行游戏。
* */
public class GreedyTest {
/**
*由用户先开始游戏,则玩家的状态为“真”,即可以游戏,之后的每一次游戏中,机器和用户在完成掷骰子之后,将自己的状态置为“假”,即本回合结束。
*同时,将对方的状态置为“真”,即对方的回合开始。 当其中一方的分数大于 100 时,结束循环,并报告获胜者。
* */
public class GreedyTest {
	/**
	 * 由用户先开始游戏,则玩家的状态为“真”,即可以游戏,之后的每一次游戏中,机器和用户在完成掷骰子之后,将自己的状态置为“假”,即本回合结束。
	 * 同时,将对方的状态置为“真”,即对方的回合开始。 当其中一方的分数大于100时,结束循环,并报告获胜者。
	 * */
	public static void main(String[] args) 
	{
		Player player = new Player() ;
		Machine machine = new Machine() ;
		System.out.println("玩家先掷骰子") ;
		while (player.getScore() < 100 && machine.getScore() < 100) 
		{
			if (player.getState())
			{
				player.play() ;
				machine.setState(true) ;
				System.out.println("玩家当前点数:" + player.getScore()) ;
				if (player.score >= 100)	break ;
			}
			if (machine.getState()) 
			{
				machine.play() ;
				player.setState(true) ;
				System.out.println("机器当前点数:" + machine.score) ;
			}
		}
		System.out.println(player.score >= 100 ? "玩家获胜" : "机器获胜") ;
	}
}

/**
* 贪心猪游戏(玩家类) 所有玩家类,包含玩家当前的得分以及当前是否是该玩家进行游戏
**/
public class GamePlayer 
{
	/** 玩家得分 **/
	protected int score ;
	/** 是否为本玩家的回合 **/
	protected boolean state ;
	/** 返回得分 **/
	public int getScore() 
	{
		return score ;
	}
	/**设置得分**/
	public void setScore(int score) 
	{
		this.score = score ;
	}
	/**返回当前玩家状态,真为其回合,假为对方回合**/
	public boolean getState() 
	{
		return state ;
	}
	/**设置是否为当前玩家状态**/
	public void setState(boolean state) 
	{
		this.state = state ;
	}
	/** 掷骰子,每次返回一个[1,6]的整数 */
	protected int dice() 
	{
		int currentScore = (int) (Math.random() * 6 + 1) ;
		System.out.println("本轮点数:" + currentScore) ;
		return currentScore ;
	}
	/**游戏规则,在子类中实现*/
	protected void play ()
	{}
}
/**
*贪心猪游戏(机器类)
*机器玩家类,包含机器玩家在使用时的规则
* */
public class Machine extends GamePlayer 
{
	/** 初始条件:得分为0,状态为假(机器后手) */
	Machine()
	{
		score = 0 ;
		state = false ;
	}
	/** 机器玩家掷出1或得分大于20时本轮停止
	 *  掷出[2,6]的整数时,将得分累加。
	 * 在本轮得分大于20时,返回本轮得分。 */
	public void play() 
	{
		System.out.println("机器扔") ;
		int current = dice() ;
		int totalScore = 0 ;
		while (current != 1 && totalScore < 20)
		{
			totalScore += current ;
			current = dice() ;
		}
		if (current == 1)
		{
			System.out.println("本轮没有得分") ;
			state = !state ;
			return ;
		}
		else if (totalScore >= 20) 
		{
			System.out.println("本轮得分:" + totalScore) ;
			super.score += totalScore ;
			state = !state ;
		} 
	}
}




import java.util.Scanner;
/**
*用户玩家类(人),包含人在进行游戏时适用的规则
* */

public class Player extends GamePlayer {
	/**	 * 初始条件:得分为0 ,状态为真(玩家先手) * */
	Player() 
	{
		score = 0;
		state = true;
	}
	/**
	 * 玩家进行游戏,当掷出1时不保留得分,返回为0。
	 * 当掷出[2,6]的整数,由玩家选择是否继续。
	 * 当玩家选择继续时,继续执行此方法。
	 * 直到当玩家选择不继续时,保留最后一次的得分并返回。
	 * */
	public void play()	
	{
		System.out.println("玩家扔");
		int currentScore = dice();
		if (currentScore == 1) 
		{
			System.out.println("本轮没有得分");
		}
		else 
		{
			if (willContinue()) 
			{
				 play();
			}
			else
			{
				System.out.println("本次玩家点数:" + currentScore);
				super.score +=  currentScore ;
				state = !state;
				return ;
			}
		} 
	}
	/**根据用户输入的选择,判断是否需要进行游戏,并在输入错误时进行提醒。 */
	public static boolean willContinue()
	{
		System.out.println("请选择是否继续掷骰子,继续按r,不继续按h");
		@SuppressWarnings("resource")
		Scanner scanner = new Scanner(System.in);
		String choice = scanner.next();
		if (choice.equals("r")) 
		{
			return true;
		} else if (choice.equals("h")) 
		{
			return false;
		}
		else
		{
			System.out.println("请输入正确的选择");
			return willContinue();
		}
	}
}

你可能感兴趣的:(程序,Java,Java实验)