文章目录
- 工期安排
- 自己实现
- 菜单逻辑+抽卡算法
- 0.书写要求
- 1.用户需求
- 2.设计思想
- 3.各个功能和算法描述
- 4.系统调试中问题
- 5.总结
- 新知识
- 怎么打开任务管理器
- 改进(进一步的设想)
- 交给她们实现
- 1.注册登录
- 2.读文件-显示查找内容
- 暂时成功案例
工期安排
1 自定义增加和删除卡面,并且显示
2 修改卡面,以及完善对卡面的操作细节
3 只显示当期up6星
4 研究别的功能
自己实现
菜单逻辑+抽卡算法
0.书写要求
1.用户需求
- 先把菜单做的美观一点
- 包含功能:
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:Scanner获取方法中只能获取String,而不能获取char,导致无法接着使用seitch
way:
1 查询后:先用string接受输入,再用charAt(0)只接受第一个字符,转为char
- 设置当前拥有抽数 :
问题1:想用像C中的全局变量一样的变量,使用时可以穿插在各个函数之间使用。
way:
1 要使用java中的局部变量/实例变量/静态变量的知识
2 去搜索一一测试应用后,选定静态变量,因为:1 直接+static声明 2 直接调用,不用像实例变量一样,还要new后通过对象名使用。
- wish
问题:怕c++中的算法,因为一些莫名奇妙的问题导致不兼容。
way:
1 先直接把c中的代码搬运过来,稍作修改
2 将五星和四星改为两个类
3 显示当期up的6星角色,只能抽此时up的角色
- 先直接把c中的代码搬运过来,稍作修改
问题1:发现随机数的生成在java中与c++不同
way:
1 查看以前java生成随机数的笔记 --使用random类进行修改
问题2:sum此时为当前拥有的抽数,menu显示的也是
way:
sum此时应该做减法,在menu的case处分别直接单抽减1,十抽减10
- 将五星和四星改为两个类,包装起来
问题1:放在集合类还是普通类中
way:共通的声明放在普通类中,而每个具体的类对象放在集合类中,方便读写操作的进行
问题2:放在什么集合类中
way:
1.看笔记,觉得放在LinkedHashSet集合中。
自己测试使用一下,再应用 --err,因为这个集合不能返回索引处的元素
2.就用最普遍的ArrayList集合,后面再考虑更换
问题3:普通类中怎么声明存放
way:
- 先分为两个普通类,进行书写
- 进行测试
a 把卡放进集合中,先直接在main中set好集合,后面再改为文件读写的增加
b 此时随机数=下标,按照下标索引到对应的名称上。
步骤:
1 创建FourStar的所有对象,再将其全部添加到ArrayList集合中,在case中按random_four作为索引输出。
参考:
成品:
再改switch-case为一句输出。
- 再合并为一个类 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内容一直不变
way2:放回GetStar函数中
经过漫长的逻辑修改后…输出正常
-
封装读文件输出为一个函数
ok
注意:文件关闭最好在函数最后进行,早关闭了,则报错 -
实现用户自定义写入卡面
用户输入后,暂存后,追加写入
步骤:
- 先在txt中写好原来的数据,去掉五星和四星各一条,由用户写入txt,查看效果–失败
问题1:四星需要定位写入
way:先自己测试一下
4,★★★★「独占鳌头」Gigasang,10
5,★☆★☆★「风趣横生」Meychan,9
–看了jdk所有方法,不可以实现
-
分为四星五星两个txt,类还是一个–抽卡算法正常 ok
-
再考虑自定义:
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);
- 在还有一个角色的情况下,写入两个,失败
原来是txt里面没有换行
原因:通过复制进行删除的方法,导致缺少一个换行符
–果然在write后面没加一句newLine()
- 抽卡算法又抽风了呵呵呵
再run一次又没事了。。。是不是有变量的生存期有问题
不知道是啥错了。。随便吧。。
- 超出动态随机数范围还没抽出
原因:随机数在写入卡片时就是错误的
改了addStar里面的reRandom函数,ok
5.总结
新知识
怎么打开任务管理器
- r+cmd
- 在终端输入taskmgr
- 进入成功
改进(进一步的设想)
- 作为javaGUI界面
- 算法设计问题: --想办法减小概率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;
}
}