《Blokus作业解题报告(含代码)》.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《Blokus作业解题报告(含代码)》.doc

Blokus作业解题报告 一、解题思路:Blokus的关键在于角的把握,把可以防止己方方块的点成为扩展点,则己方占据的扩展点越多,敌方占据的扩展点越少,那么己方优势就越大。所以我把扩展点的个数的多少作为取胜的关键。 主要以算分儿为主要手段,枚举每一种放法,达到最大的分数那一种作为最终的放法。算分儿的规则如下: 1、由于最终得分是由放置方块儿的大小(即所含小单元的个数)决定的,所以放置方块儿所含单元的数目是分数的重要组成部分,给分时为单元数目×8 2、计算己方放置方块儿后增加的扩展点,分数记为增加的扩展点数×9,这里之所以给的分数高,是因为在后期,更多的扩展点要比一、两个单元更为重要 3、计算敌方因我方放置方块儿而减少的扩展点,分数记为减少的扩展点×1,这里之所以给的分数少,是因为角斗士是以进攻渗透为主,防守是很难坚固其它三方的攻击的。 4、其它的分数。分为前期和后期。 ①前期主要是想中间渗透,谁能抢占中场,谁就能称王,在向中间渗透的过程中,当然会生成很多可用的扩展点,将来可以作为占据本方角落的扩展点。分数计算是: 放置方块儿前到中心点的距离 — 放置方块儿后到中心点的距离。(为一个负数,因为离中心越近越好) ②后期主要是争取更多的扩展点,并尽量在同时压制敌方,不让敌方进入本方的角落,占据本方的空间。当然,能渗透进地方区域是更好的。分数计算为: 放置方块儿后到角落的距离 — 放置方块儿前到角落的距离。 PS:之所以将这两个区分开,是因为前期如果也用后期的算法,那么不一定是向中心发展,而可能严边沿发展,而且不好区分前期后期。假如后期用前期的算法,也是不合适的,因为后期中区肯定很满,而边角应该还是有空隙的,而且渗透也是越深越好。 二、函数列表(只列出自己写的和改动的函数) ①int ownnumber()计算自己代号的函数,1——(0,0),2——(0,19),3——(19,19),4——(19,0) ②bool ok(int i,int j,int color)判断该点是否有邻近的同色点,i、j分别为点的横纵坐标,color为己方的代号,分别判断上下左右有没有本方的点,有则返回ture,全部都没有返回false。(若达到边界视为没有同色点) ③void availabledot()计算目前扩展点的个数,枚举每一个放置任何颜色单元的点,看它四个角是否有同色点,找到以后看这个角上的点是否有临近的同色点,(调用ok函数)如果没有,那么就是新的扩展点,本方的扩展点个数放入Mypoint(全局变量),敌方(不区分其它三方)存入Otherpoint(全局变量)。 ④double getgrade(int x,int y,int i,int d)计算方块儿i以d方式放置于(x,y)时的分数。(不含其它分数)分数计算方法前边已经提到,返回之所以是double是因为后边的距离可能不为整数。 ⑤void deletesingle(board cur, int x, int y,int i, int d); 将以d方式放置的方块儿i从(x,y)取下,基本照抄putsingle函数的内容,除了填入数字的改动。 ⑥double middle();计算目前本方单元中到中心最近的单元到中心的距离。搜索整个棋盘,计算每个本方单元到中心的距离,得到最大距离。 ⑦double extendplace();计算目前本方单元中到本方出生点最近的单元到出生点的距离。搜索整个棋盘,计算每个本方单元到出生点的距离,得到最大距离。 ⑧void putminefirst(board cur)放置第一个方块儿,每个出生点有须先设定的固定的方法,不进行计算。 ⑨void putmine(board cur)枚举每种可能的放置方法然后算分儿,然后把放上的方块儿拿下,如此循环往复,最后放上最佳方案的方块儿。 三、总结和不足 本次大作业程序写的不是很精致,前两次提交的时候比较紧张,都有明显的错误,最终改的结果还算在意料之中,写的时候大概是想到了上学期五子棋用的算分儿方法,觉得是写AI的好方法,便继续沿用,在实际中也有不错的效果。但是blokus的特殊情况还是比较多的,比如说从两个对顶的敌方方块儿中利用角斗士这个“角”的特性穿过去,这是敌方无法防守的,这一点的考虑还不是很到位。 关于算法的时间、空间复杂度问题没有进行细致的讨论,利用了一些简单的剪枝来降低时间复杂度,但是总体上还是以枚举为主,这在一定程度上也是别无选择的方法。 总之,本次大作业算是基本按要求完成,有收获也有不足,都是一种锻炼。 四、附录(源代码) /* Practice of Programming in CC++ Sample Program of Team Game -- Blokus Written by

文档评论(0)

wyth + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档