基于方法与数组学习所制作的双色球小游戏
package com.qf.lzp;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class Game01 {
//双色球游戏
/**
* 1、用户选择是机选还是手选号码
* 2、接收用户选号(6红1蓝)
* 3、生成系统号码(6红1蓝)
* 4、比较系统号码与用户号码,并记录个数
* 5、验证是否中奖
* 6、系统号码排序
* 7、公布结果
*/
public static void main(String[] args) {
System.out.println("!!! 游戏规则 !!!");
System.out.println("* 该游戏支持机选与自选号码");
System.out.println("* 中奖规则如下:");
System.out.println("* 一等奖:2w 要求:6红1蓝全中");
System.out.println("* 二等奖:5000 要求:6红0蓝");
System.out.println("* 三等奖:1200 要求:5红1蓝");
System.out.println("* 四等奖:500 要求:5红0蓝或4红1蓝");
System.out.println("* 五等奖:100 要求:3红1蓝或4红0蓝");
System.out.println("* 六等奖:30 要求:1蓝");
System.out.println("* 参与奖:纸巾一包");
//定义相关的变量
int[] userRedball = new int[6];//用于储存用户的6个红球号码
int userBlueball = 0;//用于储存用户的1个蓝球号码
int[] sysRedball = new int[6];//用于储存系统的6个红球号码
int sysBlueball = 0;//用于储存系统的1个蓝球号码
int redCount = 0;//记录红球相同的个数
int blueCount = 0;//记录篮球相同的个数
int[] redBall = new int[33];//存储总的33个红球号码
for (int i = 0; i < 33; i++) {
redBall[i] = i + 1;
}
computerSelection(redBall, sysRedball);//生成系统的红球号码
Random r = new Random();
sysBlueball = r.nextInt(16)+1;//生成系统的篮球号码
userBlueball=gameStart(redBall, userRedball, userBlueball);
redCount=statisticsRedCount(userRedball, sysRedball, redCount);
blueCount=statisticsBluedCount(userBlueball,sysBlueball,blueCount);
judgment(redCount, blueCount);
print(sysRedball, sysBlueball, userRedball, userBlueball);
}
public static void computerSelection(int[] redBall, int[] userRedball) { //定义一个算法,随机生成6个不同的红球号码
Random r = new Random();
int index = -1;
//通过随机生成数,选择数组下标对应的号码,然后将该元素与当前数组最后一位交换位置
//之后选择的范围减一,即index=r.nextInt(redBall.length-i);带表从未选择的数中选择一位
for (int i = 0; i < userRedball.length; i++) {
index = r.nextInt(redBall.length - i);
userRedball[i] = redBall[index];
int a = redBall[index];//定义中间值
redBall[index] = redBall[redBall.length - 1 - i];//进行交换,将选择的元素放置当前操作数组最后
redBall[redBall.length - 1 - i] = a;
}
}
//游戏开始
public static int gameStart(int[] redBall, int[] userRedball, int userBlueball) {
System.out.println("游戏开始");
System.out.println("请输入 机选号码:1 或者 手选号码 2");
Scanner input = new Scanner(System.in);
Random r = new Random();
boolean flag = true;
while (flag) {
int a = input.nextInt();
switch (a) {
case 1:
//机选
computerSelection(redBall, userRedball);
userBlueball = r.nextInt(16)+1;
flag = false;
break;
case 2:
//手选
System.out.println("请输入6个手选红球号码:范围1~33:");
for (int i = 0; i < userRedball.length; i++) {
userRedball[i] = input.nextInt();
}
System.out.println("请输入1个篮球号码:范围1~16:");
userBlueball = input.nextInt();
flag = false;
break;
default:
System.out.println("操作有误,重新开始");
System.out.println("请输入机选号码:1 或者 手选号码 2");
break;
}
}
return userBlueball;
}
//统计红球
public static int statisticsRedCount(int[] userRedball, int[] sysRedball, int redCount) {
for (int i = 0; i < userRedball.length; i++) {
for (int j = 0; j < sysRedball.length - redCount; j++) {
if (userRedball[i] == sysRedball[j]) {
int a = sysRedball[j];
sysRedball[j] = sysRedball[sysRedball.length - 1 - redCount];
sysRedball[sysRedball.length - 1 - redCount] = a;
redCount++;
break;
}
}
}
return redCount;
}
//统计蓝球
public static int statisticsBluedCount(int userBlueball, int sysBlueball, int blueCount) {
if(userBlueball==sysBlueball)
blueCount=1;
return blueCount;
}
//判断是否中奖
public static void judgment(int redCount, int blueCount) {
if (blueCount == 0 && redCount <= 3) {
System.out.println("恭喜你获得参与奖:纸巾一包");
} else if (blueCount == 1 && redCount < 3) {
System.out.println("恭喜你中了六等奖,奖金30块钱!");
} else if ((blueCount == 1 && redCount == 3) || (blueCount == 0 && redCount == 4)) {
System.out.println("恭喜你中了五等奖,奖金100块钱!!");
} else if ((blueCount == 1 && redCount == 4) || (blueCount == 0 && redCount == 5)) {
System.out.println("恭喜你中了四等奖,奖金500块钱!!!");
} else if (blueCount == 1 && redCount == 5) {
System.out.println("恭喜你中了三等奖,奖金1200块钱!!!!");
} else if (blueCount == 0 && redCount == 6) {
System.out.println("恭喜你中了二等奖,奖金5000块钱!!!!!");
} else if (blueCount == 1 && redCount == 6) {
System.out.println("恭喜你中了一等奖,奖金2w!!!!!!");
} else {
System.out.println("系统出错,请联系工作人员");
}
}
//输出结果
public static void print(int[] sysRedball, int sysBlueball, int[] userRedball, int userBlueball) {
System.out.print("本期中奖的红球号码为: ");
BubbleSort(sysRedball);
System.out.println(Arrays.toString(sysRedball));
System.out.println("本期中奖的蓝球号码为: " + sysBlueball);
System.out.print("你的红球号码为: ");
BubbleSort(userRedball);
System.out.println(Arrays.toString(userRedball));
System.out.println("你的的蓝球号码为: " + userBlueball);
}
//冒泡排序算法
public static void BubbleSort(int[] A) {
//外循环控制轮数
for (int i = 0; i < A.length - 1; i++) {
//内循环进行比较
for (int j = 0; j < A.length - 1 - i; j++) {
if (A[j] > A[j + 1]) {
A[j] = A[j] + A[j + 1];//加法交换法
A[j + 1] = A[j] - A[j + 1];
A[j] = A[j] - A[j + 1];
}
}
}
}
}
①随机生成不重复的6个红色球号码;
解决方法:定义一个数组int[ ] redBall用于存储33个号码;
通过随机数r, r.nextint(redBall.length-i); redBall.length-i表示当前未选择(即未被挑选红球号码)的个数
在循环中,随机生成一个下标,选择该数组下标对应的元素,然后将该元素与当前未被操作的数组元素的最后一位进行交换位置。
例:当i=0时, r.nextint(redBall.length-i)随机生成一个下标为3,此时 redBall.length-i为33,即从0到32中随机生成一个3,选择下标为3的数组元素4,与redBall[redBall.length-1-i]进行交换,然后i++后,redBall.length-i为32,即从0到31的下标中随机产生下一个元素,而此时的下标为32的数组元素储存着已经选择后的号码,从而避免了号码的重复
②对于调用方法传入的实参,使用形参进行操作后不会改变实参的数值
产生的原因:
如 :
public class test000 {
public static void main(String[] args) {
int a=0;
changeNum(a);
System.out.println(a);
}
public static void changeNum(int n){
n=10;
}
}
java类执行时,基本类型变量是存储在栈中的,压栈顺序:(1)主方法压栈->(2)变量a压栈->(3)静态方法changeNum压栈->(4)压栈参数并修改为10->(5)退出changeInt方法,并弹出changeInt方法及其作用域内的数据->(6) 退出main方法。
打印结果0是打印经过方法修改为10后,退出方法后打印的变量的值,由于基本数据类型存储在栈中,因此退出方法后,变量的值仍然是变量最初所在栈位置的值0.
解决方法:增加返回值,然后用原来的数据接收返回值,从而实现更改
如:
在main方法中:blueCount=statisticsBluedCount(userBlueball,sysBlueball,blueCount);
//统计蓝球
public static int statisticsBluedCount(int userBlueball, int sysBlueball, int blueCount) {
if(userBlueball==sysBlueball)
blueCount=1;
return blueCount;
}
从而实现在statisticsBluedCount方法中blueCount的统计。