游戏规则:

游戏使用骰子一副(6个),参与游戏的玩家轮流依次掷骰子,看骰子点数得饼:

  1. 有1个“四点”,得“一秀”饼;
  2. 有2个“四点”,得“二举”饼;
  3. 有3个“四点”,得“三红”饼;
  4. 有4个相同点数(除四点外),得“四进”饼;
  5. 若骰子点数分别为1-6顺序排列,得“对堂”饼;
  6. 玩家得“状元”饼的情况有几种,其等级按从小到大排列如下:
  1. 有4个“四点”,加上2个“一点”,得“状元插金花”;
  2. 有5个相同点数的,得“五子登科”;
  3. 有4个“四点”,得“状元”;
  4. 特殊情况: 若玩家掷出6个“四点”得“六杯红”,则直接夺得所有奖品。

程序要求:

(1)游戏开始时,可由玩家设置奖品数,例如:设“状元”1个,“对堂”2个,“三红”4个,“四进”8个,“二举”16个,“一秀”32个。

(2)游戏开始时,可设定玩家人数,游戏中应提示各位玩家轮流依次掷骰子,例如“1号玩家请掷筛子:y”;

(3)游戏中,应显示玩家每次掷得的点数,并显示得奖情况。例如“1,2,3,5,5,6   无奖,继续努力”;“1,4,4,3,5,6  二举,恭喜”。程序应能保存各位玩家得奖的记录。

(4)游戏设定的“一秀”、“二举”、“三红”、“四进”、“对堂”的奖品若领完,后续玩家若再掷出此类点数,不再得奖。但在上述奖品领完前,“状元饼”采取追饼的方式,即在其他奖品分完前,后一个掷得“状元”的人若比前一个“状元”等级大,则可追得“状元饼”。

(5)所有奖品分完,游戏结束。或者某玩家掷出6个“四点”,夺得所有奖品,其他玩家将同时失去所有奖品,游戏结束。

(6)游戏结束后,应输出所有玩家得奖情况。

附:各种得奖情况图示

java 博饼点数工具类 java博饼游戏_初始化

关于博饼游戏代码的一些说明

设计思路:总体设计思路是考虑先将总体的游戏代码框架搭好然后再去实现一些游戏逻辑,这样实现会较为轻松。

(1)用面向对象的思想,游戏的玩家可以封装成一个类,其中包含玩家的id、获奖情况以及用来比较状元之间追饼关系的flag。相关代码如下:

java 博饼点数工具类 java博饼游戏_java 博饼点数工具类_02

(2)然后主程序也封装成一个公共类名为bobing,在主程序中实现相关逻辑

具体实现

第一步:设置玩家数量,对不合法的输入值进行提醒,并让用户再次输入

java 博饼点数工具类 java博饼游戏_intellij-idea_03

第二步:设置奖品数量,用6个变量去存储,然后让用户去输入奖品数,对不合法的值进行判断,这里只截取一部分代码

java 博饼点数工具类 java博饼游戏_初始化_04

第三步:创建对象数组,并初始化

java 博饼点数工具类 java博饼游戏_数组_05

第四步:开始游戏,用随机数来模拟掷色子,并用一个数组去存储掷色子的结果,如果掷到第六个时则对该次循环对应的玩家所掷出的色子进行判断,判断他的获奖情况,并存储在对应的类数组中。当循环到第六次,此时循环体中i为5,此时对该玩家的所有属性进行更改,下图我使用了6个flag去对所掷出的6个色子进行数据保存,之后可以用这6个flag去判断该玩家的获奖情况,一次循环对应一个人的全部属性的改变,直到游戏结束

java 博饼点数工具类 java博饼游戏_数组_06

第五步:用这6个flag去讨论获奖情况,因为游戏中有个特殊情况-----六杯红 该情况要单独拿出来讨论,我这里还用了常量YIXIU、DUITANG等常量去保留各个奖品数,当four_flag=6时,将全部奖品数归0,该玩家获得所有奖品数,对应的奖品数组全部赋值,并将其他玩家获得的奖品数全部归0

java 博饼点数工具类 java博饼游戏_intellij-idea_07

第六步:最重要的是追饼的实现,所以先对追饼进行实现(此次游戏实现的是状元数只有1个的情况),实现思路是写个静态变量prize_flag,并初始化为0

java 博饼点数工具类 java博饼游戏_java 博饼点数工具类_08

当有玩家抽到状元时,判断抽到的状元的等级,与之前抽到状元的玩家比较,那么怎么比较呢?

我是这样想的,设置除了六杯红外的3个状元等级-----4个4的状元为等级1,五子登科为2,状元插金花为3。假设第一次有人抽到状元而且是4个4的状元,则将全局的prize_flag置为1,并将玩家中的player_flag置为1,假设后来还有人抽到4个4的状元,则用1和prize_flag去比较,看下1是否大于prize_flag,大的话将prize_flag置为1并将玩家中的player_flag置为1,在这里显然不行所以改不了改玩家的状态,所以无法获得状元奖品。可以对应现实中博饼游戏里奖品被人先拿而无法获奖的情况,其他两种情况类似

java 博饼点数工具类 java博饼游戏_数组_09

 当然如果该玩家的状元比较大,比如说是五子登科时则依旧比较prize_flag与状元等级之间的大小关系,满足小于关系时才改变该玩家类的属性,只不过这里是把prize_flag和player_flag置为2

java 博饼点数工具类 java博饼游戏_初始化_10

这样在最后输出所有玩家的获奖情况时,只需遍历所有玩家比较谁的player_flag等于prize_flag谁就获得状元奖品。

第七步:对游戏结束条件的编写和全部情况的逻辑编写-------这里要设置一个条件,不能无限追饼,这样游戏就没有意义,所以要在除了状元外的所有奖品都被人拿走后而且状元已经被决出来的情况直接结束游戏,若状元还未有人抽中,则继续游戏直到一名玩家抽中状元,并且此时结束游戏

java 博饼点数工具类 java博饼游戏_数组_11

全部逻辑的编写都是以four_flag为核心进行讨论,分情况讨论为0、1、2、3、4、5、6这七种情况,举个例当four_flag为2时的情况如下:

java 博饼点数工具类 java博饼游戏_数组_12

其他情况类似,要注意判断是否还有相对应的奖品存在,若不在则无法获奖,要输出无奖,继续努力

第八步:实现状元获奖者属性的更改,并将上述讨论的全部结果从类数组中输出,相应代码的实现:

java 博饼点数工具类 java博饼游戏_游戏_13