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 井字棋机器人算法讨论相关推荐

  1. 通过简单的强化学习实现井字棋(Tic-Tac-Toe)

    一.强化学习简介 强化学习的过程可以理解为Agent与Environment的交互.学习.进步的过程,在井字棋中,可以简单的将其中的一方理解为Agent,另一方为Environment.交互的过程中主 ...

  2. 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战

    来源 | MyEncyclopedia 上一篇我们从原理层面解析了AlphaGo Zero如何改进MCTS算法,通过不断自我对弈,最终实现从零棋力开始训练直至能够打败任何高手.在本篇中,我们在已有的N ...

  3. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  4. python井字棋ai_实现AI下井字棋的alpha-beta剪枝算法(python实现)

    代码参考自中国大学mooc上人工智能与信息社会陈斌老师的算法,我在原来的基础上增加了玩家输入的异常捕获 AlphaBeta剪枝算法是对Minimax方法的优化,能够极大提高搜索树的效率,如果对这个算法 ...

  5. 采用α-β算法实现井字棋游戏

    题目描述 (1)图形化界面. (2)随机选取先手后手. (3)可以人-计算机或计算机-计算机 界面效果 算法 基本思想 Max-Min算法: 采用Max-Min算法进行对抗搜索,Max和Min双方均要 ...

  6. C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  7. [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  8. 『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法代码讲解+资源打包下载】...

    一,什么是TicTacToe(井字棋) 本游戏为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎. ...

  9. java——博弈算法实现井字棋游戏

    通过java语言开发了一个简单的井字棋游戏.主要有6个类,其中有一个是主类(Main.java),一个是抽象类(PiecesMove.java)组成. 下面对各个类简单介绍一下: TicTicToe. ...

最新文章

  1. 基于机器学习的临床决策支持-ANN
  2. JSONSerialization.ReadingOption详解
  3. unity5x --------Music Mixer参数详解
  4. css深入浅出 宽度和高度
  5. win7映射网络驱动器消失了_网络资源共享;共享权限控制
  6. [scala-spark]10. RDD转换操作
  7. 【机器学习算法】XGBoost
  8. 这群理想主义者,在腾讯用10年做到了畅销榜第一
  9. Xamarin Android 所见即所得问题
  10. ThreadLocal用法详解和原理
  11. 课时2.浏览器和服务器(了解)
  12. 交换机实现虚拟局域网
  13. LogBack 打印 ES的DSL日志信息
  14. 服务器千兆网卡接百兆交换机不通_一文搞懂监控工程中百兆交换机和千兆交换机的区别在哪?...
  15. Java G1 GC 垃圾回收深入浅出
  16. python采用函数式编程模式-浅谈Python 函数式编程
  17. Ubuntu18.04安装和卸载teamviewer
  18. 集成谷歌地图不显示的问题
  19. 初识Linux与运维
  20. 最喜欢的一款星光和光晕ps笔刷

热门文章

  1. WEB数据库管理平台kb-dms:团队管理【四】
  2. 由于找不到PBSYS90.dll,无法继续执行代码。重新安装程序可能会解决此问题!——PB安装出现问题
  3. Mysql实现文章查询上一篇和下一篇功能,附sql语句?
  4. linux modprobe自动加载,Linux modprobe自动处理可载入模块命令详解
  5. 闪动的gif怎么制作?三步教你在线合成闪动gif
  6. 【软件工程】实验3:软件详细设计
  7. 第二十六课:行波和驻波
  8. 阅读笔记 | The Soot framework for Java program analysis:a retrospective
  9. springmvc学习笔记二:重定向,拦截器,参数绑定
  10. 人民的名义 | 没想到大结局竟然是这个?一定要看到最后!