CS61A 课程项目 Hog
要求参考composing programs的1.2节和1.6节,使用控制语句和高阶函数来完成该项目
Hog 游戏规则
两个玩家轮流进行游戏并试图成为第一个以让总分超过100分的人
每一轮中,当前玩家选择一定数量的骰子投掷(最多10个)
玩家该轮的分数是所有骰子投掷结果的和
投掷骰子数量太多的玩家需要承担一下风险:
- 规则Pig out. 在本轮所有骰子投掷结果中,只要有一个是1,那么当前玩家本轮得分为1
- 例1,当前玩家投掷7枚骰子,其中5个结果为1,该玩家本轮得分为1
- 例2,当前玩家投掷4枚骰子,其投掷结果均为3,由于"Pig out"规则并没有被触发,因此该玩家本轮得分为12
在正常的Hog游戏中,以上即为全部规则,该课程添加了以下特殊规则以增加趣味性以及项目难度:
-
规则Free Bacon,如果一个玩家本轮选择不投掷骰子,那么其分数为
对手本轮分数值的十位数字 + (10 - 对手本轮分数值的个位数字)
- 例1,对手该轮分数为32,当前选手不投掷,当前选手本轮分数为
10 - 2 + 3 = 11
- 例2,对手该轮分数为19,当前选手不投掷,当前选手本轮分数为
10 - 9 + 1 = 2
- 例3,对手该轮分数为80,当前选手不投掷,当前选手本轮分数为
10 - 0 + 8 = 18
- 例4,对手该轮分数为5,当前选手不投掷,当前选手本轮分数为
10 - 5 + 0 = 5
- 例1,对手该轮分数为32,当前选手不投掷,当前选手本轮分数为
-
规则Feral Hogs,如果玩家该轮投掷骰子的数量与上轮投掷得分差的绝对值为2,那么本轮可以额外获得3分。
-
注1:将第一轮游戏之前的轮次得分视为0
-
注2:在计算前一轮得分时,应忽视上轮中规则Feral Hogs和规则Swine Swap的影响
- 例1
- 两玩家起始分数为(0, 0)
- 玩家0投掷3枚骰子获得7分。(7, 0)
- 玩家1投掷1枚骰子获得4分。(7, 4)
- 玩家0投掷5枚骰子获得10分,5与7相差2,所以玩家0额外获得3分。(20, 4)
- 玩家1投掷2枚骰子获得8分,2与4相差2,玩家1额外获得3分。(20, 15)
- 玩家0投掷8枚骰子获得20分,8与10相差2,额外获得3分。(43, 15)
- 玩家1投掷6枚骰子获得1分,6与8相差2,额外获得3分。(43, 19)
- 例2
- 两玩家起始分数为(0, 0)
- 玩家0投掷2枚骰子获得3分,2与0相差2,额外获得3分。(6, 0)
- 例1
-
规则Swine Swap,本回合积分与本局得分相加后,若本局得分个位数与对方得分个位数之差的绝对值等于对方得分十位的数值,则应交换得分
-
注:交换可能发生在玩家达到目标分数的回合结束时,导致对手获胜。
- 例1,在本轮游戏中,第一位玩家结束其投掷后,两位玩家的分数为(6, 2),二者分数各位数字的差值为
6 - 2 = 4
,与第二位玩家分数的十位数字0不等,因此不作交换 - 例2,在本轮游戏中,第一位玩家结束其投掷后,两位玩家的分数为(17, 65),二者分数各位数字的差值为
7 - 5 = 2
,与第二位玩家分数的十位数字6不等,因此不作交换 - 例3,在本轮游戏中,第一位玩家结束其投掷后,两位玩家的分数为(55, 23),二者分数各位数字的差值为
5 - 3 = 2
,与第二位玩家分数的十位数字2相等,因此二者交换得分 - 例4,在本轮游戏中,第一位玩家结束其投掷后,两位玩家的分数为(89, 54),二者分数各位数字的差值为
9 - 4 = 5
,与第二位玩家分数的十位数字5相等,因此二者交换得分
- 例1,在本轮游戏中,第一位玩家结束其投掷后,两位玩家的分数为(6, 2),二者分数各位数字的差值为
该课程要求分三个阶段完成,分别为模拟器、评论和游戏策略的实现,以下为各阶段完成的记录
阶段1:模拟器
阶段2:注释函数
阶段3:策略函数
GUI
CS61A的课程团队为学生制作了GUI,在完成了三个阶段的实现后可以运行,效果图如下所示
骰子投掷界面
获胜结算界面