请选择 进入手机版 | 继续访问电脑版

C++编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2336|回复: 9

紫麒麟笔记_数学算法

[复制链接]

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
发表于 2017-4-6 15:08:34 | 显示全部楼层 |阅读模式
本帖最后由 ID紫麒麟 于 2017-4-6 15:14 编辑

新开一帖吧:有没有人搞过蒙特卡罗算法或者是龙格库塔算法呀,记得以前上学的时候似乎还学过,现在想想都忘记了。解决问题还是要记录一下笔记的,特别是逻辑方面有点儿乱的时候。

回复

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-4-7 12:01:29 | 显示全部楼层
忙的人不一定能够处理所有问题,悠闲而慢吞吞的人处理问题有条有理。分清事情的优先级。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-4-19 10:57:42 | 显示全部楼层

一个游戏逻辑算法

本帖最后由 ID紫麒麟 于 2017-4-19 11:58 编辑

现在讨论一个很多游戏里面的逻辑算法问题,这个东西不太好描述,我就先假设一个情景。

现在比较火的游戏是消消乐,我还是用这个游戏来说明吧。
消消乐我是没玩儿过的(曾经玩儿过一个电脑上的叫祖玛的宝藏单机游戏,后来对这类游戏就不太喜欢了),举这个例子只是让大多数能够明白里面的逻辑。

好了,扯远了,进入问题的关键吧,不知道消消乐是不是能够离线闯关,我也没问别人,要是有人知道也可以留个言告诉我。

假设消消乐原本不可以离线闯关的,现在需要让你去实现离线闯关的功能,在下次联网的时候能够知道用户是不是用了“非法手段”闯过关卡的。你会如何实现呢?

有兴趣的可以来说说自己的想法。




我提供一种办法吧,假设你出门带了1000元钱,剩下了500块,那么如何保证你在这个过程中没有出现差错呢?
当然是查账了呀,你的明细表如下:
打车花去了50
景点儿门票用了45
与朋友吃饭花了135
住宿花了270
最终花费了500元,好了得到的结果正好是1000-500,说明这个过程中你没有出现差错。






上面的这个过程就是离线玩儿消消乐的解决办法了。


转换成游戏里面的逻辑实现,我就简单描述一下吧,当然我不太熟悉这款游戏的规则,所以做了一些简化。
消消乐,在你消掉一部分的元素之后会自动生成新的元素来沾满空位。
你的操作也就是一些基本的东西,或者使用道具之类的。
将这些所有的东西做一长串的协议,发送给服务器,让服务器走一遍你的操作,看看最终是不是能够走通,验证你是否真的是玩儿通了这个关卡。

优化:这一长串的东西是否能够优化呢?
当然,如果你能够想到实际上在这个过程中生成新的元素是“随机”出来的,那么我们是不是能够控制这个“随机”呢?
假设我们自己设计一个随机数生成的算法,而且这个算法只是需要一个种子就能生成下一次的随机数。那么我们每次只要记录下来这个种子就能够不停的与客户端同步了。
这样一来,游戏里面的所谓随机也就都成为了已知,服务器对于客户端唯一未知的就是用户操作了。
那么只需要将用户操作发送给服务器就能够验证客户是不是真的自己玩儿的通关的了。
另外:如果连客户端的验证都没有通过,只需要记录一下用户使用了什么道具就足够了。这样也能够减轻服务器压力。

我用了不少冗余的例子来解释这个算法的核心原理,我想应该能够看懂。
直接把笔记中的东西复制过来,这个道理讲得很浅显,我也不用做补充了。










回复 支持 1 反对 0

使用道具 举报

1

主题

16

帖子

85

积分

码农

Rank: 2

积分
85
发表于 2017-4-19 12:20:26 | 显示全部楼层
ID紫麒麟 发表于 2017-4-19 10:57
现在讨论一个很多游戏里面的逻辑算法问题,这个东西不太好描述,我就先假设一个情景。

现在比较火的游戏是 ...

首先,开心消消乐我是玩儿过的。我玩儿的时候它是可以离线当作单机游戏玩儿的。而且,也确实能够在再次联网之后同步单机时的关卡信息。
你体的这个问题我首先想到的是操作日志,就是单机时同样会把用户的关卡信息记录到某个指定路径下的文件中,然后在联网后发送给服务端更新一下数据。没有你想的这么仔细。按照你的想法的话,服务器端需要根据用户的操作再模拟走一遍流程来判断用户是否有非正常操作。我个人觉得这样是没有必要的,就这个游戏而言,它属于休闲益智的,而不是竞技PK的,也就是说对于“公平”而言没有太大要求。
在这款游戏里最有意思的还是每次游戏开始的方块分布比较有意思,我提一个问题吧:
每一关失败的时候有“重玩儿一次”和“再玩儿一次”两种选择。重玩儿一次就是同样的开局,而再玩儿一次就是一种新排布的开局。所以,有时候开局很重要,一个关卡有时候卡上四五天,然后突然遇到一个好的开局,一下子就可以过关了。它的开局方法可能是根据一个随机值来设定的。我想问如果它的这个游戏的开局是靠随机值来排布,那这个随机值是不是需要有一个范围来确保所有开局都是有解的?我玩儿的过程中觉得它的有些局真的是没解的,或许是因为我这智商不够的原因吧。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-4-19 13:19:31 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2017-4-19 13:27 编辑
looksmart 发表于 2017-4-19 12:20
首先,开心消消乐我是玩儿过的。我玩儿的时候它是可以离线当作单机游戏玩儿的。而且,也确实能够在再次联 ...

能够重玩儿一次的话,我的这个方法似乎可以满足这种情况呀
这个有没有解肯定是游戏策划来想的吧,还有数值策划,不过这倒确实是一类问题。
就如同数独是否有唯一解,是否给的数字是最少的了。
还有曾经有个叫立体绘图方块的游戏,曾经也有人让我思考里面的逻辑,说实话,这类问题确实很复杂了。

但是这个东西是不是能够通过运算来计算出来呢,因为所谓的“随机”是可以掌控的,而且屏幕上可以移动的元素也是可以计算出来的。
恐怖的地方在于每个玩儿家的随机数初始种子是不同的,如果每一个都去计算的话,这个运算量肯定是非常非常大的。
但是我觉得也不是没有办法去剔除那些无解的东西。

我粗略的估算一下这个运算量吧,假设种子和随机数实际上是一个uint32_t的值,而每一个种子在某一个关卡里面需要移动32次,每次可能移动的情况为4种。
那么设计出一个关卡出来,需要判断的移动方案有多少呢?
(2^32) * (4^32) = 2^65;

优化:因为只要一个种子能够有一种方式走通,就不用继续找下去了,所以我觉得真正去运算这个东西,大概估算值为2^63

这个数量级的运算上,当然我只是纯粹用脑袋大概的想想的估算。

然后我觉得没有必要去花费那么大力气解决这个问题,因为做游戏的人目的是赚钱,如果有一个关卡怎么都过不去,那么就是需要你用再玩儿一次的道具去破解,反正最终目的就是让你掏钱嘛,何况这个本来就是一个休闲小游戏嘛。

如果需要你连续七天签到,这个游戏会赠送你这样的道具,不就是形成玩家登陆的习惯了,或者叫用户粘性?

以上就是我的解答,谢谢回复我哈。
回复 支持 2 反对 0

使用道具 举报

1

主题

16

帖子

85

积分

码农

Rank: 2

积分
85
发表于 2017-4-19 13:29:26 | 显示全部楼层
ID紫麒麟 发表于 2017-4-19 13:19
能够重玩儿一次的话,我的这个方法似乎可以满足这种情况呀
这个有没有解肯定是游戏策划来想的吧,还有 ...

随机种子应该不是你这么算的。我觉得是每个格子单独去随机的。毕竟格子就那么多,而且方块的颜色也就那么几种,这样子比较好随机,顶多再设置一下初始的可消除什么的。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-4-19 13:33:16 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2017-4-19 13:35 编辑
looksmart 发表于 2017-4-19 13:29
随机种子应该不是你这么算的。我觉得是每个格子单独去随机的。毕竟格子就那么多,而且方块的颜色也就那么 ...

额我所说的随机种子是这样计算的:

Xn+1 =f(Xn)

就是说现在的种子是由前一次的种子计算得来的,只要将最后种子保存在数据库中,然后让数据库中的种子与客户端的种子保持一致就好了。

比如需要新生成三个元素,只要利用这个公式计算三次,得到的新种子在元素种类里面就生成了新的种类。这个其实也是伪随机。
回复 支持 1 反对 0

使用道具 举报

1

主题

16

帖子

85

积分

码农

Rank: 2

积分
85
发表于 2017-4-19 14:12:07 | 显示全部楼层
ID紫麒麟 发表于 2017-4-19 13:33
额我所说的随机种子是这样计算的:

Xn+1 =f(Xn)

呃。。。每个元素都这么干?那要计算的也太多了些吧。
我的意思也是每个格子单独去随机,不过只是在那几种颜色里随机选一个颜色填充格子里就好
回复 支持 1 反对 0

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-4-19 14:30:36 | 显示全部楼层
looksmart 发表于 2017-4-19 14:12
呃。。。每个元素都这么干?那要计算的也太多了些吧。
我的意思也是每个格子单独去随机,不过只是在那几 ...

也没有太多,只是我说的这种方法需要控制随机数,只能这样来验证。

或许有其他的实现方法呢,如果重玩儿一次,就算玩儿家的操作相同,但是生成的不同的话,或许就是别人用其他办法实现的。

这个算法只是一个广义上的东西,是能够让一个游戏可以在线玩儿,也可以离线玩儿的方案而已。或许会有不同的方法实现的呢。除非是那种无所谓在线和离线的游戏,那就是根本不需要验证的单机游戏了。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-4-20 11:46:52 | 显示全部楼层
昨天晚上有个人给我推荐了一个叫KAMI2的游戏,我玩儿了一下,感觉挺有意思的,当然作为程序猿来说,看到一个游戏会以一种上地的视角去看看这个游戏开发难度,游戏规则,UI设计风格,游戏分类。

开发难度里面主要有数据结构,游戏规则的实现逻辑,游戏动画。
对于游戏规则这个东西就是游戏设定的方面,一般是游戏策划的事情,但是程序员也得先理解一下这个东西如果变成文档,大概是什么样子的,如果让自己描述会怎么描述。
UI设计风格,其实这个东西是美工的事情,但是很多时候一个游戏的整体风格与游戏的动画效果,以及受众有关系。
游戏分类就更好说了,先找找同类的东西,大概看看,对后面理解策划的点子还是有点儿帮助的。


哈哈,很久不做游戏了,感觉上面的这些东西也没什么大用,只是写出来,给一些想做个游戏的人一点儿建议。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|C++编程  

GMT+8, 2019-9-22 22:01 , Processed in 0.125000 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表