程序员用12小时复刻《羊了个羊》,代码已开源(4)
扫一扫
分享文章到微信
扫一扫
关注99科技网微信公众号
很多朋友抱怨:“程序员故意挖坑制作死关卡”。其实不然,他无须故意挖坑,因为这个游戏本身就有很多“天然的坑”,如果不使劲填坑,它们自然而然就属于你了。而这里就隐藏了几个可致命的坑:乍一看,待发牌池中所有的图案都可以被3整除那么一定可以通关?那可不一定:
只有桌面牌堆中牌的数量和待发牌池牌数一致,所有的牌才能“落地”,而游戏中桌面牌堆到底有多少(层)本身就是个迷。并且如果没猜错的话,在每一局设计者先要确保牌堆形状好看,然后再使堆牌数和待发池的牌数一致。二者哪怕差1个,也会造成死局。
上文说了,桌面牌数和待发牌池的牌数一致只是过关的必要而非充分条件。即使该条件满足,如果相对于牌桌上的牌数以及图案数量,窗口牌数太少,也会造成死局。比如下面这个极端的例子:假设游戏共有 15种花色,而牌桌上只有这个模式A牌堆,它有90张牌。那么玩家只要在连续7次拾牌时没有遇到3个相同图案的牌,就“必死无疑”了。
其实这个游戏,一方面要控制关卡的难度,另一方面又要保证能通关本身就是一个相当困难的问题 (至少老王没有想出办法) 。 而设计者反其道而行之, (可能) 没有花力气去设计算法,把坑留给玩家,得到了极低的通关率,反而制造了话题并形成爆款。 如此说来,这确实是个抖机灵的“设计”。但老王认为这种“设计”在游戏策划中是不宜被借鉴的,就像现在市面上泛滥的悬疑剧,开始埋坑无数,吊足观众胃口,最后烂尾不了了之一样,长此以往观众 (玩家) 对于悬疑剧 (游戏) 的信任感就被消费殆尽了。
02 洗牌道具的实现洗牌的实现原理很简单,把当前桌面的牌记录在一个数组tiles中,当需要洗牌时,先打乱一下数组中牌的顺序,然后让桌面上每一张牌到tiles中重新取一个值。再来个眼花缭乱点的动画,还真挺像那么回事儿。
func shuffle_tiles(): tiles.shuffle() tiles_index = -1func redistribute_face() -> int: tiles_index += 1 return tiles[tiles_index]
03 遮罩文件的读取这里要夸一下Godot Engine,它的很多功能真是方便,比如下面这个str2var它可以简单粗暴地直接把字符串转换成对象类型。
class_name FileReaderstatic func read(path,default_data): var data = default_data var file = File.new() file.open(path,File.READ) var content :String = file.get_as_text() if not content.empty(): data = str2var(content) file.close() return data
99科技网:http://www.99it.com.cn
