一,在本学期学C语言的过程中突然想到能不能用C语言写出一个抽卡模拟器,因为本人比较爱玩《崩坏·星穹铁道》,固模拟的是这个游戏的抽卡环境,大家可以拿这个代码去模拟抽卡玩一玩,说不定模拟出好运气的时候真实抽卡也比较欧哦。
二,在这个程序中,共定义了三个函数,分别是基础跃迁函数,保底跃迁函数,概率增加抽卡函数。
数据来源--《崩坏·星穹铁道》角色跃迁概率公示,米游社川盏
概率递增函数官方未公示,数据来源米游社川盏,且随机种子质量不高,与实际有些许偏差
基础跃迁出金的概率是0.006%,4星的概率是5.100%,3星的概率是94.300%
保底跃迁出金的概率是0.006%,4星的概率是99.400%
从第74抽开始概率增加,是否歪的概率是1/2
三,代码
技术差点,代码比较长,大佬轻喷。
#include <stdio.h>
#include <stdlib.h>
//数据来源--《崩坏·星穹铁道》角色跃迁概率公示,米游社川盏
// 概率递增函数官方未公示,数据来源米游社川盏,且随机种子质量不高,与实际有些许偏差
//基础跃迁出金的概率是0.006%,4星的概率是5.100%,3星的概率是94.300%
//保底跃迁出金的概率是0.006%,4星的概率是99.400%
//从第74抽开始概率增加,是否歪的概率是1/2
//定义判断歪不歪全局变量i,总抽数为num
int i = 0, num = 0;
//函数声明
int jichuyueqian(int x); int baodiyueqian(int x); int gailvzengjia(int x);
int main()
{
// 设置种子
srand(getpid(NULL));
// 生成特定区间的随机数[a,b]
//int randomNum = rand() % 2+2 ;
// 生成1到1000的随机数
//int randomNum = rand() % 1000 + 1;
// 输出随机数
//printf("1到1000的随机数为:%d\n", randomNum);
//70抽
for (int z = 0; z < 7; z++)
{
//九次基础跃迁
for (int p = 0; p < 9; p++)
{
num++;
int a = rand() % 1000 + 1;
jichuyueqian(a);
if (i == 1 || i == 2)
break;
}
if (i == 1 || i == 2)
break;//提前出货了就跳出循环
//一次保底跃迁
num++;
int a = rand() % 1000 + 1;
baodiyueqian(a);
printf("-------------------\n");
if (i == 1 || i == 2)
break;
}
if (i == 0)
{
//三次基础跃迁(到达73抽,概率开始增加)
for (int p = 0; p < 3; p++)
{
num++;
int a = rand() % 1000 + 1;
jichuyueqian(a);
if (i == 1 || i == 2)
break;
}
}
//第74到79抽
if (i == 0)
{
for (int p = 0; p < 6; p++)
{
num++;
gailvzengjia(num);
if (i == 1 || i == 2)
break;
}
}
//一次保底跃迁,第80抽
if (i == 0)
{
num = num++;
int a = rand() % 1000 + 1;
baodiyueqian(a);
printf("-------------------\n");
}
//81抽到89抽
if (i == 0)
{
for (int p = 0; p < 9; p++)
{
num++;
gailvzengjia(num);
if (i == 1 || i == 2)
break;
}
}
//第90抽
if (i == 0)
{
num++;
int waima = rand() % 1000 + 1;
if (waima <= 500)
{
i = 1;
}
else
{
i = 2;
}
}
//没歪计算总抽数,歪了从头来
if (i == 2)
{
printf(" ***出货了***\n");
printf("花费的总抽数为%d,即%d星琼\n", num, 160 * num);
}
if (i == 1)
{
i = 0;
printf("\n-----------------《歪了,别灰心继续抽》-----------------\n\n");
//70抽
for (int z = 0; z < 7; z++)
{
//九次基础跃迁
for (int p = 0; p < 9; p++)
{
num++;
int a = rand() % 1000 + 1;
jichuyueqian(a);
if (i == 1 || i == 2)
break;
}
if (i == 1 || i == 2)
break;//提前出货了就跳出循环
//一次保底跃迁
num++;
int a = rand() % 1000 + 1;
baodiyueqian(a);
printf("-------------------\n");
if (i == 1 || i == 2)
break;
}
if (i == 0)
{
//三次基础跃迁(到达73抽,概率开始增加)
for (int p = 0; p < 3; p++)
{
num++;
int a = rand() % 1000 + 1;
jichuyueqian(a);
if (i == 1 || i == 2)
break;
}
}
//第74到79抽
if (i == 0)
{
for (int p = 0; p < 6; p++)
{
num++;
gailvzengjia(num);
if (i == 1 || i == 2)
break;
}
}
//一次保底跃迁,第80抽
if (i == 0)
{
num = num++;
int a = rand() % 1000 + 1;
baodiyueqian(a);
printf("-------------------\n");
}
//81抽到89抽
if (i == 0)
{
for (int p = 0; p < 9; p++)
{
num++;
gailvzengjia(num);
if (i == 1 || i == 2)
break;
}
}
//第90抽
if (i == 0)
{
num++;
int waima = rand() % 1000 + 1;
if (waima <= 500)
{
i = 1;
}
else
{
i = 2;
}
}
printf(" ***出货了***\n");
printf("花费的总抽数为%d,即%d星琼\n", num,160*num);
}
return 0;
}
//自定义函数
//判断基础跃迁抽卡情况的函数,参数为随机数
int jichuyueqian(int x)
{
if (x<=6)
{
int waima = rand() % 1000 + 1;
if (waima <= 500)
{
i = 1;//代表歪了
}
else
{
i = 2;//代表出货了
}
}
else
{
if (x > 6 && x <= 58)
printf("四星\n");
else
printf("三星\n");
}
return 0;
}
//判断保底跃迁抽卡的函数,参数为随机数
int baodiyueqian(int x)
{
if (x <= 6)
{
//内嵌判断出金时是否歪的函数
int waima = rand() % 1000 + 1;
if (waima <= 500)
{
i = 1;
}
else
{
i = 2;
}
}
else
printf("四星\n");
return 0;
}
//概率增加时单次抽卡的函数,参数为抽卡次数
int gailvzengjia(int x)
{
//943 和 51
int b = 0;
int P = 6 + 58 * (x - 73);
int a = rand() % 1000 + 1;
if (a<=P)
{
int waima = rand() % 1000 + 1;
if (waima <= 500)
{
i = 1;
}
else
{
i = 2;
}
}
else
{
b = rand() % 994 + 1;
if (b >=1 && b <= 51)
printf("四星\n");
else
printf("三星\n");
}
return 0;
}