目录
前言
为了在学习C语言的过程中不那么枯燥,我们可以根据已学的知识来实现自己感兴趣的功能
(如果觉得不错话,请给我一个赞吧,有赞必回!)
抽卡机制
以上我们可以获取到的抽卡机制:
- 五星角色的基础概率为 0.6% 四星对象基础概率为 5.1%
- 每十次必定获得 4星及以上
- 每九十此必定获得 5星
- 获得五星时有50%是 UP角色(本期概率提升) 本次不是UP角色 则下次五星必定是UP角色
- 获得四星时有50%是 UP角色 本次不是UP角色 则下次四星必定是UP角色
效果演示
实现思路
五星的概率为 0.6% 相当于 1000份中的6份
四星的概率为 5.1% 相当于 1000份中的51份
分别用四个变量来记录:
- 每十次必得4星及以上
- 每九十次必得5星
- 本次是否必定五星UP
- 本次是否必定四星UP
代码实现
角色存放
这里我采用了结构体数组的形式进行存放
到时候打印的时候更加方便
这里并没有存放四星光锥,只存放了角色,所以角色的概率直接包含了光锥的概率
(先后顺序是按照抽卡界面-详细输入的)
#define STAR_5_num 8//五星个数
#define STAR_4_num 15//四星个数
struct star_5
{
char name[20];//五星
};
struct star_4
{
char name[20];//四星
};
struct star_5 c_5[STAR_5_num] = {
"卡芙卡",
"姬子",
"瓦尔特",
"布洛妮娅",
"杰帕德",
"克拉拉",
"彦卿",
"白露" };
struct star_4 c_4[STAR_4_num] = {
"希露瓦",
"桑博",
"卢卡",
"佩拉",
"黑塔",
"娜塔莎",
"艾丝妲",
"阿兰",
"丹恒",
"虎克",
"素裳",
"青雀",
"停云",
"驭空",
"三月七"
};
抽卡功能
这里需要现在主函数中加上
srand((unsigned int)time(NULL));
这条语句只需声明一次即可
之后每次使用随机时只要用 rand() 即可
rand()是随机数,这时rand()%N来规定在 0~N-1 范围
rand()%N+D 在 D~N-1+D 范围内
#define STAR_5 6//五星 0.600% =>在1000中有6个 范围 1~6
#define STAR_4 57//四星 5.100% =>在1000中有51个 范围 7~57
int insure_star5 = 89;//五星保底 还有多少次
int insure_star5_up = 0;//五星up保底 0:没有 1:有
int insure_star4 = 9;//四星保底 还有多少次 注意这次也要判断五星的概率
int insure_star4_up = 0;//四星up保底 0:没有 1:有
void game(int n)//抽卡功能 参数是抽n次
{
for (int i = 1; i <= n; i++)
{
//当十连时也会触发五星概率
//这里为了方便使用了 goto 语句
if (insure_star4 == 0 && insure_star5 != 0)
{
int nn = rand() % 1000 + 1;
if (nn >= 1 && nn <= STAR_5)
goto GOTO_STAR_5;
else
goto GOTO_STAR_4;
}
int nnn = rand() % 1000 + 1;
if (insure_star5 == 0 || (nnn >= 1 && nnn <= STAR_5))//五星
{
GOTO_STAR_5:
printf("\n\\\\\\\\\\--------------------------------/\n");
insure_star4 = 0;
insure_star5 = 89;
int up = rand() % 2;//0或1 up角色
if (insure_star5_up == 1 || up)
{
insure_star5_up = 0;
printf("%3d. [五星][%s]拿着你给的票上船了!!!\n", record, c_5[0].name);
}
else
{
insure_star5_up = 1;
int n_5 = rand() % (STAR_5_num - 1);
printf("%3d. [五星][%s]拿着你给的票上船了!!!\n", record, c_5[n_5].name);
}
printf("\\\\\\\\\\--------------------------------/\n\n");
}
else if ( nnn > STAR_5 && nnn <= STAR_4)//四星
{
GOTO_STAR_4:
printf("\n-----------------------------------------\n");
insure_star4 = 9;
insure_star5--;
int up = rand() % 2;//0或1 up角色
if (insure_star4_up = 0 || up)
{
insure_star4_up = 0;
int up_star4 = rand() % 3;//0~2 四星的三个up
printf("%3d. [四星][%s]拿着你给的票上船了!\n", record, c_4[up_star4].name);
}
else
{
insure_star4_up = 1;
int n_4 = rand() % (STAR_4_num - 3);
printf("%3d. [四星][%s]拿着你给的票上船了!\n", record, c_4[n_4].name);
}
printf("-----------------------------------------\n\n");
}
else//三星
{
insure_star4--;
insure_star5--;
printf("%3d. [三星]三星光锥进入了你的背包~\n", record);
}
}
return;
}
添加功能
只有一个抽卡功能或许太过单调,我们可以添加更多的功能
(以下功能均已在代码源码中)
例如
- 打印显示所有功能的菜单,显示已经使用过的票数,抽到的人物数,剩余的票数
- 添加单抽和十连抽功能
- 添加氪金功能,没票的时候不能抽卡,只有有票的时候才能抽
- 重置记录功能,把使用过的票数和抽到的人物数清空
代码源码
头文件 文件名: game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define STAR_5 6//五星 0.600% =>在1000中有6个 范围 1~6
#define STAR_4 57//四星 5.100% =>在1000中有51个 范围 7~57
unsigned short ticket;//剩余票数
unsigned short record;//使用票数
unsigned short sum_5;//抽到的五星次数
unsigned short sum_4;//抽到的四星次数
unsigned short sum_3;//抽到的三星次数
void menu();//打印菜单
void game(int n);//抽卡功能
void Give_him_money();//氪金
void resetting();//重置记录
运行文件 文件名:test.c
#include"game.h"
//概率:
int main()
{
srand((unsigned int)time(NULL));
int input = 0;//输入
do {
menu(ticket, record);
printf("请输入功能->:");
scanf("%d", &input);
switch (input)
{
case 1://单抽
game(1);
break;
case 2://十连
game(10);
break;
case 3://氪金
Give_him_money();
break;
case 4://重置记录
resetting();
break;
}
} while (input);
int n = rand() % 1000 + 1;//一共 1000 可能性
return 0;
}
函数实现文件 文件名:game.c
#include"game.h"
#define STAR_5_num 8//五星个数
#define STAR_4_num 15//四星个数
struct star_5
{
char name[20];//五星
};
struct star_4
{
char name[20];//四星
};
struct star_5 c_5[STAR_5_num] = {
"卡芙卡",
"姬子",
"瓦尔特",
"布洛妮娅",
"杰帕德",
"克拉拉",
"彦卿",
"白露" };
struct star_4 c_4[STAR_4_num] = {
"希露瓦",
"桑博",
"卢卡",
"佩拉",
"黑塔",
"娜塔莎",
"艾丝妲",
"阿兰",
"丹恒",
"虎克",
"素裳",
"青雀",
"停云",
"驭空",
"三月七"
};
int insure_star5 = 89;//五星保底 还有多少次
int insure_star5_up = 0;//五星up保底 0:没有 1:有
int insure_star4 = 9;//四星保底 还有多少次 注意这次也要判断五星的概率
int insure_star4_up = 0;//四星up保底 0:没有 1:有
void menu()//打印菜单
{
printf("---------------------\n");
printf("| 1.单抽一发入魂! | 当前票数:%u\n", ticket);
printf("| 2.十连稳赚不亏! | 已使用票数:%u\n", record);
printf("| 3.氪金 | 已抽到的五星:%u\n", sum_5);
printf("| 4.重置记录 | 已抽到的四星:%u\n", sum_4);
printf("---------------------\n");
}
void game(int n)//抽卡功能
{
if (ticket >= n)
ticket -= n;
else
{
printf("票数不足!快去氪金~\n");
return;
}
for (int i = 1; i <= n; i++)
{
//当十连时也会触发五星概率
//这里为了方便使用了 goto 语句
if (insure_star4 == 0 && insure_star5 != 0)
{
int nn = rand() % 1000 + 1;
if (nn >= 1 && nn <= STAR_5)
goto GOTO_STAR_5;
else
goto GOTO_STAR_4;
}
int nnn = rand() % 1000 + 1;
if (insure_star5 == 0 || (nnn >= 1 && nnn <= STAR_5))//五星
{
GOTO_STAR_5:
printf("\n\\\\\\\\\\--------------------------------/\n");
sum_5++;
record++;
insure_star4 = 0;
insure_star5 = 89;
int up = rand() % 2;//0或1 up角色
if (insure_star5_up == 1 || up)
{
insure_star5_up = 0;
printf("%3d. [五星][%s]拿着你给的票上船了!!!\n", record, c_5[0].name);
}
else
{
insure_star5_up = 1;
int n_5 = rand() % (STAR_5_num - 1);
printf("%3d. [五星][%s]拿着你给的票上船了!!!\n", record, c_5[n_5].name);
}
printf("\\\\\\\\\\--------------------------------/\n\n");
}
else if ( nnn > STAR_5 && nnn <= STAR_4)
{
GOTO_STAR_4:
printf("\n-----------------------------------------\n");
sum_4++;
record++;
insure_star4 = 9;
insure_star5--;
int up = rand() % 2;//0或1 up角色
if (insure_star4_up = 0 || up)
{
insure_star4_up = 0;
int up_star4 = rand() % 3;//0~2 四星的三个up
printf("%3d. [四星][%s]拿着你给的票上船了!\n", record, c_4[up_star4].name);
}
else
{
insure_star4_up = 1;
int n_4 = rand() % (STAR_4_num - 3);
printf("%3d. [四星][%s]拿着你给的票上船了!\n", record, c_4[n_4].name);
}
printf("-----------------------------------------\n\n");
}
else//三星
{
sum_3++;
record++;
insure_star4--;
insure_star5--;
printf("%3d. [三星]三星光锥进入了你的背包~\n", record);
}
}
return;
}
void Give_him_money()//氪金
{
while (1)
{
printf("请输入要氪的票数->:");
int n = 0;
scanf("%d", &n);
if (n < 0)
{
printf("不带输入负数的!");
continue;
}
else
{
ticket += n;
return;
}
}
}
void resetting()//重置记录
{
record = 0;//使用票数
sum_5 = 0;//抽到的五星
sum_4 = 0;
sum_3 = 0;
return;
}