案例需求:用户输入一组由6个红球和1个蓝球组成的数字,系统随机生成一组数字,通过判断是否一致来辨别是否中奖
//红色球号码由1-33从选择 蓝色球号码由1-16中选择
//中奖条件与奖金数
/**
* 红色0+蓝色1, 红1+蓝1, 六等奖 5元
* 红2+蓝1,红3+蓝1,红4+蓝0 五等奖 10元
* 红4+蓝1,红5+蓝0 四等奖 200元
* 红5+蓝1 三等奖 3000元
* 红6+蓝0 二等奖 500万元
* 红6+蓝1 一等奖 1000万元
*/
该案例可以分成三部分,分别是系统随机生成一组中奖号码,用户自身输入号码和判断中奖情况
1.系统随机生成中奖号码
public static int[] createLuckNumbers(){
//建立一组数组,存储7个球的号码
int[] numbers=new int[7];
//随机生成
Random r=new Random();
for (int i = 0; i < numbers.length-1; i++) {
//先生成6个红球 1-33,且不要重复的
while (true) {
//新建一个变量,接收随机生成的数字
int data = r.nextInt(33) + 1;
//新建一个信号量,判断新生成的数字是否重复
boolean flat=true;//没有重复
//number【j】是一组新生成的数字
for (int j = 0; j < i; j++) {
if(numbers[j]==data){
flat=false;
break;
}
}
if(flat){
numbers[i]=data;
break;
}
}
}
//l蓝球1-16 随机生成
numbers[numbers.length-1]= r.nextInt(16)+1;
return numbers;
}
这部分的流程是:a.定义数组,用于存储生成的号码
b.使用Random方法随机生成。
c.因为是双色球,所以要分开生成蓝球号码和红球号码,并且根据要求红球要1-33内的数字,且必须不能重复的。
d.遍历数组,设置数组的前六位用来存储红球的号码,因为必须要不重复,所以要设置一个信号量判断生成的数字是否重复,在死循环里判断,然后通过遍历检查新生成的数字与已经生成的数字是否重复,如果重复则信号量为false,遍历终止,重新进入死循环生成新的数字,重复操作,直到生成六个不重复数字的红球,然后把这些数字存放到数组中,跳出for循环,生成最后一个蓝球号码,并放入数组中。
2.用户自身输入一组号码
public static int[] userInputNumbers(){
//建立一组数组,存储用户输入的数字
int[] numbers=new int[7];
//键盘输入
Scanner sc=new Scanner(System.in);
//循环输入1-6个号码范围1-33,且不重复的
for (int i = 0; i < numbers.length-1; i++) {
System.out.println("请你输入第"+(i+1)+"个号码(1-33,且不重复):");
//设置变量接收用户输入的数字
int data=sc.nextInt();
//将接收的数字放入存储的数组中
numbers[i]=data;
}
//用户输出蓝球号码1-16
System.out.println("请你输入蓝色球的号码(1-16):");
int data= sc.nextInt();
numbers[numbers.length-1]=data;
return numbers;
}
该部分的流程:a.新建数组,用来存储用户输入的数字。
b.通过引用Scanner方法,键入用户所想要输入的数字
c.通过遍历数组,输入具有良好的用户性的语句,设置一个变了接收用户输入的数字,并存入数组中
d.跳出for循环,输入蓝球号码,放入数组中。
3.判断中奖情况
//判断是否中奖了
public static void judge(int[] luckNumbers, int[] userLuckNumber){
//设置两个变量,分别判断红球和蓝球的个数
int redHitNumbers=0;
int blueHitNumber=0;
//遍历随机生成的号码与用户输入的号码 红球
for (int i = 0; i < luckNumbers.length-1; i++) {
for (int j = 0; j < userLuckNumber.length-1; j++) {
if(userLuckNumber[j]==luckNumbers[i]){
redHitNumbers++;
break;
}
}
}
//判断蓝球号码
blueHitNumber= userLuckNumber[6] == luckNumbers[6] ? 1:0;
System.out.println("本期的中奖号码分别是:");
printArray(luckNumbers);
System.out.println("您输入的号码分别是");
printArray(userLuckNumber);
System.out.println("您所中的红球号码数是:"+redHitNumbers);
System.out.println("您是否命中蓝球:"+(blueHitNumber==1? "是":"否"));
//判断中奖情况
if(redHitNumbers<3 &&blueHitNumber==1)
{
System.out.println("恭喜你中了六等奖,获得了5块钱!!!!");
}else if(redHitNumbers == 3 && blueHitNumber ==1
|| redHitNumbers ==4 && blueHitNumber ==0 ){
System.out.println("恭喜你中了五等奖,获得了10块钱!!!!");
}else if (redHitNumbers ==4 && blueHitNumber == 1
|| redHitNumbers == 5 && blueHitNumber ==0){
System.out.println("恭喜你中了四等奖,获得了200元大奖!!!");
}else if(redHitNumbers ==5 && blueHitNumber==1){
System.out.println("恭喜你中了三等奖,获得了3000元特大奖!!!");
}else if(redHitNumbers == 6 && blueHitNumber == 0){
System.out.println("恭喜你中了二等奖,获得了500万元现金巨奖!!!!");
}else if(redHitNumbers==6 &&blueHitNumber==1){
System.out.println("恭喜你中了一等奖,获得了1000万元现金超级巨奖,可以享受人生不用奋斗了");
}else {
System.out.println("对不起,您没有中奖,很遗憾,感谢您为慈善事业做出了杰出的贡献");
}
}
该部分的流程:a.设置存储红球与蓝球个数的变量;
b.遍历查找系统随机生成的号码与用户输入的号码是否有一样的,若是有则红球数量加1,因为先判断红球的,然后跳出for循环使用三元运算符的方法判断蓝球号码是否一样。
c.通过if...else结构判断中奖情况
4.感想与不足之处
通过做这个案例,有很多逻辑理不通,比如随机生成号码判断是否重复那一部分就卡壳了许久,起初没有想到要用死循环,但是通过做完案例收获颇丰。
不足之处:自我感觉后期可以完善这个程序,比如:编写出友好的用户交互界面,还有设置用户输入红球的号码必须是1-33,否则就会报错等的一些完善。
5.完整代码:
package com.study.day6;
import java.util.Random;
import java.util.Scanner;
public class ShuangSeQiuDemo7 {
public static void main(String[] args) {
//案例:用户输入一组由6个红球和1个蓝球组成的数字,系统随机生成一组数字,通过判断是否一致来辨别是否中奖
//红色球号码由1-33从选择 蓝色球号码由1-16中选择
//中奖条件与奖金数
/**
* 红色0+蓝色1, 红1+蓝1, 六等奖 5元
* 红2+蓝1,红3+蓝1,红4+蓝0 五等奖 10元
* 红4+蓝1,红5+蓝0 四等奖 200元
* 红5+蓝1 三等奖 3000元
* 红6+蓝0 二等奖 500万元
* 红6+蓝1 一等奖 1000万元
*/
//随机生成
int[] luckNumbers=createLuckNumbers();
//printArray(luckNumbers);
//用户自选号码
int[] userLuckNumber=userInputNumbers();
// printArray(userLuckNumber);
//判断中奖情况
judge(luckNumbers,userLuckNumber);
}
//判断是否中奖了
public static void judge(int[] luckNumbers, int[] userLuckNumber){
//设置两个变量,分别判断红球和蓝球的个数
int redHitNumbers=0;
int blueHitNumber=0;
//遍历随机生成的号码与用户输入的号码 红球
for (int i = 0; i < luckNumbers.length-1; i++) {
for (int j = 0; j < userLuckNumber.length-1; j++) {
if(userLuckNumber[j]==luckNumbers[i]){
redHitNumbers++;
break;
}
}
}
//判断蓝球号码
blueHitNumber= userLuckNumber[6] == luckNumbers[6] ? 1:0;
System.out.println("本期的中奖号码分别是:");
printArray(luckNumbers);
System.out.println("您输入的号码分别是");
printArray(userLuckNumber);
System.out.println("您所中的红球号码数是:"+redHitNumbers);
System.out.println("您是否命中蓝球:"+(blueHitNumber==1? "是":"否"));
//判断中奖情况
if(redHitNumbers<3 &&blueHitNumber==1)
{
System.out.println("恭喜你中了六等奖,获得了5块钱!!!!");
}else if(redHitNumbers == 3 && blueHitNumber ==1
|| redHitNumbers ==4 && blueHitNumber ==0 ){
System.out.println("恭喜你中了五等奖,获得了10块钱!!!!");
}else if (redHitNumbers ==4 && blueHitNumber == 1
|| redHitNumbers == 5 && blueHitNumber ==0){
System.out.println("恭喜你中了四等奖,获得了200元大奖!!!");
}else if(redHitNumbers ==5 && blueHitNumber==1){
System.out.println("恭喜你中了三等奖,获得了3000元特大奖!!!");
}else if(redHitNumbers == 6 && blueHitNumber == 0){
System.out.println("恭喜你中了二等奖,获得了500万元现金巨奖!!!!");
}else if(redHitNumbers==6 &&blueHitNumber==1){
System.out.println("恭喜你中了一等奖,获得了1000万元现金超级巨奖,可以享受人生不用奋斗了");
}else {
System.out.println("对不起,您没有中奖,很遗憾,感谢您为慈善事业做出了杰出的贡献");
}
}
public static int[] userInputNumbers(){
//建立一组数组,存储用户输入的数字
int[] numbers=new int[7];
//键盘输入
Scanner sc=new Scanner(System.in);
//循环输入1-6个号码范围1-33,且不重复的
for (int i = 0; i < numbers.length-1; i++) {
System.out.println("请你输入第"+(i+1)+"个号码(1-33,且不重复):");
//设置变量接收用户输入的数字
int data=sc.nextInt();
//将接收的数字放入存储的数组中
numbers[i]=data;
}
//用户输出蓝球号码1-16
System.out.println("请你输入蓝色球的号码(1-16):");
int data= sc.nextInt();
numbers[numbers.length-1]=data;
return numbers;
}
//输出方法
public static void printArray(int[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
System.out.println();//换行
}
public static int[] createLuckNumbers(){
//建立一组数组,存储7个球的号码
int[] numbers=new int[7];
//随机生成
Random r=new Random();
for (int i = 0; i < numbers.length-1; i++) {
//先生成6个红球 1-33,且不要重复的
while (true) {
//新建一个变量,接收随机生成的数字
int data = r.nextInt(33) + 1;
//新建一个信号量,判断新生成的数字是否重复
boolean flat=true;//没有重复
//number【j】是一组新生成的数字
for (int j = 0; j < i; j++) {
if(numbers[j]==data){
flat=false;
break;
}
}
if(flat){
numbers[i]=data;
break;
}
}
}
//l蓝球1-16 随机生成
numbers[numbers.length-1]= r.nextInt(16)+1;
return numbers;
}
}