Java笔记——控制台模拟“双色球”福利彩票游戏
说明:本打算重新巩固java知识并重新记录笔记,但是现在对于一个20多年的语言而言,鄙人的能力实在是提炼不出来什么精华,直接上练手的小项目更加合适,后续直接上练手的小项目,逐步加强能力…
全部代码如下所示,并对其中细节进行分析:
package com.linstack.testunionlotto;
import java.util.Scanner;
/**
* @Auther: LinStack
* @Date: 2022/8/27 - 08 - 27
* @Description: com.linstack.testunionlotto
* @version: 1.0
*/
public class TestUnionLotto {
public static void main(String[] args) {
//实现功能:按要求完成“双色球福彩游戏”
//声明一个全局数组,用以存储用户选择的双色球数字
int[] balls = new int[7];
//购票数量初始值为0;
int count = 0;
//设置购买状态,防止用户不购买彩票直接查看开奖,造成误导
boolean isBuy = false; //初始状态为false
//完成菜单,并根据需求持续显示在控制台上
while (true){
System.out.println("----------欢迎进入双色球彩票系统----------");
System.out.println("1.购买彩票");
System.out.println("2.查看开奖");
System.out.println("3.退出系统");
System.out.println("请选择您要选择的功能:");
//键盘录入选择的功能:
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
//对录入数字进行初步过滤
while (choice!=1&&choice!=2&&choice!=3){ //使用while不用if避免多次录入非标数据再次报错
System.out.println("对不起,其他功能正在开发中,请重新输入功能选择:");
int newChoice = sc.nextInt();
choice = newChoice; //将新录入的数字再次传回choice中进行下述选择
}
//进入系统后的分支操作
switch (choice){
case 1: //用户购买彩票功能
System.out.println("双色球彩票系统————购票界面:");
System.out.println("请选择彩票票注:");
count = sc.nextInt(); //购票数量,原则上不会为负数,不超过100注
if(count<1 || count >100) {
System.out.println("彩票数量购买失败!请重新选择票注:");
count = sc.nextInt();
}
//模拟选择彩球的数量
for (int i = 1; i <= 7; i++) {
if (i!=7){ //模拟前六个红球
System.out.println("请选择第"+i+"个红球数字:");
int redBall = sc.nextInt();
if(redBall<1 || redBall >33) {
System.out.println("红球输入数字不在数字范围中,请重新选择第"+i+"个红球数字:");
redBall = sc.nextInt();
}
balls[i-1] = redBall; //初步筛选后,传入数组下标0-5对应的红球1-6
for (int j = 1; j < i; j++) { //设置红球选择重复的自检for循环
if (balls[i-1] == balls[j-1]){ //通过循环判断后一个数与前面数字是否一致
//如果一致表示出现重复,则将传入的次数进行回退,给出提示信息并重新获取
System.out.println("红球输入数字重复,请重新选择第"+i+"个红球数字:");
i--;
redBall = sc.nextInt();
}
}
} else { //模拟蓝球
System.out.println("请选择蓝球数字:");
int blueBall = sc.nextInt();
//界限蓝球数字选择
if(blueBall<1 || blueBall >16) {
System.out.println("蓝球输入数字不在数字范围中,请重新输入:");
blueBall = sc.nextInt();
}
balls[6] = blueBall; //传入数组下标6对应的蓝球
}
}
//汇总彩票购买信息:
System.out.println("本次购买"+count+"注彩票,共计消费"+count*2+"元。本次购买的彩票号码为:");
for (int num : balls){
System.out.print(num+"\t");
}
System.out.println(); //格式上与后续菜单显示进行换行
//购买状态设置为true
isBuy = true;
break;
case 2: //彩票开奖功能(开奖随机号码与购买者号码进行对比,分析用户中奖结果)
if (isBuy){
System.out.println("双色球彩票系统————开奖界面:");
//传入开奖方法,获取开奖号码数组
int[] luckBalls = getLuckBalls();
//展示开奖号码数组
System.out.println("本次开奖的彩票号码为:");
for (int num : luckBalls){
System.out.print(num+"\t");
}
System.out.println(); //格式上与后续菜单显示进行换行
//将用户购买的彩票与开奖号码进行比对,获取中奖情况
int levels = getLevels(balls, luckBalls);
switch (levels){
case 1:
System.out.println("恭喜您中奖,获得一等奖!单注奖金500万元人民币,您一共获得:" + 500 * count + "万元人民币!");
break;
case 2:
System.out.println("恭喜您中奖,获得二等奖!单注奖金20万元人民币,您一共获得:" + 20 * count + "万元人民币!");
break;
case 3:
System.out.println("恭喜您中奖,获得三等奖!单注奖金3000元人民币,您一共获得:" + 3000 * count + "元人民币!");
break;
case 4:
System.out.println("恭喜您中奖,获得四等奖!单注奖金200元人民币,您一共获得:" + 200 * count + "元人民币!");
break;
case 5:
System.out.println("恭喜您中奖,获得五等奖!单注奖金10元人民币,您一共获得:" + 10 * count + "元人民币!");
break;
case 6:
System.out.println("恭喜您中奖,获得六等奖!单注奖金5元人民币,您一共获得:" + 5 * count + "元人民币!");
break;
case 0:
System.out.println("对不起,您没有中奖!感谢您对福利事业的贡献,欢迎下次购买!");
break;
}
} else { //没有购买彩票,返回提示信息
System.out.println("请先购买彩票!");
}
break;
case 3: //退出功能
System.out.println("确认是否退出? Y/N ");
String isExit = sc.next();
if ("Y".equals(isExit)) {
System.out.println("感谢您的使用,再见!");
return;
}
}
}
}
//定义一个方法,用于生成开奖号码
public static int[] getLuckBalls(){
//int[] luckBalls = {1,2,3,4,5,6,7}; //测试用
int[] luckBalls = new int[7];
/*双色球生成规则:
* 红球范围[1,33],蓝球范围[1,16]
* 使用Math.random()进行随机数的选取
* Math.random()——>[0.0,1.0)
* Math.random()*33——>[0.0,33.0)
* (int)(Math.random()*33)——>[0,33)——>[0,32]
* (int)(Math.random()*33)+1——>[1,33]
* 完成1-33的随机数的选取*/
for (int i = 1; i <= 7; i++) {
if (i!=7){
//6次红球随机数的生成,为了防止随机数的生成产生重复数字,进行双重循环嵌套(现实彩票摇球不可能出现重复数字)
luckBalls[i-1] = (int)(Math.random()*33)+1; //先把数学随机数方法得到的彩球数字传入数组中
for (int j = 1; j < i; j++) { //设置自检for循环
while (luckBalls[i-1] == luckBalls[j-1]){ //通过循环判断后一个数与前面数字是否一致
i--; //如果一致,则将传入的次数进行回退,重新获取
}
}
}else {
//1次蓝球随机数生成
luckBalls[6] = (int)(Math.random()*16)+1;
}
}
return luckBalls;
}
//定义一个方法,用于比对开奖号与购买号的情况,判断开奖结果
public static int getLevels(int[] balls, int[] luckballs){
int level = 0; //初始值为0
//分别使用两个计数器用于计算红球与蓝球的中奖个数
int redCount = 0;
int blueCount = 0;
//对购买的号码进行遍历
for (int i = 0; i <= 6; i++) {
if (i!=6){
//比对红球
for (int j = 0; j <= 5; j++) {
if (balls[i]==luckballs[j]){
redCount++;
}
}
}else {
//比对蓝球
if (balls[6]==luckballs[6]){
blueCount++;
}
}
}
System.out.println("红球中奖个数:" + redCount);
System.out.println("蓝球中奖个数:" + blueCount);
//根据上述的中奖个数获取中奖等级
if (redCount==6 && blueCount==1){
level = 1;
} else if (redCount==6){
level = 2;
} else if (redCount==5 && blueCount==1){
level = 3;
} else if (redCount==5 ||(redCount==4 && blueCount==1)){
level = 4;
} else if (redCount==4 ||(redCount==3 && blueCount==1)){
level = 5;
} else if (redCount==3 ||(redCount==2 && blueCount==1) ||(redCount==1 && blueCount==1) ||blueCount==1){
level = 6;
}else {
return level;
}
return level;
}
}
数字的判定在多处使用,如:
//对录入数字进行初步过滤
while (choice!=1&&choice!=2&&choice!=3){ //使用while不用if避免多次录入非标数据再次报错
System.out.println("对不起,其他功能正在开发中,请重新输入功能选择:");
int newChoice = sc.nextInt();
choice = newChoice; //将新录入的数字再次传回choice中进行下述选择
}
count = sc.nextInt(); //购票数量,原则上不会为负数,不超过100注
if(count<1 || count >100) {
System.out.println("彩票数量购买失败!请重新选择票注:");
count = sc.nextInt();
}
if(redBall<1 || redBall >33) {
System.out.println("红球输入数字不在数字范围中,请重新选择第"+i+"个红球数字:");
redBall = sc.nextInt();
}
int[] luckBalls = new int[7];
/*双色球生成规则:
* 红球范围[1,33],蓝球范围[1,16]
* 使用Math.random()进行随机数的选取
* Math.random()——>[0.0,1.0)
* Math.random()*33——>[0.0,33.0)
* (int)(Math.random()*33)——>[0,33)——>[0,32]
* (int)(Math.random()*33)+1——>[1,33]
* 完成1-33的随机数的选取*/
for (int i = 1; i <= 7; i++) {
if (i!=7){
//6次红球随机数的生成,为了防止随机数的生成产生重复数字,进行双重循环嵌套(现实彩票摇球不可能出现重复数字)
luckBalls[i-1] = (int)(Math.random()*33)+1; //先把数学随机数方法得到的彩球数字传入数组中
for (int j = 1; j < i; j++) { //设置自检for循环
while (luckBalls[i-1] == luckBalls[j-1]){ //通过循环判断后一个数与前面数字是否一致
i--; //如果一致,则将传入的次数进行回退,重新获取
}
}
}else {
//1次蓝球随机数生成
luckBalls[6] = (int)(Math.random()*16)+1;
}
}
return luckBalls;
数字重复的判定在多处使用,如:
balls[i-1] = redBall; //初步筛选后,传入数组下标0-5对应的红球1-6
for (int j = 1; j < i; j++) { //设置红球选择重复的自检for循环
if (balls[i-1] == balls[j-1]){ //通过循环判断后一个数与前面数字是否一致
//如果一致表示出现重复,则将传入的次数进行回退,给出提示信息并重新获取
System.out.println("红球输入数字重复,请重新选择第"+i+"个红球数字:");
i--;
redBall = sc.nextInt();
}
}
for (int i = 1; i <= 7; i++) {
if (i!=7){
//6次红球随机数的生成,为了防止随机数的生成产生重复数字,进行双重循环嵌套(现实彩票摇球不可能出现重复数字)
luckBalls[i-1] = (int)(Math.random()*33)+1; //先把数学随机数方法得到的彩球数字传入数组中
for (int j = 1; j < i; j++) { //设置自检for循环
while (luckBalls[i-1] == luckBalls[j-1]){ //通过循环判断后一个数与前面数字是否一致
i--; //如果一致,则将传入的次数进行回退,重新获取
}
}
}else {
//1次蓝球随机数生成
luckBalls[6] = (int)(Math.random()*16)+1;
}
}
//设置购买状态,防止用户不购买彩票直接查看开奖,造成误导
boolean isBuy = false; //初始状态为false
if (isBuy){
System.out.println("双色球彩票系统————开奖界面:");
}
} else { //没有购买彩票,返回提示信息
System.out.println("请先购买彩票!");
}
case 3: //退出功能
System.out.println("确认是否退出? Y/N ");
String isExit = sc.next();
if ("Y".equals(isExit)) {
System.out.println("感谢您的使用,再见!");
return;
}
还有没实现的地方,比如在获取开奖结果后,再次获取开奖结果的时候,系统将会自动把我们的彩票传入新的自建的随机数开奖数组中,即一次性的开奖。