java 做的原神抽卡模拟小程序

java做的原神抽卡模拟小程序

难度不大,适合学完面向对象后做着玩。

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Random;
import java.util.Scanner;

public class Card {

    public static void main(String[] args) {

        /**
         * 复刻周期
         */
        String[][] role={{"温迪","可莉"},{"达达利亚","钟离"},{"阿贝多","甘雨"},{"魈","胡桃"},{"神里凌华","申鹤"}};
        Calendar calendar = Calendar.getInstance();
        int second=calendar.get(Calendar.SECOND);//当前秒数
        int flag=second% role.length;//复刻数组下标

        System.out.println("-----UP角色-----");
        System.out.println(role[flag][0]+"\t\t"+role[flag][1]);

        Scanner scanner = new Scanner(System.in);
        System.out.print("你选择抽取的池子(1"+role[flag][0]+" "+"2"+role[flag][1]+"):");

        int choice=scanner.nextInt();
        String roleName;
        if(choice==1){
            roleName=role[flag][0];
        }else{
            roleName=role[flag][1];

        }
        Up up = new Up(roleName);
        int i=0;
        System.out.print("你的抽数:");
        int sum = scanner.nextInt();
        while(i<sum){
            up.clickOne();
            i++;
        }
        up.cal();
    }
}


/**
 * up池算法模型
 */
class  Up{

    private String roleName;//up角色名称
    private static int up;//抽到的up角色
    private static int normal;//常驻角色
    private static int all;//总抽数
    private static int sum;//上次五星到现在总抽数
    private static double poss;//抽到up角色概率
    private static Boolean flag;//这次是否是大保底
    private static ArrayList<String> count;

    /**
     * 默认初始化
     */
    public Up(String name){
        roleName=name;
        up=0;
        normal=0;
        all=0;
        sum=0;
        poss= 0.006;
        flag=false;
        count=new ArrayList<>();
    }

    /**
     * 单抽
     */
    public void clickOne(){
        String s;//记录
        sum++;
        all++;
        updatePoss();
        /**
         * 生成0和1之间随机数
         */
        Random random = new Random();
        double v = random.nextDouble();//实际概率
        if(poss>=v){
            //抽取五星成功
            if(flag){//大保底
                System.out.println(roleName);
                up++;
                s=sum+roleName;
                count.add(s);
                flag=false;
            }else{
                double v1 = random.nextDouble();
                if(v1>=0.5){//不歪
                    System.out.println(roleName);
                    up++;
                    s=sum+roleName;
                    count.add(s);
                }else{
                    System.out.println("常驻角色");
                    normal++;
                    flag=true;
                    s=sum+"歪";
                    count.add(s);
                }
            }
            sum=0;
        }else{
            //没抽到五星
            System.out.print("普通"+" ");
        }

    }

    /**
     * 十连
     */
    public void clickTen(){
        int i=0;
        while(i<10){
            clickOne();
            i++;
        }
    }

    /**
     * 更新出货概率
     */
    public  void updatePoss(){
        if(sum<=73){
            poss=0.006;
        }else if(sum>=74 && sum<90){
            poss=(sum-73)*0.06+0.006;
        }else if(sum==90){
            poss=1;
        }
    }


    /**
     * 统计情况
     */
    public void cal(){
        System.out.println("\n");
        System.out.println("总抽数:"+all+"\t"+
                "五星角色数量:"+(up+normal)+"\t"+
                "up角色数量:"+up+"\t"+
                "歪了:"+normal+"次"+"\t"+
                "已垫:"+sum+"抽"+"\t"+
                "平均:"+(all-sum)/(up+normal)+"一个金");
        System.out.println(count);
    }

}


image-20230326165754356

[外链图片转存中…(img-2ZIZ3uRT-1679821301441)]

648拿不下满命神里也太难了,非酋实锤哈哈。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值