从自走棋代码分析游戏机制--棋池、回蓝、目标判断、掉落概率与新英雄

前几天接触了一下自走棋,发现这游戏有毒= =。 虽然作为新手菜鸡被虐的不要不要的,但是依然乐此不疲....

可惜的是虽然大概的机制玩过Dota 2的同学都懂,但是某些游戏机制是巨鸟多多独创的,而且并未说明过,除了知道有8位玩家共享棋池,攻击/被攻击都能回蓝,每轮会抽牌,每5轮野怪,大家觉得这似乎是一个纯随机游戏,技能释放完全看脸,回蓝也完全看脸.....

作为非酋的我实在不能忍.....这真的是一个概率游戏?正好逛github的时候发现有人上传了代码,于是去瞅了瞅。

自走棋部分代码(请自己注意日期)

虽然我Lua语法不太熟,但是作者写的注释很全而且意外的好懂.......以至于我这种弱鸡也能从代码发现一点东西,拿来和大家分享一下~

棋池大小与棋子总数

首先,需要明确的是自走棋游戏规则中,每轮抽牌是先根据当前人口的概率分布,先随机选择棋子的稀有度,再从这个稀有度的所有棋子中随机抽出一个棋子。

举个例子,比如在一轮抽牌中我抽到了1个2块钱的月骑,那么实际的过程是:

  1. 我抽到了一个2块钱的棋子
  2. 我从所有2块钱棋子组成的棋池里抽到了月骑


彩蛋环节

第一步中决定概率的是你的人口(科技等级),不过在这之前,有两个彩蛋,作者称之以为SSR卡........就是ssr_ck和ssr_nec,似乎是特殊版的混沌骑士和特殊版的死灵法师。

function RandomDrawChessNew(team_id)
	local h = TeamId2Hero(team_id)
	local this_chess = nil
	local ran = RandomInt(1,100)
	local chess_level = 1
	local curr_per = 0
	local hero_level = h:GetLevel()

	local table_11chess = {}
	for _,chess in pairs(GameRules:GetGameModeEntity().mychess[team_id]) do
		if string.find(chess.chess,'11') then
			table.insert(table_11chess,string.sub(chess.chess,1,-3))
		end
	end
	local ran1 = RandomInt(1,10000) %随机一个1~10000的数1
	local ran2 = RandomInt(1,10000) %随机一个1~100000的数2
	if h:GetLevel() >= 7 and ran1 <= 1 and ran2 <= 1 then %如果人口在7以上,且两个随机数都是1,随机抽SSR卡池中的卡
		this_chess = GameRules:GetGameModeEntity().chess_list_ssr[RandomInt(1,table.maxn(GameRules:GetGameModeEntity().chess_list_ssr))]
	else
		if GameRules:GetGameModeEntity().chess_gailv[hero_level] ~= nil then
			for per,lv in pairs(GameRules:GetGameModeEntity().chess_gailv[hero_level]) do
				if ran>per and curr_per<=per then
					curr_per = per
					chess_level = lv
				end
			end
		end
		-- this_chess = GameRules:GetGameModeEntity().chess_list_by_mana[chess_level][RandomInt(1,table.maxn(GameRules:GetGameModeEntity().chess_list_by_mana[chess_level]))]

		this_chess = DrawAChessFromChessPool(chess_level, table_11chess)
	end
	return this_chess
end

我在上述代码中加粗并加了注释来说明这部分,在这里解释一下。

所有的抽卡开始之前,有两个判断逻辑:如果你的人口大于7,且两个1~10000的随机数都是1,那么从SSR棋池中抽卡,这里抽出来的卡目前只有两种,就是上述说的ssr_ck和ssr_nec,两个随机数都是1的概率大概是 \frac{1}{10000} \times \frac{1}{10000} = 10^{-8}

当前的SSR棋池是这个:

GameRules:GetGameModeEntity().chess_list_ssr = {'chess_nec_ssr','chess_ck_ssr'}

所以这个概率下能抽出来SSR卡的是真·欧洲人,所以想验证自己的rp的各位,请7人口以后疯狂抽卡,8人口提升不了SSR的概率。

PS:这一步会在每轮抽卡的时候进行5次,所以....概率还是有的。


第一步判断棋子等级

在作为RP过滤器的彩蛋环节后,非洲人们就进入了正常抽卡环节。如果我没有理解错的话,这个根据当前人口判断抽卡等级的概率来自这里:

f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值