import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
//需求:双色球
public class Demo07 {
public static void main(String[] args) {
//int[] arr1 = select();
//printArr(arr1);
//中奖号码
int[] arr1 = auto();
for (int i = 0; i < 1000; i++) {
//机选号码
int[] arr2 = auto();
//检测
check(arr2, arr1);
}
}
/**
* 打印数组中的红球号和蓝球号
*
* @param arr 存储有号码的数组
*/
public static void printArr(int[] arr) {
//打印数组中双色球号码,也是一个功能,可以使用方法实现
//将一段代码选中,然后:ctrl + alt + m ,可以把这段代码放到方法中
System.out.print("红球号:");
for (int i = 0; i < arr.length - 1; i++) {
System.out.print(arr[i] + "\t");
}
System.out.print("\t蓝球号:");
System.out.println(arr[6]);
}
/**
* 1.用户投注。6个红球号(1~33),1个蓝球号(1~16)
* 明确参数:不需要参数,双色球的规则是固定的!范围和个数都有要求
* 明确返回值:返回一组号码。int[]。0~5索引放红球号,6索引放蓝球号
*/
public static int[] select() {
//1.1 需要得到一个长度为7的int数组。动态初始化
int[] arr = new int[7];
//1.2 需要键盘录入号码,创建Scanner
Scanner sc = new Scanner(System.in);
//1.3 需要为arr数组中填充号码,先填充红球号,遍历数组。0~5索引
for (int i = 0; i <= 5; i++) {
//1.4 提示用户输入红球号
System.out.println("请输入" + (i + 1) + "个红球号,号码在1~33之间:");
//1.5 将键盘录入的数据直接给数组i索引位置复制
arr[i] = sc.nextInt();
//1.6 赋值之后,i索引位置的数据不一定合理。首先要看范围对不对
if (arr[i] < 1 || arr[i] > 33) {
//成立了,此时i索引位置的数据不合理,这个位置的数据需要作废
System.out.println("亲,红球号必须在1~33之间哦!请重新输入!");
i--;
//这个位置已经不合理,直接继续下一次循环即可
continue;
}
//1.7 如果代码能够执行到这,说明continue没有执行。意味着arr[i]范围是合理的!
//arr[i]这个号码和前面的号码是否重复?
for (int j = 0; j < i; j++) {
//判断i索引位置的数据,和j索引位置的数据是否有重复的!
if (arr[i] == arr[j]) {
//成立了,说明i位置的数据和前面的重复了!
System.out.println("亲,输入的号码不能重复哦!请重新输入!");
i--;
break;
}
}
}
//红球号输入完毕,对红球号进行排序,需要排序的索引是从0号开始到5号结束
//指定数组特定索引范围的数据排序,格式:Arrays.sort(被排序的数组, 开始索引, 结束索引的后一位)
Arrays.sort(arr, 0, 6);
//1.8 输入蓝球号。蓝球号有可能一直输入错误,这是个死循环
while (true) {
System.out.println("请输入蓝球号,号码在1~16之间:");
arr[6] = sc.nextInt();
//arr[6]这个输入的蓝球号有可能非法,需要判断
if (arr[6] < 1 || arr[6] > 16) {
//非法
System.out.println("亲,蓝球号必须在1~16之间哦!请重新输入!");
} else {
//合法。循环需要结束
break;
}
}
//返回数组
return arr;
}
/**
* 2.机选号码,随机生成6个不重复的红球号,和一个蓝球号
* 明确参数:不需要
* 明确返回值:int[]
*/
public static int[] auto() {
//2.1 动态初始化一个长度为7的数组
int[] arr = new int[7];
//2.2 随机生成号码,需要使用Random
Random r = new Random();
//2.3 遍历0~5索引位置,赋值随机的红球号
for (int i = 0; i <= 5; i++) {
//2.4 生成范围是1~33的随机数。给数组i索引位置赋值
arr[i] = r.nextInt(33) + 1;
//2.5 i索引位置的数据和前面是否重复?需要遍历判断
for (int j = 0; j < i; j++) {
if (arr[i] == arr[j]) {
//成立,说明重复了!
i--;
//已经发现重复了,这个遍历j的循环可以结束了
break;
}
}
}
//2.6 排个序
Arrays.sort(arr, 0, 6);
//2.7 生成随机的蓝球号
arr[6] = r.nextInt(16) + 1;
//返回数组
return arr;
}
/**
* 3.定义方法,判断中奖情况
* 明确参数:需要抽奖的号码,和中奖的号码
* 明确返回值:直接打印中奖情况,不需要返回值
*/
public static void check(int[] myArr, int[] arr) {
//定义计数器,用来记录红球命中的次数
int count = 0;
//4.统计一下红球的命中次数!遍历myArr数组,从0号索引到5号索引
for (int i = 0; i <= 5; i++) {
//5.拿出i索引位置的号码(自己的号码)和arr数组中的号码(中奖的号码)比较,有相同的就说明中了一个
//内层循环遍历中间的数组
for (int j = 0; j < 5; j++) {
if (myArr[i] == arr[j]) {
//成立,命中了一个!
count++;
}
}
}
//6.考虑蓝球有没有中!
if (myArr[6] == arr[6]) {
//命中蓝球
//使用switch看看count到底匹配几次红球
switch (count) {
case 6:
System.out.println("一等奖,最高1000万!");
break;
case 5:
System.out.println("三等奖,最高3000元!");
break;
case 4:
System.out.println("四等奖,200元!");
break;
case 3:
System.out.println("五等奖,10元!");
break;
case 0, 1, 2:
System.out.println("六等奖,5元!");
break;
}
} else {
//未命中蓝球
switch (count) {
case 6:
System.out.println("二等奖,最高500万!");
break;
case 5:
System.out.println("四等奖,200元!");
break;
case 4:
System.out.println("五等奖,10元!");
break;
default:
System.out.println("很遗憾,您没有中奖!");
break;
}
}
}
}
彩票抽奖概率
于 2023-06-03 00:13:58 首次发布