【java】课程设计--抽卡模拟器


工期安排

1 自定义增加和删除卡面,并且显示
2 修改卡面,以及完善对卡面的操作细节
3 只显示当期up6星
4 研究别的功能

自己实现

菜单逻辑+抽卡算法

0.书写要求

在这里插入图片描述
在这里插入图片描述

1.用户需求

  1. 先把菜单做的美观一点
  2. 包含功能:
    1 查看抽卡记录(抽到的物品、已抽抽数)
    2 设置当前所拥有的抽数
    3 选择10抽或者1抽
    4 显示当前up的6星卡牌
    5 加一些增加删除修改的操作

2.设计思想

1.先不考虑注册登录进行实现
2.先不从文件中进行读写,直接用暂存数据
a 先暂存实现功能2\3
b 开启文件读写,实现功能1\4
c 实现功能5

3.各个功能和算法描述

步骤a 先暂存实现功能2\3

  • menu()
  1. 菜单输入字符进入指定功能

问题1:Scanner获取方法中只能获取String,而不能获取char,导致无法接着使用seitch

way:
1 查询后:先用string接受输入,再用charAt(0)只接受第一个字符,转为char

  1. 设置当前拥有抽数 :

问题1:想用像C中的全局变量一样的变量,使用时可以穿插在各个函数之间使用。

way:
1 要使用java中的局部变量/实例变量/静态变量的知识
2 去搜索一一测试应用后,选定静态变量,因为:1 直接+static声明 2 直接调用,不用像实例变量一样,还要new后通过对象名使用。

  • wish

问题:怕c++中的算法,因为一些莫名奇妙的问题导致不兼容。
way:
1 先直接把c中的代码搬运过来,稍作修改
2 将五星和四星改为两个类
3 显示当期up的6星角色,只能抽此时up的角色

  1. 先直接把c中的代码搬运过来,稍作修改

问题1:发现随机数的生成在java中与c++不同
way:
1 查看以前java生成随机数的笔记 --使用random类进行修改

问题2:sum此时为当前拥有的抽数,menu显示的也是
way:
sum此时应该做减法,在menu的case处分别直接单抽减1,十抽减10

  1. 将五星和四星改为两个类,包装起来

问题1:放在集合类还是普通类中
way:共通的声明放在普通类中,而每个具体的类对象放在集合类中,方便读写操作的进行
问题2:放在什么集合类中

way:
1.看笔记,觉得放在LinkedHashSet集合中。
自己测试使用一下,再应用 --err,因为这个集合不能返回索引处的元素
在这里插入图片描述
2.就用最普遍的ArrayList集合,后面再考虑更换

问题3:普通类中怎么声明存放

way:

  1. 先分为两个普通类,进行书写
  2. 进行测试
    a 把卡放进集合中,先直接在main中set好集合,后面再改为文件读写的增加
    b 此时随机数=下标,按照下标索引到对应的名称上。

步骤:
1 创建FourStar的所有对象,再将其全部添加到ArrayList集合中,在case中按random_four作为索引输出。
参考:
在这里插入图片描述
成品:
在这里插入图片描述
再改switch-case为一句输出。

  1. 再合并为一个类 OK

复制exp文件夹-删除FourStar和FiveStar,新建Star类-多一个int grade判断

在Main1类中,删去GetFiveStar和GetFourStar方法,新建GetStar方法

1.因为概率范围不一样所以,需要改的只有:类对象的加入

步骤b b 开启文件读写,实现功能1\4

  • 更改为文件读写

1 先实现卡面写入txt,以及输出
2 实现用户自定义写入卡面
3 抄入新txt,实现显示当期up6星

** 1 先实现卡面写入txt**
参考:
1 笔记-字符流-集合到文件
在这里插入图片描述
明明关闭了资源,再开启BufferedWriter却写入失败
way1:采取追加写入方法,只有一个BufferedWriter
–因为想要追加写入五星角色,要先加入if(random_five< 10 )判断,逻辑不对
way2:开启一个函数在一开始就进行写入操作

在这里插入图片描述
bug1 四星角色全部写入四次 ok
–因为内容不断追加写入,前面三次四星角色是以前残余下来的
way:在写入操作前进行,清空txt内容操作
在这里插入图片描述
–实际上,用户是不断写入新的卡面,旧的卡面不会重复写入

  • 实现输出

核心:grade为当前星级下,查找对应的random值,并输出name
步骤:先按照笔记–再考虑封装函数

问题1:IO流错误
在这里插入图片描述
way1:尝试写一个函数,把txt内的内容全输出看看
在这里插入图片描述
原来是自己把s变量提到外面,导致s内容一直不变
emmmm
在这里插入图片描述
way2:放回GetStar函数中
经过漫长的逻辑修改后…输出正常
在这里插入图片描述

  • 封装读文件输出为一个函数
    ok
    注意:文件关闭最好在函数最后进行,早关闭了,则报错

  • 实现用户自定义写入卡面

用户输入后,暂存后,追加写入

步骤:

  1. 先在txt中写好原来的数据,去掉五星和四星各一条,由用户写入txt,查看效果–失败

问题1:四星需要定位写入
way:先自己测试一下
4,★★★★「独占鳌头」Gigasang,10
5,★☆★☆★「风趣横生」Meychan,9

–看了jdk所有方法,不可以实现

  1. 分为四星五星两个txt,类还是一个–抽卡算法正常 ok

  2. 再考虑自定义:

1 先增加 一张 四星

问题1:随机数的自动生成

当前随机数 = 当前角色级别对应的角色个数
way1:去构造函数中,先判断级别类别,再每构造一次进行一次++
bug:因为Star为四星和五星等等构造函数,如果进行判断级别,有时候不按照有参数构造函数进行构造时,就无法++。

way2:还是分为两个Star类比较好(文件都分开了,写一个Star已经没有便利的地方了) ok
再通过构造函数,进行求全部角色个数,以此求随机数,再全部放入集合类中
bug:在构造函数中用sum统计角色总数,失败
在这里插入图片描述
在这里插入图片描述
way:设置为Main1类中的静态变量

问题2:修改为动态随机数后,抽卡算法果然出错了
在这里插入图片描述
IllegalArgumentException:抛出表示一种方法已经通过了非法或不正确的参数。

原因:numFour、numFive在一开始进入系统时都为0,所以作为参数非法,被抛出异常

way:想一种办法,让numFour等一直贯穿于系统开启与关闭的时期里。

way1:读取txt文本当前行总数为当前角色总数–ok

NumberFormatException:抛出以表示应用程序已尝试将字符串转换为其中一个数字类型,但该字符串不具有相应的格式。 --strArray[1]不知道为什么取不到数字,为空的

way:改为以空格进行分割,输出正确

  • 显示当前up的6星卡牌

核心:只能抽当期up6星卡(两个),需要修改算法

1 先自定义当期六星卡(显示当前所有六星卡的名称和编号,再由用户输入当期6星卡的编号,设定成功)
2 抽中区间不变,但是随机数区间变了(随机数范围为:角色数*概率倒数,此时角色数为2)

问题1:怎么只能在当期up角色里面抽
way:
1 文件读写,把up角色抽出,放在一个txt中
2 Star类中新增一个boolean变量

–先去实现文件读写,再考虑way2
来了来了

因为之前把所有算法都改为跟着txt内角色个数动态变化,所以何不如把starFour/starFive.txt当为up卡池

完成
在这里插入图片描述

查看所有角色图鉴
ok

删除up区角色
思路参考

先提取文件内容到集合中,在集合中删去查找到的数组内容,覆盖写入新集合到文件中

bug:写入test.txt的删除后对象好好的,一到本文件内的删除,就全部都被删除了。–原因:test的来源是另外一个文件,期间该文件内容始终不变很稳定,所以test抄入成功,而该文件对自己本身抄入,一旦抄入就被覆盖,不稳定,抄入失败。

way1:test文件抄入完成后,复制test内容到目标文件中
way2.先把数据抄入到一个集合中,集合建立完成后,再抄入到目标文件中
way3:难道是研究思路文章时少了啥,再去研究研究

先尝试way2 --还是test可以,本文件不可以。。

尝试way1:
ok

4.系统调试中问题

1 直接在一开始时输入回车报错StringIndexOutOfBoundsException
在这里插入图片描述
way:
在这里插入图片描述

2 抽数为0后,会变成负数 ok
在这里插入图片描述
直接在menu的一开始判断sum==0时,报错
–导致一开始还没设置时就进入这个判断
way:加一个boolean判断,是否为一开始没设置抽数时

3 当四星的随机数为10时 ok
在这里插入图片描述
因为索引 = 随机数 - 1,改:FourStar s = arrayFr.get(random_four-1);

  1. 在还有一个角色的情况下,写入两个,失败

在这里插入图片描述
在这里插入图片描述
原来是txt里面没有换行

原因:通过复制进行删除的方法,导致缺少一个换行符

–果然在write后面没加一句newLine()

  1. 抽卡算法又抽风了呵呵呵
    在这里插入图片描述
    再run一次又没事了。。。是不是有变量的生存期有问题

不知道是啥错了。。随便吧。。

  1. 超出动态随机数范围还没抽出

在这里插入图片描述

原因:随机数在写入卡片时就是错误的

在这里插入图片描述
改了addStar里面的reRandom函数,ok

5.总结


新知识

怎么打开任务管理器

  1. r+cmd
  2. 在终端输入taskmgr
  3. 进入成功

改进(进一步的设想)

  1. 作为javaGUI界面
  2. 算法设计问题: --想办法减小概率s
    平时抽数按随机数规律,满抽数就进入必中的随机数区间,导致eg一个十抽中更容易抽到两个四星

交给她们实现

1.注册登录

2.读文件-显示查找内容

暂时成功案例

Main1.java

package exp1;

import exp1.Star;

import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Main1 {
    
    
    //剩余抽数
    static int sum = 0;
    //动态五星角色累计抽数
    static int dynSum_five = 0;
    //动态四星角色累计抽数
    static int dynSum_four = 0;
    //非酋判断的两个条件
    static boolean judge_five;
    static boolean judge_four;
    //判断抽数是否再次为0
    static boolean judge_start = false;
//    四星角色总数
    static int numFour = 0;
//    五星角色总数
    static int numFive = 0;

    public static void main(String[] args) throws Exception {
    
    
//        WriteFourStar();
//        WriteFiveStar();
        //先获取当前角色总数
        GetTxtLine();
        System.out.println("GetTxtLine外numFour:"+numFour);
        //1.引入菜单
        menu();
    }

//    获取当前txt内行数为当前角色总数
     public static void GetTxtLine() throws IOException {
    
    
         BufferedReader br1 = new BufferedReader(new FileReader("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFour.txt"));
         String line;
         while ((line = br1.readLine()) != null) {
    
    
             numFour++;
         }
         System.out.println("GetTxtLine内numFour:"+numFour);
         BufferedReader br2 = new BufferedReader(new FileReader("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFive.txt"));
//         String line;
         while ((line = br2.readLine()) != null) {
    
    
             numFive++;
         }
//         System.out.println("此五星角色总数为:"+numFive);
     }
    //# 文件读写
    public static void ClearFile(int grade) throws Exception{
    
    
        if(grade == 4){
    
    
            File f = new File ("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFour.txt");
            FileWriter fw = new FileWriter (f);
            fw.write("");
            fw.flush();
            fw.close();
        }
        if(grade == 5){
    
    
            File f = new File ("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFive.txt");
            FileWriter fw = new FileWriter (f);
            fw.write("");
            fw.flush();
            fw.close();
        }
    }
    public static void WriteFourStar() throws Exception {
    
    
        BufferedWriter bw1 = new BufferedWriter(new FileWriter("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFour.txt",true));
        //使用类对象加入
        ClearFile(4);
        //四星文件写入
        StarFour Fr1 = new StarFour("★★★★「老实巴交」Sousang",1);
        StarFour Fr2 = new StarFour("★★★★「韬光养晦」Nqrse",2);
        StarFour Fr3 = new StarFour("★★★★「淑人君子」Araki",3);
        StarFour Fr4 = new StarFour("★★★★「不骄不躁」Itsubakulo",4);
        StarFour Fr5 = new StarFour("★★★★「神清气朗」Gerosang",5);
        StarFour Fr6 = new StarFour("★★★★「神志不清」Nerusang",6);
        StarFour Fr7 = new StarFour("★★★★「履险如夷」Decosang",7);
        StarFour Fr8 = new StarFour("★★★★「温文尔雅」Harumakigohan",8);
        StarFour Fr9 = new StarFour("★★★★「娓娓而谈」Syudou",9);
        StarFour Fr10 = new StarFour("★★★★「独占鳌头」Gigasang",10);
        //将对象加入集合类中
        ArrayList<StarFour> arrayFr = new ArrayList<>();

        arrayFr.add(Fr1);
        arrayFr.add(Fr2);
        arrayFr.add(Fr3);
        arrayFr.add(Fr4);
        arrayFr.add(Fr5);
        arrayFr.add(Fr6);
        arrayFr.add(Fr7);
        arrayFr.add(Fr8);
        arrayFr.add(Fr9);
        arrayFr.add(Fr10);

//        bw.write("四星角色文件写入");
//        bw.newLine();
//    bw.flush();
        for (StarFour s : arrayFr){
    
    
            StringBuilder sb = new StringBuilder();
            sb.append(s.getName()).append(" ").append(s.getRnum());

            bw1.write(sb.toString());
            bw1.newLine();
//        bw.flush();
        }
        bw1.close();
    }
    public static void WriteFiveStar() throws Exception {
    
    
        BufferedWriter bw2 = new BufferedWriter(new FileWriter("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFive.txt",true));
        ClearFile(5);
        //五星文件写入
        StarFive Fv1 = new StarFive("★☆★☆★「睡眼惺忪」Soraru",1);
        StarFive Fv2 = new StarFive("★☆★☆★「神采奕奕」Amatsuki",2);
        StarFive Fv3 = new StarFive("★☆★☆★「笑里藏刀」Mafumafu",3);
        StarFive Fv4 = new StarFive("★☆★☆★「变幻莫测」96neko",4);
        StarFive Fv5 = new StarFive("★☆★☆★「超群出众」Ribsang",5);
        StarFive Fv6 = new StarFive("★☆★☆★「沉谋重虑」uratanuki",6);
        StarFive Fv7 = new StarFive("★☆★☆★「德才兼备」Evesang",7);
        StarFive Fv8 = new StarFive("★☆★☆★「心醇气和」Sakata",8);
        StarFive Fv9 = new StarFive("★☆★☆★「风趣横生」Meychan",9);
        //使用类对象加入
        //将对象加入集合类中
        ArrayList<StarFive> arrayFv = new ArrayList<>();
        arrayFv.add(Fv1);
        arrayFv.add(Fv2);
        arrayFv.add(Fv3);
        arrayFv.add(Fv4);
        arrayFv.add(Fv5);
        arrayFv.add(Fv6);
        arrayFv.add(Fv7);
        arrayFv.add(Fv8);
        arrayFv.add(Fv9);

        //将集合写入txt文件中
//        bw.write("五星角色文件写入");
//        bw.newLine();
//        bw.flush();
        for (StarFive s : arrayFv){
    
    
            StringBuilder sb = new StringBuilder();
            sb.append(s.getName()).append(" ").append(s.getRnum());

            bw2.write(sb.toString());
            bw2.newLine();
            bw2.flush();
        }
        bw2.close();
    }
    public static void ReadFile(int random,int grade) throws IOException {
    
    
        String line;
        if (grade == 5) {
    
    
            BufferedReader br1 = new BufferedReader(new FileReader("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFive.txt"));
            if (random < numFive+1){
    
    
                while ((line = br1.readLine())!=null){
    
    
                    String[] strArray = line.split(" ");
                    StarFive s = new StarFive();
                    s.setName(strArray[0]);

                    s.setRnum(Integer.parseInt(strArray[1]));
                        //2.按逻辑判断再输出
                        if (random == s.getRnum()) {
    
    
                            dynSum_five = 0;
                            judge_five = true;

                            //输出当前s对象下的name
                            System.out.println(s.getName());
                        }
                }
            }
            br1.close();
        }

        if (grade == 4) {
    
    
            BufferedReader br2 = new BufferedReader(new FileReader("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFour.txt"));
            if (random < numFour+1) {
    
    
                while ((line = br2.readLine()) != null) {
    
    
                    String[] strArray = line.split(" ");
                    StarFour s = new StarFour();
//                    System.out.println("strArray[0] = "+strArray[0]);
                    s.setName(strArray[0]);
//                    System.out.println("strArray[2] = "+strArray[1]);
                    s.setRnum(Integer.parseInt(strArray[1]));


//                    System.out.println(s.getName());//导致所有都输出
                     //2.按逻辑判断再输出
                        if (random == s.getRnum()) {
    
    
                            dynSum_four = 0;
                            judge_four = true;

                            //输出当前s对象下的name
                            System.out.println(s.getName());
                        }
                }
            }
            br2.close();
        }

    }

    //# 菜单
    public static void menu() throws IOException {
    
    
        while (true){
    
    

            System.out.println("-----------------------欢迎来到抽卡模拟系统----------------------");
            System.out.println("|    +.设置当前抽数               0.退出系统                   |");
            System.out.println("|    1.单抽                     2.十抽                       |");
            System.out.println("|    3.写入当期up卡片                                         |");
            System.out.println("|-----------------------------------------当前拥有抽数:"+sum+"|");


            System.out.println("|                    当期up五星角色:                         |");
            BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFive.txt"));
            String line;
            while ((line = br.readLine())!=null){
    
    
                String[] strArray = line.split(" ");
                System.out.print(" "+strArray[0]+"        ");
            }
            System.out.println();
            System.out.println("|                    当期up四星角色:                         |");
            BufferedReader br1 = new BufferedReader(new FileReader("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFour.txt"));
            String line1;
            int n = 0;
            while ((line1 = br1.readLine())!=null){
    
    
                n++;
                String[] strArray = line1.split(" ");
                System.out.print(" "+strArray[0]+"        ");
                if (n%2 == 0){
    
    
                    System.out.println();
                }
            }
//            System.out.println();
            System.out.println("------------------------------------------------------------");
            System.out.println();
            System.out.print("请输入您需要的操作:");

            Scanner scanner = new Scanner(System.in);
            String s = scanner.nextLine();
            System.out.println();
            //判断是输入的特殊情况
            if(s == null || "".equals(s)){
    
    
                System.out.println("输入内容不得为空!");
                menu();
            }
            if(s.length()!=1){
    
    
                System.out.println("输入非法!");
                menu();
            }

            char c = s.charAt(0);
            switch (c){
    
    
                case '+':
                    judge_start = true;
                    //@改进:选择是重新设置,还是增加减少
                    System.out.println("设置当前抽数为:");
                    sum = scanner.nextInt();
                    menu();
                    break;
                case '0':
                    System.out.println("期待您的下次使用~");
                    return;
                case '1':
                    sum --;
                    CheckSum(sum);
                    wish();
                    break;
                case '2':
                    sum -= 10;
                    CheckSum(sum);
                    for(int i = 0;i<11;i++){
    
    
                        wish();
                    }
                    break;
                case '3':
                    AddStar();
                    break;
                default:
                    System.out.println("请输入一个有效字符!");
                    break;
            }

        }

    }
    //sum在设置抽数后再次为0
    public static void CheckSum(int sum) throws IOException {
    
    
        if (sum<0){
    
    
            System.out.println("当前抽数小于0,请重新设置当前抽数!");
            menu();
        }
    }




    //# 功能
    // 用户自定义增加卡面
    public static void AddStar() throws IOException {
    
    
        System.out.println("|up卡面增加功能|");
        Scanner scanner = new Scanner(System.in);
        System.out.println("退出此功能请输入'out',否则输入'in':");
        String te = scanner.next();
        if (te.equals("out")){
    
    
            menu();
//            return false;
        }
        System.out.println("请输入新增卡面等级:");
        int grade = scanner.nextInt();
        System.out.println("请输入增加的卡面数量:");
        int num = scanner.nextInt();

        for(int i = 1;i<num+1;i++){
    
    
            //卡面的名称 ★★★★★「风趣横生」Meychan
            System.out.println("请输入第"+i+"卡面的名称:");
            String name = scanner.next();

            //卡面的随机数
            int r = reRandom(grade);

            StringBuilder sb = new StringBuilder();
            sb.append(name).append(" ").append(r);

            //写入文件中
            if (grade == 4){
    
    
                BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFour.txt",true));
                bw.write(sb.toString());
                bw.newLine();
                bw.flush();

                if (i == num){
    
    
                    bw.close();
                }
            }
            if (grade == 5){
    
    
                BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\路聃\\Desktop\\课程设计\\自己实现任务\\库\\starFive.txt",true));
                bw.write(sb.toString());
                bw.newLine();
                bw.flush();

                if (i == num){
    
    
                    bw.close();
                }
            }
        }
//        return true;
    }
    //返回当前随机数 --为当前角色个数
    public static int reRandom(int grade) throws IOException {
    
    
        if (grade == 4){
    
    
            //因为新的一行还没有写入,所以当前随机数为+1
            return numFour+1;
        }
        if (grade == 5){
    
    
            return numFive+1;
        }
        return 0;
    }


    // 祈愿抽卡wish
    public static void wish() throws IOException {
    
    
        judge_five = false;
        judge_four = false;

        GetStar();
        Lost();
        System.out.println();
    }

    //没抽中输出函数
    public static void Lost(){
    
    
        if(judge_five == false && judge_four == false){
    
    
            System.out.println("非酋");
        }
    }
    
    public static void GetStar() throws IOException {
    
    
        //# 四星判断
        dynSum_four ++;
        System.out.println("当前四星的动态总抽数 :"+dynSum_four);
        Random r4 = new Random();
        //随机数范围为:角色数*概率倒数
        int random_four = r4.nextInt(numFour*10)+1;
        //当抽数到达10,随机数在直接在抽中区间内取,保证必抽中
        if(dynSum_four == 10){
    
    
            random_four = r4.nextInt(numFour)+1;
        }
        System.out.println("当前四星的随机数为:"+random_four);
        ReadFile(random_four,4);


        //# 五星判断
        dynSum_five ++;
//	cout<<"当前五星的动态总抽数 :"<<dynSum_five<<endl;
        System.out.println("当前五星的动态总抽数 :"+dynSum_five);
        Random r5 =new Random();
        int random_five = r5.nextInt(numFive*90)+1;
        if(dynSum_five == 90){
    
    
            random_five = r5.nextInt(numFive)+1;
        }
//	cout<<"当前五星的随机数为:"<<random_five<<endl;
        System.out.println("当前五星的随机数为:"+random_five);
        //还需要读文件操作,实现输出
        ReadFile(random_five,5);



    }

}
/*
符号讲解:
@   可改进s


 */

Star.java

package exp1;

public class Star {
    
    
    int grade;
    String name;
    int Rnum;

    public Star(int grade, String name, int rnum) {
    
    
        this.grade = grade;
        this.name = name;
        Rnum = rnum;
    }

    public int getGrade() {
    
    
        return grade;
    }

    public void setGrade(int grade) {
    
    
        this.grade = grade;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getRnum() {
    
    
        return Rnum;
    }

    public void setRnum(int rnum) {
    
    
        Rnum = rnum;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_65431212/article/details/127958058