五子棋人机对战代码.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8.2电脑下棋算法设计 本款游戏最核心的地方就是算法,因为这是整个程序最难的模块。算法的中心思想是: 利用分数代表每个位置的重要程度, 越重要的位置的分数值会越高, 当电脑下棋时会先将电 脑和玩家棋型的分数分别计算一遍,然后选择二者中分数最高的点下子。如果玩家的分数高, 那么代表电脑应该防守,如果电脑的分数高,那么代表电脑应该进攻。 具体的分数值赋值如下: 分数 电脑 玩家 活二 60 50 半活二 40 35 死二 10 10 半死二 10 10 活三 950 700 半活三 900 650 死三 100 100 半死三 100 100 活四 6000 3500 半活四 5000 3000 死四 4000 800 半死四 3600 750 活五 20000 15000 半活五 10000 3300 死五 20000 15000 半死五 10000 3300 解释一下其中的活,半活,死,半死: 活:代表几个子是相连的,中间没有空格,两端都至少有一个空格。 半活:代表几个子不是相连的,几个子中间有一个空格,两端都至少有一个空格。 死:代表几个子是相连的, 中间没有空格,但有一端紧挨着对方的棋子或有一端正好在 棋盘的边界。 半死:代表几个子不是相连的, 几个子中间有一个空格, 而且一端紧挨着对方的棋子或 有一端正好在棋盘的边界。 每个位置的分数的计算方式是各个方向的分数相加, 最后找出电脑棋型和玩家棋型的分 数的最高的位置为电脑的下棋点下棋。 具体的代码如下: public void qixi ng(){ for ( int i=0;i17;i++){ for ( int j=0;j17;j++){ if (qipan [i+1][j+1]==0){ // 说明此处没有棋子 qix in gPC [i][j]= heiheng(i,j,2)+heishu(i,j,2)+heizuoxie(i,j,2)+heiyouxie(i,j,2); qixingPlayer [i][j] = heiheng(i,j,1)+heishu(i,j,1)+heizuoxie(i,j,1)+heiyouxie(i,j,1); } else { qixingPC [i][j] = 0; qixingPlayer [i][j] = 0; } } } } // 算出黑子横方向的棋型数值 public int heihen ( int hang, int lie, int num){ int k = 0; // 记录空白处的个数 int count = 1; // 记录可以形成几连 int n = hang+1; // 对应棋盘的行 int m = lie+1; // 对应棋盘的列 boolean left = false ; // 判断左边是否有黑子 boolean liveLeft = false ; // 判断左边是活还是死 boolean liveRight = false ; // 判断右边是活还是死 [n][m-1]==0)while (( qipan [n][m-1]!=-1)( qipan [n][m-1]==num|| qipan ){ [n][m-1]==0) if ( qipan [n][m-1]==0k1){ // 第一个空白 if ( qipan [n][m-2]!=num){ liveLeft = true ; break ; } k++; m--; } else if ( qipan [n][m-1]==num){ // 黑子 left = true ; m--; } else { // 第二个空白 liveLeft = true ; break ; } } if (!left){ k = 0; m = lie+1; while (( qipan [n][m+1]!=-1)( qipan [n][m+1]==num|| qipan [n][m+1]==0) ){ int t = qipan [n][m+1]; if (m==lie){ count++; m++; continue ; } if (t==0k1){ // 第一个空白 if ( qipan [n][m+2]!=num){ liveRight = true ; break ; } k++; m++; } else if (t==0k0){ // 第二个空白 liveRight = true ; break ; } else { // 黑子 m++; count++; } } return jieguo(liveLeft,liveRight,count,k,num); [n-1][m]==0)} [n-1][m]==0) // 算出黑子竖方向的棋型数值 public

文档评论(0)

136****3783 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档