最近做了五子棋,记录下自己完成五子棋的人机对战的思路。

首先,思路是这样的:每当人手动下一颗棋子(黑子)的时候,应当遍历它周围棋子的情况,并赋予周围棋子一定的权值,当在机器要下棋子(白子)守护之前,会遍历整个棋盘的权值情况(棋盘的权值存在一个二维数组中),从中找出权值最大的点坐标,并下子(白子)。

这样的话,问题就集中在两个方面了,一个是:如何遍历黑子周围的棋子情况? 另一个是:如何设定权值?

首先,是设定权值。这个没有固定的设定方案,可以先试着设定,然后,尝试效果后(主要是白子的攻防情况是否合理),再调整。

以下是我的设定方案:

接着,是相对困难的部分,就是如何遍历黑子周围的棋子情况。 从之前权值方案中可以看到,设置权值的一个很重要的目的是为了进行防守,所以应当在连续黑子的两端(下面图中的橙色区域)设置权值,这样就有利于白子填充在连续黑子的两端,从而达到防守的目的,下面这张图可以说明:

中心的黑子:表示当前所下的黑子,周围的棋子表示是之前下的。

红色箭头:表示需要遍历的八个方向,因为中心黑子的坐标(i, j)是已知的,所以很容易得到周围的棋子坐标(i+n, j+m)。

橙色方框:表示连续黑子的末端,可能是空白(表示还没有棋子填充),也可能是白子。

接着是算法思想:

首先,应当先判断敌方棋子(黑子)第一次下的时候(敌方棋子先下),此时,周围八个棋子都是空的,于是应当对周围八个点赋予相同的权值(活一),当遍历整个棋盘后,便在这八个点中随机选择一个(用随机数),填上黑子。

接着,敌方继续下子,如果敌方当前所下棋子与之前的棋子连续,则会构成活二或者眠二(以此类推,会构成活三眠三~~),这时,根据权值表,会赋予周围棋子更大的权值(权值应当是累加的,也就是说,当前权值 += 之前权值),最后遍历后,下白子。

java 五子棋之人机对战思路详解的更多相关文章

  1. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  2. BaseAdapter自定义适配器——思路详解

    BaseAdapter自定义适配器——思路详解 引言: Adapter用来把数据绑定到扩展了AdapterView类的视图组.系统自带了几个原生的Adapter. 由于原生的Adapter视图功能太少 ...

  3. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

  4. Java工程师 基础+实战 完整路线图(详解版)

    Java工程师 基础+实战 完整路线图(详解版)   Java 基础 Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装.继承.多态.此外还有泛型.反射 ...

  5. ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

    简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3. ...

  6. Java中堆内存和栈内存详解2

    Java中堆内存和栈内存详解   Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...

  7. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  8. Java 5 的新标准语法和用法详解集锦

    Java 5 的新标准语法和用法详解集锦 Java 5 的新标准语法和用法详解集锦 (需要在首选项-java-complier-compiler compliance level中设置为java5.0 ...

  9. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

随机推荐

  1. IP地址输入框

    <style> div.IPDiv{background:#ffffff;width:120;font-size:9pt;text-align:center;border:2 ridge ...

  2. ApplicationContext中getBean详解

    在org.springframework.context包中有一个接口叫 applicationContext applicationContext中有一个getBean方法,此方法继承之BeanFa ...

  3. python爬取人民币汇率中间价

    python爬取人民币汇率中间价,从最权威的网站中国外汇交易中心. 首先找到相关网页,解析链接,这中间需要经验和耐心,在此不多说. 以人民币兑美元的汇率为例(CNY/USD),脚本详情如下: wind ...

  4. Vue 2.0学习(一)简介

    简介 Vue是一套用于构建用户界面的渐进式框架.简单小巧( 压缩后仅17KB),Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手,还便于与第三方库或既 ...

  5. java 同步 异步

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 同步 就是  讲究顺序 异步 就是  可以同时进行. 不知道那个家伙起得名字.. 讲究 ...

  6. vijos Warcraft III 守望者的烦恼

    题解 转移方程好写吧 一个一维递推式 然后我们可以构造矩阵优化 嗯,最近学一下递推优化 代码 #include<cstdio> #include<cstring> #inclu ...

  7. 「学习笔记」Min25筛

    「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}​\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK ...

  8. AtcoderGrandContest 005 F. Many Easy Problems

    $ >AtcoderGrandContest \space 005 F.  Many Easy Problems<$ 题目大意 : 有一棵大小为 \(n\) 的树,对于每一个 \(k \i ...

  9. [HNOI2008]玩具装箱TOY --- DP + 斜率优化 / 决策单调性

    [HNOI2008]玩具装箱TOY 题目描述: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京. 他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器 ...

  10. const和define在值定义上的区别

    (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...