




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8.2 电脑下棋算法设计本款游戏最核心的地方就是算法,因为这是整个程序最难的模块。算法的中心思想是:利用分数代表每个位置的重要程度,越重要的位置的分数值会越高,当电脑下棋时会先将电脑和玩家棋型的分数分别计算一遍,然后选择二者中分数最高的点下子。如果玩家的分数高,那么代表电脑应该防守,如果电脑的分数高,那么代表电脑应该进攻。 具体的分数值赋值如下:分数电脑玩家活二6050半活二4035死二1010半死二1010活三950700半活三900650死三100100半死三100100活四60003500半活四50003000死四4000800半死四3600750活五2000015000半活五10000
2、3300死五2000015000半死五100003300解释一下其中的活,半活,死,半死:活:代表几个子是相连的,中间没有空格,两端都至少有一个空格。半活:代表几个子不是相连的,几个子中间有一个空格,两端都至少有一个空格。死:代表几个子是相连的,中间没有空格,但有一端紧挨着对方的棋子或有一端正好在棋盘的边界。半死:代表几个子不是相连的,几个子中间有一个空格,而且一端紧挨着对方的棋子或有一端正好在棋盘的边界。每个位置的分数的计算方式是各个方向的分数相加,最后找出电脑棋型和玩家棋型的分数的最高的位置为电脑的下棋点下棋。具体的代码如下:public void qixing()for(int i=0;
3、i<17;i+)for(int j=0;j<17;j+)if(qipani+1j+1=0)/说明此处没有棋子qixingPCij = heiheng(i,j,2)+heishu(i,j,2)+heizuoxie(i,j,2)+heiyouxie(i,j,2);qixingPlayerij = heiheng(i,j,1)+heishu(i,j,1)+heizuoxie(i,j,1)+heiyouxie(i,j,1);elseqixingPCij = 0;qixingPlayerij = 0;/ 算出黑子横方向的棋型数值public int heiheng(int hang,int
4、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;/判断右边是活还是死while(qipannm-1!=-1)&&(qipannm-1=num|qipannm-1=0)if(qipannm-1=0&&k<1)/第一个空白if(qipa
5、nnm-2!=num)liveLeft = true;break;k+;m-;else if(qipannm-1=num)/黑子left = true;m-;else/第二个空白liveLeft = true;break;if(!left)k = 0;m = lie+1;while(qipannm+1!=-1)&&(qipannm+1=num|qipannm+1=0)int t = qipannm+1;if(m=lie)count+;m+;continue;if(t=0&&k<1)/第一个空白if(qipannm+2!=num)liveRight = tr
6、ue;break;k+;m+;else if(t=0&&k>0)/第二个空白liveRight = true;break;else/黑子m+;count+;return jieguo(liveLeft,liveRight,count,k,num);/算出黑子竖方向的棋型数值public int heishu(int hang,int lie,int num)int k = 0;/记录空白处的个数int count = 1;/记录可以形成几连int n = hang+1;/对应棋盘的行int m = lie+1;/对应棋盘的列boolean top = false;/判断上
7、边是否有黑子boolean liveLeft = false;boolean liveRight = false;while(qipann-1m!=-1)&&(qipann-1m=num|qipann-1m=0)if(qipann-1m=0&&k<1)/第一个空白if(qipann-2m!=num)liveLeft = true;break;k+;n-;else if(qipann-1m=num)/黑子top = true;n-;else/第二个空白liveLeft = true;break;if(!top)k = 0;n = hang+1;while(q
8、ipann+1m!=-1)&&(qipann+1m=num|qipann+1m=0)int t = qipann+1m;if(n=hang)count+;n+;continue;if(t=0&&k<1)/第一个空白if(qipann+2m!=num)liveRight = true;break;k+;n+;else if(t=0&&k>0)/第二个空白liveRight = true;break;else/黑子n+;count+;/return jieguo(k=0,count);return jieguo(liveLeft,live
9、Right,count,k,num);/算出黑子左斜方向的棋型数值public int heizuoxie(int hang,int lie,int num)int k = 0;/记录空白处的个数int count = 1;/记录可以形成几连int n = hang+1;/对应棋盘的行int m = lie+1;/对应棋盘的列boolean top = false;/判断上边是否有黑子boolean liveLeft = false;boolean liveRight = false;while(qipann+1m-1!=-1)&&(qipann+1m-1=num|qipann
10、+1m-1=0)if(qipann+1m-1=0&&k<1)/第一个空白if(qipann+2m-2!=num)liveLeft = true;break;k+;n+;m-;else if(qipann+1m-1=num)/黑子top = true;n+;m-;else/第二个空白liveLeft = true;break;if(!top)k = 0;n = hang+1;m = lie+1;while(qipann-1m+1!=-1)&&(qipann-1m+1=num|qipann-1m+1=0)int t = qipann-1m+1;if(n=(ha
11、ng+2)&&m=lie)count+;n-;m+;continue;if(t=0&&k<1)/第一个空白if(qipann-2m+2!=num)liveRight = true;break;k+;n-;m+;else if(t=0&&k>0)/第二个空白liveRight = true;break;else/黑子n-;m+;count+;return jieguo(liveLeft,liveRight,count,k,num);/算出黑子右斜方向的棋型数值public int heiyouxie(int hang,int lie,i
12、nt num)int k = 0;/记录空白处的个数int count = 1;/记录可以形成几连int n = hang+1;/对应棋盘的行int m = lie+1;/对应棋盘的列boolean top = false;/判断上边是否有黑子boolean liveLeft = false;boolean liveRight = false;while(qipann-1m-1!=-1)&&(qipann-1m-1=num|qipann-1m-1=0)if(qipann-1m-1=0&&k<1)/第一个空白if(qipann-2m-2!=num)liveL
13、eft = true;break;k+;n-;m-;else if(qipann-1m-1=num)/黑子top = true;n-;m-;else/第二个空白liveLeft = true;break;if(!top)k = 0;n = hang+1;m = lie+1;while(qipann+1m+1!=-1)&&(qipann+1m+1=num|qipann+1m+1=0)int t = qipann+1m+1;if(n=hang&&m=lie)count+;n+;m+;continue;if(t=0&&k<1)/第一个空白if(q
14、ipann+2m+2!=num)liveRight = true;break;k+;n+;m+;else if(t=0&&k>0)/第二个空白liveRight = true;break;else/黑子n+;m+;count+;return jieguo(liveLeft,liveRight,count,k,num);public int jieguo(boolean left,boolean right,int count,int k,int num)if(count=1)return 0;else if(count=2)if(left&&right)i
15、f(k=0)if(num=2)return 60;elsereturn 50;elseif(num=2)return 40;elsereturn 35;else if(!left&&!right)return 0;elsereturn 10;else if(count=3)if(left&&right)if(k=0)if(num=2)return 950;elsereturn 700;elseif(num=2)return 900;elsereturn 650;else if(!left&&!right)return 0;elsereturn 100;else if(count=4)if(left&&right)if(k=0)if(num=2)return 6000;elsereturn 3500;elseif(num=2)retu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 清洗地面合同范本
- 烟叶生产用工合同范本
- bimco 光租合同范本
- 别墅如何洽谈合同范本
- 庆典布展合同范本
- 自驾活动合同范本
- 多式联运合同(6篇)
- 音乐初步知识点
- 淘宝后台操作流程
- 山东建筑大学《书法创作》2023-2024学年第二学期期末试卷
- 中国神话故事绘本火神祝融
- 五星级酒店前厅管理常用表格
- 《养老护理员》-课件:老年人安全防范及相关知识
- 茶楼棋牌经营管理方案
- 水准测量记录数据自动生成表
- 2024年宜都市高新技术产业投资有限公司招聘笔试参考题库含答案解析
- 2024年英语专业四级考试真题及详细答案
- 初中数学八年级下册 一次函数的概念 全市获奖
- 肺占位性病变查房
- 水平三(五年级)体育《障碍跑-红军长征路》教学设计及教案
- 弹性计算:无处不在的算力
评论
0/150
提交评论