崩坏星穹铁道[抽卡机制]_C语言实现

目录

前言

抽卡机制

效果演示

实现思路

代码实现

角色存放

抽卡功能

 添加功能

代码源码

 


前言

为了在学习C语言的过程中不那么枯燥,我们可以根据已学的知识来实现自己感兴趣的功能

(如果觉得不错话,请给我一个赞吧,有赞必回!)

抽卡机制

以上我们可以获取到的抽卡机制:

  1. 五星角色的基础概率为 0.6% 四星对象基础概率为 5.1%
  2. 每十次必定获得 4星及以上
  3. 每九十此必定获得 5星
  4. 获得五星时有50%是 UP角色(本期概率提升) 本次不是UP角色 则下次五星必定是UP角色
  5. 获得四星时有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+DD~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;
}

 添加功能

只有一个抽卡功能或许太过单调,我们可以添加更多的功能

(以下功能均已在代码源码中)

例如

  1. 打印显示所有功能的菜单,显示已经使用过的票数,抽到的人物数,剩余的票数
  2. 添加单抽十连抽功能
  3. 添加氪金功能,没票的时候不能抽卡,只有有票的时候才能抽
  4. 重置记录功能,把使用过的票数和抽到的人物数清空

代码源码

头文件 文件名: 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;
}

<think>好的,用户想找《崩坏铁道》的MOD资源和教程。首先,我需要回顾一下提供的引用内容,看看有没有直接相关的信息。引用1和引用4是关于游戏版本更新和活动,引用2提到了自动化工具StarRailAssistant,引用3和5涉及技术方面的内容,比如payload构造和克隆项目。 用户的需求是MOD下载和教程,但现有引用里没有直接提到MOD资源。不过引用5提到了HoYo-Glyphs项目,可能涉及游戏字体或界面修改,这可能和MOD有关联。需要进一步确认这个项目是否属于MOD范畴,或者是否用户可以通过这个项目学习到如何制作MOD。 接下来,我应该考虑用户可能需要的步骤:寻找MOD资源网站、安装教程、注意事项。由于引用中没有具体的MOD站点,可能需要建议用户去知名的MOD社区如GitHub、Nexus Mods等搜索。同时,引用2的StarRailAssistant虽然主要是自动化工具,但可能涉及游戏文件修改,需提醒用户注意账号安全,避免被封禁。 另外,引用5的克隆项目和安装依赖可能涉及技术操作,用户可能需要一定的编程知识,这部分在回答中需要说明,避免新手直接操作导致问题。还要提醒用户MOD可能存在兼容性问题,尤其是游戏更新后。 总结回答结构:先说明目前没有官方MOD支持,建议社区资源;然后分步骤说明如何查找和安装,提到GitHub和Nexus Mods;接着给出具体例子如HoYo-Glyphs项目;最后强调风险和注意事项。这样既利用了现有引用中的相关信息,又补充了常见的MOD获取途径,确保回答全面且安全。</think>《崩坏铁道》的MOD资源获取与使用需注意以下要点: ### 一、MOD资源获取途径 1. **GitHub开源项目** 推荐尝试开源项目如$HoYo-Glyphs$(米哈游游戏字体修改工具),可通过以下命令克隆仓库: ```bash git clone https://github.com/SpeedyOrc-C/HoYo-Glyphs.git ```[^5] 该项目涉及游戏界面元素的修改,需安装Python依赖并配置环境变量 2. **第三方MOD社区** - Nexus Mods(需搜索"Honkai: Star Rail"分类) - GameBanana等专业MOD平台 - 国内贴吧/论坛的玩家交流版块 ### 二、安装注意事项 1. **版本兼容性** MOD需匹配当前游戏版本(如2.3版本更新后部分MOD可能失效)[^1] 2. **风险提示** 使用自动化工具(如$StarRailAssistant$)或修改客户端可能触发反作弊机制[^2],建议: - 仅用于单机内容 - 避免在联机玩法中使用 - 使用前备份游戏存档 ### 三、技术实现参考 通过分析网络请求可了解游戏数据交互方式(示例请求头): ``` GET /?a=QNKCDZO&b=s155964671a&c=2025e HTTP/1.1 Host: node4.anna.nssctf.cn:28486[^3] ``` 此类技术研究需遵守《用户协议》,建议在虚拟机环境测试
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值