找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 25520|回复: 32

自制井字棋机器人组装进度贴(4.5更新)

[复制链接]
头像被屏蔽
发表于 2009-3-31 10:34:08 | 显示全部楼层 |阅读模式
本帖最后由 flexitime 于 2009-4-7 11:42 编辑

其实很久之前看过有人完成过类似的机器人,当时自己也想搞一个,不过一来时间不多,二来发现有些地方比较难以实现,再者9797+9648的零件看起来也不足以完成这个机器人,所以就放一边没有搞了,不过最近在网上看到有祖国版的仿乐高的TECH系列的积木可买,所以就进了一个回来试试。
祖国版的,唉~~~,质量就别提有多难过,不过用模型刀具去修修还是可以用的,当然最缺的材料可以在祖国版中找到一些。以后有机会将它与Lego正版货的对比照放上来给大家参详参详。

今天决定开个贴来记录下组装的过程,也方便大家交流,现在开始记录:

这是之前的记录(时间大约是 3 月 22 到 3 月27之间)
想法:
我是这样设计的
人与机器对手棋,当人完成一步后,就按一下NXT的Button或者触感,然后就到机器走棋,机器会把机械臂(臂中有一个光感及一个放棋子的机构)移到棋盘上,然后检测一次整个棋盘的状态,计算决定下一步棋子该放到那里,然后再移动机械臂到合适的位置,接着把棋子放上去。
现在完成了机械臂放棋子的机构,不过移动这个机械臂的机构没有搞好,按原来的设计,是想用皮带来拖动,用钢丝作导轨的,但由于都不是标准件,比较难搞,所以现在改成用齿条来传动(正在找齿条,其实最早的方案就是用齿条的,不过9648+9797中的可连续齿条只有两个,十分不足,所以才改)。
----------
完成后的视频如下
http://www.tudou.com/v/KK1PEY78u1w

听了老糖的意见后,将算法修改了一下,以下是视频
http://www.tudou.com/programs/view/R8rrNXcO02o/

忍不住,打乱一下顺序,发一张完成图出来:
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
头像被屏蔽
 楼主| 发表于 2009-3-31 10:47:56 | 显示全部楼层
补回:
3月28
昨天在网上买了一个9602,组了一下,发现祖国版的质量实在不怎么样。但学习了一下乐高是如何设计转向机构的,我原来的方法与乐高的不一样,不过可能没有他们设计的好。而且9602中有一个齿条,这个可以用来补充一下。后来上网,才查到原来工程叉车有更多的齿条(多谢坛中的兄弟),所以就去订了个祖国版的机械工程叉车(9190),现在在等货物送来。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-3-31 10:54:25 | 显示全部楼层
补回
3月29
很晚了,把东西收拾好,用Delphi写了一个井字棋算法的程序,用Delphi的原因是我十分熟悉,另外我是想将算法想好了,到时改用NXC也是十分容易的。
我是想使用一个函数,这个函数的作用是计算出应下棋子的位置,并判断是否输赢,程序如下(我只保留了关键的算法部份:

var
  ChessAry : array [0..8] of integer;

ChessWin : array [0..23] of integer = (
1,2,3,
1,5,9,
1,4,7,
2,5,8,
3,5,7,
3,6,9,
4,5,6,
7,8,9);

function CheckWinChess(flag : integer) : boolean;
var
  i, j : integer;
begin
  for i := 0 to 7 do
    begin
      result := true;
      for j := 0 to 2 do
        begin
          if (ChessAry [ ChessWin[i* 3 + j] ] <> flag) then
            begin
              result := false;
              break;
            end;
        end;
      if result then exit;
    end;
end;


function doChess : integer; // 返回100表示计算机赢了, 返回 101 表示计算机输了 ,返回102表示平局, 返回 其它数字 表示走那一步
var
  i, j, k : integer;
  f : boolean;
begin
  f := CheckWinChess(2);
  if f then
    begin
      result := 100;
      exit;
    end;

  f := CheckWinChess(1);
  if f then
    begin
      result := 101;
      exit;
    end;

// 先判断那一步是必须走的,走了这一步就必赢的。
  for i := 0 to 8 do
    begin
      if ChessAry[i] = 0 then
        begin
          ChessAry[i] := 2;
          f := CheckWinChess(2);
          ChessAry[i] := 0;
        end;
      if f then
        begin
          result := i;
          exit;
        end;
    end;

// 先判断那一步是必须走的,不走就要输
  for i := 0 to 8 do
    begin
      if ChessAry[i] = 0 then
        begin
          ChessAry[i] := 1;
          f := CheckWinChess(1);
          ChessAry[i] := 0;
        end;
      if f then
        begin
          result := i;
          exit;
        end;
    end;

// 随便走
  result := 102;  //默认是平局

  if ChessAry[4] = 0 then
    begin
      result := 4;
      exit;
    end;
   
  for i := 0 to 8 do
    begin
      if ChessAry[i] = 0 then
        begin
          result := i;
          exit;
        end;
    end;

end;
------------------------
还有一个初始化数组的部份,就是将ChessWin 数组中的值都减去一(C及Delphi都是以0为开头的)
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-3-31 11:00:24 | 显示全部楼层
本来下棋的算法,很多都是以递归的方式,实现有限次数的广度优先搜索算法的,但一来我不清楚NXC支不支持递归,二来,井字棋实在是比较简单,所以我采用棋谱查表的方法,具体就是将所以会赢得棋局的状态都列举出来,然后再查表(ChessWin数组)。
另一方面,我不清楚NXC支不支持多维数组,所以我在Delphi的实现算法中只使用一个一维数组去模拟二维来用。
最后,为了程序能简单,我使用了两个全局变量。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-3-31 11:21:35 | 显示全部楼层
3月30
今天修改了原来下棋机构的设计,改成更轻便,更结实一些,现在再加上另外一个驱动电机上去,接着着手构造另外的一个驱动小车,
照片在手机上,传不上来,等下找个蓝牙再传。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2009-3-31 13:13:05 | 显示全部楼层
很不错,如果有更多你这样分享的玩家,中国就有希望了。
我看我是不是能帮你把这个帖子控制好地方,让你全部发完呢
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-4-1 22:50:18 | 显示全部楼层
先贴几个图出来

<br>

<br>

<br>

<br>

<br>
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-4-1 22:51:26 | 显示全部楼层
晕,论雲不支持 1024的图片~~~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2009-4-2 11:40:34 | 显示全部楼层
图片是你外连的,所以无法缩放,东西很不错,给你加精华了
我原来看到magic兄的视频系统,楼主可以考虑一下,这样可以少很多传感器
缺点就是需要pc配合
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-4-2 13:11:01 | 显示全部楼层
本帖最后由 flexitime 于 2009-4-2 14:45 编辑

我只用一个传感器(光感),另外Magic小兄弟的那个视频我是没有看过,也看不到,但图我是看过类似的,这种东西其实是通过PC采集棋盘的图像进行分析的。我在这里只有NXT本体就算了,当然用 PC 的话,功能会更强。
另外,上面讲的下棋机构是有问题的,不然也不会叫第一版了,因为采用的是推出的动作,在这种动作下棋子会有一个水平的移动惯性,导致当其落到棋盘时可能会发生倒转,当然我们采用加重棋子,改变棋盘的材质可以改善一些这种情况,但毕竟也只是改善,效果其实并不理想。所以的方案是改变了的。等下再上图。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-4-3 11:31:15 | 显示全部楼层
更改一下放棋的机构,采用两个轮子,直放式下棋
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2009-4-3 11:41:40 | 显示全部楼层
拍段视频来看看吧,哈哈,那才过瘾啊!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-4-3 11:55:45 | 显示全部楼层
还没有搞完,正在不断完善中,等搞好了,我肯定会拍的
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-4-4 17:56:28 | 显示全部楼层
差不多搞好我的井字棋机器人了,联机测试过一下,各种动作还算正常,不过程序还没写
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2009-4-5 02:23:40 | 显示全部楼层
哇咔咔,终于搞好了,虽然还有一点点精度问题,但基本上能做到人机对战了!明天有空就上图。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-22 07:13 , Processed in 0.167904 second(s), 21 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表