博饼小游戏

打印 上一主题 下一主题

主题 663|帖子 663|积分 1989

题目:博饼小游戏

目的:


  • 掌握java面向对象编程
  • 选择合适的数据结构实现需求
  • 熟练使用各种控制结构
内容:

设计并编程实现博饼小游戏,游戏规则如下:
游戏使用骰子一副(6个),参与游戏的玩家轮流依次掷骰子,看骰子点数得饼:

  • 有1个“四点”,得“一秀”饼
  • 有2个“四点”,得“二举”饼
  • 有3个“四点”,得“三红”饼
  • 有4个相同点数(除四点外),得“四进”饼
  • 若骰子点数分别为1-6顺序排列,得“对堂”饼
  • 玩家得“状元”饼的情况有几种,其等级按从小到大
    排列如下:

    • 有4个“四点”,得“状元”
    • 有5个相同点数的,得“五子登科”
    • 有4个“四点”,加上2个“一点”,得“状元插金花”

  • 特殊情况: 若玩家掷出6个“四点”得“六杯红”,则直接夺得所有奖品
程序要求:


  • 游戏开始时,可由玩家设置奖品数,例如:设“状元”1个,“对堂”2个,“三红”4个,“四进”8个,“二举”16个,“一秀”32个
  • 游戏开始时,可设定玩家人数,游戏中应提示各位玩家轮流依次掷骰子,例如“1号玩家请掷筛子:y”
  • 游戏中,应显示玩家每次掷得的点数,并显示得奖情况。例如“1,2,3,5,5,6   无奖,继续努力”;“1,4,4,3,5,6  二举,恭喜”。程序应能保存各位玩家得奖的记录
  • 游戏设定的“一秀”、“二举”、“三红”、“四进”、“对堂”的奖品若领完,后续玩家若再掷出此类点数,不再得奖。但在上述奖品领完前,“状元饼”采取追饼的方式,即在其他奖品分完前,后一个掷得“状元”的人若比前一个“状元”等级大,则可追得“状元饼”
  • 所有奖品分完,游戏结束。或者某玩家掷出6个“四点”,夺得所有奖品,其他玩家将同时失去所有奖品,游戏结束
  • 游戏结束后,应输出所有玩家得奖情况
各种得奖情况图示


代码实现

Prize类(奖品对象)
  1. package BocakeGame;
  2. import java.util.Scanner;
  3. public class Prize { //奖品对象
  4.     //牺牲一个存储空间,增加程序可读性
  5.     public static int reward1; //一秀
  6.     public static int reward2; //二举
  7.     public static int reward3; //三红
  8.     public static int reward4; //四进
  9.     public static int reward5; //对堂
  10.     public static int reward6; //状元 五子登科 状元插金花 六杯红
  11.     public Prize() { //初始化
  12.         reward1 = reward2 = reward3 = reward4 = reward5 = reward6 = 0;
  13.     }
  14.     public void setPrizeNumber(Scanner scanner) {
  15.         System.out.println("请设置奖品数量(如果输入负数或零将变为默认设置):");
  16.         System.out.println("(1)状元奖数固定为:1");
  17.         reward6 = 1;
  18.         System.out.print("(2)请设置对堂奖数:");
  19.         reward5 = scanner.nextInt();
  20.         System.out.print("(3)请设置三红奖数:");
  21.         reward3 = scanner.nextInt();
  22.         System.out.print("(4)请设置四进奖数:");
  23.         reward4 = scanner.nextInt();
  24.         System.out.print("(5)请设置二举奖数:");
  25.         reward2 = scanner.nextInt();
  26.         System.out.print("(6)请设置一秀奖数:");
  27.         reward1 = scanner.nextInt();
  28.     }
  29. }
复制代码
PlayGame类(玩游戏对象)
  1. package BocakeGame;
  2. import java.util.Scanner;
  3. public class PlayGame { //玩游戏
  4.     public static int num; //游戏玩家数(静态属性)
  5.     public static void setPlayerNumber(Scanner scanner) { //设置游戏玩家数(静态属性)
  6.         System.out.print("请设置玩家人数(6~10):");
  7.         num = scanner.nextInt();
  8.         if (num < 6) num = 6;
  9.         else if (num > 10) num = 10;
  10.     }
  11.     public static void main(String[] args) { //运行游戏
  12.         Scanner scanner = new Scanner(System.in); //创建一个全局扫描器对象
  13.         Dice dice = new Dice(); //创建骰子对象
  14.         Prize prize = new Prize(); //创建奖品对象
  15.         prize.setPrizeNumber(scanner); //设置奖品数量
  16.         setPlayerNumber(scanner); //设置玩家人数
  17.         scanner.close(); //关闭全局扫描器对象 后面不再需要输入了
  18.         Player[] players = new Player[num]; //创建num个玩家
  19.         for (int i = 0; i < num; i++) {
  20.             players[i] = new Player(); //创建玩家对象
  21.             players[i].id = i + 1; //给每个玩家编号
  22.         }
  23.         for (int i = 0; i < num; i++) {
  24.             players[i].play(dice, prize); //每个人玩游戏
  25.             if (players[i].flag == 1) { //游戏结束 退出循环
  26.                 break;
  27.             }
  28.         }
  29.         if (players[0].winner != -1) { //最后输出状元玩家
  30.             System.out.println("状元是" + players[0].winner + "号玩家!");
  31.         } else System.out.println("很遗憾没有人获得状元!");
  32.     }
  33. }
复制代码
Player类(玩家对象)
  1. package BocakeGame;
  2. public class Player { //玩家对象
  3.     public int id; //玩家号码
  4.     public int[] result = new int[6]; //记录玩家结果 一秀 二举 三红 四进 对堂 状元
  5.     public static int grade; //记录玩家追饼情况
  6.     public static int winner; //记录状元获得者
  7.     public int flag; //记录玩家是否夺得六杯红
  8.     public Player() { //初始化玩家
  9.         id = 0;
  10.         for (int i = 0; i < 6; i++) {
  11.             result[i] = 0;
  12.         }
  13.         grade = 0;
  14.         winner = -1;
  15.         flag = 0;
  16.     }
  17.     public void play(Dice dice, Prize prize) { //每个人只能投一次骰子 之后判断玩家所获得的奖励
  18.         //牺牲一个存储空间,增加程序可读性
  19.         int[] roll = {0, 0, 0, 0, 0, 0, 0}; //记录六个点数出现的次数
  20.         System.out.println(id + "号玩家掷骰子");
  21.         dice.rollDice(); //掷骰子
  22.         dice.printDice(); //打印出骰子的点数
  23.         for (int i = 0; i < 6; i++) { //记录骰子的点数
  24.             roll[dice.dice[i]]++;
  25.         }
  26.         //判断玩家能否获得奖励
  27.         //六杯红
  28.         if (roll[4] == 6) {
  29.             System.out.println("六杯红,恭喜获得所有奖品!");
  30.             result[5] = 1;
  31.             winner = id;
  32.             flag = 1;
  33.             return;
  34.         }
  35.         //状元插金花
  36.         else if (roll[4] == 4 && roll[1] == 2 && grade < 3) {
  37.             System.out.println("状元插金花,有机会获得状元!");
  38.             prize.reward6 = 0;
  39.             result[5] = 1;
  40.             winner = id;
  41.             grade = 3;
  42.         }
  43.         //五子登科
  44.         else if ((roll[1] == 5 || roll[2] == 5 || roll[3] == 5 || roll[5] == 5 || roll[6] == 5) && (grade < 2)) {
  45.             System.out.println("五子登科,有机会获得状元!");
  46.             prize.reward6 = 0;
  47.             result[5] = 1;
  48.             winner = id;
  49.             grade = 2;
  50.         }
  51.         //状元
  52.         else if (roll[4] == 4 && grade < 1) {
  53.             System.out.println("状元,有机会获得状元!");
  54.             prize.reward6 = 0;
  55.             result[5] = 1;
  56.             winner = id;
  57.             grade = 1;
  58.         }
  59.         //对堂
  60.         else if (roll[1] == 1 && roll[2] == 1 && roll[3] == 1 && roll[4] == 1 && roll[5] == 1 && roll[6] == 1) {
  61.             if (prize.reward5 == 0) {
  62.                 System.out.println("恭喜获得对堂,但是奖品没有了!");
  63.             } else {
  64.                 result[4] = 1;
  65.                 prize.reward5--;
  66.                 System.out.println("恭喜获得对堂!");
  67.             }
  68.         }
  69.         //四进
  70.         else if (roll[1] == 4 || roll[2] == 4 || roll[3] == 4 || roll[5] == 4 || roll[6] == 4) {
  71.             if (prize.reward4 == 0) {
  72.                 System.out.println("恭喜获得四进,但是奖品没有了!");
  73.             } else {
  74.                 result[3] = 1;
  75.                 prize.reward4--;
  76.                 System.out.println("恭喜获得四进!");
  77.             }
  78.         }
  79.         //三红
  80.         else if (roll[4] == 3) {
  81.             if (prize.reward3 == 0) {
  82.                 System.out.println("恭喜获得三红,但是奖品没有了!");
  83.             } else {
  84.                 result[2] = 1;
  85.                 prize.reward3--;
  86.                 System.out.println("恭喜获得三红!");
  87.             }
  88.         }
  89.         //二举
  90.         else if (roll[4] == 2) {
  91.             if (prize.reward2 == 0) {
  92.                 System.out.println("恭喜获得二举,但是奖品没有了!");
  93.             } else {
  94.                 result[1] = 1;
  95.                 prize.reward2--;
  96.                 System.out.println("恭喜获得二举!");
  97.             }
  98.         }
  99.         //一秀
  100.         else if (roll[4] == 1) {
  101.             if (prize.reward1 == 0) {
  102.                 System.out.println("恭喜获得一秀,但是奖品没有了!");
  103.             } else {
  104.                 result[0] = 1;
  105.                 prize.reward1--;
  106.                 System.out.println("恭喜获得一秀!");
  107.             }
  108.         } else {
  109.             System.out.println("很遗憾,没有获奖!");
  110.         }
  111.         //判断游戏是否结束
  112.         if (prize.reward1 == 0 && prize.reward2 == 0 && prize.reward3 == 0 && prize.reward4 == 0 && prize.reward5 == 0 && prize.reward6 == 0) {
  113.             System.out.println("奖品全发完啦,游戏结束!");
  114.             flag = 1;
  115.             return;
  116.         }
  117.     }
  118. }
复制代码
Dice类(骰子对象)
  1. package BocakeGame;
  2. public class Dice { //骰子对象
  3.     public int[] dice = new int[6]; //六次掷骰子的点数
  4.     public Dice() { //初始化骰子点数
  5.         for (int i = 0; i < 6; i++) {
  6.             dice[i] = 0;
  7.         }
  8.     }
  9.     public void printDice() { //打印骰子点数
  10.         System.out.print("骰子的点数为:");
  11.         for (int i = 0; i < 6; i++)
  12.             System.out.print(dice[i] + " ");
  13.         System.out.println();
  14.     }
  15.     public void rollDice() { //随机扔骰子
  16.         for (int i = 0; i < 6; i++) {
  17.             dice[i] = 1 + (int) (Math.random() * 6); //产生[1,7)的随机整数
  18.         }
  19.     }
  20. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表