17、双色球模拟综合案例
这里面涵盖了34、35、36小节
一、双色球彩票玩法
玩法说明:
双色球投注区分为红球号码区和蓝球号码区,红球号码范围为01~33,蓝球为01~16,双色球每期从33个红球中开出6个号码,从16个蓝球中开出1个号码,作为中奖号码,双色球玩法既是竞猜开奖号码的6个红球号码和1个蓝球号码,顺序不限。
二、案例分析
1、如何产生蓝球和红球
2、如何接受用户选号
3、如何验证是否中奖
4、公布本期中奖号码
三、实现步骤
1、整体实现思路
2、随机取值不重复算法(系统和用户)
3、判断是否中奖逻辑
4、结果输出
四、分析
在类之外,首先导入Scanner、Random、Arrays类,一会要用。
主函数:
1、导入Scanner input,一会输入机选还是手选和手选蓝球。
2、导入Random r,用来模拟随机数结果。
3、int[] userRedBall、int userBlueBall、int[] sysRedBall、int sysBlueBall,用来保存用户输入的红球蓝球数字和系统保存的红球篮球数字;这里都为空。
4、int[] redBall通过for保存1~33个数字。
5、输出三行 欢迎…… -----…… 您是……。
6、定义一个布尔值,默认为真,在while循环里,如果默认为真,就会提示没选对,再进入循环,选对了,把此值改为假
7、选了1,手动,则提示用户输入红球(这是第一个方法,前面说过故不介绍)蓝球数字,输每一个红球要用回车连接
8、选了2,自动,进入第二个方法来向红球输入数字,用for来延迟时间,再给userBlueBall给一个1~16的值(用r.intNext(16)+1)。
9、系统生成的随机号码(给sysRedBall[]和sysBlueBall),方法和8相同。
10、比较有没有红球中奖:如果有一个中,红球中奖数(redCount)加一,为了更简单,把这个数改到redBall数组的最后一个,如果蓝球中,蓝球数量为1,否则blueBall = 0。
11、验证是否中奖,奖励方法看双色球规则。
12、输出系统的球和用户的球。
方法一:略
方法二:
1、首先设置下标index为 -1,记录所选红球长度len,建立一个伪随机数r。
2、进入循环,给下标index一个这个值,就是一个redBall的下标,然后让userRedBall[i] = redBall[index] ,之后把redBall放在redBall数组最后,下次再循环的时候i已经等于i+1了,下标就是从0~31(第一次是0~32),这时候最后这个数在redBall暂时没有(只是暂时,实际上还有),接着再进行循环。
方法三:
冒泡排序:https://blog.csdn.net/silent0001/article/details/89495998
import java.util.Scanner;
import java.util.Random;
import java.util.Arrays;
public class a
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
Random r = new Random();
int[] userRedBall = new int[6];//用户选择红球数,用户手选或机选存的地方
int[] sysRedBall = new int[6];//系统选择红球数,机器存的地方
int userBlueBall = 0;//用户选择蓝球,用户手选或机选存的地方
int sysBlueBall = 0;//系统选择篮球,机器存的地方
int[] redBall = new int[33];
int len = redBall.length;
for(int i = 0 ; i < len ; i++)
redBall[i] = i+1;
System.out.println("欢迎来到双色球游戏!");
System.out.println("--------------------");
System.out.println("您是想手选还是机选呢?(1、手选;2、机选)");
boolean flag = true;
while(flag)
{
int choice = input.nextInt();//接受手选还是机选
if(choice == 1)
{
System.out.println("你选择了手选,请输入选的红球号码(每个号码输完按回车):");
shouXuan(userRedBall);
System.out.println("再把你选的蓝球号码敲入:");
userBlueBall = input.nextInt();
flag = false;
}
else if(choice == 2)
{
System.out.println("你选择了机选,正在选择中...");
computerSelection(redBall, userRedBall);//机选红球
for(int i = 0; i < 1000000000 ; i++);
userBlueBall = r.nextInt(16) + 1;//机选蓝球
System.out.println("选择完成!");
flag = false;
}
else
System.out.println("没选对,再输一次!");
}
//以上为用户选择
//以下为系统随机生成号码
computerSelection(redBall, sysRedBall);
sysBlueBall = r.nextInt(16) + 1;
//以上为系统球结果
//以下为比较
int redCount = 0 , blueCount = 0;//系统选择正确的红球和蓝球数
for(int i = 0; i < userRedBall.length; i++)
{
for(int j = 0; j < sysRedBall.length - redCount; j++)
{
if(userRedBall[i] == sysRedBall[j])
{
int temp = sysRedBall[j];
sysRedBall[j] = sysRedBall[sysRedBall.length - 1 -redCount];//这里交换顺序
sysRedBall[sysRedBall.length - 1 -redCount] = temp;
redCount++;
break;
}
}
}
if(userBlueBall == sysBlueBall)
blueCount = 1;
//以上为比较
//以下为验证
if(blueCount == 0 && redCount <= 3)
System.out.println("没中奖");
else if(blueCount == 1 && redCount < 3)
System.out.println("中了六等奖!");
else if((blueCount == 1 && redCount == 3) || (blueCount == 0 && redCount == 4))
System.out.println("中了五等奖!");
else if((blueCount == 1 && redCount == 4) || (blueCount == 0 && redCount == 5))
System.out.println("中了四等奖!");
else if(blueCount == 1 && redCount == 5)
System.out.println("中了三等奖!");
else if(blueCount == 0 && redCount == 6)
System.out.println("中了二等奖!");
else
System.out.println("中了一等奖!");
//以上为验证
//以下为排序并公布系统结果
System.out.println("公布本期红球中奖号码:");
System.out.println(Arrays.toString(sort(sysRedBall)));
System.out.println("公布本期蓝球中奖号码:"+sysBlueBall);
//以下为用户结果
System.out.println("您的红球号码:");
System.out.println(Arrays.toString(sort(userRedBall)));
System.out.println("您的蓝球号码:"+userBlueBall);
}
public static void shouXuan(int[] userRedBall)
{
Scanner input = new Scanner(System.in);
int len = userRedBall.length;
for(int i = 0 ; i < len ; i++)
{
userRedBall[i] = input.nextInt();
}
}
public static void computerSelection(int[] redBall,int[] userRedBall)
{
int index = -1;
int len = userRedBall.length;
Random r = new Random();
for(int i = 0 ; i < len ; i++)
{
index = r.nextInt(redBall.length-i);
userRedBall[i] = redBall[index];//找一个1~33的数字给红球
int temp = redBall[index];
redBall[index] = redBall[redBall.length-1-i];
redBall[redBall.length-1-i] = temp;//这个数与最后一个互换
}
}
public static int[] sort(int[] ball)//冒泡排序
{
int len = ball.length;
for(int i = 0; i < len - 1; i++)
{
for(int j = 0; j < len - 1 -i; j++)
{
if(ball[j] > ball[j+1])
{
ball[j] = ball[j] + ball[j+1];
ball[j+1] = ball[j] - ball[j+1];
ball[j] = ball[j] - ball[j+1];
}
}
}
return ball;
}
}