ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

博饼小游戏

2022-06-24 22:33:30  阅读:148  来源: 互联网

标签:int System roll 博饼 小游戏 玩家 public out


题目:博饼小游戏

目的:

  • 掌握java面向对象编程

  • 选择合适的数据结构实现需求

  • 熟练使用各种控制结构

内容:

设计并编程实现博饼小游戏,游戏规则如下:

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

  1. 有1个“四点”,得“一秀”饼

  2. 有2个“四点”,得“二举”饼

  3. 有3个“四点”,得“三红”饼

  4. 有4个相同点数(除四点外),得“四进”饼

  5. 若骰子点数分别为1-6顺序排列,得“对堂”饼

  6. 玩家得“状元”饼的情况有几种,其等级按从小到大
    排列如下:

    • 有4个“四点”,得“状元”

    • 有5个相同点数的,得“五子登科”

    • 有4个“四点”,加上2个“一点”,得“状元插金花”

  7. 特殊情况: 若玩家掷出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. 游戏结束后,应输出所有玩家得奖情况

各种得奖情况图示

image

代码实现

Prize类(奖品对象)

package BocakeGame;

import java.util.Scanner;

public class Prize { //奖品对象
    //牺牲一个存储空间,增加程序可读性
    public static int reward1; //一秀
    public static int reward2; //二举
    public static int reward3; //三红
    public static int reward4; //四进
    public static int reward5; //对堂
    public static int reward6; //状元 五子登科 状元插金花 六杯红

    public Prize() { //初始化
        reward1 = reward2 = reward3 = reward4 = reward5 = reward6 = 0;
    }

    public void setPrizeNumber(Scanner scanner) {
        System.out.println("请设置奖品数量(如果输入负数或零将变为默认设置):");
        System.out.println("(1)状元奖数固定为:1");
        reward6 = 1;
        System.out.print("(2)请设置对堂奖数:");
        reward5 = scanner.nextInt();
        System.out.print("(3)请设置三红奖数:");
        reward3 = scanner.nextInt();
        System.out.print("(4)请设置四进奖数:");
        reward4 = scanner.nextInt();
        System.out.print("(5)请设置二举奖数:");
        reward2 = scanner.nextInt();
        System.out.print("(6)请设置一秀奖数:");
        reward1 = scanner.nextInt();
    }
}

PlayGame类(玩游戏对象)

package BocakeGame;

import java.util.Scanner;

public class PlayGame { //玩游戏
    public static int num; //游戏玩家数(静态属性)

    public static void setPlayerNumber(Scanner scanner) { //设置游戏玩家数(静态属性)
        System.out.print("请设置玩家人数(6~10):");
        num = scanner.nextInt();
        if (num < 6) num = 6;
        else if (num > 10) num = 10;
    }

    public static void main(String[] args) { //运行游戏
        Scanner scanner = new Scanner(System.in); //创建一个全局扫描器对象
        Dice dice = new Dice(); //创建骰子对象
        Prize prize = new Prize(); //创建奖品对象
        prize.setPrizeNumber(scanner); //设置奖品数量
        setPlayerNumber(scanner); //设置玩家人数
        scanner.close(); //关闭全局扫描器对象 后面不再需要输入了

        Player[] players = new Player[num]; //创建num个玩家
        for (int i = 0; i < num; i++) {
            players[i] = new Player(); //创建玩家对象
            players[i].id = i + 1; //给每个玩家编号
        }
        for (int i = 0; i < num; i++) {
            players[i].play(dice, prize); //每个人玩游戏
            if (players[i].flag == 1) { //游戏结束 退出循环
                break;
            }
        }
        if (players[0].winner != -1) { //最后输出状元玩家
            System.out.println("状元是" + players[0].winner + "号玩家!");
        } else System.out.println("很遗憾没有人获得状元!");
    }
}

Player类(玩家对象)

package BocakeGame;

public class Player { //玩家对象
    public int id; //玩家号码
    public int[] result = new int[6]; //记录玩家结果 一秀 二举 三红 四进 对堂 状元
    public static int grade; //记录玩家追饼情况
    public static int winner; //记录状元获得者
    public int flag; //记录玩家是否夺得六杯红

    public Player() { //初始化玩家
        id = 0;
        for (int i = 0; i < 6; i++) {
            result[i] = 0;
        }
        grade = 0;
        winner = -1;
        flag = 0;
    }

    public void play(Dice dice, Prize prize) { //每个人只能投一次骰子 之后判断玩家所获得的奖励
        //牺牲一个存储空间,增加程序可读性
        int[] roll = {0, 0, 0, 0, 0, 0, 0}; //记录六个点数出现的次数
        System.out.println(id + "号玩家掷骰子");
        dice.rollDice(); //掷骰子
        dice.printDice(); //打印出骰子的点数
        for (int i = 0; i < 6; i++) { //记录骰子的点数
            roll[dice.dice[i]]++;
        }
        //判断玩家能否获得奖励
        //六杯红
        if (roll[4] == 6) {
            System.out.println("六杯红,恭喜获得所有奖品!");
            result[5] = 1;
            winner = id;
            flag = 1;
            return;
        }
        //状元插金花
        else if (roll[4] == 4 && roll[1] == 2 && grade < 3) {
            System.out.println("状元插金花,有机会获得状元!");
            prize.reward6 = 0;
            result[5] = 1;
            winner = id;
            grade = 3;
        }
        //五子登科
        else if ((roll[1] == 5 || roll[2] == 5 || roll[3] == 5 || roll[5] == 5 || roll[6] == 5) && (grade < 2)) {
            System.out.println("五子登科,有机会获得状元!");
            prize.reward6 = 0;
            result[5] = 1;
            winner = id;
            grade = 2;
        }
        //状元
        else if (roll[4] == 4 && grade < 1) {
            System.out.println("状元,有机会获得状元!");
            prize.reward6 = 0;
            result[5] = 1;
            winner = id;
            grade = 1;
        }
        //对堂
        else if (roll[1] == 1 && roll[2] == 1 && roll[3] == 1 && roll[4] == 1 && roll[5] == 1 && roll[6] == 1) {
            if (prize.reward5 == 0) {
                System.out.println("恭喜获得对堂,但是奖品没有了!");
            } else {
                result[4] = 1;
                prize.reward5--;
                System.out.println("恭喜获得对堂!");
            }
        }
        //四进
        else if (roll[1] == 4 || roll[2] == 4 || roll[3] == 4 || roll[5] == 4 || roll[6] == 4) {
            if (prize.reward4 == 0) {
                System.out.println("恭喜获得四进,但是奖品没有了!");
            } else {
                result[3] = 1;
                prize.reward4--;
                System.out.println("恭喜获得四进!");
            }
        }
        //三红
        else if (roll[4] == 3) {
            if (prize.reward3 == 0) {
                System.out.println("恭喜获得三红,但是奖品没有了!");
            } else {
                result[2] = 1;
                prize.reward3--;
                System.out.println("恭喜获得三红!");
            }
        }
        //二举
        else if (roll[4] == 2) {
            if (prize.reward2 == 0) {
                System.out.println("恭喜获得二举,但是奖品没有了!");
            } else {
                result[1] = 1;
                prize.reward2--;
                System.out.println("恭喜获得二举!");
            }
        }
        //一秀
        else if (roll[4] == 1) {
            if (prize.reward1 == 0) {
                System.out.println("恭喜获得一秀,但是奖品没有了!");
            } else {
                result[0] = 1;
                prize.reward1--;
                System.out.println("恭喜获得一秀!");
            }
        } else {
            System.out.println("很遗憾,没有获奖!");
        }
        //判断游戏是否结束
        if (prize.reward1 == 0 && prize.reward2 == 0 && prize.reward3 == 0 && prize.reward4 == 0 && prize.reward5 == 0 && prize.reward6 == 0) {
            System.out.println("奖品全发完啦,游戏结束!");
            flag = 1;
            return;
        }
    }
}

Dice类(骰子对象)

package BocakeGame;

public class Dice { //骰子对象
    public int[] dice = new int[6]; //六次掷骰子的点数

    public Dice() { //初始化骰子点数
        for (int i = 0; i < 6; i++) {
            dice[i] = 0;
        }
    }

    public void printDice() { //打印骰子点数
        System.out.print("骰子的点数为:");
        for (int i = 0; i < 6; i++)
            System.out.print(dice[i] + " ");
        System.out.println();
    }

    public void rollDice() { //随机扔骰子
        for (int i = 0; i < 6; i++) {
            dice[i] = 1 + (int) (Math.random() * 6); //产生[1,7)的随机整数
        }
    }
}

标签:int,System,roll,博饼,小游戏,玩家,public,out
来源: https://www.cnblogs.com/DoNotMove/p/16410420.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有