黑马程序员技术交流社区

标题: 基础班结束,分享一个自己写的买彩票Demo,写的不好,请多多指教 [打印本页]

作者: tang475    时间: 2019-8-20 18:28
标题: 基础班结束,分享一个自己写的买彩票Demo,写的不好,请多多指教
贴一个自己写的小Demo,是写了学生管理系统后受到启发自己独立编写的。叫做“欢乐彩票”;
        实现的功能:
(需要管理员验证:输入正确的账号和密码,错误的话无法进入“欢乐彩票系统”)
1.买彩票(1.自选 2.机选 3.修改一注彩票(带撤销功能) 4.删除一注彩票(带撤销功能) 5.返回)
2.摇出开奖号码(程序运行一次,只能生成一次开奖号码)
3.兑奖(显示所得奖金并结账)
4.退出

        感兴趣的同学可以copy回去试着运行一下,代码的逻辑很初级,可能存在未知BUG,仅供各位学习交流,轻喷~



我的代码:
(1)主界面类  Main.java
/*
   彩票开奖系统的主界面

   实现功能:
   1.管理员登录验证
   2.调用方法生成当前开奖的随机彩票数值(前区5个数:1-35互不重复,后区2个数:1-12互不重复)
   3.调用方法输入自己的彩票数值(无上限,循环打印购买彩票)
   4.调用方法兑奖
奖项设置:
    一等奖:5+2 500万元
    二等奖:5+1 300万元
    三等奖:5+0 100万元
    四等奖:4+2 3000元
    五等奖:4+1 600元
    六等奖:4+0/3+2 100元
    七等奖:3+1/2+2 10元
    八等奖:3+0/2+1/1+2/0+2 5元

   主界面内容:
   1.我要买彩票(1.自选 2.机选 3.修改1注彩票 4.删除1注彩票 5.返回主界面)
   2.开始摇奖(每运行一次程序,只能摇奖一次)
   3.兑奖(如果中奖,显示中奖的号码及中奖金额)
   4.退出本程序
*/
/*
    目前程序的不足:可能生成相同的数组,未优化
*/

import java.util.ArrayList;
import java.util.Scanner;

/**
* @author TJH
* 2019-08-14 17:24
*/
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);//创建数字接收对象
        Scanner sc2 = new Scanner(System.in);//创建字符串接收对象(防止BUG)
        Manager a = new Manager();//创建管理员对象
        LotteryNumber b = new LotteryNumber();//创建彩票生成方法调用对象
        ArrayList<ArrayList<int[]>> arr = new ArrayList<>();//创建一个储存数组的集合的集合
        ArrayList<int[]> ar;//创建一个临时储存数组的集合
        ArrayList<int[]> ar2 = new ArrayList<>();//创建一个储存中奖号码的集合
        if (a.logOn()) {//进入彩票系统(添加了管理员验证功能,需要登录)
            int count = 0;//定义一个计数器
            int index;//定义一个参数
            boolean boo = false;//定义一个判断参数
            while (true) {
                mainPrint();
                int select = sc.nextInt();//选择
                switch (select) {
                    case 1://1.自选 2.机选 3.修改 4.删除 5.返回
                        while (true) {
                            System.out.println("----------------------------------------------------");
                            System.out.println("1.自选 2.机选 3.修改1注彩票 4.删除1注彩票 5.返回主界面");
                            int select2 = sc.nextInt();
                            if (select2 == 1) {//自选内部逻辑
                                while (true) {
                                    arr.add(b.bonusNumeber(b.genericScanArr(5, 35), b.genericScanArr(2, 12)));
                                    b.print(arr);//每完成一次投注操作,打印已完成数组
                                    System.out.println("-------------------------------");
                                    System.out.println("是否继续自选(1.是 2.否)");
                                    select2 = sc.nextInt();
                                    if (select2 == 1) {
                                    } else if (select2 == 2) {
                                        break;
                                    } else {
                                        System.out.println("参数错误!返回主界面");
                                        break;
                                    }
                                }
                            } else if (select2 == 2) {//机选内部逻辑
                                System.out.println("请输入要机选的数量:");
                                int key = sc.nextInt();
                                for (int i = 0; i < key; i++) {
                                    arr.add(b.bonusNumeber(b.genericRanArr(5, 35), b.genericRanArr(2, 12)));
                                }
                                b.print(arr);
                            } else if (select2 == 3) {//修改1注彩票内部逻辑
                                if (arr.size() > 0) {
                                    while (true) {
                                        System.out.println("1.更换1注彩票 2.修改彩票中的值 3.返回上一层");
                                        select2 = sc.nextInt();
                                        if (select2 == 1) {
                                            while (true) {
                                                System.out.println("更换哪注彩票?");
                                                index = sc.nextInt();
                                                if (index > arr.size() || index < 1) {
                                                    System.out.println("参数异常,重新输入");
                                                    break;
                                                }
                                                ar = arr.set(index - 1, b.bonusNumeber(b.genericScanArr(5, 35), b.genericScanArr(2, 12)));
                                                b.print(arr);
                                                System.out.println("更换成功!撤销操作请输入 re,不撤销请回车");
                                                if (sc2.nextLine().equals("re")) {
                                                    arr.set(index - 1, ar);
                                                    System.out.println("撤销操作成功!");
                                                    b.print(arr);
                                                }
                                                System.out.println("是否继续更换? 1.是 2.否");
                                                index = sc.nextInt();
                                                if (index == 1) {
                                                } else if (index == 2) {
                                                    System.out.println("返回上一层");
                                                    break;
                                                } else {
                                                    System.out.println("参数异常");
                                                    break;
                                                }
                                            }
                                        } else if (select2 == 2) {
                                            while (true) {
                                                System.out.println("修改哪注彩票?");
                                                int index1 = sc.nextInt();
                                                if (index1 > arr.size() || index1 < 1) {
                                                    System.out.println("参数异常,重新输入");
                                                    break;
                                                }
                                                System.out.println("修改修改数字的索引(前区:1-5 后区:6-7):");
                                                int index2 = sc.nextInt();
                                                if (index2 >= 1 && index2 <= 7) {
                                                    b.modyNum(arr.get(index1 - 1), index2);
                                                    b.print(arr);
                                                    System.out.println("修改成功!");
                                                } else {
                                                    System.out.println("参数异常,修改失败");
                                                }
                                                System.out.println("1.继续修改 2.返回上一层");
                                                select2 = sc.nextInt();
                                                if (select2 == 1) {

                                                } else if (select2 == 2) {
                                                    break;
                                                } else {
                                                    System.out.println("参数错误,返回上一层");
                                                }
                                            }
                                        } else if (select2 == 3) {
                                            break;
                                        } else {
                                            System.out.println("参数错误,返回上一层");
                                        }
                                    }
                                } else {
                                    System.out.println("不存在任何彩票,返回上一层");
                                }
                            } else if (select2 == 4) {//删除1注彩票内部逻辑
                                if (arr.size() > 0) {
                                    while (true) {
                                        System.out.println("删除哪注彩票?");
                                        index = sc.nextInt();
                                        if (index >= 0 && index <= arr.size()) {
                                            ar = arr.remove(index - 1);
                                        } else {
                                            System.out.println("不存在任何彩票,返回上一层");
                                            break;
                                        }
                                        b.print(arr);
                                        System.out.println("删除成功!撤销操作请输入 re,不撤销请回车");
                                        if (sc2.nextLine().equals("re")) {
                                            arr.add(index - 1, ar);
                                            System.out.println("撤销操作成功!");
                                            b.print(arr);
                                        }
                                        System.out.println("是否继续删除? 1.是 2.否");
                                        index = sc.nextInt();
                                        if (index == 1) {
                                        } else if (index == 2) {
                                            System.out.println("返回上一层");
                                            break;
                                        } else {
                                            System.out.println("参数异常");
                                            break;
                                        }

                                    }
                                } else {
                                    System.out.println("不存在任何彩票,返回上一层");
                                }
                            } else if (select2 == 5) {//返回主界面
                                break;
                            } else {//参数异常
                                System.out.println("参数错误,返回主界面");
                                break;
                            }
                        }
                        break;
                    case 2://随机生成中奖号码,并且在程序结束前不能更改
                        count++;
                        if (count == 1) {
                            ar2 = b.bonusNumeber(b.genericRanArr(5, 35), b.genericRanArr(2, 12));
                            System.out.println("开奖号码已生成!");
                            boo = true;
                            /*b.print2(ar2);*/
                        } else {
                            System.out.println("开奖号码无法重复生成!");
                        }
                        break;
                    case 3://兑奖
                        if (boo) {
                            if (arr.size() == 0) {
                                System.out.println("未购买彩票,不能兑奖!");
                                break;
                            } else {
                                System.out.println("开奖了!");
                                b.print2(ar2);
                                int bonus = 0;
                                int sum = 0;
                                int[] n = new int[arr.size()];
                                for (int i = 0; i < arr.size(); i++) {
                                    n[i] = b.compare(ar2, arr.get(i));
                                    if (n[i] == 1) {
                                        bonus = 5000000;
                                        sum += bonus;
                                    } else if (n[i] == 2) {
                                        bonus = 3000000;
                                        sum += bonus;
                                    } else if (n[i] == 3) {
                                        bonus = 1000000;
                                        sum += bonus;
                                    } else if (n[i] == 4) {
                                        bonus = 3000;
                                        sum += bonus;
                                    } else if (n[i] == 5) {
                                        bonus = 600;
                                        sum += bonus;
                                    } else if (n[i] == 6) {
                                        bonus = 100;
                                        sum += bonus;
                                    } else if (n[i] == 7) {
                                        bonus = 10;
                                        sum += bonus;
                                    } else if (n[i] == 8) {
                                        bonus = 5;
                                        sum += bonus;
                                    }
                                    if (n[i] >= 1 && n[i] <= 8) {
                                        System.out.println();
                                        System.out.print("第" + (i + 1) + "注彩票:");
                                        b.print3(arr.get(i));
                                        System.out.println(n[i] + "等奖:" + bonus + "元");
                                        System.out.println();
                                    }
                                }
                                int max = n[1];
                                int num = 0;
                                for (int i = 1; i < n.length; i++) {
                                    if (max > n[i]) {
                                        max = n[i];
                                        num = i;
                                    }
                                }
                                if (sum == 0) {
                                    System.out.println();
                                    System.out.println("未中奖!");
                                    b.consumer(arr);
                                } else {
                                    b.print2(ar2);
                                    System.out.println();
                                    System.out.println("恭喜您中奖了!");
                                    System.out.println("第" + (num + 1) + "注中了最大奖项" + max + "等奖:");
                                    b.print3(arr.get(num));
                                    System.out.println("中奖金额总计:" + sum + "元");
                                    b.consumer(arr);
                                }
                            }
                        } else {
                            System.out.println("未开奖,请稍等!");
                            break;
                        }
                    case 4://退出程序
                        System.out.println();
                        System.out.println("退出成功!谢谢光临");
                        System.exit(0);
                }
            }
        }
    }

    public static void mainPrint() {
        System.out.println("----------欢迎来到欢乐彩票----------\n" +
                "1.我要买彩票\n" +
                "2.开始摇奖\n" +
                "3.兑奖\n" +
                "4.退出\n" +
                "请输入你的选择:");
    }
}(2)管理员验证类 Manager.java
import java.util.Scanner;

public class Manager {
    private String user = "tang475";
    private String keyWord = "88888888";

    public boolean logOn() {
        System.out.println("请输入管理员用户名:");
        String user02 = new Scanner(System.in).nextLine();
        System.out.println("请输入密码:");
        String keyWord02 = new Scanner(System.in).nextLine();
        while (!(user02.equals(user))) {
            System.out.println("管理员不存在!");
            System.out.println("请输入管理员用户名:");
            user02 = new Scanner(System.in).nextLine();
            System.out.println("请输入密码:");
            keyWord02 = new Scanner(System.in).nextLine();
        }
        for (int count = 2; !(keyWord02.equals(keyWord)); count--) {
            if (count == 0) {
                System.out.println("密码错误次数过多,账户锁定!");
                return false;
            }
            System.out.println("密码错误!请再次输入密码(你还可以输入" + count + "次:)");
            keyWord02 = new Scanner(System.in).nextLine();
        }
        System.out.println("登录成功!");
        return true;
    }
}

(3) 生成彩票号码及打印类  LotteryNumber.java
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/**
* @author TJH
* @date 2019-08-14 21:05
*/
public class LotteryNumber extends WinOrNot {
    /*public static void main(String[] args) {
        LotteryNumber a = new LotteryNumber();
        ArrayList<int[]> ar = a.bonusNumeber(a.genericRanArr(5, 35), a.genericRanArr(2, 12));
        print(ar.get(0),ar.get(1));
        ArrayList<int[]> ar2 = a.bonusNumeber(a.genericScanArr(5, 35), a.genericScanArr(2, 12));
        print(ar2.get(0),ar2.get(1));
    }*/
    //生成彩票方法1:手动输入1注彩票
    public int[] genericScanArr(int a/*数组长度*/, int b/*取值范围*/) {
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[a];
        for (int i = 0; i < arr.length; i++) {
            if (a > 2) {
                System.out.println("请输入前区第" + (i + 1) + "个号码(1-35):");
            } else {
                System.out.println("请输入后区第" + (i + 1) + "个号码(1-12):");
            }
            int key = sc.nextInt();
            boolean flag = true;
            for (int j = 0; j < i; j++) {
                if (arr[j] == key) {
                    System.out.println("号码不能重复!");
                    flag = false;
                }
            }
            if(a>2) {
                if (key < 1 || key > 35) {
                    System.out.println("号码不符合规则!");
                    flag = false;
                }
                if (flag) {
                    arr[i] = key;
                } else {
                    i--;
                }
            }else{
                if (key < 1 || key > 12) {
                    System.out.println("号码不符合规则!");
                    flag = false;
                }
                if (flag) {
                    arr[i] = key;
                } else {
                    i--;
                }
            }
        }
        arrSort(arr);//数组选择排序
        return arr;
    }

    //生成彩票方法2:随机生成1注彩票
    public int[] genericRanArr(int a/*数组长度*/, int b/*随机种子*/) {
        int[] arr = new int[a];//定义数组
        Random rd = new Random();
        //数组随机赋值并且不重复
        for (int i = 0; i < arr.length; i++) {
            boolean flag = true;
            int key = rd.nextInt(b) + 1;
            for (int j = 0; j < i; j++) {
                if (arr[j] == key) {
                    flag = false;
                }
            }
            if (flag) {
                arr[i] = key;
            } else {
                i--;
            }
        }
        arrSort(arr);//数组选择排序
        return arr;
    }

    //生成彩票方法3:集合储存1注彩票的两个数组
    public ArrayList bonusNumeber(int[] arr1/*前区*/, int[] arr2/*后区*/) {
        ArrayList<int[]> bon = new ArrayList<>();//创建集合用于存储两个数组
        bon.add(arr1);
        bon.add(arr2);
        return bon;
    }

    //打印方法部分1:1注彩票两个数组的StringBuilder拼接
    public StringBuilder getStringBuilder(int[] a, int[] b) {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < a.length; i++) {
            if (i == a.length - 1) {
                if (a[i] < 10) {
                    sb.append("0" + a[i] + " + ");
                } else {
                    sb.append(a[i] + " + ");
                }
            } else {
                if (a[i] < 10) {
                    sb.append("0" + a[i] + " ");
                } else {
                    sb.append(a[i] + " ");
                }
            }
        }
        for (int i = 0; i < b.length; i++) {
            if (i == b.length - 1) {
                if (b[i] < 10) {
                    sb.append("0" + b[i]);
                } else {
                    sb.append(b[i]);
                }
            } else {
                if (b[i] < 10) {
                    sb.append("0" + b[i] + " ");
                } else {
                    sb.append(b[i] + " ");
                }
            }
        }
        sb.append("]");
        return sb;
    }

    //打印方法部分2:打印顾客购买的彩票数组方法
    public void print(ArrayList<ArrayList<int[]>> arr) {//泛型???
        System.out.println("-------------------------------");
        for (int j = 0; j < arr.size(); j++) {
            ArrayList<int[]> ar = arr.get(j);
            ;
            int[] a = ar.get(0);
            int[] b = ar.get(1);
            StringBuilder sb = getStringBuilder(a, b);
            System.out.println("第" + (j + 1) + "注: " + sb.toString());
            if ((j + 1) % 5 == 0) {
                System.out.println("-------------------------------");
            }
        }
    }

    //打印方法部分3:打印开奖号码数组
    public void print2(ArrayList<int[]> ar) {
        int[] a = ar.get(0);
        int[] b = ar.get(1);
        StringBuilder sb = getStringBuilder(a, b);
        System.out.println("***********************************");
        System.out.println("中奖号码为:" + sb.toString());
        System.out.println("***********************************");
    }

    //打印方法部分4:打印中奖号码数组
    public void print3(ArrayList<int[]> ar) {
        int[] a = ar.get(0);
        int[] b = ar.get(1);
        StringBuilder sb = getStringBuilder(a, b);
        System.out.println(sb.toString());
    }

    //数组选择排序方法
    public int[] arrSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

    //修改彩票数组某个值的方法
    public void modyNum(ArrayList<int[]> ar, int a) {
        Scanner sc = new Scanner(System.in);
        if (a > 0 && a < 6) {
            boolean boo = true;
            while (boo) {
                System.out.println("录入修改数字:");
                int a1 = sc.nextInt();
                for (int i = 0; i < ar.get(0).length; i++) {
                    if (a1 == ar.get(0)[i]) {
                        boo = true;
                        System.out.println("数字重复,请重新输入!");
                    } else {
                        boo = false;
                    }
                }
                if (!boo) {
                    ar.get(0)[a - 1] = a1;
                }
            }
            System.out.println("修改成功");
            arrSort(ar.get(0));
        } else if (a == 6 || a == 7) {
            boolean boo = true;
            while (boo) {
                System.out.println("输入修改的数字:");
                int a1 = sc.nextInt();
                for (int i = 0; i < ar.get(1).length; i++) {
                    if (a1 == ar.get(1)[i]) {
                        boo = true;
                        System.out.println("数字重复,请重新输入!");
                    } else {
                        boo = false;
                    }
                }
                if (!boo) {
                    ar.get(1)[a - 6] = a1;
                }
            }
            System.out.println("修改成功");
            arrSort(ar.get(1));
        } else {
            System.out.println("参数错误!");
        }
    }

    //结账方法
    public void consumer(ArrayList<ArrayList<int[]>> arr){
        int con = arr.size()*2;
        System.out.println("打印了"+arr.size()+"注彩票,共消费"+arr.size()*2+"元");
    }
}
(4)兑奖类WinOrNot.java
/*
    判断是否中奖
*/

import java.util.ArrayList;

/**
* @author TJH
* @date 2019-08-15 9:40
*/
public class WinOrNot {

    public int compare(ArrayList<int[]> a/*中奖号码*/,ArrayList<int[]> b/*购买号码*/){
       /* a.get(0);//中奖号码前区数组
        a.get(1);//中奖号码后区数组
        b.get(0);//顾客号码前区数组
        b.get(1);//顾客号码后区数组*/
        int count1 = 0; //前区中奖个数计数
        for(int i =0;i<b.get(0).length;i++){
            for(int j =0;j<a.get(0).length;j++){
                if(b.get(0)[i]==a.get(0)[j]){
                    count1++;
                    break;
                }
            }
        }
        int count2 = 0; //后区中奖个数计数
        for(int i =0;i<b.get(1).length;i++){
            for(int j =0;j<a.get(1).length;j++){
                if(b.get(1)[i]==a.get(1)[j]){
                    count2++;
                    break;
                }
            }
        }
        /*
        设置:
    一等奖:5+2 500万元
    二等奖:5+1 300万元
    三等奖:5+0 100万元
    四等奖:4+2 3000元元
    五等奖:4+1 600元
    六等奖:4+0/3+2 100元
    七等奖:3+1/2+2 10元
    八等奖:3+0/2+1/1+2/0+2 5元
         */
        int sum = 0;
        if(count1 ==5&&count2==2){
            sum = 1;
        }else if(count1 ==5&&count2==1){
            sum = 2;
        }else if(count1 ==5&&count2==0){
            sum = 3;
        }else if(count1 ==4&&count2==2){
            sum = 4;
        }else if(count1 ==4&&count2==1){
            sum = 5;
        }else if((count1 ==4&&count2==0)||(count1 ==3&&count2==2)){
            sum = 6;
        }else if((count1 ==3&&count2==1)||(count1 ==2&&count2==2)){
            sum = 7;
        }else if((count1 ==3&&count2==0)||(count1 ==2&&count2==1)||(count1 ==1&&count2==2)||(count1 ==0&&count2==2)){
            sum = 8;
        }
        return sum;
    }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2