遇到一个问题 感觉很简单 却又那么难 这是为何

hiose89 2016-08-23 02:07:23
主要是思路的问题。
之前有个思路 但做下来代码太多 逻辑判断太复杂,于是就把所有代码推倒了。
但想了很久又找不到新的好点的思路。


这是斗地主里的问题,把牌拆成顺子。
实际的不同牌型情况很多,先随便假设集合里如果是这些数,怎么样拆成顺子比较人道?
JQKA是为了肉眼看起来好理解些,实际上就是11 12 13 14.



3344556778991010JQK

344566778910JQQKK

33455678910

334556778810JQKAA



难道是我太笨了。别笑我的问题太小白啊。大神快来啊,指点指点 给个算法。。。。。
...全文
900 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiose89 2016-08-31
  • 打赏
  • 举报
回复
引用 34 楼 qq_20324803 的回复:
[quote=引用 楼主 hiose89 的回复:] 主要是思路的问题。 之前有个思路 但做下来代码太多 逻辑判断太复杂,于是就把所有代码推倒了。 但想了很久又找不到新的好点的思路。 这是斗地主里的问题,把牌拆成顺子。 实际的不同牌型情况很多,先随便假设集合里如果是这些数,怎么样拆成顺子比较人道? JQKA是为了肉眼看起来好理解些,实际上就是11 12 13 14. 3344556778991010JQK 344566778910JQQKK 33455678910 334556778810JQKAA 难道是我太笨了。别笑我的问题太小白啊。大神快来啊,指点指点 给个算法。。。。。
楼主有没有印象。就是对一个数列,有正负的。算这个数列中,连续的数列最大值。 比如,1,-1,2,3.这个数列最大就是2.3. 我觉得那个算法好像可以参考一下。 [/quote]
引用 34 楼 qq_20324803 的回复:
[quote=引用 楼主 hiose89 的回复:] 主要是思路的问题。 之前有个思路 但做下来代码太多 逻辑判断太复杂,于是就把所有代码推倒了。 但想了很久又找不到新的好点的思路。 这是斗地主里的问题,把牌拆成顺子。 实际的不同牌型情况很多,先随便假设集合里如果是这些数,怎么样拆成顺子比较人道? JQKA是为了肉眼看起来好理解些,实际上就是11 12 13 14. 3344556778991010JQK 344566778910JQQKK 33455678910 334556778810JQKAA 难道是我太笨了。别笑我的问题太小白啊。大神快来啊,指点指点 给个算法。。。。。
楼主有没有印象。就是对一个数列,有正负的。算这个数列中,连续的数列最大值。 比如,1,-1,2,3.这个数列最大就是2.3. 我觉得那个算法好像可以参考一下。 [/quote] 谢谢。虽然不清楚你说的是什么。 回头想想这个问题应该没有固定的算法。因为牌全是未知的,而且牌的自由性太大,有很多种可能。 如果用一个方法来解决所有拆牌可能,那几乎很难做到,先抛开争对你的对手出牌的任何情况来做应对。 就最单纯的拿手上牌拆分。 一个最简单例子 如果手上有33 45678 明显该拆成33 45678 你可以用代码判断如果遇到队子时后面的牌能组顺子你便可以跳过这对3.不让他组成顺子。 但如果 是334566778910 如果还用之前的逻辑 如果直接跳过对3 会变成 33 45678910 6 7 这样多出2张牌 6 7 但如果拆成 34567 678910 3 这样的话 只会多个一张单牌3 人一看就知道,但电脑不是人 究竟要用什么逻辑来把334566778910 拆成 34567 678910 3 ???同时也能兼顾到33 45678 ,每多一个可能,你就得多做一种判断。 这只是其中2中情况。实际上复杂的情况很多,一副可能组成顺子的牌中,可能穿插着飞机,大牌,连队等等,其中的取舍。 没有一个固定的规律。 找不到好的算法,只能用最原始的办法,逐个判断分析,花了千行代码,算是勉强解决了各种可能发生的情况·~但还是傻瓜
摇撼大地 2016-08-28
  • 打赏
  • 举报
回复
引用 楼主 hiose89 的回复:
主要是思路的问题。 之前有个思路 但做下来代码太多 逻辑判断太复杂,于是就把所有代码推倒了。 但想了很久又找不到新的好点的思路。 这是斗地主里的问题,把牌拆成顺子。 实际的不同牌型情况很多,先随便假设集合里如果是这些数,怎么样拆成顺子比较人道? JQKA是为了肉眼看起来好理解些,实际上就是11 12 13 14. 3344556778991010JQK 344566778910JQQKK 33455678910 334556778810JQKAA 难道是我太笨了。别笑我的问题太小白啊。大神快来啊,指点指点 给个算法。。。。。
楼主有没有印象。就是对一个数列,有正负的。算这个数列中,连续的数列最大值。 比如,1,-1,2,3.这个数列最大就是2.3. 我觉得那个算法好像可以参考一下。
xiaha3 2016-08-27
  • 打赏
  • 举报
回复
要写个打牌机器人?最简单的就是遍历出牌组合,找出最少步骤,本身打牌就是个技术活,还能写简单了?这个真没人帮你写
hiose89 2016-08-26
  • 打赏
  • 举报
回复
引用 29 楼 Seilboy 的回复:
。。。。。直接抄企鹅的出牌方式不行吗?自己打个2小时估计能总结个差不多
在哪抄、、。。
hiose89 2016-08-26
  • 打赏
  • 举报
回复
引用 28 楼 redshiliu 的回复:
[quote=引用 25 楼 hiose89 的回复:] [quote=引用 24 楼 huang461072830 的回复:] 看完回复,我怎么觉得楼主想要的是一个棋牌界的“能PK李世石的谷歌机器人”....列出所有能组合成顺子的牌面比较简单,至于要怎么最“人道”这估计要让计算机了解怎么打会赢。首先:计算发完牌后另外两家的牌面,列出另外两家牌的所有组合可能性,计算每一个钟可能性的概率(不会弄),然后计算自己牌被压住的概率,如果不是能要牌就必须要的类型还得观察另外两家的性格、心里,计算出对方要不要的概率。然后计算所有的可能性。OK,到这里框架差不多搭好了,细节方面不要太在意,然后进行训练,让程序不断优化出牌方案,最后找到一种胜算最大的出牌方式。然后换了一个对家,继续训练。。。。经过N个人N多次的训练后统计人类的心里、出牌的方案,标出各个方案的权重。。。。然后慢慢的接近“人道”。最后来了一个不按套路出牌的。。。然后呵呵了。。。 大致思考了下,完成这东西大概要知道统计学、心理学、神经算法、并发处理、高等数学、遗传算法等等一系列的知识,还有一些其他的感觉特别高大上的知识。。。 恩,搞定差不多可以研究AI了,然后我怎么这么闲在这水了这么久,扯到蛋了。。。
不是的,你太偏激了。想太多了。相反是最简单的AI 尽量不落单的拆好牌后,就可以给牌分好类型组, 上家出的是什么牌,我只虚要判断他牌的类型,是单拍或顺子 3带1等等。 然后在自己对应牌型数组里找,有大过的就要,没有就过。 这就是最基本的需求,如果做一个上家出什么我不管,我只需要把所有牌直接拆了一定压死你, 这样做没有任何意义啊, [/quote] 对于斗地主来说,不是说有大过的就压上。一方面需要压上的时候就要分析出最好的拆牌策略,另一方面还要根据局势判断到底要不要压上,这个都是电脑靠程序来搞很费劲的。比如你是地主,刚开始走了一个小对,结果下家农民立即出了一个对A,按照人的理解,那这个农民肯定着急说话,如果不压,后面肯定一个大顺子或者其它,所以这个到底要不要压还是一个很难用程序来把握的,至少需要很费劲。[/quote] 真相帝
gtclulong 2016-08-26
  • 打赏
  • 举报
回复
想解决这个问题必须要有高水平地斗地主技巧,把自己的技巧用算法写出来。你让一个没有多少斗地主经验的来搞斗地主AI,只能得到一个弱智程序 除非是自动学习的模式,否则依照既定的策略来出牌,软件的最高AI水平也就是作者的斗地主水平
xiaha3 2016-08-25
  • 打赏
  • 举报
回复
大概给你个思路吧,哈哈,哥哥平时也玩斗地主,有点经验,如果单纯就是斗地主,在界面上像我说的这样安排,作为选手可以希望一目了然。 然后如果像楼主说的自动分组功能,实际就是如何拆牌组合,可以有个自动拆牌按钮,系统可以给出几个拆牌策略,当然其中需要出牌次数最少的为第一,而且每次出牌后都可以重新给出最优策略。 如果设计程序,如果我做的话,2个东西: 一个是牌数据,结构和界面一样,二维数组。 第二个就是原子团,就是可以出的牌型 龙:就是个从3到k的一维数组,双,单,连双三,双龙,三代一。。。。。 结果策略应该就是由原子团组成的一个大分子了,具体用链表还是什么你自己想吧
token不能为空 2016-08-25
  • 打赏
  • 举报
回复
。。。。。直接抄企鹅的出牌方式不行吗?自己打个2小时估计能总结个差不多
redshiliu 2016-08-25
  • 打赏
  • 举报
回复
引用 25 楼 hiose89 的回复:
[quote=引用 24 楼 huang461072830 的回复:] 看完回复,我怎么觉得楼主想要的是一个棋牌界的“能PK李世石的谷歌机器人”....列出所有能组合成顺子的牌面比较简单,至于要怎么最“人道”这估计要让计算机了解怎么打会赢。首先:计算发完牌后另外两家的牌面,列出另外两家牌的所有组合可能性,计算每一个钟可能性的概率(不会弄),然后计算自己牌被压住的概率,如果不是能要牌就必须要的类型还得观察另外两家的性格、心里,计算出对方要不要的概率。然后计算所有的可能性。OK,到这里框架差不多搭好了,细节方面不要太在意,然后进行训练,让程序不断优化出牌方案,最后找到一种胜算最大的出牌方式。然后换了一个对家,继续训练。。。。经过N个人N多次的训练后统计人类的心里、出牌的方案,标出各个方案的权重。。。。然后慢慢的接近“人道”。最后来了一个不按套路出牌的。。。然后呵呵了。。。 大致思考了下,完成这东西大概要知道统计学、心理学、神经算法、并发处理、高等数学、遗传算法等等一系列的知识,还有一些其他的感觉特别高大上的知识。。。 恩,搞定差不多可以研究AI了,然后我怎么这么闲在这水了这么久,扯到蛋了。。。
不是的,你太偏激了。想太多了。相反是最简单的AI 尽量不落单的拆好牌后,就可以给牌分好类型组, 上家出的是什么牌,我只虚要判断他牌的类型,是单拍或顺子 3带1等等。 然后在自己对应牌型数组里找,有大过的就要,没有就过。 这就是最基本的需求,如果做一个上家出什么我不管,我只需要把所有牌直接拆了一定压死你, 这样做没有任何意义啊, [/quote] 对于斗地主来说,不是说有大过的就压上。一方面需要压上的时候就要分析出最好的拆牌策略,另一方面还要根据局势判断到底要不要压上,这个都是电脑靠程序来搞很费劲的。比如你是地主,刚开始走了一个小对,结果下家农民立即出了一个对A,按照人的理解,那这个农民肯定着急说话,如果不压,后面肯定一个大顺子或者其它,所以这个到底要不要压还是一个很难用程序来把握的,至少需要很费劲。
hiose89 2016-08-25
  • 打赏
  • 举报
回复
引用 26 楼 xiaha3 的回复:
大概给你个思路吧,哈哈,哥哥平时也玩斗地主,有点经验,如果单纯就是斗地主,在界面上像我说的这样安排,作为选手可以希望一目了然。 然后如果像楼主说的自动分组功能,实际就是如何拆牌组合,可以有个自动拆牌按钮,系统可以给出几个拆牌策略,当然其中需要出牌次数最少的为第一,而且每次出牌后都可以重新给出最优策略。 如果设计程序,如果我做的话,2个东西: 一个是牌数据,结构和界面一样,二维数组。 第二个就是原子团,就是可以出的牌型 龙:就是个从3到k的一维数组,双,单,连双三,双龙,三代一。。。。。 结果策略应该就是由原子团组成的一个大分子了,具体用链表还是什么你自己想吧
和没说一样
hiose89 2016-08-24
  • 打赏
  • 举报
回复
引用 18 楼 redshiliu 的回复:
你是想写电脑的应对逻辑是吧,简单点就按人玩的逻辑来搞,你出顺子是不是会按拆出最少单牌的方式走?
引用 19 楼 xiaha3 的回复:
看了眼,随便给你个思路,你可以把拍视觉上处理一下, 比如设置13个槽,每个槽都竖排,能否成套一目了然
没听懂。。。。
xiaha3 2016-08-24
  • 打赏
  • 举报
回复
看了眼,随便给你个思路,你可以把拍视觉上处理一下, 比如设置13个槽,每个槽都竖排,能否成套一目了然
redshiliu 2016-08-24
  • 打赏
  • 举报
回复
你是想写电脑的应对逻辑是吧,简单点就按人玩的逻辑来搞,你出顺子是不是会按拆出最少单牌的方式走?
hiose89 2016-08-24
  • 打赏
  • 举报
回复
引用 24 楼 huang461072830 的回复:
看完回复,我怎么觉得楼主想要的是一个棋牌界的“能PK李世石的谷歌机器人”....列出所有能组合成顺子的牌面比较简单,至于要怎么最“人道”这估计要让计算机了解怎么打会赢。首先:计算发完牌后另外两家的牌面,列出另外两家牌的所有组合可能性,计算每一个钟可能性的概率(不会弄),然后计算自己牌被压住的概率,如果不是能要牌就必须要的类型还得观察另外两家的性格、心里,计算出对方要不要的概率。然后计算所有的可能性。OK,到这里框架差不多搭好了,细节方面不要太在意,然后进行训练,让程序不断优化出牌方案,最后找到一种胜算最大的出牌方式。然后换了一个对家,继续训练。。。。经过N个人N多次的训练后统计人类的心里、出牌的方案,标出各个方案的权重。。。。然后慢慢的接近“人道”。最后来了一个不按套路出牌的。。。然后呵呵了。。。 大致思考了下,完成这东西大概要知道统计学、心理学、神经算法、并发处理、高等数学、遗传算法等等一系列的知识,还有一些其他的感觉特别高大上的知识。。。 恩,搞定差不多可以研究AI了,然后我怎么这么闲在这水了这么久,扯到蛋了。。。
不是的,你太偏激了。想太多了。相反是最简单的AI 尽量不落单的拆好牌后,就可以给牌分好类型组, 上家出的是什么牌,我只虚要判断他牌的类型,是单拍或顺子 3带1等等。 然后在自己对应牌型数组里找,有大过的就要,没有就过。 这就是最基本的需求,如果做一个上家出什么我不管,我只需要把所有牌直接拆了一定压死你, 这样做没有任何意义啊,
小程序员 2016-08-24
  • 打赏
  • 举报
回复
看完回复,我怎么觉得楼主想要的是一个棋牌界的“能PK李世石的谷歌机器人”....列出所有能组合成顺子的牌面比较简单,至于要怎么最“人道”这估计要让计算机了解怎么打会赢。首先:计算发完牌后另外两家的牌面,列出另外两家牌的所有组合可能性,计算每一个钟可能性的概率(不会弄),然后计算自己牌被压住的概率,如果不是能要牌就必须要的类型还得观察另外两家的性格、心里,计算出对方要不要的概率。然后计算所有的可能性。OK,到这里框架差不多搭好了,细节方面不要太在意,然后进行训练,让程序不断优化出牌方案,最后找到一种胜算最大的出牌方式。然后换了一个对家,继续训练。。。。经过N个人N多次的训练后统计人类的心里、出牌的方案,标出各个方案的权重。。。。然后慢慢的接近“人道”。最后来了一个不按套路出牌的。。。然后呵呵了。。。 大致思考了下,完成这东西大概要知道统计学、心理学、神经算法、并发处理、高等数学、遗传算法等等一系列的知识,还有一些其他的感觉特别高大上的知识。。。 恩,搞定差不多可以研究AI了,然后我怎么这么闲在这水了这么久,扯到蛋了。。。
hiose89 2016-08-24
  • 打赏
  • 举报
回复
引用 22 楼 xiaha3 的回复:
就是界面有13个位置,放从1到13的排,同样的牌竖着放,发完牌,自动填充 红桃3 红桃4 .。。。。。。 红桃k 空 红桃2 大王 黑桃3 片子4.。。。。。。。黑桃k 空 花子2 花子4
你的意思是这样吗 假如手里的牌是 33 4 5 6 777 88 99 10 JJ Q K K A A 是意思? 3 4 5 6 7 8 9 10 j Q K A 3 7 8 9 j K A 7 然后呢,自动填充是何意,快来 大神。
xiaha3 2016-08-24
  • 打赏
  • 举报
回复
就是界面有13个位置,放从1到13的排,同样的牌竖着放,发完牌,自动填充 红桃3 红桃4 .。。。。。。 红桃k 空 红桃2 大王 黑桃3 片子4.。。。。。。。黑桃k 空 花子2 花子4
hiose89 2016-08-24
  • 打赏
  • 举报
回复
引用 18 楼 redshiliu 的回复:
你是想写电脑的应对逻辑是吧,简单点就按人玩的逻辑来搞,你出顺子是不是会按拆出最少单牌的方式走?
引用 18 楼 redshiliu 的回复:
你是想写电脑的应对逻辑是吧,简单点就按人玩的逻辑来搞,你出顺子是不是会按拆出最少单牌的方式走?
是啊,如果不先把电脑的牌拆好,光根据上家的出牌 现拆 应对的话 牌就散了。 而且电脑在占大后,不知道怎么出牌。
hiose89 2016-08-23
  • 打赏
  • 举报
回复
引用 16 楼 shingoscar 的回复:
[quote=引用 14 楼 From_TaiWan 的回复:] 只能帮你一个大致框架,细节只好自己研究了
楼主的意思就是不是:你们写个能跑起来的代码,不然肯定是有这样那样的问题 不知道我有没有理解错。[/quote] 这兄弟说的太对了 不愧是知道牛顿定律的人 实事上也不麻烦,搞个54个的数组,打乱,给自己17张就可以大家的实现想法了。
Poopaye 2016-08-23
  • 打赏
  • 举报
回复
引用 14 楼 From_TaiWan 的回复:
只能帮你一个大致框架,细节只好自己研究了
楼主的意思就是不是:你们写个能跑起来的代码,不然肯定是有这样那样的问题 不知道我有没有理解错。
加载更多回复(15)

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧