Java日常学习016(基于方法与数组学习所制作的小游戏之双色球)

学习目标:

基于方法与数组学习所制作的双色球小游戏

学习内容:

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的统计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值