一.问题描述

按照博饼游戏规则和要求进行编程。

1.模拟博饼游戏:

(1) 提醒用户输入玩家数(6-10)。

(2) 循环为每个玩家生成六个筛子点数(1-6),根据上图的规则判断所产生的骰子对应的奖项,并输出。

(3) 游戏结束时(所有奖项已经出完),输出每个玩家所获得的奖项以及每个奖项的个数。

2.要求预留测试接口以便测试程序。

3.需要考虑一次产生多个奖项的情况,如:四进带一秀。

评奖规则如下:

二.开发环境

eclipse java 17.0.1

三.完整代码

Award.java

package pk1;
​
public class Award {static final String[] name= {"状元","对堂","三红","四进","二举","一秀"};static public int[] top=new int[6];//记录当届状元static public int top_no;//当届状元编号static public int[] awards= {1,2,4,8,16,32};//奖项剩余数量}

Bobing.java

package pk1;
import java.util.Random;
import java.util.Scanner;
​
public class Bobing {public class Player{private int no=0;private int[] pawards= {0,0,0,0,0,0};//统计获奖public void play()//投掷一次{int[] results=new int[6];//用于存放一次投掷的结果for(int i=0;i<6;i++)//清空results[i]=0;Random ra=new Random();for(int j=0;j<6;j++)results[ra.nextInt(6)]++;
​judge_all(results);}public void get_award(){System.out.print("恭喜Player"+this.no+"一共荣获");for(int i=1;i<6;i++)System.out.print(Award.name[i]+pawards[i]+"个 ");System.out.println('!');}public void set_no(int x){no=x;}private void judge_all(int[] res){if(res[3]>3){judge_top(res);return;//分流到状元,且状元与其他奖不兼容}for(int i=0;i<6;i++){if(res[i]>4){judge_top(res);return;//分流到状元,且状元与其他奖不兼容}else if(res[i]==4)judge(4);//分流到四进}if(res[3]==3)judge(3);//三红else if(res[3]==2)judge(2);//二进else if(res[3]==1){boolean s=true;for(int i=0;i<6;i++){if(res[i]!=1){s=false;break;}}if(s)judge(1);//对堂elsejudge(5);//一秀}}private void judge(int i){if(Award.awards[i]>0) {Award.awards[i]--;this.pawards[i]++;System.out.println("恭喜Player"+this.no+"荣获"+Award.name[i]+'!');}elseSystem.out.println("恭喜Player"+this.no+"荣获空气"+Award.name[i-1]+'!');}private void judge_top(int[] res){int s_p=judge_top_rank(res),s_t=judge_top_rank(Award.top);if(s_p>s_t)//卫冕失败{Award.top=res;Award.top_no=no;return;}}private int judge_top_rank(int[] res)//状元分级{int sum=0,rank=0;if(res[3]==4 && res[0]==2)rank=6;//插金花if(res[3]==6)rank=5;//六红for(int i=0;i<6;i++)if(res[i]==6){rank=4;//六黑sum+=i;break;}if(res[3]==5){rank=3;//五红for(int i=0;i<6;i++){if(i!=3 && res[i]>0)sum+=i;}}for(int i=0;i<6;i++){if(res[i]==5){rank=2;//五黑sum+=i*10;}else if(res[i]!=0)sum+=i;}if(res[3]==4){rank=3;//四红for(int i=0;i<6;i++){if(i!=3 && res[i]>0)sum+=i;}}sum+=rank*100;return sum;}public Player(int x){no=x;}}public static void main(String[] args){int round=0;Scanner input = new Scanner(System.in);System.out.print("请输入玩家个数:");int pn = input.nextInt();Player[] players=new Player[pn];Bobing bb=new Bobing();for(int i=0;i<pn;i++){players[i]=bb.new Player(i);}boolean b=true;while(b)//进行游戏{for(int i=0;i<pn;i++){round++;System.out.println("第"+round+"轮:");players[i].play();}for(int i=1;i<6;i++)//游戏结束的判断{if(Award.awards[i]>0)break;if(i==5)b=false;}
​}System.out.println("博饼结束,接下来揭示欧皇与非酋:");System.out.println("状元是:::::::::::"+Award.top_no+"!!!!!!!!");players[Award.top_no].pawards[0]++;for(Player p:players)p.get_award();}
}
​

四.代码分析

简单的分类程序

1.奖品

public class Award {static final String[] name= {"状元","对堂","三红","四进","二举","一秀"};static public int[] top=new int[6];//记录当届状元static public int top_no;//当届状元编号static public int[] awards= {1,2,4,8,16,32};//奖项剩余数量}

两个数组一个用于存放奖项的名称,另一个用于存放各个奖项的剩余数量;然后由于状元的机制比较特殊,在游戏结束时进行结算,所以需要把当前状元的编号以及获奖记录保留下来以便比较。以上属性均为静态,方便访问与修改,其中name数组不可修改,用final修饰。

2.玩家

private int[] pawards= {0,0,0,0,0,0};//统计获奖
private int no=0;

有两个基本属性,一个是自身的编号,一个是用于统计各个获奖数的数组。

    public void play()//投掷一次{int[] results=new int[6];//用于存放一次投掷的结果for(int i=0;i<6;i++)//清空results[i]=0;Random ra=new Random();for(int j=0;j<6;j++)results[ra.nextInt(6)]++;
​judge_all(results);}

然后是play方法,这里用了Ramdon类的nextInt方法来产生随机数,results数组用来存放各个点数的获得次数,然后判断方法接棒。

首先是总体的分流方法judge_all,大体是按照4的个数去转到状元的判断方法或者一般奖励的判断方法,由于状元奖项和其他奖不能兼容,所以要return结束方法。

普通奖项的判断实际上在judge_all中就已经完成了,在judge方法中只是判断奖励是否已被拿走,若还有就在奖励总数中减一并在相应玩家示例中记录。

private void judge(int i){if(Award.awards[i]>0) {Award.awards[i]--;this.pawards[i]++;System.out.println("恭喜Player"+this.no+"荣获"+Award.name[i]+'!');}elseSystem.out.println("恭喜Player"+this.no+"荣获空气"+Award.name[i-1]+'!');}

状元的判断相对麻烦,我这里是采用了一个打分方法judge_top_rank返回一个可以代表状元大小的int值,而judge_top实际上是对现任状元和新晋状元进行了一次对比。

private int judge_top_rank(int[] res)//状元分级{int sum=0,rank=0;if(res[3]==4 && res[0]==2)rank=6;//插金花if(res[3]==6)rank=5;//六红for(int i=0;i<6;i++)if(res[i]==6){rank=4;//六黑sum+=i;break;}if(res[3]==5){rank=3;//五红for(int i=0;i<6;i++){if(i!=3 && res[i]>0)sum+=i;}}for(int i=0;i<6;i++){if(res[i]==5){rank=2;//五黑sum+=i*10;}else if(res[i]!=0)sum+=i;}if(res[3]==4){rank=3;//四红for(int i=0;i<6;i++){if(i!=3 && res[i]>0)sum+=i;}}sum+=rank*100;return sum;}

打分的主要思想就是分层,其中影响程度最大的是“金花,六红,六黑,五红,五黑,四红”这六层(rank),权重为100然后六黑五黑中由于相同的点数存在大小之分,所以也会影响大小判定,这里给予10的权值;最后是影响程度最小的五红五黑四红中的杂项点数,给予1的权值。(虽然理论上说四红存在两个杂项应该减掉一个3防止超出,但是在这里没有影响)

五.运行结果

博饼程序-Java实验相关推荐

  1. 博饼程序制作教程 C#

    博饼程序制作教程 任务分析 制作一个博饼程序,模拟日常博饼中随机掷出六个骰子,并根据骰子的点数判断来判断胜负. 一.思路解析 按照此思路,我们开始进行博饼程序的编写 二.界面设计 2.1骰子的制作 思 ...

  2. 厦门中秋博饼程序!(JAVA编写)

    /*博饼,这是一个Applet程序,要求:记录已经获取的每种奖品的数目,如果某种奖品用完了,再博出的相应点数不获奖. 游戏结束的条件是:状元已经产生,而且奖品已经用完.跟踪每个获奖过程,一直到游戏结束 ...

  3. 我的C#第一次实验:中秋博饼

    我的C#第一次实验:中秋博饼 一.实验目的: 熟悉C#语法和VS编程环境 二.开发环境: 1.操作系统:windows 10 X64 2.SDK:Visual Studio 2019 三.制作项目 1 ...

  4. java实验多线程机制_使用Java多线程的同步机制编写应用程序 PDF 下载

    使用Java多线程的同步机制编写应用程序 PDF 下载 本站整理下载: 相关截图: 主要内容: 一. 实验名称 使用Java多线程的同步机制编写应用程序 二. 实验目的及要求 1.理解并行/并发的概念 ...

  5. java程序设计实验报告代写_代写file I/O作业、代写java Scanner I/O程序、代写java编程作业、代做java实验报告...

    代写file I/O作业.代写java Scanner I/O程序.代写java编程作业.代做java实验报告 日期:2018-09-05 03:40 ?Objectives oCreate a pr ...

  6. java程序设计基础实验_JAVA程序设计基础实验1.doc

    JAVA程序设计基础实验1 实 验 报 告 一课 程JAVA程序设计实验项目Java语言基础成 绩学 号XXXXXXXX姓 名 XXXX实验日期2012-9-17专业班级计算机科学与技术(嵌入式方向) ...

  7. java applet类开始博饼_中秋博饼demo

    [实例简介] 自己编写的中秋博饼demo.随机方向滚动,判断椭圆边缘碰撞,骰子之间碰撞.喜欢的可以拿去. [实例截图] [核心代码] f3735861-cb9e-49a5-8bb4-114320c68 ...

  8. java实验报告之applet(小程序)

    一.实验目的与要求 1.了解java Applet基本框架结构.生命期. 2.了解Applet与HTML网页之间的应用关系. 3.了解HTML向Applet传递参数. 二.实验内容 2.1实验问题及结 ...

  9. 微信小程序中秋博饼部分插图分享

    这是微信小游戏<中秋博饼>的部分软件展示图,后续会公开源代码和其他module,谢谢

  10. 20165310 Java实验五《网络编程与安全》

    20165310 Java实验五<网络编程与安全> 任务一 题目:①编写MyBC.java实现中缀表达式转后缀表达式的功能:②编写MyDC.java实现从上面功能中获取的表达式中实现后缀表 ...

最新文章

  1. 为什么做好数据安全这么难?黑客太牛?
  2. iptables总结
  3. python条码识别
  4. Spark中Task,Partition,RDD、节点数、Executor数、core数目(线程池)、mem数
  5. poj1564 Sum It Up dfs水题
  6. Castle.MVC框架介绍
  7. 图像语义分割_uNetXST:将多个车载摄像头转换为鸟瞰图语义分割图像
  8. 2016可信云大会进入倒计时 顶级“参会攻略”强势来袭
  9. 大数据在企业中起到什么作用
  10. text-transform 文本大小写转换、input checkbok 大小设置、letter-spacing 设置字符间距
  11. Atitit 在线支付系统功能设计原理与解决方案 与目录
  12. python设计模式之MVC
  13. 启动SQL Server服务器以及新建连接的方法
  14. 如何加减单元格指定数字_表格怎么自动计算加减
  15. 实验四 C程序的编译和调试(Linux基础教程 第2版)
  16. python evn安装模块pip
  17. sap固定资产号码范围_SAP 固定资产的配置与逻辑
  18. 考研380分什么水平计算机,考研380分属于什么水平 算高分吗
  19. 《仰天大笑出门去,这个杀手有脾气-雾满拦江》
  20. 10个降低PCB成本的技巧!PCB采购必须掌握!

热门文章

  1. DHCP报文分析及C/C++代码实现
  2. 分组卷积和深度可分离卷积
  3. vb整合多个excel表格到一张_vba实现excel多表合并
  4. java.util.timer_java.util.Timer分析源码了解原理
  5. plc编程语言是c语言吗,PLC各种编程语言特点你了解多少?
  6. 最适合管理的计算机语言,PLC 编程语言的优劣,哪种语言更适合编程
  7. 高仿墨迹天气下拉拉伸图片
  8. 有人给我留言要电源软件,于是就有了这篇软件合集
  9. 2021-2027全球与中国编码器附件市场现状及未来发展趋势
  10. mysql sniffer下载_Gitee 极速下载