千峰Java教程:034. 双色球案例(下一节是037小节)【第三章完结】

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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值