前面介绍了监听机制,窗体使用,重绘机制,画笔使用,对象传递等等概念,接下来我们来谈一点算法的东西,相信大家都玩过五子棋这个游戏吧,在不包括先手禁手等复杂规则之下,我们只考虑最简单的15*15格子的棋盘,规则是只要没有落子的地方均可下子,某一方连成五个棋子则获胜,游戏结束。

权值算法

权值法在五子棋游戏中是一种很基础的算法,它的思想包括以下几个部分:

  • 评价权值

  • 计算全盘权值

  • 寻找有利点

  • 判断输赢
    1.评价权值
    既然我们要选择下棋子,那么我们就需要对利弊情况进行一个数字化的分析,假设我们当前有两种情况,己方有三子连线和四子连线,那么肯定优先去下四子连线的部分,让他成为五子,我们不妨把四子的情况用权值1000来代替,把三子的情况用500来代替,通过判断权值的大小我们可以决定优先下哪个位置。那么我们可以统计一下棋盘上的自己摆放总共有多少种情况(我们把两方都没有被围堵的棋叫“活”,把一方被围堵的棋叫“眠”),那么棋局总共有

  • 活1、眠1

  • 活2、眠2

  • 活3、眠3

  • 活4、眠4
    以上这几种情况大概概括了所有棋局阵列的情况,我们可以尝试着给这几种情况划分权值如下:

     ("010", 30);//活1("020", 60);//活2("030", 700);//活3("040", 10000);//活4("01-1", 15);//眠1("02-1", 40);//眠2("03-1",    500);//眠3("04-1", 10000);//眠4

这种权值划分方式只是我小时牛刀的一种而已,具体的数值该如何分配尚需要具体的商榷,大家可以在实现大体功能之后仔细斟酌和修改,此处不做过多讨论。
2.权值计算
在前面我们已经分配好了各种情况的权值,接下来要做的是根据上述规则计算棋盘上所有点的权值大小,统计棋盘上各点的情况并把情况转化为数字存储起来。我们可以用一个for循环来完成单个点的权值计算过程。假设当前点下标是
(i,j)。我们要对该点的八个方向进行检索,可以写八个函数分别对八个方向进行判断

在这里我选择写两个数组,然后通过数组实现对八个方向的遍历,先判断遍历方向的第一个棋子是何种情况,然后再看他的后面有没有与之相同的棋子,直到最终检索到空白位置或者与之颜色相反的棋子,那么就终止,然后统计在这个方向上的棋子排布,将其转化为数字权值;最后将八个方向的权值累加起来放在权值数组中,代表当前位置的权值

int X[] = {1,1,0,-1,-1,-1,0,1};
int Y[] = {0,1,1,1,0,-1,-1,-1};
for(int i=0;i<X.length;i++){//ans数组存放的是当前棋盘的落子情况,1代表是己方的黑子,-1代表对方的白子int tmp_x = x + X[i];int tmp_y = y + Y[i];if(ans[tmp_x][tmp_y]==1) {  //如果这个坐标为1,说明当前方向第一子为己方int temp =  -2;//一直循环知道后面的子与第一子颜色不同为止while(ans[tmp_x][tmp_y]==1) {num_positive++;tmp_x+=X[i];tmp_y+=Y[i];if((tmp_x<15&&tmp_x>=0)&&(tmp_y>=0&&tmp_y<15)) {}//判断边界问题,不                                            能超边界else {temp = -1;break;}}/*-2是初始化的值,如果temp没被改变过,说明没有超边界,就把最终结束的ans赋给temp*/if(temp==-2) {temp=ans[tmp_x][tmp_y];}if(temp==-1) {//根据hashmap给最后的tmp_sum加权值Integer value=map.get("0"+num_positive+"-1");if(value != null) {tmp_sum+=value;}}else {Integer value=map.get("0"+num_positive+"0");if(value != null) {tmp_sum+=value;}}}//这里讨论的是另一种情况,即遇上了对方白子的情况else if(ans[tmp_x][tmp_y]==-1){int temp=-2;while(ans[tmp_x][tmp_y]==-1) {num_negative++;tmp_x+=X[i];tmp_y+=Y[i];if((tmp_x<15&&tmp_x>=0)&&(tmp_y>=0&&tmp_y<15)) {}else {temp=1;break;}}if(temp==-2) {temp=ans[tmp_x][tmp_y];}//如果遇上了黑子而停止,执行以下操作if(temp==1) {Integer value=map.get("0-"+num_negative+"1");if(value!=null) {tmp_sum+=value;}}//如果是遇上了空白棋盘,执行下面操作else if(temp==0){Integer value=map.get("0-"+num_negative+"0");if(value != null) {tmp_sum +=value;}}}}
}

执行完上面这一段代码之后,我们就能够计算出(i,j)位置的权值大小了,接下来我们要计算出所有棋盘上空白位置的权值,用双重for循环即可,代码如下:

public void fill() {int max=-1;x0=-1;y0=-1;//双重for循环,进行整个棋盘的遍历for(int i=0;i<BOARD_SIZE;i++) {for(int j=0;j<BOARD_SIZE;j++) {if(ans[i][j]==0) {   //为0代表棋盘上没有棋子,可以计算其权值weight[i][j]=search(i,j);      //填充这个位置上的权值if(max<weight[i][j]) {       //选取权值中最大的一个点max=weight[i][j];x0=i;y0=j;}}}}}

选取好了权值最大点的下标之后,就可以将参数传递给处理函数进行调用处理了,在下完权值最大位置的棋子之后,我们可以判断输赢,如果某一方赢得比赛,则弹出一个新窗口游戏。
当然我们还需要做一个窗体面板,做好画棋子的机制,做好重绘机制,判断输赢机制等等
在这里我再可以讲一下悔棋的思路,因为我在重绘的时候是把所有的棋子存放在一个数组中,然后对这个数组进行遍历重绘,如果我要悔棋,只需要让数组的长度减一即可

if("悔棋".equals(zhiling)) {ms.set_ans(chess_arr[ms.get_index()-1].get_x(), chess_arr[ms.get_index()-1].get_y(), 0); //设置悔棋位置的棋子为0ms.set_index(-1);  //下标-1this.paint(gf);       //悔棋之后重绘一下ms.reverse_flag();    //将下棋的权利进行翻转}

讲到这里,大概就是五子棋全职算法的基本实现流程了,大致思路是对棋盘上的各种局势的一种主观性判断,将主观危险的判断用数字来代替从而实现优先选择的机制。
有疑问联系1124397151@qq.com


人机对战五子棋(权值法)相关推荐

  1. 权值法实现五子棋AI

    权值法实现五子棋AI 前言 五子棋AI,能根据棋盘局势判断棋子应落在何处获胜,主要有权值法和博弈树法两种实现方案.本篇博客将就权值法展开介绍,笔者水平有限,望各路大神有所建议评论提出,谢谢. 权值法 ...

  2. 简易五子棋AI权值法(2)

    简易五子棋&AI权值法(2) 权值法 权值法实现AI,就是给每个无子的地方给一个权值,然后选出权值最大的让电脑落子. 具体到每个位置,权值根据周围一定范围的落子情况给出. 就我的想法来说,我觉 ...

  3. Java五子棋Ai-权值法

    Java五子棋Ai-权值法 一. 什么是权值法? 二.实现权值法Ai会面临的问题 1.如何表达棋盘上未下处的横竖斜的棋子情况?(类似01120) 2.如何将未下处的横竖斜情况和权值联系起来?(Hash ...

  4. java五子棋ai_Java五子棋Ai-权值法

    一. 什么是权值法? 权值法顾名思义,即是权衡不同的情况并赋予不同的数值,这个数值即代表着这个情况的重要性. 例如,当我们进行五子棋对战的时候,我们每下一个棋子就要判断这个点横竖斜的情况,对于不同的情 ...

  5. java swing人机对战五子棋(含背景音乐)

    一.项目简介 本项目是一套基于java swing的人机对战五子棋系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者. 包含:项目源码.数据库脚本等,该项目附带全部源码可 ...

  6. 介绍一款Android小游戏--交互式人机对战五子棋

    学习Android系统开发之余,编写了一个小游戏--交互式人机对战五子棋,自娱自乐.之所以称之为交互式人机对战五子棋,一是因为在进入人机对战模式这前,你可以任意设置好开局,同时,在对战过程中,你可以看 ...

  7. 五子棋java程序=权值法_五子棋(人机对弈)——Java权值法五子棋博弈

    五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...

  8. 五子棋(人机对弈)——Java权值法五子棋博弈

    五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...

  9. JAVA权值法实现五子棋_java游戏之 五子棋实现人人对战!

    五子棋,是我们大家都喜爱玩的智力棋类游戏,在学完了界面以及绘图之后便一直想做一个,如今终于如愿以偿,虽然还没有更好的美化该游戏,但是大局已定.高兴! 五子棋我们需要很多常量,比如说棋子的大小,棋盘格子 ...

  10. Java-基于GUI编程的人机对战五子棋

    1.人员分工 组员 职务 负责模块 刘新臻 组长 AI算法设计.程序逻辑设计 陈钦毅 组员 游戏画面框架,监听器.工具类 文才学 组员 棋子设计类.菜单功能 2.前期调查 根据调研我们需要以下功能 功 ...

最新文章

  1. struts2文件下载出现Can not find a java.io.InputStream with the name的错误
  2. 编译器扩展SEH(1)
  3. qt android程序联网死机,Qt for Android(九) ——APP 崩溃卡死拉起保活实战
  4. CentOS 5.4 制作 Python 2.6 RPM 包的方法
  5. android 倒计时handle,android -handler 实现倒计时
  6. java消息推送怎么实现_PHP实现的消息实时推送功能
  7. 数字孪生:迈向未来,智慧城市大脑运营方案及整体建设解决方针
  8. Vista 自动激活工具(最新 最权威 所有版本 可升级)
  9. 乱世王者服务器维护,乱世王者微信541区风平浪静开服时间表_乱世王者新区开服预告_第一手游网手游开服表...
  10. 在Android上模拟登录广工正方教务系统查询成绩
  11. Hadoop学习11:NameNode和Secondary NameNode的工作机制
  12. python tokenize()_Python tokenize-rt包_程序模块 - PyPI - Python中文网
  13. 网络爬虫排除协议robots.txt介绍及写法详解.
  14. c语言学生成绩系统综合实验,C语言学生管理系统_综合实验报告.docx
  15. 全角和半角的区别及使用方式
  16. matlab小游戏程序代码,Matlab有趣代码
  17. Unity Awake OnEnable Start 和Update 先后顺序探究
  18. mysql的锁机制(读锁,写锁,表锁,行锁,悲观锁,乐观锁,间隙锁)
  19. for(int a:b)在C++中的作用
  20. 2021年最受欢迎的10款开源DevOps工具

热门文章

  1. 3 非齐次线性微分方程与无量纲化
  2. SNN综述(1):深度脉冲神经网络
  3. 商城购物APP——YiGo
  4. 店盈通:拼多多推广技巧步骤
  5. 阿里云服务器使用docker安装mysql
  6. USYD悉尼大学DATA1002 详细作业解析Module4
  7. ckeditor富文本解决文段首行缩进问题
  8. [Chatter] 架构设计是做甚么
  9. 时序例外_Timing Exceptions_Min/Max Delays(set_max_delay/set_min_delay)
  10. 哒螨灵使用注意事项_哒螨灵的基础知识