一.题目简介
本次的项目是编写一个斗地主的小游戏,实现语言:java;主要完成了GUI设计、计时线程、算法。本次项目的主要目的是对算法的学习。算法分析在心得里面。
技术难点:1.图片的移动 2.计时线程的设定 3.对牌的分割,必须考虑到优先拆分方案,将权值低的拆分方案舍去。 4.在删除的时候遇到问题了,删除不了。
二.结对分工及过程
本次结对项目的成员有两个,张国伟:负责对GUI界面的设计,完成功能:洗牌功能,发牌功能,打牌功能的图片的位移处理,基本打牌的桌面等等。
我主要负责对算法的设计编写和对计时线程的编写。
三.代码地址
https://github.com/Tsir/DouDiZhu
github最近出问题了,上传不了文件了,还没解决。所以github中只有源码,没有素材图片。
四.结对实践过程
1.对程序的整体思路,结构进行设计,采用了model2模式,将view层和model层分离,写到不同的类里,使程序的结构更加明了。
2.对程序界面功能的实现进行了设计和讨论;然后又对算法的进行了分析和讨论,查阅了相关资料,对算法设计进行学习。
3.分工合作,张国伟主要负责界面的编写,我负责对算法的编写,其中我们就一些难点一起讨论,如 牌面的移动。
4.对代码的整合与修改,两个人的代码整合一定会出很对问题,我们就问题进行讨论解决,完成代码的整合。
五.测试情况
程序的结构:
运行后的主界面:
出牌:
完成比赛:
六.问题及心得
游戏中算法的基本思想是:当我们随机拿到牌时,我们先将牌排序,当然排序也是有算法的,然后对牌按照斗地主的规则(如:单张、对子、三带、飞机、炸弹等)将牌分成不同的组合存放在集合list里,分牌的算法基本思路是对牌组合优先级的设置,即考虑两个方面,手牌的出牌手数(手数少的优先级高)和牌组合权值的设定(如:王炸的权值应该是最大的,单牌的权值应该是最小的),通过这两方面,可以决定如何对牌的拆分组合,舍弃优先级底的情况;对牌拆分完后,将拆分好的牌放入集合中待用。
这个算法的缺点是:牌在出牌前就拆好了,必须严格按照集合已有对象进行出牌,不能灵活的变更和更接近人的思维模式。
个人的新思路为:拆牌时,我们可以将牌按单张、对子、三张等先放入不同的集合里(这里可能会有交集,如 34567889,我们要分成3456789和88放入不同的集合内),当我们找到合适的牌打出后,我们对剩下的牌重新拆分,然后对集合更新(因为前面的出牌很可能破坏了牌分好的牌类型),这样就能更全面的考虑情况了,这时候优先级的设计就针对如何找到合适的牌,我们不能有就出,还要考虑合不合适的问题。
我这里还做了一套类似的游戏------跑得快,按照斗地主的标准,只是对战的是两个人,并且是电脑的智能对战,这个平台可以对算法的学习起到很好的帮助。目前代码还在修改中,修改好了,随后会分享到github中。另外对算法有兴趣的同学可以编写更好的算法进行测试。