matlab tic tac toe,详解Tic-Tac-Toe人工智能实现
井字棋棋盘
Tic-Tac-Toe又称井字棋,即在3X3的棋盘上,双方轮流落子,先将3枚棋子连成一线的一方获得胜利。
Tic-Tac-Toe变化简单,只有765个可能局面,26830个棋局,因此常成为博弈论和游戏树搜寻的教学例子,同时也是人工智能的一道好题目。
关于棋盘:
井字棋棋盘坐标版
整个棋盘可以连接出8条线。tic-tac-toe 井字棋 胜利方式(如右图)——>
在中心的位置(2,2)有四条线穿过。
在所有棱位(1,2),(2,1),(2,3),(3,2),均有两条线穿过。
在所有角位(1,1),(1,3),(3,1),(3,3),均有三条线。
如何实现人工智能:
在下棋过程中,任何一方无非处于四种状态:
开局落子
第二步棋(先角原则)
攻
守
垃圾时间
想要实现人工智能,让AI和人正常对弈,必须让AI理解这5种状态。
开局落子:
井字棋 AI先手[/caption]
开局时,分为两种状况,一是AI先手,二是AI后手。AI先手时,毫无疑问,让AI落子在(2,2)位置(以X表示AI)。如图:
而当AI后手时,玩家可能落子情况有分为三种:
中心位置
棱位
角位
1、玩家落子在中心位置:
图1[/caption]
此时,AI需要落子在角位。原因在于,如果落子在棱位,将出现如下必输的情形,示例如下,AI此时落子在(1,2)位置:玩家只需要在(3,1)或(3,3)位置落子,如图在(3,1),下一步则必须落子在(1,3),对手跟进落子在(1,1),
——则AI大势已去!
2、棱位 3、角位
这两种情形,AI指需要落子在(2,2)位置,便可保无虞,甚至反守为攻。
第二步棋(先角原则):
由上可知,当中心被玩家占据,需要避免上边提到的“必输的情形”跟进落子在角上,而非棱上。
而如果,自己占据中心,玩家落子在棱上,根据“必输情形”,此时也应该落在角上,而且如上图图1,应该落子在玩家棋子对面的角位上,此时“必输情形”将属于玩家。
攻:
任何己方两枚棋子连接在一起,且连线有空位时,落子在空位。
守:
任何玩家两枚棋子连接在一起,且连线有空位时,落子在空位。
垃圾时间:
由于棋盘大小限制,下棋过程中,很容易陷入双方均无法获胜的情况,此时,只需要找个空位随便落子即可。
特殊情况:
在以以上方式实现AI时,出现了一种比较特殊情况。即玩家先手,落子在角位以(1,1)为例,AI根据“开局落子”的原则3,落子在(2,2)。而玩家在第一步棋子位置(1,1)的对角(3,3)位置落子,
井字棋 特殊情况[/caption]
依据“角先原则”,AI将落子在(1,3)或(3,1),对方将在(3,1)或(1,3)封堵AI,此时AI便已输了。
所以,唯有此种情况不能执行“角先原则”。
代码实现:
其中,以二维数组t[3][3]表示棋盘,-1表示AI棋子X,1表示玩家棋子O,
dropPiece(Position p)方法表示落子,Position(int f ,int x,int y)表示棋盘位置,x,y表示坐标值,f取值范围为(-1或1)表示AI或者玩家。下面是AI类主要代码:
public void start(){
if(attrack()){//实现攻
}else if(defend()){//实现守
}else if(center()){//实现开局落子
}else{
planB();//实现特殊情况、先角原则及垃圾时间
}
}//以上方法是AI运行开始的方法
public boolean attrack(){
return twoPieces(-1);
}//攻,任何己方两枚棋子连接在一起,且连线有空位时,落子在空位。
public boolean defend(){
return twoPieces(1);
}//守,任何对方两枚棋子连接在一起,且连线有空位时,落子在空位。
private boolean twoPieces(int f) {
for(int i=0;i<=t.length-1;i++){
if(t[i][0]==t[i][1]&&t[i][0]==f&&t[i][2]==0){
b.dropPiece(new PieceLocation(-1,i,2));return true;
}else if(t[i][0]==t[i][2]&&t[i][0]==f&&t[i][1]==0){
b.dropPiece(new PieceLocation(-1,i,1));return true;
}else if (t[i][1]==t[i][2]&&t[i][1]==f&&t[i][0]==0){
b.dropPiece(new PieceLocation(-1,i,0));return true;
}else if(t[0][i]==t[1][i]&&t[0][i]==f&&t[2][i]==0){
b.dropPiece(new PieceLocation(-1,2,i));return true;
}else if (t[0][i]==t[2][i]&&t[0][i]==f&&t[1][i]==0){
b.dropPiece(new PieceLocation(-1,1,i));return true;
}else if(t[1][i]==t[2][i]&&t[1][i]==f&&t[0][i]==0){
b.dropPiece(new PieceLocation(-1,0,i));return true;
}
}
if (t[0][0]==t[1][1]&&t[0][0]==f&&t[2][2]==0){
b.dropPiece(new PieceLocation(-1,2,2));return true;
}else if(t[1][1]==t[2][2]&&t[1][1]==f&&t[0][0]==0){
b.dropPiece(new PieceLocation(-1,0,0));return true;
}else if(t[0][2]==t[1][1]&&t[0][2]==f&&t[2][0]==0){
b.dropPiece(new PieceLocation(-1,2,0));return true;
}else if (t[1][1]==t[2][0]&&t[1][1]==f&&t[0][2]==0){
b.dropPiece(new PieceLocation(-1,0,2));return true;
}else{
return false;
}
}//包含任何己方两枚棋子连接在一起,且连线有空位的情况
//(横向、纵向和斜着的方向)
public boolean center(){
if(t[1][1]==0){
b.dropPiece(new PieceLocation(-1,1,1));return true;
}else{
return false;
}
}
public void planB(){
if(t[0][0]==t[2][2]&&t[0][0]==1||t[0][2]==t[2][0]&&t[0][2]==1){
if(t[0][2]==0){
b.dropPiece(new PieceLocation(-1,0,2));
}else{
b.dropPiece(new PieceLocation(-1,0,0));
}//特殊情况实现代码
}else if((t[0][1]==1||t[1][2]==1)&&t[2][0]==0){
b.dropPiece(new PieceLocation(-1,2,0));
}else if((t[1][0]==1||t[2][1]==1)&&t[0][2]==0){
b.dropPiece(new PieceLocation(-1,0,2));
//以上四行为先角原则的实现 以下为垃圾时间代码实现,即从座至右,
//从上到下,扫描整个棋盘,然后寻找空位,落子。
}else if(t[0][0]==0){
b.dropPiece(new PieceLocation(-1,0,0));
}else if (t[0][2]==0){
b.dropPiece(new PieceLocation(-1,0,2));
}else if(t[2][0]==0){
b.dropPiece(new PieceLocation(-1,2,0));
}else if (t[2][2]==0){
b.dropPiece(new PieceLocation(-1,2,2));
}else if(t[0][1]==0){
b.dropPiece(new PieceLocation(-1,0,1));
}else if(t[1][0]==0){
b.dropPiece(new PieceLocation(-1,1,0));
}else if(t[1][2]==0){
b.dropPiece(new PieceLocation(-1,1,2));
}else
b.dropPiece(new PieceLocation(-1,2,1));
}
}
The Original Link: http://baham.github.io/08_02_328.html
If you want to reprint it, please do under the CC BY-NC-SA 4.0
matlab tic tac toe,详解Tic-Tac-Toe人工智能实现相关推荐
- Matlab人脸检测算法详解
这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...
- matlab中sinks,MATLAB Simulink模块库详解(二)Sinks篇
MATLAB Simulink模块库详解(二)Sinks篇 Simulink模块库概述 1.Sources模块库,为仿真提供各种信号源 2.Sinks模块库,为仿真提供输出设备元件 3.Continu ...
- Matlab中 pdist 函数详解
学习笔记,仅供参考,有错必纠 转载自:Matlab中 pdist 函数详解(各种距离的生成); pdist Pairwise distance between pairs of objects. Sy ...
- matlab melbankm,Matlab v_melbankm函数参数详解(英文附例)
Matlab v_melbankm函数参数详解(英文附例) 笔者使用的是R2019的matlab,下载了voicebox安装至matlab路径下即可使用.下载voicebox请参看此博客 需要注意的是 ...
- Matlab mfcc函数参数详解(英文附例)
Matlab mfcc函数参数详解 其实可以直接打开源代码看哈. %MFCC Extract the mfcc, log-energy, delta, and delta-delta of audio ...
- matlab中xcorr函数详解
Matlab中xcorr函数详解 引言 在matlab中查找相关函数时,找到了xcov函数和xcorr函数,仔细看了帮助文档,发现虽然计算公式不一样,但是两个函数用法相同,计算出的值也相同,于是在翻了 ...
- 【MATLAB图像处理实用案例详解】目录
未来一个月的任务主要是GAN生成对抗网络理论部分+代码实战和MATLAB图像处理实用案例详解. 做生成对抗网络主要是因为我的研究方向涉及到这个部分,因此将其作为主要研究内容,但由于研究方向的私密性问题 ...
- 基于MobileNet的人脸表情识别系统(MATLAB GUI版+原理详解)
摘要:本篇博客介绍了基于MobileNet的人脸表情识别系统,支持图片识别.视频识别.摄像头识别等多种形式,通过GUI界面实现表情识别可视化展示.首先介绍了表情识别任务的背景与意义,总结近年来利用深度 ...
- Matlab v_melcepst函数参数详解(英文附例)
Matlab v_melcepst函数参数详解(英文附例) 笔者使用的是R2019的matlab,下载了voicebox安装至matlab路径下即可使用.下载voicebox请参看此博客 需要注意的是 ...
- Matlab S-Function函数入门详解
Matlab S-Function函数入门详解 Part I: 所谓s函数是system Function的简称, 用它来写自己的simulink模块. s函数可以用matlab.C.C++.Fort ...
最新文章
- 最新综述 | 基于深度学习的立体视觉深度估计
- php 插入2个数组,用PHP将2个数组插入mysql
- 二叉搜索树简介和部分题目
- mysql 5.x数据库安装_Ubuntu 12.04 mysql 源码安装--mysql.5.5.x
- 树莓派wiringPi库详解
- mysql中查询触发器的语句
- 如何在ADF中将参数传递给ActionListener
- 纯CSS实现锚点跳转位置上下偏移的办法
- html5发布原文,HTML5 第二份草案发布
- SpringBoot Cache 深入
- 程序员要学点儿理财知识,而不仅仅是代码技巧
- btsync 分享资源
- Java实现的中间库
- CRM客户管理系统源码PHP开发搭建
- Pikachu-敏感信息泄露
- ESD 静电标准分类
- python3安装库报错ERROR: Exception: Traceback (most recent call last): File “A:\ProgramData\Anacon
- MATLAB toc使用
- CSS 各类选择器 第一节
- MySQL 03、深入浅出索引
热门文章
- 大智能时代,人工智能的研究热点是什么?
- 比价寄快递CPS小程序开发
- javascript 快速获取图片实际大小的宽高
- 手机通讯录被删除后怎么恢复
- 微信开发常用技巧(3)-微信ios返回为静态返回,防止微信做缓存
- Ubuntu16.04编译android6.0.1源码记录
- Python 进阶视频课 - 10. LSMC 美式百慕大期权定价
- 2014科技十大名词——如果之前你不知道,证明你是行外人,如果你只是听说,证明你只是是爱好者
- 互联网日报 | 4月1日 星期四 | 华为2020年收入8914亿元;滴滴拿下消费金融牌照;HM已在中国关闭约20家门店...
- 如何实现复制微信图文到Word文档