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