抽卡模拟系统(包含图形界面,结果可存储到数据库中)

本文档介绍了为软件工程大作业设计的一个抽卡模拟系统,该系统受《原神》、《FGO》等游戏启发,允许用户自定义概率、概率Up和保底机制。系统包括单抽、十连抽功能,并具备图形界面和数据库存储结果。通过Setting、LuckyDraw和Main模块实现核心算法,Window和ComponentInWindow用于创建和设置界面,CommandListener、ButtonListener1和ButtonListener2处理按钮事件,实现与数据库的交互。文章末尾提到了代码可能存在的不成熟之处,欢迎反馈改进意见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件工程的大作业,要求写一个系统。自己平时玩过一些抽卡手游,类似于《原神》、《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;//类变量,小保底计数器,统计多少抽未出小保底,用来计算小保底(出小保底后清零)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值