软件工程的大作业,要求写一个系统。自己平时玩过一些抽卡手游,类似于《原神》、《FGO》之类的,因此想试一试写一个类似的程序。
这篇文章受到了这个讲解抽卡机制的b站视频的启发:
https://www.bilibili.com/video/BV1LE411H79s?from=search&seid=1515395401480087823
另外我也参考了其它作者写的抽卡程序,在此一并表示感谢。
该程序包含以下功能:
- 自定义☆/☆☆/☆☆☆概率。
- 自定义是否有概率Up,及Up概率的值(0-100%)。
- 自定义是否有大保底,及大保底的数量。
- 单抽。
- 十连抽。
- 小保底(即十连保底)。
- 大保底。
- 图形界面。
- 数据库。
概念简述
概率Up:当Up概率为70%时,若某次抽卡结果是☆☆☆,则该☆☆☆有70%概率是限定☆☆☆,30%概率是普通☆☆☆。
小保底(十连保底):对于十连抽中累计九次都没出现☆☆/☆☆☆的玩家,使其第十次抽取必为☆☆/☆☆☆中的一种。
大保底:对于抽取次数到达管理员规定的大保底次数的前一次时仍未抽取到up角色的非酋玩家,那么下一次抽取必定获得☆☆☆角色。
模块介绍
前三个模块是主要的核心算法,可以实现除了图形界面和数据库的所有功能。
Main模块中输入概率、概率Up、保底后运行,可以输出单抽和十连抽的结果,是我前期进行测试时使用的。
Setting(设置概率、概率Up、保底)
package 抽卡系统;
import java.util.Scanner;
public class Setting {
/*
* 设置☆/☆☆/☆☆☆概率
* 设置是否有概率up
* 设置是否有保底
*/
Scanner sc=new Scanner(System.in);
/*-------------------------------------------------------------------------------------------*/
public double [] Chance() {
//设置☆/☆☆/☆☆☆概率
double[] allchance= new double[3];//创建一个double数组,用于返回所有概率
for(int i=0;i<3;i++)
allchance[i]=0;
System.out.print("请分别设置☆☆/☆☆☆出现概率");
System.out.println("(☆概率为100%-☆☆/☆☆☆概率之和)");
double twostarchance=0;
double threestarchance=0;
System.out.print("请分别输入☆☆/☆☆☆概率(小数):");
if (sc.hasNextDouble()) {
twostarchance = sc.nextDouble();
threestarchance=sc.nextDouble();
if(twostarchance+threestarchance>1) {
System.out.println("☆☆/☆☆☆概率之和超过100%!");
return allchance;//数值不符合要求,退出函数
}
else if(twostarchance<0||threestarchance<0) {
System.out.println("☆☆/☆☆☆概率<0!");
return allchance;
}
}
else {
System.out.println("输入的不是小数!");
return allchance;
}
double onestarchance=1-twostarchance-threestarchance;
System.out.println("概率分别是:");
System.out.println("☆概率:"+onestarchance);
System.out.println("☆☆概率:"+twostarchance);
System.out.println("☆☆☆概率:"+threestarchance);
allchance[0]=onestarchance;
allchance[1]=twostarchance;
allchance[2]=threestarchance;
return allchance;
}
/*-------------------------------------------------------------------------------------------*/
public double UpChance() {
//是否概率Up
double upchance=0;
System.out.print("请输入up概率(小数)(0代表不up):");
if (sc.hasNextDouble()) {
upchance=sc.nextDouble();
if(upchance>1) {
System.out.println("Up概率超过100%!");
return -1;
}
else if(upchance<0) {
System.out.println("Up概率<0!");
return -1;
}
}
else {
System.out.println("输入的不是小数!");
return -1;
}
System.out.println("Up概率是:");
System.out.println(upchance);
return upchance;
}
/*-------------------------------------------------------------------------------------------*/
public int MinimumGuarantee() {
//是否保底
int minimumguarantee=0;
System.out.print("请输入保底数(整数)(0代表无保底):");
if (sc.hasNextInt()) {
minimumguarantee=sc.nextInt();
if(minimumguarantee<0) {
System.out.println("保底不可为负数");
return -1;
}
}
else {
System.out.println("输入的不是整数!");
return -1;
}
System.out.println("保底数是:");
System.out.println(minimumguarantee);
return minimumguarantee;
}
/*-------------------------------------------------------------------------------------------*/
}
LuckyDraw(单抽、十连抽算法)
package 抽卡系统;
public class LuckyDraw
{
/*
* 进行单抽或十连抽
* 包含主要抽卡算法
*/
public static int counter=0;//类变量,统计已抽次数
public static int flag1=0;//类变量,小保底计数器,统计多少抽未出小保底,用来计算小保底(出小保底后清零)