让我们玩Meta井字游戏吧!


38

让我们玩Meta井字游戏!

这是Meta tic-tac-toe 赛。井字游戏的规则如下:

  1. 井字游戏的所有常规规则均适用。

  2. 安排了九个板以组成一个主板。像这样:

    0|1|2 || 0|1|2 || 0|1|2 
    ----- || ----- || ----- 
    3|4|5 || 3|4|5 || 3|4|5 
    ----- || ----- || ----- 
    6|7|8 || 6|7|8 || 6|7|8 
    ========================
    0|1|2 || 0|1|2 || 0|1|2 
    ----- || ----- || ----- 
    3|4|5 || 3|4|5 || 3|4|5 
    ----- || ----- || ----- 
    6|7|8 || 6|7|8 || 6|7|8 
    ========================
    0|1|2 || 0|1|2 || 0|1|2 
    ----- || ----- || ----- 
    3|4|5 || 3|4|5 || 3|4|5 
    ----- || ----- || ----- 
    6|7|8 || 6|7|8 || 6|7|8 
    

    板0指的是左上方的板,板1指的是顶部中板...像这样

    0|1|2
    -----
    3|4|5
    -----
    6|7|8
    

    如果我说的是第3块板,即第4块,则表示该板的中间砖位于左中。

  3. 您只能进入较小的木板之一。

  4. 如果您赢得了较小的棋盘之一,则整个棋盘都将计为您的

  5. 如果其中一个木板在任何一个机器人赢得胜利之前就已被填满,则将其视为nobody牌。

  6. 谁赢了主板就赢了!

但是,有一个重要的转折。比方说,我在走板7,瓷砖2.上轮到你来,你可以在板2.去然后让我们说你在板2去,瓷砖5.现在就轮到我了,我也只能在板5去。假设1号板已满。(没有更多的可用空间,或者我们其中一个已经赢得了第1局)现在,如果我进入第5局,图块1,则可以进入任何您想要的局。

这些规则可以视为:

  1. 您必须在与先前玩家所玩位置相对应的棋盘上进行游戏。
    • 如果X在第2局比赛,则为5。O必须参加第5局比赛
  2. 如果目标板已满(平局)或已经获胜,则下一步操作不受限制。
  3. 即使采取了不受限制的举动,也可能不会有胜者的局参与其中。

如果这有点令人困惑,您可以在此处在线尝试(请确保从“第一张图块获胜”切换为“连续3张图块”)

现在,这是挑战的规则。

  1. 您必须编写一个玩此游戏的机器人。

  2. Bot 1是Xs,它先走。将使用以下命令行参数来调用它(括号中没有内容):

    X         (whose turn)
    --------- (board 0)
    --------- (board 1)
    --------- (board 2)
    --------- (board 3)
    --------- (board 4)
    --------- (board 5)
    --------- (board 6)
    --------- (board 7)
    --------- (board 8)
    --------- (master board)
    xx        (last move)
    

    第一个字符代表机器人是谁。在这种情况下,机器人1扮演X。接下来的9行引用9个棋盘。第11行是指主板。最后一步是“ xx”。现在,bot1必须打印两个介于0和8之间的数字。数字1是您的机器人正在移动的板,而数字2是该板上的磁贴。控制器将跟踪此动作。假设bot 1可以打印38。现在该板将如下所示:

     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |  ||  | |  ||  | |  
    ==========================
     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |X ||  | |  ||  | |  
    ==========================
     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |  ||  | |  ||  | |  
    

    bot2将使用以下参数调用:

    O
    ---------
    --------- 
    --------- 
    --------X 
    --------- 
    --------- 
    --------- 
    --------- 
    --------- 
    ---------
    38
    
  3. 现在,机器人2必须在板8中移动(因为机器人1在图块3中放置了x)。假设bot2可以打印84。现在该板看起来像这样。

     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |  ||  | |  ||  | |  
    ==========================
     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |X ||  | |  ||  | |  
    ==========================
     | |  ||  | |  ||  | |  
    ----- || ----- || ----- 
     | |  ||  | |  ||  |O|  
    ----- || ----- || ----- 
     | |  ||  | |  ||  | |  
    

    现在将使用以下参数调用bot1:

    X
    ---------
    --------- 
    --------- 
    --------X 
    --------- 
    --------- 
    --------- 
    --------- 
    ----0---- 
    ---------
    84
    
  4. 现在bot1必须在板4中移动。但是,bot1是一个顽皮的小机器人,并决定在板3中移动。它会显示'30'。董事会完全没有变化。主机器人会对此进行跟踪。现在,将使用以下参数调用bot2:

    O
    ---------
    --------- 
    --------- 
    --------X 
    --------- 
    --------- 
    --------- 
    --------- 
    ----0---- 
    ---------
    xx
    
  5. 现在,bot 2可以随心所欲了(当然38和84除外)。这一直持续到有人连续赢得3个主板为止。然后,进行第二次对决,其中bot2为X并首先进入。

  6. 重复此过程,直到每个机器人都玩过其他机器人。

计分

评分方式如下:

每场比赛的获胜者都会获得100 + number of open spots积分。这样,如果您的机器人迅速获胜,那就更有价值。每次您的漫游器无效动作时,它都会失去1分。如果在250轮之后没有一个机器人获胜,那么每个机器人将失去10分,我们继续进行下一轮。


一切都将放入包含以下内容的目录中

  1. 控制器机器人。这是我编写的C ++程序。您可以在此处查看控制器机器人的源代码如果您发现控制器不正确的地方,请告诉我。

  2. 名为“ instructions.txt此文件”的文本文件将如下所示:

    [Total number of bots that are competing]
    
    [bot1Name] [bot1 command to run]
    [bot2Name] [bot2 command to run]
    ...
    
  3. 每个漫游器的文件夹。该文件夹将保存您的程序(无论是脚本还是二进制文件)和一个名称为data.txtbot可以读写所需内容的文本文件。

技术规格和规则说明

  • 任何试图从不在其文件夹内的任何地方读取/写入内容的漫游器都会被踢出游戏。

  • 您的程序必须能够在运行优胜美地的Macbook上运行。当前支持的语言是python(2.7.9和3.4.2),C / C ++,objective-C,perl,ruby,bash,PHP,Java,C#,javascript和Haskell。还有很多,但是这些只是我现在能想到的。随着时间的流逝,我将添加更多内容。如果您想使用特定的语言进行比赛,请给我发消息或发表评论,如果可能,我会将其添加到列表中。

  • 如果赢得了一个棋盘,但仍有空间,您仍然无法进入其中一个空位。

  • 请注意,您提交的工作目录将是包含控制器和所有其他机器人的目录,而不是包含您的机器人的目录。

  • 请与您的控制器机器人代码一起发布正确的命令进行编译(如果适用)并运行您的机器人。大多数操作将通过OS X终端完成,该终端与linux终端非常相似。

  • 机器人必须在一秒钟内完成。不幸的是,我没有足够的能力向控制器机器人添加计时器。但是,我将手动为机器人计时。


结果!

好吧,我是对的。我忘了让控制器机器人检查主板是否已满。如果masterBoard已满,则每个动作都是无效的,但是它将继续调用bot,这可能就是为什么有这么多无效动作的原因。我已经解决了。以下是所有机器人的最新版本的官方结果。

Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.

With 4 bots, This program took 477.471 seconds to finish.

深度机器人是卫冕冠军!至少目前如此。


顺便说一句,你有没有看着火与冰(在PBEM版本 gamerz.net) -有一些井字棋元素吧...不过这让我想起了划线

9个赞和40次浏览。给我留下深刻的印象!
Loovjo 2015年

5
您可能希望限制漫游器的响应时间,否则漫游器在搜索所有未来可能的移动时,每步可能需要3分钟。
2015年

1
我在下一步操作中添加了一些规则说明。我担心数据格式和规则之一。第一节的规则5:“如果其中一个木板被装满,则算作Nobody块。” 没有胜利者就充满了吗?也就是说,如果有人以前赢得了瓷砖,并且变得满满了,那它是否就是瓷砖?此外,如果漫游器是无状态的(它们看起来是无状态的)并且传递了状态,那么如何赢得董事会的获胜者XXX000---?还是“没有人先赢得它就赢得了它”?

@MichaelT董事会的获胜者在11号线被传递。我将对此部分进行编辑以使其更加清晰,但是您的编辑不正确。“如果赢得一个董事会,但仍有空间,您仍然无法进入其中一个空缺。”
DJMcMayhem

Answers:


5

Python 2.7,深度

没有任何花哨的alpha-beta修剪实现。它确实尝试以不太幼稚的方式命令移动,以最大程度地消除alpha-beta。我可能会尝试加快速度,但老实说,我不知道如果将Python归结为速度问题,其竞争力将如何。

class DepthPlayer:
    def __init__(self,depth):
        self.depth = depth

    def score(self,master,subs,last_move):
        total = 0
        for x in range(3):
            for y in range(3):
                c = master[3*y+x]
                if c == 0:
                    total += sum(subs[3*y+x])
                else:
                    total += c*10
                    for (dx,dy) in [(1,-1),(1,0),(0,1),(1,1)]:
                        if x+dx<=2 and 0<=y+dy<=2 and master[3*(y+dy)+(x+dx)] == c:
                            total += c*10
        if last_move is None or master[last_move[1]] != 0 or 0 not in subs[last_move[1]]:
            total += 5
        return total

    def winner(self,board):
        for y in range(3):
            row = board[3*y:3*y+3]
            if 0!=row[0]==row[1]==row[2]:
                return row[0]
        for x in range(3):
            col = board[x:9:3]
            if 0!=col[0]==col[1]==col[2]:
                return col[0]
        if 0!=board[0]==board[4]==board[8]:
            return board[0]
        if 0!=board[2]==board[4]==board[6]:
            return board[2]

        return 0

    def parse(self,input):
        lines = input.split('\n')
        team = lines[0]
        subs_str = lines[1:10]
        master_str = lines[10]
        last_move_str = lines[11]

        master = [1 if c==team else 0 if c=='-' else -1 for c in master_str]
        subs = [[1 if c==team else 0 if c=='-' else -1 for c in sub_str] for sub_str in subs_str]
        if last_move_str == 'xx':
            last_move = None

        else:
            last_move = [int(c) for c in last_move_str]
        return master,subs,last_move

    def alphabeta(self, master,subs,last_move, depth, alpha, beta, player):
        if depth == 0:
            return self.score(master,subs,last_move),None
        w = self.winner(master)
        if w != 0:
            return w*1000,None

        if player:
            v = -10000
            best = None
            for n_master,n_subs,n_last_move in self.all_moves(master,subs,last_move,1):
                nv,_ = self.alphabeta(n_master,n_subs,n_last_move, depth-1, alpha, beta, False)
                if nv>v:
                    v = nv
                    best = n_last_move
                alpha = max(alpha, v)
                if beta <= alpha:
                    break
            return v,best
        else:
            v = 10000
            best = None
            for n_master,n_subs,n_last_move in self.all_moves(master,subs,last_move,-1):
                nv,nb = self.alphabeta(n_master,n_subs,n_last_move, depth-1, alpha, beta, True)
                if nv<v:
                    v = nv
                    best = n_last_move
                beta = min(beta, v)
                if beta <= alpha:
                    break
            return v,best

    def make_move(self,master,subs,move,player):
        n_subs = [sub[:] for sub in subs]
        n_master = master[:]
        n_subs[move[0]][move[1]] = player
        if n_master[move[0]] == 0:
            n_master[move[0]] = self.winner(n_subs[move[0]])
        return n_master,n_subs,move

    def sub_moves(self,board):
        first = []
        second = []
        third = []
        for i in range(9):
            if board[i] != 0:
                continue
            y,x = divmod(i,3)
            c=-2
            if   x==0 and 0!=board[i+1]==board[i+2]>c: c=board[i+1]
            elif x==1 and 0!=board[i-1]==board[i+1]>c: c=board[i-1]
            elif x==2 and 0!=board[i-2]==board[i-1]>c: c=board[i-2]
            if   y==0 and 0!=board[i+3]==board[i+6]>c: c=board[i+3]
            elif y==1 and 0!=board[i-3]==board[i+3]>c: c=board[i-3]
            elif y==2 and 0!=board[i-6]==board[i-3]>c: c=board[i-6]
            if i in [0,4,8] and 0!=board[(i+4)%12]==board[(i+4)%12]>c: c=board[i-6]
            if i in [2,4,6] and 0!=board[6 if i==2 else i-2]==board[2 if i==6 else i+2]>c: c=board[i-6]

            if c==-2:   third.append(i)
            elif c==-1: second.append(i)
            else:       third.append(i)
        return first+second+third

    def all_moves(self,master,subs,last_move,player):
        if last_move is not None and master[last_move[1]]==0 and 0 in subs[last_move[1]]:
            for i in self.sub_moves(subs[last_move[1]]):
                yield self.make_move(master,subs,[last_move[1],i],player)

        else:
            for j in range(9):
                if master[j]==0 and 0 in subs[j]:
                    for i in self.sub_moves(subs[j]):
                        yield self.make_move(master,subs,[j,i],player)

    def move(self,master,subs,last_move):
        return self.alphabeta(master,subs,last_move, self.depth, -10000, 10000, True)[1]

    def run(self,input):
        result = self.move(*self.parse(input))
        if result:
            return str(result[0])+str(result[1])

def print_board(subs,player):
    string = ""
    for row in range(9):
        for sub in subs[row/3*3:row/3*3+3]:
            for c in sub[row%3*3:row%3*3+3]:
                string += "-XO"[c*(1 if player=='X' else -1)]
            string += ' '
        if row%3 == 2:
            string += '\n'
        string += '\n'
    print string

def to_string(master,subs,last_move,player):
    string = player+'\n'
    for sub in subs:
        for c in sub:
            string += "-XO"[c*(1 if player=='O' else -1)]
        string += '\n'
    for c in master:
        string += "-XO"[c*(1 if player=='O' else -1)]
    string += '\n'+str(last_move[0])+str(last_move[1])
    return string


import sys
command = '\n'.join(sys.argv[1:])
print DepthPlayer(8).run(command)

要运行它,您可以简单地做python Depth.py <input>,尽管我建议您使用pypy它,因为它可以显着加快速度。

另外我也不知道您的系统有多快,但是DepthPlayer如果仍然可以在指定的时间内运行,您可以将第一个参数修改为更高(在我的系统上,它几乎可以快速完成几乎所有事情) 7或8,但有些情况接近或高于一秒,因此我将其设置为6是安全的)。


python sys.argv不会返回换行符分隔的字符串。它给出了这种格式的字符串列表:['Depth.py', 'X', '---------', '---------', ...]我通过编辑最后两行对此进行了修复,command = '\n'.join(sys.argv[1:]) print DepthPlayer(6).run(command)希望您不要介意。
DJMcMayhem

@DJMcMayhem哦,谢谢,我没有测试最后一行。
KSab 2015年

2

天真Java

如果可能,它将获胜。否则,它将阻止对手获胜。

import java.util.Arrays;

public class Naive {

    public static void main(String[] args) {

        char[][] board = new char[9][9];
        for (int i = 0; i < 9; i++) {
            board[i] = args[i + 1].toCharArray();
        }
        char[] metaBox = args[10].toCharArray();

        char a = args[0].charAt(0),
                b = (char) ('X' + 'O' - a);

        int legalBox = args[11].charAt(1) - '0';
        boolean legalAnywhere = legalBox == 'x' - '0';
        if (!legalAnywhere) {
            if (wins(board[legalBox], 'X') || wins(board[legalBox], 'O')) {
                legalAnywhere = true;
            }
        }
        a:
        if (!legalAnywhere) {
            for (int i = 0; i < 9; i++) {
                if (board[legalBox][i] == '-') {
                    break a;
                }
            }
            legalAnywhere = true;
        }

        if (legalAnywhere) {
            chooseMove(board, metaBox, a, b);
        } else {
            chooseMove(board, metaBox, a, b, legalBox);
        }
    }

    static boolean canWinWith(char[] box, char c) {
        for (int i = 0; i < 9; i++) {
            if (wins(box, i, c)) {
                return true;
            }
        }
        return false;
    }

    static boolean wins(char[] box, int move, char c) {
        char[] copy = Arrays.copyOf(box, 9);
        copy[move] = c;
        return wins(copy, c);
    }

    static boolean wins(char[] box, char c) {
        return (box[0] == c && box[1] == c && box[2] == c)
               || (box[3] == c && box[4] == c && box[5] == c)
               || (box[6] == c && box[7] == c && box[8] == c)
               || (box[0] == c && box[3] == c && box[6] == c)
               || (box[1] == c && box[4] == c && box[7] == c)
               || (box[2] == c && box[5] == c && box[8] == c)
               || (box[0] == c && box[4] == c && box[8] == c)
               || (box[2] == c && box[4] == c && box[6] == c);
    }

    static void endWith(int box, int i) {
        System.out.println("" + box + i);
        System.exit(0);
    }

    private static void chooseMove(char[][] board, char[] metaBox, char a, char b, int legalBox) {
        for (int i = 0; i < 9; i++) {
            if (wins(board[legalBox], i, a) && board[legalBox][i] == '-') {
                endWith(legalBox, i);
            }
        }
        for (int i = 0; i < 9; i++) {
            if (wins(board[legalBox], i, b) && board[legalBox][i] == '-') {
                endWith(legalBox, i);
            }
        }
        for (int i = 0; i < 9; i++) {
            if (board[legalBox][i] == '-') {
                if (!canWinWith(board[i], b)) {
                    endWith(legalBox, i);
                }
            }
        }
        for (int i = 0; i < 9; i++) {
            if (board[legalBox][i] == '-') {
                endWith(legalBox, i);
            }
        }
        throw new RuntimeException("No move chosen!");
    }

    private static void chooseMove(char[][] board, char[] metaBox, char a, char b) {
        for (int box = 0; box < 9; box++) {
            for (int i = 0; i < 9; i++) {
                if (wins(board[box], i, a) && board[box][i] == '-') {
                    endWith(box, i);
                }
            }
        }
        for (int box = 0; box < 9; box++) {
            for (int i = 0; i < 9; i++) {
                if (wins(board[box], i, b) && board[box][i] == '-') {
                    endWith(box, i);
                }
            }
        }
        for (int box = 0; box < 9; box++) {
            for (int i = 0; i < 9; i++) {
                if (board[box][i] == '-') {
                    if (!canWinWith(board[i], b)) {
                        endWith(box, i);
                    }
                }
            }
        }
        for (int box = 0; box < 9; box++) {
            for (int i = 0; i < 9; i++) {
                if (board[box][i] == '-') {
                    endWith(box, i);
                }
            }
        }
        throw new RuntimeException("No move chosen!");
    }
}

您必须原谅我成为Java noob,但是如何从父目录中运行它呢?我Naive.classnaiveBot主目录中有一个目录。
DJMcMayhem

@DJMcMayhem我没有使用Mac的权限,但是在Windows上,只要java Naive <args>环境变量包含指向的指针,您就可以运行命令C:\Program Files\Java\jdk1.8.0\bin。我希望这有帮助。
Ypnypn 2015年

好吧,我会解决的。
DJMcMayhem

@DJMcMayhem如果您还没有弄清楚,那就是java -classpath naiveBot Naive;)
CommonGuy 2015年

@Ypnypn如果legalAnywhere为true,则提交失败,因为您尝试使用已由玩家赢得的棋盘。
CommonGuy 2015年

2

Python 2,MiddleBot

MiddleBot喜欢中间人。在赢得中央游戏(4)之前,它将尝试抓住尽可能多游戏的中心方块,迫使对手一次又一次地回到中间游戏。
完成此操作后,它会尝试赢得所有可能的游戏,或者如果没有赢得,则仅填充第一个可用空间(我认为需要继续进行后期的游戏)

from random import randint
import sys
command_in = '\n'.join(sys.argv[1:])
class MiddleBot:

    def scan_in(self,the_game):

        lines = the_game.split('\n')
        self.us = lines[0]
        if self.us == 'X':
            self.them = 'O'
        else:
            self.them = 'X'
        self.games = lines[1:10]
        self.metagame = lines[10]
        self.last_move = lines[11]

        try:
            self.sub_board = int(self.last_move[1])
        except ValueError:
            self.sub_board = self.last_move[1]

    def empty(self,game,target):
        if self.games[int(game)][int(target)] == '-':
            self.emptycell = 1
        else: self.emptycell = 0

    def empty_fill(self,game):
        #checks for next empty space, fills it
        for k in xrange(0,8):
            self.empty(game,k)
            if self.emptycell == 1:
                self.first_empty_space = k
                break
            if self.emptycell == 0:
                game = randint(0,8)
                self.first_empty_space = 4


    def aim_for_target(self,game,target):
        if self.games[int(game)][int(target)] == '-':
            self.move = `game` + `target`
        else:
            self.empty_fill(game)
            self.move = `game` + `self.first_empty_space`


    #define all win conditions        
    win = [0]*8            
    win[0] = [0,1,2]
    win[1] = [3,4,5]
    win[2] = [6,7,8]
    win[3] = [0,3,6]
    win[4] = [1,4,7]
    win[5] = [2,5,8]
    win[6] = [0,4,8]
    win[7] = [2,4,6]

    #check if current board state is one move away from 'us' winning
    def aim_for_win(self,game):
            for k in xrange(0,len(self.win)):
                if self.games[self.sub_board][self.win[k][0]] == self.games[self.sub_board][self.win[k][1]] == self.us:
                    self.empty(self.sub_board,self.win[k][2])
                    if self.emptycell == 1:
                        self.move = `self.sub_board`+`self.win[k][2]`
                    else:
                        self.empty_fill(self.sub_board)
                        self.move = `self.sub_board`,`self.first_empty_space`
                elif self.games[self.sub_board][self.win[k][0]] == self.games[self.sub_board][self.win[k][2]] == self.us:
                    self.empty(self.sub_board,self.win[k][1])
                    if self.emptycell == 1:
                        self.move = `self.sub_board`+`self.win[k][1]`
                    else:
                        self.empty_fill(self.sub_board)
                        self.move = `self.sub_board`+`self.first_empty_space`
                elif self.games[self.sub_board][self.win[k][1]] == self.games[self.sub_board][self.win[k][2]] == self.us:
                    self.empty(self.sub_board,self.win[k][0])
                    if self.emptycell == 1:
                        self.move = `self.sub_board`+`self.win[k][0]`
                    else:
                        self.empty_fill(self.sub_board)
                        self.move = `self.sub_board`+`self.first_empty_space`
                else:
                    self.empty_fill(self.sub_board)
                    self.move = `self.sub_board`+`self.first_empty_space`


    def play(self):
        #If the middle board is not won, aim for the middle square of each board
        if self.metagame[4] == '-':
            if self.sub_board == 4 or self.sub_board == 'x':
                self.aim_for_target(4,4)
            else:
                self.aim_for_target(self.sub_board,4)
        else:
            #once the middle board is won, pretty much plays randomly, aiming to win if it can, otherwise just filling the first empty space in each subgame
            played = 0
            if self.sub_board == 'x':
                self.sub_board = randint(0,8)
            while played == 0:
                if self.metagame[int(self.sub_board)] == '-':
                    self.aim_for_win(self.sub_board)
                    played = 1
                else:
                    self.sub_board = randint(0,8)
        return self.move

    def run(self,game_board):
        self.scan_in(game_board)
        self.play()
        return self.move

print MiddleBot().run(command_in)      

运行它,python MiddleBot.py <input>对于我来说似乎很开心,不到一秒钟,所以希望对您也一样


一切运行正常,但是仅供参考,当最后一个动作是“ xx”时,它就会崩溃,这是在开始时以及每次机器人进行无效动作时发生的。
DJMcMayhem

糟糕!现在应该修复。忘记在那个迭代中测试'xx'情况,对不起!
LogicianWithAH,2015年

还进行了编辑-如果在没有获胜者的情况下填补了董事会,就会被要求在那儿玩
LogicianWithAH,2015年

0

最好将自己的机器人加入其中。

python 2,goodRandomBot

import sys
from random import choice

args = sys.argv
if len(args) < 13:
    print ("I can't work with this!\n")
    sys.exit()

whoAmI = args[1];
masterBoard = list(args[11])
board = []
for i in range(2, 11):
    board.append(list(args[i]))

oppMove = args[12]

def findAllValidMoves(board, masterBoard):
    validMoves = []
    for row in range(9):
        if masterBoard[row] != '-':
            continue
        for col in range(len(board[row])):
            if board[row][col] == '-':
                validMoves.append(str(row) + str(col))
    return validMoves

validMoves = []
if oppMove == "xx" or masterBoard[int(oppMove[1])] != "-":
    validMoves = findAllValidMoves(board, masterBoard)    

else:
    row = int(oppMove[1])
    for col in range(len(board[row])):
        if board[row][col] == '-' and masterBoard[row] == "-":
            validMoves.append(str(row) + str(col))

if (validMoves == []):
    validMoves = findAllValidMoves(board, masterBoard)

print choice(validMoves)

只要它是有效的举动,该机器人就不会在意它的移动位置。从所有有效动作中随机选择,并对0无效动作进行平均。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.