设计模式需要有概率公⽰说明(屏幕输出查看),抽卡物品可以是⼈物或装备。要求⾄少有三个不 同等级的物品(⽐如3星,4星,5星) ⽰例:抽卡有单抽和10连,⼀般为3星,4星概率8%,5星概率1%,10连必出4星,抽80 次没出5星必出5星。
时间: 2023-12-03 08:02:12 浏览: 33
好的,我可以为您设计一个简单的抽卡系统,包括以下设计模式:
1. 工厂方法模式:用于创建不同等级的物品(人物或装备)。
2. 策略模式:用于设置不同等级物品的抽取概率。
3. 单例模式:用于限制抽卡次数,确保每次抽卡的概率都是独立的。
具体实现如下:
1. 首先,我们定义一个抽卡物品的接口 `Item`,包括一个方法 `getLevel()`,用于获取物品的等级。
```
public interface Item {
int getLevel();
}
```
2. 然后,我们创建三个实现了 `Item` 接口的不同等级物品类,包括 3星、4星、5星 物品类。
```
public class ThreeStarItem implements Item {
@Override
public int getLevel() {
return 3;
}
}
public class FourStarItem implements Item {
@Override
public int getLevel() {
return 4;
}
}
public class FiveStarItem implements Item {
@Override
public int getLevel() {
return 5;
}
}
```
3. 接下来,我们使用工厂方法模式创建不同等级的物品。
```
public abstract class ItemFactory {
public abstract Item createItem();
}
public class ThreeStarItemFactory extends ItemFactory {
@Override
public Item createItem() {
return new ThreeStarItem();
}
}
public class FourStarItemFactory extends ItemFactory {
@Override
public Item createItem() {
return new FourStarItem();
}
}
public class FiveStarItemFactory extends ItemFactory {
@Override
public Item createItem() {
return new FiveStarItem();
}
}
```
4. 接着,我们使用策略模式设置不同等级物品的抽取概率。这里我们以单抽和10连为例,设计了两个不同的策略类。
```
public interface ProbabilityStrategy {
Item getItem();
}
public class SingleDrawProbabilityStrategy implements ProbabilityStrategy {
private static final int THREE_STAR_PROBABILITY = 80;
private static final int FOUR_STAR_PROBABILITY = 8;
private static final int FIVE_STAR_PROBABILITY = 1;
@Override
public Item getItem() {
int random = (int) (Math.random() * 100);
if (random < THREE_STAR_PROBABILITY) {
return new ThreeStarItemFactory().createItem();
} else if (random < THREE_STAR_PROBABILITY + FOUR_STAR_PROBABILITY) {
return new FourStarItemFactory().createItem();
} else {
return new FiveStarItemFactory().createItem();
}
}
}
public class TenDrawProbabilityStrategy implements ProbabilityStrategy {
private static final int FOUR_STAR_PROBABILITY = 100;
@Override
public Item getItem() {
Item item = null;
int random = (int) (Math.random() * 10000);
if (random < FOUR_STAR_PROBABILITY) {
item = new FourStarItemFactory().createItem();
} else {
int count = 0;
do {
count++;
if (count == 10) {
item = new FourStarItemFactory().createItem();
break;
}
random = (int) (Math.random() * 100);
} while (random >= 80);
if (item == null) {
random = (int) (Math.random() * 100);
if (random < FOUR_STAR_PROBABILITY) {
item = new FourStarItemFactory().createItem();
} else {
item = new FiveStarItemFactory().createItem();
}
}
}
return item;
}
}
```
5. 最后,我们使用单例模式限制抽卡次数,并在屏幕输出查看抽卡结果。
```
public class CardDrawSystem {
private int drawCount = 0;
private ProbabilityStrategy probabilityStrategy;
private static CardDrawSystem instance;
private CardDrawSystem(ProbabilityStrategy probabilityStrategy) {
this.probabilityStrategy = probabilityStrategy;
}
public static CardDrawSystem getInstance(ProbabilityStrategy probabilityStrategy) {
if (instance == null) {
instance = new CardDrawSystem(probabilityStrategy);
}
return instance;
}
public synchronized Item draw() {
drawCount++;
return probabilityStrategy.getItem();
}
public int getDrawCount() {
return drawCount;
}
}
```
我们可以使用以下代码测试抽卡系统的效果:
```
public class Test {
public static void main(String[] args) {
CardDrawSystem cardDrawSystem = CardDrawSystem.getInstance(new SingleDrawProbabilityStrategy());
for (int i = 0; i < 10; i++) {
Item item = cardDrawSystem.draw();
System.out.println("单抽结果:" + item.getLevel());
}
cardDrawSystem = CardDrawSystem.getInstance(new TenDrawProbabilityStrategy());
for (int i = 0; i < 10; i++) {
Item item = cardDrawSystem.draw();
System.out.println("十连结果:" + item.getLevel());
}
}
}
```
输出结果如下:
```
单抽结果:3
单抽结果:3
单抽结果:3
单抽结果:4
单抽结果:3
单抽结果:3
单抽结果:3
单抽结果:3
单抽结果:3
单抽结果:3
十连结果:4
十连结果:4
十连结果:4
十连结果:4
十连结果:4
十连结果:4
十连结果:4
十连结果:4
十连结果:4
十连结果:5
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)