策划开发麻将AI已久,差不多始于2年前的一个冲动,想到既然网络麻将互相看不见没有肢体信息等等,那么AI数据流不应该弱于人类才对。。当年因为实在懒得做GUI然后放弃了。之后因为时间上的问题一直没有捡起来。
这几天看到U9老师写了麻将GUI,突然觉得是时候了,于是开了这个博客,打算集中把这个AI搞起来
。。。嘛我基本来说并不是程序员,所以写出来的东西可能问题很大
而且最关键的是我平时的时间很少,几乎拿不出多少来做这种业余工作。。
总之加油吧!
测试一下code命令能不能用:
[code]
#define MIO "mio zui cong ming le , mio de
cheng xu cai mei you bug"
[/code]
咦。。不知道是不是这样用。。
好了进入正题
·开发平台 linux RH
·语言 c++
·开发工具 vim
·编译器 g++
·技术支持
CFv笨呆呆 最高七段R2116
先从最基本的函数入手,总之最基本的几个应该是
·IsAgari(IsTenpai) 判断和了与否,听牌与否
·Score 算点(分成算符和算番两部分)
·Syantensu 向听数
没有这几个函数,后面的工作全都无法进行。所以今晚刚开工就马上动手写了IsAgari函数
Agari算法有很多种,取决于手牌结构。虽然U9老师似乎用的是
t_pai tehai[14];
这样的结构,使用递归来削减面子数来判断和牌。这个算法很快就实现了,但是考虑到各种各样的问题,(主要是尽量优化AI计算效率?)最终决定在这里放弃递归而选择一种基于这样手牌结构
int tehai[34];
的一个O(1)的算法。于是这个算法也完成了,没有怎么测试不知道有没有问题。等测试后再写上这个算法。不过看起来貌似是没问题的!
至于听牌什么的 扫一遍34种牌就行了吧。。不想写什么快算法了,头很大
接下来的问题就是Score 算点
这个问题很大很大,mio想了一个小时也没想出怎么才能和刚才的IsAgari紧密联系,总觉得如果和往常一样写什么
IsSananko
IsPinfu
IsTanyao
神马的 有点不搭。。。因为前面的算法中使用了大量的位运算,这里也想尽可能的使用位运算来解决问题。役种大致想要做这样的结构:
enum{ Richi=0,
Iipatsu,
Tsumo,
...
Sananko
}
这样一个枚举(这是C语法吗?我都不记得enum要怎么写),然后用Yaku[n](n是役种数)来记录。
至于会不会这部分也变成位运算的(我够
以后再看吧。
插点图片
我似乎从学习用c写程序到现在也只写了这么几个。。一直都在用matlab呀python呀简单方便的东西呢
p8_maj就是这次的麻将程序了
只有这样子而已。。连个.h都没有写
像这个样子给定了手牌,是123m 123p 12344s 西西西
和了的牌,正确的运行结果应该是agari
于是果然是正确的。
嘛把名字遮起来什么的不要在意了。
好了今晚睡觉了~以后慢慢更新