一、 实验目的
熟悉 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 函数进行重写,类图如下。
类图
如图 5.1-1 所示,在本实验中除测试类外共涉及 GamePlayer、Player 和 Macine 三个类,其中后二者分别为 GamePlayer 的子类。由于规则的不同,两子类对父类中的 play 函数进行重写,且在构造函数中对父类的两成员变量赋初值。此外, Player 类在执行时,需由用户判断是否娇羞投掷色子,因而添加了 willContinue 方法,用以判断是否继续。
(2)循环控制
规则中玩家先手,则初始化时将普通玩家的回合状态设为假(false),将计算机玩家的回合状态设为真(true),其分数均为 0。游戏在任意玩家分数达到一百及以上时停止,当没有玩家满足条件时始终继续。则主循环可采用 while 型循环,结束条件为普通玩家或计算机玩家总分大于等于一百。其中,每个玩家结束自己的回合后将自己的回合状态设为假(true)并将对方状态设为真(true),用以实现二人的轮换状态。若其中任意玩家分数满足条件,可提前跳出循环。
贪心猪游戏流程图
如图 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() <