博饼程序-Java实验
一.问题描述
按照博饼游戏规则和要求进行编程。
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实验相关推荐
- 博饼程序制作教程 C#
博饼程序制作教程 任务分析 制作一个博饼程序,模拟日常博饼中随机掷出六个骰子,并根据骰子的点数判断来判断胜负. 一.思路解析 按照此思路,我们开始进行博饼程序的编写 二.界面设计 2.1骰子的制作 思 ...
- 厦门中秋博饼程序!(JAVA编写)
/*博饼,这是一个Applet程序,要求:记录已经获取的每种奖品的数目,如果某种奖品用完了,再博出的相应点数不获奖. 游戏结束的条件是:状元已经产生,而且奖品已经用完.跟踪每个获奖过程,一直到游戏结束 ...
- 我的C#第一次实验:中秋博饼
我的C#第一次实验:中秋博饼 一.实验目的: 熟悉C#语法和VS编程环境 二.开发环境: 1.操作系统:windows 10 X64 2.SDK:Visual Studio 2019 三.制作项目 1 ...
- java实验多线程机制_使用Java多线程的同步机制编写应用程序 PDF 下载
使用Java多线程的同步机制编写应用程序 PDF 下载 本站整理下载: 相关截图: 主要内容: 一. 实验名称 使用Java多线程的同步机制编写应用程序 二. 实验目的及要求 1.理解并行/并发的概念 ...
- 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 ...
- java程序设计基础实验_JAVA程序设计基础实验1.doc
JAVA程序设计基础实验1 实 验 报 告 一课 程JAVA程序设计实验项目Java语言基础成 绩学 号XXXXXXXX姓 名 XXXX实验日期2012-9-17专业班级计算机科学与技术(嵌入式方向) ...
- java applet类开始博饼_中秋博饼demo
[实例简介] 自己编写的中秋博饼demo.随机方向滚动,判断椭圆边缘碰撞,骰子之间碰撞.喜欢的可以拿去. [实例截图] [核心代码] f3735861-cb9e-49a5-8bb4-114320c68 ...
- java实验报告之applet(小程序)
一.实验目的与要求 1.了解java Applet基本框架结构.生命期. 2.了解Applet与HTML网页之间的应用关系. 3.了解HTML向Applet传递参数. 二.实验内容 2.1实验问题及结 ...
- 微信小程序中秋博饼部分插图分享
这是微信小游戏<中秋博饼>的部分软件展示图,后续会公开源代码和其他module,谢谢
- 20165310 Java实验五《网络编程与安全》
20165310 Java实验五<网络编程与安全> 任务一 题目:①编写MyBC.java实现中缀表达式转后缀表达式的功能:②编写MyDC.java实现从上面功能中获取的表达式中实现后缀表 ...
最新文章
- 为什么做好数据安全这么难?黑客太牛?
- iptables总结
- python条码识别
- Spark中Task,Partition,RDD、节点数、Executor数、core数目(线程池)、mem数
- poj1564 Sum It Up dfs水题
- Castle.MVC框架介绍
- 图像语义分割_uNetXST:将多个车载摄像头转换为鸟瞰图语义分割图像
- 2016可信云大会进入倒计时 顶级“参会攻略”强势来袭
- 大数据在企业中起到什么作用
- text-transform 文本大小写转换、input checkbok 大小设置、letter-spacing 设置字符间距
- Atitit 在线支付系统功能设计原理与解决方案 与目录
- python设计模式之MVC
- 启动SQL Server服务器以及新建连接的方法
- 如何加减单元格指定数字_表格怎么自动计算加减
- 实验四 C程序的编译和调试(Linux基础教程 第2版)
- python evn安装模块pip
- sap固定资产号码范围_SAP 固定资产的配置与逻辑
- 考研380分什么水平计算机,考研380分属于什么水平 算高分吗
- 《仰天大笑出门去,这个杀手有脾气-雾满拦江》
- 10个降低PCB成本的技巧!PCB采购必须掌握!
热门文章
- DHCP报文分析及C/C++代码实现
- 分组卷积和深度可分离卷积
- vb整合多个excel表格到一张_vba实现excel多表合并
- java.util.timer_java.util.Timer分析源码了解原理
- plc编程语言是c语言吗,PLC各种编程语言特点你了解多少?
- 最适合管理的计算机语言,PLC 编程语言的优劣,哪种语言更适合编程
- 高仿墨迹天气下拉拉伸图片
- 有人给我留言要电源软件,于是就有了这篇软件合集
- 2021-2027全球与中国编码器附件市场现状及未来发展趋势
- mysql sniffer下载_Gitee 极速下载