用最笨的方法做一个原某模拟抽卡

学了一阵子的C语言,还没学透,玩游戏的时候感觉太非,就自己试着用会的那么点东西写了这么一个。当然废话可能蛮多的,新手嘛,体谅体谅,也希望路过的大佬给提点建议,

变量名都是瞎起的,比如概率的英文是probability我就写pbb,所以看着可能有点乱。

 在这个程序里,5星的概率为0.6%,在50抽没有5星的情况下,开始每抽一次概率增加1%,第91次必为5星,同时概率恢复到最初值。抽到5星时50%是常驻(俗称“歪了”),50%是up,如果抽到常驻,下次5星必为up。

4星概率为5.1%,每抽到3星,概率加2%,每10次必出四星及以上卡,之后刷新4星的概率

3星概率为94.3%

 

#define	_CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

static int pbb1 = 6;	//把整体分为3部分的两个间隔数
static int pbb2 = 949;	//概率probability
static int s = 0;		//三星数量
static int ss = 0;		//四星数量
static int sss_1 = 0;	//up五星数量
static int sss_2 = 0;   //常驻五星数量
static int num = 0;		//抽奖的总次数
static int bao = 0;		//保底
static int num_3_4 = 0;	//抽到三星和四星的数量,因为抽到五星要清零,所以不用s+ss

void head()			//标题函数
{
	printf("请选择祈愿次数\n");
	printf("1 次:请输入1\n");
	printf("10次:请输入10\n");
	printf("退出请输入0\n");
}

void action(int ret)		//抽奖函数
{
	 if (0 < ret && ret <= pbb1 || num_3_4 == 90)		//随机数为0-pbb1或者三星四星数量到90为五星
	 {
		if (ret % 2 == 0 || bao == 1)					//有50%的概率抽到up五星,50%概率抽到常驻的五星
			{											//且第一次不是up,第二次抽到五星必为up五星 即保底bao==1时
				printf("*****up五星*****\n");
                sss_1++;
				bao = 0;								//抽到up五星保底就清零
			}
		else
			{
				printf("*****常驻五星*****\n");
                sss_2++;
				bao++;									//没抽到up五星保底+1
			}
		pbb1 = 6;										//抽到五星概率就回到最初值										
		num_3_4 = 0;									//抽到五星 三星+四星的数量清零
	 }
	else if (pbb1 <= ret && ret <= pbb2)				//随机数为pbb1-pbb2时为三星
	{
		printf("***三星***\n");
		if (num_3_4 >= 50)								//如果三星+四星的数量>=50时 增加抽五星的范围
			pbb1 += 10;									//五星的范围加10 相当于增加1%
		num_3_4++;
		pbb2 -= 20;										//四星的范围加20 相当于增加2%
		s++;
	}
	else if (pbb2 < ret && ret <= 1000)					//随机数为pbb2-1000时为四星
	{
		printf("****四星****\n");
		if (num_3_4 >= 50)								
			pbb1 += 10;
		num_3_4++;
		pbb2 = 1000 - 51;								//抽到四星后四星的概率返回最初值
		ss++;
		s = 0;											//当抽到四星 三星的数量清零  用于下边的10抽必中4星
	}

	if (s == 9)											//连着九发是三星,第十发必是四星或五星
	{
		pbb2 = pbb1;									//五星概率不变 把三星的概率都给了四星
	}
}

int main()
{
	int n = 0;
	do
	{
		head();					//先打印标题
		scanf("%d", &n);		//输入次数1/10
		switch (n)				//判断n
		{
		case 1:					//n=1执行一次action函数
			srand(time(0));		//生成随机数
			int m = rand() % 1000 + 1;		//使随机数在1-1000之间
			action(m);
			printf("合计:共%d次,四星有%d个,五星有%d个\n\n", num+=1, ss, sss);
			continue;
		case 10:				//n=10执行10次action函数
		{
			int a[10];			//定义一个存放10个随机数的数组
			int i;
			srand(time(0));
			for (i = 0; i < 10; i++)
			{
				a[i] = rand() % 1000 + 1;		//生成10个随机数并依次赋值给数组的各元素
				action(a[i]);
			}
			printf("合计:共%d次,四星有%d个,up五星有%d个,常驻五星有%d个\n\n", num+=10, ss, sss_1,sss_2);
		}
		continue;
		case 0:		//输入0结束
			break;
		default:	//输入其他数显示错误
			printf("输入错误");
		}
	} while (n);	//n!=0就一直循环
	return 0;
}

 第一篇文章,支持一下,大佬提点建议,我会虚心学习。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值