Lego MindStorms NXT 井字棋机器人算法讨论
written by flexitime
最近在搞这套Lego的玩具,大家可以看一下照片
(
以下是一些有关这个机械人的录像:
1.最终修正版本,算法现在按正统的方式修改了,聪明了很多
http://www.tudou.com/programs/view/c7Msf-Ol0VE/
2.第一次修正的方案,改进了运行的算法,下棋会快一些。但算法有点问题,所以有点笨~~
http://www.tudou.com/programs/view/R8rrNXcO02o/
3.最初的版本
http://www.tudou.com/programs/view/KK1PEY78u1w/
)
这个玩具其实是Lego公司推出的一套机器人套装玩具,里面有一个32位的电脑(单片机),3个伺服电机,光感,声感,超声波等的传感器,使用这些传感器可以搭建出很多不同类型的机器人。在这里我就不讨论这个井字棋机器人如何搭建了(我对精巧的机械设计很感兴趣,但对机械的理解及运用能力毕竟不在行,这个机械人花了我两周的时间才搞好)
现在我们来讨论一下有关井字棋算法的实现:
在讨论算法之前,我先来介绍一下有关NXT机器人的一些问题,NXT机器人是一个电脑(单片机),Lego公司为这个机器人配套了一种名为NXT-G的语言,这是一种图形语言,用户可以通过鼠标选择一个个节点图标来描述程序,简单易懂,十分适合儿童去学习。但NXT除了支持NXT-G之外还支持汇编及其它一些高级语言,例如我将会用到的NXC(Not Exactly C)。
NXC是一种与C语言十分类似的语言,它的编译器是开源的,这种语言的语法与C语言相差无几,但它有不少的限制,例如不支持函数的递归调用。
井字棋很多人都懂得,规则是双方在一个9个格子的棋盘上轮流下棋,如果某一方首先能在纵、横、斜等方向上连成一线的,就赢得一局,如图所示一样。
现在我们要实现一个人机对奕的程序,按照一般棋类博奕程序的写法,我们首先完成的是‘规则’的函数,这个规则的函数也比较简单,我们可以写出以下的代码:
......
int chess_win [24] ={
1,2,3,
1,5,9,
1,4,7,
2,5,8,
3,5,7,
3,6,9,
4,5,6,
7,8,9
}; //赢棋规则
int check_win_chess(int flag) //输入:棋子的代码,1为人,2为电脑;输出:1为赢, 0为非赢
{
int i, j, result, k;
for (i = 0 ; i < 8; i++)
{
result = 1;
for (j = 0; j < 3; j++)
{
k = chess_win[i * 3 + j];
k = chess_ary[k];
if (k != flag)
{
result = 0;
break;
}
}
if (result == 1) {return result; }
}
return 0;
}
......
我在这里定义了一个全局的数组(NXC的程序一般都不复杂,定义一个全局数组有利于运算速度的提高),这个数组的作用是保存了所有可以赢棋的组合,另外,我当时写这个程序时不清楚NXC支不支持多维的数组,所以我在这里使用的是一个一维的数组,通过一些映射的运算来模拟二维数组。
接着下面编写的那个chess_win函数的作用是用来判断棋局的输赢情况。参数flag是表明传入的是那方的标识(在这里1代表的是人所执的棋子,2代表的是机器所执的棋子)。函数有两个返回值,如果返回是1表是传入标识的这种棋子赢了,如果是0则表示没有赢。
未完,待续....
Lego MindStorms NXT 井字棋机器人算法讨论相关推荐
- 通过简单的强化学习实现井字棋(Tic-Tac-Toe)
一.强化学习简介 强化学习的过程可以理解为Agent与Environment的交互.学习.进步的过程,在井字棋中,可以简单的将其中的一方理解为Agent,另一方为Environment.交互的过程中主 ...
- 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战
来源 | MyEncyclopedia 上一篇我们从原理层面解析了AlphaGo Zero如何改进MCTS算法,通过不断自我对弈,最终实现从零棋力开始训练直至能够打败任何高手.在本篇中,我们在已有的N ...
- Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)
前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...
- python井字棋ai_实现AI下井字棋的alpha-beta剪枝算法(python实现)
代码参考自中国大学mooc上人工智能与信息社会陈斌老师的算法,我在原来的基础上增加了玩家输入的异常捕获 AlphaBeta剪枝算法是对Minimax方法的优化,能够极大提高搜索树的效率,如果对这个算法 ...
- 采用α-β算法实现井字棋游戏
题目描述 (1)图形化界面. (2)随机选取先手后手. (3)可以人-计算机或计算机-计算机 界面效果 算法 基本思想 Max-Min算法: 采用Max-Min算法进行对抗搜索,Max和Min双方均要 ...
- C++实现的基于α-β剪枝算法的井字棋游戏
"井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...
- [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏
"井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...
- 『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法代码讲解+资源打包下载】...
一,什么是TicTacToe(井字棋) 本游戏为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎. ...
- java——博弈算法实现井字棋游戏
通过java语言开发了一个简单的井字棋游戏.主要有6个类,其中有一个是主类(Main.java),一个是抽象类(PiecesMove.java)组成. 下面对各个类简单介绍一下: TicTicToe. ...
最新文章
- 基于机器学习的临床决策支持-ANN
- JSONSerialization.ReadingOption详解
- unity5x --------Music Mixer参数详解
- css深入浅出 宽度和高度
- win7映射网络驱动器消失了_网络资源共享;共享权限控制
- [scala-spark]10. RDD转换操作
- 【机器学习算法】XGBoost
- 这群理想主义者,在腾讯用10年做到了畅销榜第一
- Xamarin Android 所见即所得问题
- ThreadLocal用法详解和原理
- 课时2.浏览器和服务器(了解)
- 交换机实现虚拟局域网
- LogBack 打印 ES的DSL日志信息
- 服务器千兆网卡接百兆交换机不通_一文搞懂监控工程中百兆交换机和千兆交换机的区别在哪?...
- Java G1 GC 垃圾回收深入浅出
- python采用函数式编程模式-浅谈Python 函数式编程
- Ubuntu18.04安装和卸载teamviewer
- 集成谷歌地图不显示的问题
- 初识Linux与运维
- 最喜欢的一款星光和光晕ps笔刷
热门文章
- WEB数据库管理平台kb-dms:团队管理【四】
- 由于找不到PBSYS90.dll,无法继续执行代码。重新安装程序可能会解决此问题!——PB安装出现问题
- Mysql实现文章查询上一篇和下一篇功能,附sql语句?
- linux modprobe自动加载,Linux modprobe自动处理可载入模块命令详解
- 闪动的gif怎么制作?三步教你在线合成闪动gif
- 【软件工程】实验3:软件详细设计
- 第二十六课:行波和驻波
- 阅读笔记 | The Soot framework for Java program analysis:a retrospective
- springmvc学习笔记二:重定向,拦截器,参数绑定
- 人民的名义 | 没想到大结局竟然是这个?一定要看到最后!