途游斗地主是一款超级受欢迎的休闲娱乐类手机游戏!现游戏玩家已经破亿!途游斗地主游戏为玩家提供了时下最流行的游戏玩法,操作简单,画面简约大方,老少皆宜!游戏还会每天安排各项比赛,赢得比赛的有可能会获得微信红包哟!感兴趣的小伙伴们欢迎下载体验哦!
火箭、飞机、炸弹横飞 随时翻盘
玩牌最痛苦的事情就是牌太烂,被压制?玩《途游斗地主》没有差牌,增加了得到炸弹牌的几率,让炸弹逆袭的机会更多。除此之外,每局最高翻牌倍数高达512倍,让你体会最刺激的牌局。
全天24小时赛事不断 奖励丰厚
高手云集岂能没有排名,分出排名岂能没有奖励?《途游斗地主》中采用ASS打立出局+定分淘汰赛制,设计了多人冠军赛、九人快速赛、三人快速赛等多种比赛赛事,赛事时间贯穿全天。另外,《途游斗地主》每天赛事的奖金池高达千万金币,来玩就有100%的机会得金币及其他奖励哦!
可爱表情恶搞配音 Q萌欢乐
游戏采用Q版人设,正太与萌妹子化身游戏中当地主与农民,人物动态表情可爱萌动,“我炸你个桃花朵朵开”等恶搞配音让游戏过程更加欢愉,背景音乐轻柔欢快,具有极强的感染力,让你时刻保持愉快心情!
认证头像实时语音 真实沟通
游戏可自定义头像,真实头像可申请官方认证。另外,游戏拥有全城语聊功能,在游戏的过程中无需打字,即可畅快与他人无阻碍沟通,究竟对面的“他”是萝莉?是御姐?是正太?是大叔??只需看头像听声音就可辨别哦!
《途游斗地主》采用最顶尖的防作弊技术,快速游戏自动配桌,彻底杜绝作弊。另外,游戏采用最有效的流量压缩技术,完美适应2G(E)网络,全天游戏只需1.2M,同时保证游戏画面流畅,不卡、不慢、不断!想要绝对公平、最省流量的斗地主,就快下载吧!
一亿手机玩家的玩牌选择
炸弹横飞,史上最刺激的牌局
每日赠送4000—10000金币,无需充值玩得爽
《途游斗地主》至今已经拥有1.5亿手机下载用户,每天有30万人新加入《途游斗地主》,是当前中国人手机上最流行的扑克游戏。《途游斗地主》提供了经典,欢乐,癞子,二人,三人等当前市面上最流行的斗地主玩法。除此之外,每天都会举办各项斗地主比赛,发放丰厚的奖励。《途游斗地主》在设计上追求公平的规则与简易的操作,更符合年轻人打“快牌”的需求,是手机上最刺激的“斗地主”游戏。
全面提升1080p高清画质
优化牌局支持体育总局相关棋牌赛事
赛事优化,增加多种全新赛事
系统链接优化,流量更绿色
途游斗地主是一款超级受欢迎的休闲娱乐类手机游戏!现游戏玩家已经破亿!途游斗地主游戏为玩家提供了时下最流行的游戏玩法,操作简单,画面简约大方,老少皆宜!游戏还会每天安排各项比赛,赢得比赛的有可能会获得微信红包哟!感兴趣的小伙伴们欢迎下载体验哦!
火箭、飞机、炸弹横飞 随时翻盘
玩牌最痛苦的事情就是牌太烂,被压制?玩《途游斗地主》没有差牌,增加了得到炸弹牌的几率,让炸弹逆袭的机会更多。除此之外,每局最高翻牌倍数高达512倍,让你体会最刺激的牌局。
全天24小时赛事不断 奖励丰厚
高手云集岂能没有排名,分出排名岂能没有奖励?《途游斗地主》中采用ASS打立出局+定分淘汰赛制,设计了多人冠军赛、九人快速赛、三人快速赛等多种比赛赛事,赛事时间贯穿全天。另外,《途游斗地主》每天赛事的奖金池高达千万金币,来玩就有100%的机会得金币及其他奖励哦!
可爱表情恶搞配音 Q萌欢乐
游戏采用Q版人设,正太与萌妹子化身游戏中当地主与农民,人物动态表情可爱萌动,“我炸你个桃花朵朵开”等恶搞配音让游戏过程更加欢愉,背景音乐轻柔欢快,具有极强的感染力,让你时刻保持愉快心情!
认证头像实时语音 真实沟通
游戏可自定义头像,真实头像可申请官方认证。另外,游戏拥有全城语聊功能,在游戏的过程中无需打字,即可畅快与他人无阻碍沟通,究竟对面的“他”是萝莉?是御姐?是正太?是大叔??只需看头像听声音就可辨别哦!
《途游斗地主》采用最顶尖的防作弊技术,快速游戏自动配桌,彻底杜绝作弊。另外,游戏采用最有效的流量压缩技术,完美适应2G(E)网络,全天游戏只需1.2M,同时保证游戏画面流畅,不卡、不慢、不断!想要绝对公平、最省流量的斗地主,就快下载吧!
一亿手机玩家的玩牌选择
炸弹横飞,史上最刺激的牌局
每日赠送4000—10000金币,无需充值玩得爽
《途游斗地主》至今已经拥有1.5亿手机下载用户,每天有30万人新加入《途游斗地主》,是当前中国人手机上最流行的扑克游戏。《途游斗地主》提供了经典,欢乐,癞子,二人,三人等当前市面上最流行的斗地主玩法。除此之外,每天都会举办各项斗地主比赛,发放丰厚的奖励。《途游斗地主》在设计上追求公平的规则与简易的操作,更符合年轻人打“快牌”的需求,是手机上最刺激的“斗地主”游戏。
全面提升1080p高清画质
优化牌局支持体育总局相关棋牌赛事
赛事优化,增加多种全新赛事
系统链接优化,流量更绿色
本软件是基于android平台的斗地主AI,我们在源代码的基础之上,旨在改进AI的算法,使玩家具有更丰富的体验感,让NPC可以更为智能。
(1)发牌和叫牌:一副扑克54张,先为每个人发17张,剩下的3张作为底牌,玩家视自己手中的牌来确定自己是否叫牌。按顺序叫牌,谁出的分多谁就是地主,一般分数有1分,2分,3分。地主的底牌需要给其他玩家看过后才能拿到手中,最后地主20张牌,农民分别17张牌。
(2)出牌:地主先出牌,按照逆时针顺序依次进行,农民利用手中的牌组织地主继续出牌,并和同伴配合(这种配合的默契程度,之后会在算法中体现)尽快出完手中的牌。当一手牌在另外两家打不过的情况下,出牌的玩家继续出牌。
(3)牌型以及大小:单牌大小顺序为:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3,组合牌大小顺序为:火箭最大,炸弹其次,大过任何的牌型。
如果是同种牌型,则比较其主牌作为单牌时的顺序。下面是各种牌型的使用说明:
单牌:任何一张牌都是单牌,大小为:大王,小王,2,A,K,Q,J……
对牌:2张数值相同,花色不同的牌。
三张:3张数值相同,花色不同的牌。
单顺:5张或5张以上,数值连续的牌,2和双王不能列入其中。
双顺:3个或者3个以上数值连续的对牌。
三顺:2个或2个以上数值连续的三张。
飞机:三顺加数量相同的单牌或者对牌。
炸弹:4张数值相同的牌。
四带二:炸弹+(两张单牌或者对牌)。
(三)代码的详细解析:
整个游戏将近3000行代码,共由10个类组成,以下先将10个类的具体作用在表格中展示出来,再具体分析每个类的具体功能:
Person:游戏中的玩家,其中两家是NPC(这里仅限于单机游戏,目的是要测试计算机的AI智商)
Desk:一个游戏桌位,存储着三个玩家的共有信息,和当前游戏的进度控制
Card:每一手牌都是一个Card类的实例
Poke:洗牌,比较大小等操作
PokeType:定义了牌型的接口,里面定义了十二种牌型常量和两种绘制牌的方向
AnalyzePoke:分析手中的所有牌,将各种牌型划分
(人工智能主要在Person类中NPC出牌的过程中展现)
UniqInt:一个存储不同数值的辅助工具类
本游戏是一个单机游戏,所以桌子(Desk)只有一个,桌子上有3个玩家(Person),其中两个是NPC玩家,一个是用户玩家,每一个玩家都有一把牌,17张或者20张,每一把牌都可以分成很多手牌(Card)。
上面已经分析了Desk,Person,Card之间的关系,下面逐个逐个进行解析。
Desk是桌子类,它持有3个玩家的实例对象,负责为3个玩家分牌,控制出牌的顺序流程,当前分数的倍数等全局性信息。
Desk类地成员变量:
这里调用了一个出牌人的AI函数,对于timeLimite的理解,感觉是让机器再多算一会儿,控制回溯的深度?这里有待考虑。
如果NPC没有大牌了,就选择不要牌,如下是对于不要牌的操作:
nextPerson()函数用于定位下一个出牌的人(对于不要之后的轮转函数),而对于buyao()函数,这里有待进一步理解。
(如下的代码和UI有关,这里就不列出了)
对于Person类自己的一些见解:
这里,AI考虑当玩家没有任何“威胁”的情况下,任意出了一手牌,其实按照习惯,应该出一手玩家认为在当前时刻最为迫切出的牌,所以,这里的AI有待补完。
PokeType类,也就是其中的对于牌型的定义:
Poke获取牌型信息:
Poke定义了一些关于扑克牌的核心操作,例如洗牌,获取牌型,出牌等。作为一个关于扑克操作的工具栏,Poke中的所有方法全部是静态方法,可以直接通过类名调用,不实例化Poke类。
关于洗牌的操作,实际上,根据经验可知,在物理上,洗牌六次可以达到最大的混乱度,但是,这里采用了一个随机算法,也就是让54张牌分别和随机生成的牌发生交换,这种方法不置可否,应该没有常规洗牌那么“随机性”,不过,作为置乱,也已经足够随机了。
获取牌型之后,通过判断两手牌的大小,需要知道一手牌的牌值:
这里只对于“绝对优势”的牌做出了比较,比如:火箭和炸弹。
下 面继续人工智能,Poke类中给出了这样一个方法,可以直接从牌中选中能够打过card值得牌,如果没有则返回false;(其中运用了C++--STL 中的vector作为存储容器,这里还有一个小亮点,利用must值来判断紧迫性,如果neesZd为true,则需要炸弹了配合,也就是到了一些关键关 头,另外,在选择拆牌的时候,考虑到“火箭”和“4个2”的牌是拥有绝对实力的,这样的牌都不能拆开。在检查炸弹的时候,也根据紧迫性几率出牌,如果下家 是和自己一伙的,则顺延给下家)
这里,对于不同的人工智能解析,会有不同的版本,这里的版本暂时设定为Simple2。
以下是出牌智能,上述的解析函数运用在出牌智能中。
该出牌智能基于如下一些原则:
玩家只剩下一手牌的时候,此时无论如何也应该要出牌。
对于要牌者(这里理解为挑战者):
当玩家非地主时,如果是地主出的牌,则和BOSS的紧迫性原则差不多,但是,如果是自己家的牌的话,遵循以下的一些原则:
(1) 如果我很可能一次性或者几乎一次性地出完牌(c<=3),那么我就出牌。
(2) 如果我手中的牌的大小大于一定的值(这个值可以经过商议之后微调,不过,这里暂时限定为card.value=12),否则,我可以顺延一个。
这里,有一个很好的想法是“紧迫程度原则”,但是,是否就用must变量来处理,有待进一步分析。
最后一个类为AnalyzePoke类,进行牌型的分析,与牌型的分析不同,这里是对一副牌的分析,上面是对一手牌的分析。AnalyzePoke类本来应该也放置在Poke类中,但是为了减少Poke类中的代码量,于是就将牌型的分析这个模块分离出来,
AnalyzePoke最主要的方法就是分析方法,它将一副牌中所有的牌型全部分析出来(按照牌的威力的依次下降逐层逐层分析的),放置到各自的Vector容器中,这样就可以在需要的时候从各自的牌型中取得,或者进行组合得到。
(这样,可以初步解析出一副牌,以及分析出牌的“综合实力”了,需要改进的地方还有很多,比如,有些时候,牌的“威力”并不是那么固定的)
以 上,就是所有的主要代码,电脑NPC的智商还是有些偏低,这里没有用到一些人工智能的算法(利用博弈树,DFS,BFS,A*)等等,貌似用到了回溯,但 是,其中有些亮点值得注意,这里并没有纯粹客观地利用搜索的深度来逐渐扩大NPC的“智商”,因为,这样会引入一些比较大的时间复杂度,而这在作为玩家的 游戏中时不可取的,我们应该在加强NPC的聪明程度的同时考虑到玩家的耐心程度,斗地主AI的优秀程度,也就是这两个方面的利弊权衡吧!
以上就是我对那3000行代码的一些见解,关于UI,绘图,以及线程刷频等一些东西我就不拿出来了。