Java开发之阴阳师概率抽卡大揭秘

Java开发之阴阳师概率抽卡大揭秘

Java开发之阴阳师概率抽卡大揭秘

相信很多人都有玩过阴阳师手游,其中最让人着迷的便是它的抽卡机制,那么如何简单实现阴阳师的概率抽卡功能呢?

项目环境

本项目的开发只需要具备Java虚拟机就可以,这里作者使用的是intelij开发编辑器,当然eclipse等任意编辑器都可以,下面是工程目录结构。
在这里插入图片描述
项目简介 在这里你需要简单的创建四个类,Main,Card,CardPool,GetCard这四个类,四个类统一放在了Card_Rate下。

Card.calss源码如下

package Card_Rate;
public class Card {
    String SSR[]={"一目连","彼岸花","荒川之主"};//概率为6%
    String SR[]={"姑获鸟","金鱼姬","弈"};//概率为10%
    String R[]={"鲤鱼精","山兔","河童"};//概率为20%
    String N[]={"涂壁","灯笼鬼","齿舌"};//概率为64%
}

CardPool.calss源码如下

package Card_Rate;
import java.util.ArrayList;
import java.util.Random;
public class CardPool {
    //功能:创建一个卡池,卡池里放好式神卡片,根据卡片数量来定,卡池容量定为100
    ArrayList cardpool = new ArrayList();//卡池
    int count=100;//卡池容量
    /*卡池填充*/
    public void fullCard() {
        Card card = new Card();
        Random ra = new Random();
        //循环6张SSR卡
        for (int i = 0; i < 6; i++) {
            int num=ra.nextInt(3) ;// 随机产生0-2三种数字
            cardpool.add(card.SSR[num]+"SSR");
        }
        //循环10张SR卡
        for (int i = 0; i < 10; i++) {
            int num=ra.nextInt(3) ;// 随机产生0-2三种数字
            cardpool.add(card.SR[num]+"SR");
        }
        //循环20张R卡
        for (int i = 0; i < 20; i++) {
            int num=ra.nextInt(3) ;// 随机产生0-2三种数字
            cardpool.add(card.R[num]+"R");
        }
        //循环64张N卡
        for (int i = 0; i < 64; i++) {
            int num=ra.nextInt(3) ;// 随机产生0-2三种数字
            cardpool.add(card.N[num]+"N");
        }
       // System.out.println("卡池:"+cardpool);
       // System.out.println("卡池容量:"+cardpool.size());
    }
    public int cardpoolnum(){
        return cardpool.size();//获取当前卡池式神数量
    }
    public void allcard(){
        System.out.println(cardpool);//输出卡池所以式神
    }
    public Object getonecard(CardPool cardPool){
        //从卡池中随机抽出一张牌
        Random random=new Random();
        int size=cardpool.size();
        if(size==0){
            fullCard();//卡池容量清零则填充
            System.out.println("-----卡池刷新------");
            size=cardpool.size();//size重新赋值
            System.out.println("卡池刷新后容量:"+size);
        }
        int i=random.nextInt(size);//随机0-size-1的整数,size为卡池当前抽卡后的数
        Object object=cardpool.get(i);
        System.out.println("抽到的式神为:"+cardpool.get(i));
        cardpool.remove(i);//将抽取到的卡牌移除
        System.out.println("卡剩余式神数:"+cardpool.size());
        //System.out.println(cardpool.get(i));
        return object;
    }
}

GetCard.class源码如下

package Card_Rate;

public class GetCard {
    /*卡池抽一张少一张count--*/
    public void getoneCard(CardPool  cardPool) {
        System.out.println("当前为单抽");
        cardPool.getonecard(cardPool);//单抽
    }
    public void gettenCard(CardPool  cardPool) {
        System.out.println("-------------------------");
        System.out.println("当前为十连抽");
        for(int i=0;i<10;i++){
            cardPool.getonecard(cardPool);//十连抽
        }
    }
    public void gethuandrendCard(CardPool  cardPool) {
        System.out.println("-------------------------");
        System.out.println("当前为百连抽");
        for (int i = 0; i < 100; i++) {
            cardPool.getonecard(cardPool);//十连抽
        }
    }
}

Main.class源码如下

package Card_Rate;
public class Main {
    public static void main(String[] args) {
        CardPool cardPool=new CardPool();
        GetCard getCard=new GetCard();
        cardPool.fullCard();//初始化卡池容量填满为100
        System.out.print("卡池总量:");
        System.out.println(cardPool.cardpoolnum());
        getCard.gethuandrendCard(cardPool);//百连抽
        getCard.gettenCard(cardPool);//十连抽
        getCard.getoneCard(cardPool);//单抽
        }
}

好了,四个类的代码都已经了解,大家可以运行一下试一试,下面介绍一下思路来源,首先是Card类里面存放的是SSR,SR,R和N卡等式神,可以不断填充新的式神进来。CardPool是式神池,也就是一堆各种各样的式神都放在这里,将SSR,SR,R,N卡式神打乱,玩家就需要从这里面抽卡了,抽卡类是GetCard类,这里编写了单抽、十连抽和百连抽方法,当然,由于我们这里用的是式神池,所以当一波式神抽完之后就必须刷新一波新的式神,否则就抽不到新的式神了。

最后在贴图来一波运行的结果图:

在这里插入图片描述
不知道大家看到没有,抽个SSR完全靠运气啊,有的时候抽几个就有SSR了,有的时候抽完所有都没碰到,这里SSR就直接在前五个之后就抽到了。

卡池刷新图

在这里插入图片描述
这是一波卡池抽完之后刷新的另一波卡池。
如果大家有什么不懂得地方,可以联系作者的QQ:1175929184

发布了1 篇原创文章 · 获赞 1 · 访问量 36

猜你喜欢

转载自blog.csdn.net/weixin_43554112/article/details/105009516