Kết nối một phần có thể quan sát-4


8

Tro choi

Bạn sẽ chơi một trò chơi tiêu chuẩn (gần như) của Connect-4 . Thật không may, đây là một trò chơi tương ứng và ai đó đã đặt băng đen trên mỗi hàng thứ hai bắt đầu từ phía dưới, do đó bạn không thể thấy bất kỳ động thái nào của đối thủ trong các hàng này.

Bất kỳ di chuyển nào trong các cột đã đầy sẽ được tính là vượt qua lượt của bạn và nếu trò chơi diễn ra lâu hơn 6 * 7lượt, nó sẽ được coi là một trận hòa.

Đặc tả thử thách

Chương trình của bạn nên được thực hiện dưới dạng hàm Python 3. Đối số đầu tiên là 'chế độ xem' của bảng, biểu thị trạng thái bảng đã biết dưới dạng danh sách 2D các hàng từ dưới lên trên, trong đó 1di chuyển bởi người chơi thứ nhất, 2di chuyển bởi người chơi thứ hai và 0vị trí trống hoặc ẩn di chuyển bởi đối thủ của bạn.

Đối số thứ hai là số lần lượt được lập chỉ mục từ 0và tính chẵn lẻ của nó cho bạn biết bạn là người chơi nào.

Đối số cuối cùng là một trạng thái tùy ý, được khởi tạo Noneở đầu mỗi trò chơi, bạn có thể sử dụng để duy trì trạng thái giữa các lượt.

Bạn nên trả về 2-tuple của chỉ mục cột bạn muốn chơi và trạng thái mới sẽ được trả lại cho bạn vào lượt tiếp theo.

Chấm điểm

Một chiến thắng được tính là +1, một trận hòa 0và một trận thua là -1. Mục tiêu của bạn là đạt được số điểm trung bình cao nhất trong một giải đấu vòng tròn. Tôi sẽ cố gắng chạy nhiều trận theo yêu cầu để xác định người chiến thắng rõ ràng.

Quy tắc

Bất kỳ đối thủ cạnh tranh nào cũng nên có nhiều nhất một bot cạnh tranh tại một thời điểm, nhưng bạn có thể cập nhật mục nhập của mình nếu bạn tiến bộ. Hãy cố gắng giới hạn bot của bạn trong ~ 1 giây thời gian suy nghĩ mỗi lượt.

Kiểm tra

Dưới đây là mã nguồn cho bộ điều khiển, cùng với một vài bot ví dụ không cạnh tranh để tham khảo:

import itertools
import random

def get_strides(board, i, j):
    yield ((i, k) for k in range(j + 1, 7))
    yield ((i, k) for k in range(j - 1, -1, -1))
    yield ((k, j) for k in range(i + 1, 6))
    yield ((k, j) for k in range(i - 1, -1, -1))
    directions = [(1, 1), (-1, -1), (1, -1), (-1, 1)]
    def diag(di, dj):
        i1 = i
        j1 = j
        while True:
            i1 += di
            if i1 < 0 or i1 >= 6:
                break
            j1 += dj
            if j1 < 0 or j1 >= 7:
                break
            yield (i1, j1)
    for d in directions:
        yield diag(*d)

DRAWN = 0
LOST = 1
WON = 2
UNDECIDED = 3

def get_outcome(board, i, j):
    if all(board[-1]):
        return DRAWN
    player = board[i][j]
    strides = get_strides(board, i, j)
    for _ in range(4):
        s0 = next(strides)
        s1 = next(strides)
        n = 1
        for s in (s0, s1):
            for i1, j1 in s:
                if board[i1][j1] == player:
                    n += 1
                    if n >= 4:
                        return WON
                else:
                    break
    return UNDECIDED

def apply_move(board, player, move):
    for i, row in enumerate(board):
        if board[i][move] == 0:
            board[i][move] = player
            outcome = get_outcome(board, i, move)
            return outcome
    if all(board[-1]):
        return DRAWN
    return UNDECIDED

def get_view(board, player):
    view = [list(row) for row in board]
    for i, row in enumerate(view):
        if i % 2:
            continue
        for j, x in enumerate(row):
            if x == 3 - player:
                row[j] = 0
    return view

def run_game(player1, player2):
    players = {1 : player1, 2 : player2}
    board = [[0] * 7 for _ in range(6)]
    states = {1 : None, 2 : None}
    for turn in range(6 * 7):
        p = (turn % 2) + 1
        player = players[p]
        view = get_view(board, p)
        move, state = player(view, turn, states[p])
        outcome = apply_move(board, p, move)
        if outcome == DRAWN:
            return DRAWN
        elif outcome == WON:
            return p
        else:
            states[p] = state
    return DRAWN

def get_score(counts):
    return (counts[WON] - counts[LOST]) / float(sum(counts))

def run_tournament(players, rounds=10000):
    counts = [[0] * 3 for _ in players]
    for r in range(rounds):
        for i, player1 in enumerate(players):
            for j, player2 in enumerate(players):
                if i == j:
                    continue
                outcome = run_game(player1, player2)
                if outcome == DRAWN:
                    for k in i, j:
                        counts[k][DRAWN] += 1
                else:
                    if outcome == 1:
                        w, l = i, j
                    else:
                        w, l = j, i
                    counts[w][WON] += 1
                    counts[l][LOST] += 1
        ranks = sorted(range(len(players)), key = lambda i: get_score(counts[i]), reverse=True)
        print("Round %d of %d\n" % (r + 1, rounds))
        rows = [("Name", "Draws", "Losses", "Wins", "Score")]
        for i in ranks:
            name = players[i].__name__
            score = get_score(counts[i])
            rows.append([name + ":"] + [str(n) for n in counts[i]] + ["%6.3f" % score])
        lengths = [max(len(s) for s in col) + 1 for col in zip(*rows)]
        for i, row in enumerate(rows):
            padding = ((n - len(s)) * ' ' for s, n in zip(row, lengths))
            print(''.join(s + p for s, p in zip(row, padding)))
            if i == 0:
                print()
        print()

def random_player(view, turn, state):
    return random.randrange(0, 7), state

def constant_player(view, turn, state):
    return 0, state

def better_random_player(view, turn, state):
    while True:
        j = random.randrange(0, 7)
        if view[-1][j] == 0:
            return j, state

def better_constant_player(view, turn, state):
    for j in range(7):
        if view[-1][j] == 0:
            return j, state

players = [random_player, constant_player, better_random_player, better_constant_player]

run_tournament(players)

Chúc bạn vui vẻ!

Kết quả tạm thời

Name                    Draws Losses Wins  Score  

zsani_bot:              40    5377   94583  0.892 
better_constant_player: 0     28665  71335  0.427 
constant_player:        3     53961  46036 -0.079 
normalBot:              38    64903  35059 -0.298 
better_random_player:   192   71447  28361 -0.431 
random_player:          199   75411  24390 -0.510 

Bạn có thể giải thích lý do tại sao bạn kiểm tra chế độ xem [-1] [j] == 0 không? Tôi không hoàn toàn chắc chắn tôi thấy nơi bạn lấp đầy chúng và kiến ​​thức về con trăn của tôi có vẻ hơi rỉ sét.
Barbarian772

@ Barbarian772 Tôi đang kiểm tra xem có còn chỗ trống trong cột đó không. Lưu ý rằng có 6 hàng để hàng trên cùng được quan sát đầy đủ.
user1502040

1
Bạn không nên tính việc đặt vào các cột đã đầy đủ như một lượt. Nhiều trò chơi kết nối 4 kết thúc chỉ với một cột không được điền và nếu một người chơi sẽ thua bằng cách chơi trong cột đó, điều này sẽ khiến trò chơi buộc khi đó là một chiến thắng bắt buộc cho một người chơi.
soktinpk

@soktinpk Không phải chỉ cần thêm một lớp chiến lược nữa sao? Connect-4 là một trò chơi đã được giải quyết, do đó, yếu tố bỏ qua lần lượt có thể đủ thay đổi quy tắc mà những người đóng góp không thể chỉ sử dụng các thuật toán tiêu chuẩn.
mypetlion

1
Không có chỉ mục từ dưới lên, là các hàng được dán (0,2,4,6) hoặc (1,3,5)? Một số nghệ thuật ASCII sẽ hữu ích.
SIGSTACKFAULT

Câu trả lời:


6

Bot này có tất cả các chiến thắng chắc chắn, và quay trở lại để chặn các đối thủ, lần thứ hai đoán chúng theo chiều dọc và chiều ngang hoặc thực hiện các bước di chuyển ngẫu nhiên.

nhập pprint, toán, bộ sưu tập, sao chép
def zsani_bot_2 (xem, rẽ, trạng thái):
    if state == Không có: #first lượt riêng - luôn dành cho trung gian
        state = (1, 2) nếu biến == 0 khác (2, 1) # (my_symbol, ký hiệu của bạn)
        #print (pprint.pformat (xem) + 'Turn:' + str (lượt) + 'Trình phát:' + str (trạng thái [0]))
        trở về 3, nhà nước

    #locate điểm rõ ràng
    cho tôi trong phạm vi (1, 6): #skip hàng đầu tiên
        cho j trong phạm vi (len (xem [i])): #TODO: Tối ưu hóa với zip. Đi cho rõ ràng ngay bây giờ
            nếu xem [i] [j]! = 0 và xem [i-1] [j] == 0:
                xem [i-1] [j] = bang [1]
    địch_point = math.floor (lượt / 2)
    ++ địch_point nếu trạng thái [0] == 2 kẻ thù khác
    know_point = sum ([i.count (bang [1]) cho i trong chế độ xem])
    mất tích_point = địch_point - đã biết

    #get chắc chắn thắng theo bất kỳ hướng nào
    cho j trong phạm vi (0, 7): cột #every
        cho i trong phạm vi (4, -1, -1):
            nếu xem [i] [j]! = 0:
                phá vỡ #find điểm được biết đến cao nhất
        if (không thiếu_point hoặc i + 1 trong {1, 3, 5}):
            view1 = copy.deepcopy (xem)
            cố gắng = áp dụng_move (view1, bang [0], j)
            nếu cố gắng == WON:
               # print (pprint.pformat (view) + 'Turn:' + str (lượt) + 'Player:' + str (bang [0]) + 'di chuyển người chiến thắng')
                trở lại j, nhà nước

    #block chắc chắn kẻ thù chiến thắng theo bất kỳ hướng nào
    cho j trong phạm vi (0, 7):
        cho i trong phạm vi (4, -1, -1):
            nếu xem [i] [j]! = 0:
                phá vỡ #find điểm được biết đến cao nhất
        if (không thiếu_point hoặc (i + 1 trong {1, 3, 5})):
            view1 = copy.deepcopy (xem)
            cố gắng = áp dụng_move (view1, bang [1], j)
            nếu cố gắng == WON:
              # print (pprint.pformat (view) + 'Turn:' + str (Turn) + 'Player:' + str (state [0]) + 'save move')
                trở lại j, nhà nước

    # chặn tường
    cho i trong phạm vi (0, 3): # có thể nhận được 4 liên tiếp khi cột đầy
        cho j trong phạm vi (0, 6):
            if view [i] [j]! = 0 và xem [i] [j] == view [i + 1] [j] và xem [i + 2] [j] == view [i + 3] [j ] == 0:
             # print (pprint.pformat (view) + 'Turn:' + str (Turn) + 'Player:' + str (state [0]) + 'di chuyển cột')
                trở lại j, nhà nước

    #block nền tảng nếu có thông tin hoàn hảo về hàng bên dưới và điểm rơi
    cho i trong phạm vi (0, 5):
        cho j trong phạm vi (0, 3):
            stats = sưu tập. Bộ đếm ([view [i] [j], view [i] [j + 1], view [i] [j + 2], view [i] [j + 3]])
            if stats [0] == 2 và (stats [state [0]] == 2 hoặc stats [state [0]] == 2):
                cho k trong phạm vi (0, 3):
                    nếu xem [i] [j + k] == 0:
                        phá vỡ
                if (i == 0 hoặc xem [i-1] [j + k]! = 0) và (không thiếu_point hoặc i trong {1, 3, 5}):
                    #print (pprint.pformat (view) + 'Turn:' + str (Turn) + 'Player:' + str (state [0]) + 'di chuyển nền tảng')
                    trở lại j + k, trạng thái
                khác:
                    cho l trong phạm vi (k, 3):
                        nếu xem [i] [j + l] == 0:
                            phá vỡ
                        if (i == 0 hoặc xem [i-1] [j + l]! = 0) và (không thiếu_point hoặc i trong {1, 3, 5}):
                     # print (pprint.pformat (view) + 'Turn:' + str (Turn) + 'Player:' + str (state [0]) + 'di chuyển nền tảng')
                            trả lại j + l, trạng thái

    #fallback -> ngẫu nhiên
    trong khi Đúng:
        j = ngẫu nhiên.randrange (0, 7)
        nếu xem [-1] [j] == 0:
            #print (pprint.pformat (view) + 'Turn:' + str (Turn) + 'Player:' + str (state [0]) + 'di chuyển ngẫu nhiên')
            trở lại j, nhà nước

Cảm ơn bạn đã sửa chữa run_game!

Thay đổi:

  • v2 thêm chặn ngang - nếu, trong một hàng 4, có hai điểm trống và hai điểm được điền bởi cùng một người chơi, nó sẽ cố gắng lấp đầy một trong số chúng để có ba hàng / chặn hàng đối thủ, hy vọng sẽ có được viết hoa trong các lượt sau.

3
Chào mừng đến với trang web. Tôi đã bỏ phiếu để từ chối chỉnh sửa để thay đổi thành mã, tốt nhất nên để lại như một nhận xét, theo cách đó OP có thể quyết định làm gì với mã.
Ad Hoc Garf Hunter

Tôi không có đủ danh tiếng để bình luận về bài viết chính. Làm cách nào để tôi rút một chỉnh sửa?
Syfer Arlingtonki

Không cần phải rút bản chỉnh sửa (Tôi không nghĩ bạn có thể nào). Trong tương lai bình luận sẽ là đủ nhưng vì bạn đã nói nó trong câu trả lời của bạn nên có khả năng OP sẽ thấy. Thêm vào đó tôi nghĩ rằng OP sẽ thấy rằng bạn đã đề xuất và chỉnh sửa ngay cả khi nó đã bị từ chối.
Ad Hoc Garf Hunter

Lý do tôi muốn rút lại chỉnh sửa là vì tôi đã bỏ lỡ một dòng trong các thay đổi, nếu không có mã chỉnh sửa đó sẽ hoàn toàn không chạy được. Tôi đã đưa nó vào đề xuất chỉnh sửa trong bài viết của mình. Cảm ơn sự giúp đỡ của bạn!
Syfer Arlingtonki

2

normalBot chơi theo giả định rằng các điểm ở giữa có giá trị hơn các điểm ở hai đầu. Vì vậy, nó sử dụng một phân phối bình thường tập trung ở giữa để xác định lựa chọn của mình.

def normalBot(view, turn, state):
    randomNumber = round(np.random.normal(3, 1.25))
    fullColumns = []
    for i in range(7):
        if view[-1][i] != 0:
            fullColumns.append(i)
    while (randomNumber > 6) or (randomNumber < 0) or (randomNumber in fullColumns):
        randomNumber = round(np.random.normal(3, 1.25))
    return randomNumber, state

-1

Điều này rõ ràng là không cạnh tranh, nhưng dù sao cũng rất hữu ích để gỡ lỗi ... và thật thú vị, nếu bạn biết bot của mình đủ để lừa đảo: D vì vậy tôi đang đăng bài với hy vọng truyền cảm hứng cho nhiều bài đăng hơn:

import math, pprint
def manual_bot(view, turn, state):
    if state == None:
        state = (1, 2) if turn == 0 else (2, 1) #(my_symbol, your symbol)

#locate obvious points
    for row in range (1, 6):
        for j in range(len(view[row])):
            if view[row][j] != 0 and view[row-1][j] == 0:
                view[row-1][j] = state[1]

#if you're second, the opponent has one more point than half the turns
    enemy_points = math.ceil(turn/2)
    known_points = sum([row.count(state[1]) for row in view])
    missing_points = enemy_points - known_points

    print(pprint.pformat(view) + ' Turn: ' + str(turn) + ' Player: ' + str(state[0]) + ' Missing points: ' + str(missing_points))
    while True:
        try:
            move = int(input("What is your move?(0-6) "))
        except ValueError:
            continue
        if move in {0, 1, 2, 3, 4, 5, 6}:
            return move, state

Lưới lộn ngược (hàng dưới cùng là cao nhất). Để nhận được thông báo người chiến thắng, bạn cần vá bộ điều khiển trò chơi, thêm một câu lệnh in trước khi trả lại chiến thắng:

elif outcome == WON:
    print(pprint.pformat(board) + ' Turn: ' + str(turn) +' Winner: '+ str(p))
    return p

[[0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 0 Người chơi: 1 Điểm thiếu: 0
Di chuyển của bạn là gì? (0-6) 3
[[0, 0, 0, 1, 0, 0, 0],
 [0, 0, 0, 2, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 2 Người chơi: 1 Điểm thiếu: 0
Di chuyển của bạn là gì? (0-6) 2
[[0, 0, 1, 1, 0, 0, 0],
 [0, 0, 0, 2, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 4 Người chơi: 1 Điểm thiếu: 1
Di chuyển của bạn là gì? (0-6) 4
[[0, 0, 1, 1, 1, 0, 0],
 [0, 0, 0, 2, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 6 Người chơi: 1 Điểm thiếu: 2
Di chuyển của bạn là gì? (0-6) 1
[[2, 1, 1, 1, 1, 2, 0],
 [0, 0, 0, 2, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 6 Người chiến thắng: 1
[[0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 1 Người chơi: 2 Điểm thiếu: 1
Di chuyển của bạn là gì? (0-6) 2
[[0, 0, 2, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 3 Người chơi: 2 Điểm thiếu: 2
Di chuyển của bạn là gì? (0-6) 3
[[0, 0, 2, 1, 0, 0, 0],
 [0, 0, 1, 2, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 5 Người chơi: 2 Điểm thiếu: 1
Di chuyển của bạn là gì? (0-6) 4
[[0, 0, 2, 1, 2, 0, 0],
 [0, 0, 1, 2, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 7 Người chơi: 2 Điểm thiếu: 2
Di chuyển của bạn là gì? (0-6) 1
[[0, 2, 2, 1, 2, 0, 0],
 [0, 0, 1, 2, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]] Lần lượt: 9 Người chơi: 2 Điểm thiếu: 1
Di chuyển của bạn là gì? (0-6) 2
[[0, 2, 2, 1, 2, 0, 0],
 [0, 0, 1, 2, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0],
 [0, 0, 2, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0]] Lần lượt: 11 Người chơi: 2 Điểm thiếu: 1
Di chuyển của bạn là gì? (0-6) 4
[[0, 2, 2, 1, 2, 0, 0],
 [0, 0, 1, 2, 2, 0, 0],
 [0, 0, 1, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0],
 [0, 0, 2, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0]] Lần lượt: 13 Người chơi: 2 Điểm thiếu: 2
Di chuyển của bạn là gì? (0-6) 4
[[0, 2, 2, 1, 2, 0, 0],
 [0, 1, 1, 2, 2, 0, 0],
 [0, 0, 1, 0, 1, 0, 0],
 [0, 0, 1, 0, 2, 0, 0],
 [0, 0, 2, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0]] Lần lượt: 15 Người chơi: 2 Điểm thiếu: 1
Di chuyển của bạn là gì? (0-6) 3
[[0, 2, 2, 1, 2, 0, 0],
 [0, 1, 1, 2, 2, 0, 0],
 [0, 0, 1, 2, 1, 0, 0],
 [0, 0, 1, 0, 2, 0, 0],
 [0, 0, 2, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0]] Lần lượt: 17 Người chơi: 2 Điểm thiếu: 2
Di chuyển của bạn là gì? (0-6) 5
[[0, 2, 2, 1, 2, 1, 1],
 [0, 1, 1, 2, 2, 2, 1],
 [0, 0, 1, 2, 1, 0, 0],
 [0, 0, 1, 0, 2, 0, 0],
 [0, 0, 2, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0]] Lần lượt: 19 Người chơi: 2 Điểm thiếu: 0
Di chuyển của bạn là gì? (0-6) 
Di chuyển của bạn là gì? (0-6) 6
[[0, 2, 2, 1, 2, 1, 1],
 [0, 1, 1, 2, 2, 2, 1],
 [0, 0, 1, 2, 1, 0, 2],
 [0, 0, 1, 0, 2, 0, 0],
 [0, 0, 2, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0]] Lần lượt: 21 Người chơi: 2 Điểm thiếu: 1
Di chuyển của bạn là gì? (0-6) 1
[[0, 2, 2, 1, 2, 1, 1],
 [0, 1, 1, 2, 2, 2, 1],
 [0, 2, 1, 2, 1, 0, 2],
 [0, 1, 1, 0, 2, 0, 0],
 [0, 0, 2, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0]] Lần lượt: 23 Người chơi: 2 Điểm thiếu: 1
Di chuyển của bạn là gì? (0-6) 3
[[0, 2, 2, 1, 2, 1, 1],
 [0, 1, 1, 2, 2, 2, 1],
 [0, 2, 1, 2, 1, 0, 2],
 [0, 1, 1, 2, 2, 0, 0],
 [0, 0, 2, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0]] Lượt: 25 Người chơi: 2 Điểm thiếu: 2
Di chuyển của bạn là gì? (0-6) 6
[[0, 2, 2, 1, 2, 1, 1],
 [0, 1, 1, 2, 2, 2, 1],
 [0, 2, 1, 2, 1, 0, 2],
 [0, 1, 1, 2, 2, 0, 2],
 [0, 0, 2, 1, 0, 0, 0],
 [0, 0, 1, 1, 0, 0, 0]] Lần lượt: 27 Người chơi: 2 Điểm thiếu: 1
Di chuyển của bạn là gì? (0-6) 5
[[1, 2, 2, 1, 2, 1, 1],
 [1, 1, 1, 2, 2, 2, 1],
 [0, 2, 1, 2, 1, 2, 2],
 [0, 1, 1, 2, 2, 0, 2],
 [0, 0, 2, 1, 0, 0, 0],
 [0, 0, 1, 1, 0, 0, 0]] Lần lượt: 29 Người chơi: 2 Điểm thiếu: 0
Di chuyển của bạn là gì? (0-6) 5
[[1, 2, 2, 1, 2, 1, 1],
 [1, 1, 1, 2, 2, 2, 1],
 [0, 2, 1, 2, 1, 2, 2],
 [0, 1, 1, 2, 2, 2, 2],
 [0, 0, 2, 1, 0, 0, 0],
 [0, 0, 1, 1, 0, 0, 0]] Lần lượt: 29 Người chiến thắng: 2
Vòng 1 của 1

Tên rút ra thua lỗ Điểm số
hướng dẫn sử dụng_bot: 0 0 2 1.000 zsani_bot_2: 0 2 0 -1.000

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.