เชื่อมต่อบางส่วนที่สังเกตได้ 4


8

เกม

คุณจะได้รับการเล่น (เกือบ) เกมมาตรฐานของการเชื่อมต่อ-4 น่าเสียดายที่มันเป็นเกมการติดต่อทางจดหมายและมีคนวางเทปสีดำลงในแถวที่สองทุก ๆ แถวโดยเริ่มจากด้านล่างเพื่อที่คุณจะได้ไม่เห็นการเคลื่อนไหวของคู่ต่อสู้ในแถวเหล่านี้

การเคลื่อนไหวใด ๆ ภายในคอลัมน์ที่เต็มไปแล้วจะนับว่าผ่านการเทิร์นของคุณและหากเกมใดที่ใช้งานเกินกว่า6 * 7เทิร์นมันจะถูกตัดสินว่าเป็นการเสมอ

สเปคท้าทาย

โปรแกรมของคุณควรใช้งานในรูปแบบ Python 3 อาร์กิวเมนต์แรกคือ 'มุมมอง' ของกระดานซึ่งแสดงถึงสถานะกระดานที่รู้จักในชื่อ 2D แถวจากล่างขึ้นบนซึ่ง1เป็นการย้ายโดยผู้เล่นคนแรก2การย้ายโดยผู้เล่นคนที่สองและ0ตำแหน่งว่างหรือซ่อน ย้ายโดยฝ่ายตรงข้ามของคุณ

อาร์กิวเมนต์ที่สองคือหมายเลขเทิร์นอินที่จัดทำดัชนีจาก0และพาริตีของมันจะบอกคุณว่าคุณเป็นผู้เล่นรายใด

อาร์กิวเมนต์สุดท้ายคือสถานะโดยพลการเริ่มต้นNoneที่จุดเริ่มต้นของแต่ละเกมซึ่งคุณสามารถใช้เพื่อรักษาสถานะระหว่างรอบ

คุณควรคืนค่า 2 คอลัมน์ของดัชนีคอลัมน์ที่คุณต้องการเล่นและสถานะใหม่ที่จะส่งคืนให้คุณในเทิร์นถัดไป

เกณฑ์การให้คะแนน

นับเป็นชัยชนะ+1วาดเป็นและสูญเสียเป็น0 -1เป้าหมายของคุณคือเพื่อให้ได้คะแนนสูงสุดโดยเฉลี่ยในทัวร์นาเมนต์ round-robin ฉันจะพยายามวิ่งแข่งให้ได้มากที่สุดเท่าที่จำเป็นเพื่อระบุผู้ชนะที่ชัดเจน

กฎระเบียบ

ผู้แข่งขันใด ๆ ควรมีบอทที่แข่งขันกันมากที่สุดในแต่ละครั้ง แต่มันก็โอเคที่จะอัพเดทข้อมูลของคุณถ้าคุณทำการปรับปรุง โปรดลอง จำกัด บอตของคุณให้เหลือเวลาคิดประมาณ 1 วินาที

การทดสอบ

นี่คือซอร์สโค้ดสำหรับคอนโทรลเลอร์พร้อมกับบ็อตตัวอย่างที่ไม่แข่งขันสำหรับการอ้างอิง:

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)

ขอให้มีความสุข!

ผลลัพธ์ชั่วคราว

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 

คุณช่วยอธิบายว่าทำไมคุณตรวจสอบดู [-1] [j] == 0 ฉันไม่แน่ใจว่าฉันเห็นที่ใดที่คุณเติมเต็มและความรู้ของหลามดูเหมือนว่าจะเป็นสนิมเล็กน้อย
Barbarian772

@ Barbarian772 ฉันกำลังตรวจสอบว่ามีพื้นที่ในคอลัมน์นั้นหรือไม่ โปรดทราบว่ามี 6 แถวดังนั้นแถวบนสุดจะสังเกตได้อย่างสมบูรณ์
user1502040

1
คุณไม่ควรนับการวางในคอลัมน์เต็มแล้วเป็นผ่าน หลายเกมที่เชื่อมต่อ 4 จบลงด้วยคอลัมน์เดียวที่ยังไม่ได้กรอกและหากผู้เล่นคนใดคนหนึ่งจะแพ้โดยการเล่นในคอลัมน์นั้นสิ่งนี้จะทำให้เกมเสมอกัน
soktinpk

@soktinpk นั่นไม่ได้เพิ่มแค่เลเยอร์ของกลยุทธ์อีกใช่ไหม Connect-4 เป็นเกมที่ได้รับการแก้ไขหลังจากทั้งหมดดังนั้น turn turn ข้ามปัจจัยอาจเพียงพอสำหรับการเปลี่ยนแปลงกฎที่ผู้มีส่วนร่วมไม่สามารถใช้อัลกอริทึมมาตรฐานเท่านั้น
mypetlion

1
การทำดัชนีจากด้านล่างเป็นศูนย์แถวทับซ้อน (0,2,4,6) หรือ (1,3,5)? ศิลปะ ASCII บางอันอาจมีประโยชน์
SIGSTACKFAULT

คำตอบ:


6

บอทนี้จะชนะอย่างแน่นอนและถอยกลับไปปิดกั้นคู่แข่งที่สองคาดเดาพวกเขาในแนวตั้งและแนวนอนหรือทำการย้ายแบบสุ่ม

นำเข้า pprint, คณิตศาสตร์, คอลเลกชัน, คัดลอก
def zsani_bot_2 (มุมมองเลี้ยวรัฐ):
    ถ้า state == ไม่มี: #first ของตัวเอง - เสมอสำหรับคนกลาง
        state = (1, 2) ถ้า turn == 0 อื่น (2, 1) # (my_symbol สัญลักษณ์ของคุณ)
        #print (pprint.pformat (ดู) + 'Turn:' + str (turn) + 'Player:' + str (state [0])
        ผลตอบแทน 3 สถานะ

    #locate จุดที่ชัดเจน
    สำหรับฉันอยู่ในช่วง (1, 6): #skip แถวแรก
        สำหรับ j อยู่ในช่วง (len (ดู [i])): #TODO: ปรับด้วยซิป ไปเพื่อความชัดเจนในขณะนี้
            if view [i] [j]! = 0 และดู [i-1] [j] == 0:
                ดู [i-1] [j] = state [1]
    ศัตรู_points = math.floor (เทิร์น / 2)
    ++ ศัตรู _ พอยต์หากรัฐ [0] == 2 อื่น ๆ
    known_points = sum ([i.count (สถานะ [1]) สำหรับ i ในมุมมอง])
    missing_points = combat_points - known_points

    #get แน่ใจว่าชนะในทุกทิศทาง
    สำหรับ j ในช่วง (0, 7): #every column
        สำหรับฉันอยู่ในช่วง (4, -1, -1):
            ถ้าดู [i] [j]! = 0:
                ทำลาย #find จุดเติมที่รู้จักกันสูงสุด
        หาก (ไม่ใช่ missing_point หรือ i + 1 ใน {1, 3, 5}):
            view1 = copy.deepcopy (ดู)
            พยายาม = Apply_move (มุมมอง 1, สถานะ [0], j)
            ถ้าพยายาม == ชนะ:
               # print (pprint.pformat (ดู) + 'Turn:' + str (turn) + 'ผู้เล่น:' + str (สถานะ [0]) + 'ผู้ชนะการย้าย')
                return j, state

    #block แน่ใจว่าศัตรูชนะในทุกทิศทาง
    สำหรับ j อยู่ในช่วง (0, 7):
        สำหรับฉันอยู่ในช่วง (4, -1, -1):
            ถ้าดู [i] [j]! = 0:
                ทำลาย #find จุดเติมที่รู้จักกันสูงสุด
        ถ้า (ไม่ใช่ missing_points หรือ (i + 1 ใน {1, 3, 5})):
            view1 = copy.deepcopy (ดู)
            พยายาม = Apply_move (มุมมอง 1, สถานะ [1], j)
            ถ้าพยายาม == ชนะ:
              # print (pprint.pformat (มุมมอง) + 'Turn:' + str (turn) + 'Player:' + str (สถานะ [0]) + 'บันทึกการย้าย')
                return j, state

    #blockblock
    สำหรับ i ในช่วง (0, 3): # เป็นไปได้ที่จะได้ 4 ในแถวเมื่อคอลัมน์เต็ม
        สำหรับ j อยู่ในช่วง (0, 6):
            if view [i] [j]! = 0 และดู [i] [j] == ดู [i + 1] [j] และดู [i + 2] [j] == ดู [i + 3] [j ] == 0:
             # print (pprint.pformat (ดู) + 'Turn:' + str (turn) + 'Player:' + str (สถานะ [0]) + 'ย้ายคอลัมน์')
                return j, state

    #block platform หากวางข้อมูลที่สมบูรณ์ในแถวด้านล่างและจุดดรอป
    สำหรับฉันอยู่ในช่วง (0, 5):
        สำหรับ j อยู่ในช่วง (0, 3):
            สถิติ = ชุดสะสมตัวนับ ([ดู [i] [j], ดู [i] [j + 1], ดู [i] [j + 2], ดู [i] [j + 3]])
            ถ้า stats [0] == 2 และ (stats [state [0]] == 2 หรือ stats [state [0]] == 2):
                สำหรับ k อยู่ในช่วง (0, 3):
                    ถ้าดู [i] [j + k] == 0:
                        หยุดพัก
                ถ้า (i == 0 หรือดู [i-1] [j + k]! = 0) และ (ไม่ใช่ missing_points หรือ i ใน {1, 3, 5}):
                    #print (pprint.pformat (ดู) + 'Turn:' + str (turn) + 'ผู้เล่น:' + str (สถานะ [0]) + 'ย้ายแพลตฟอร์ม')
                    return j + k, state
                อื่น:
                    สำหรับ l ในช่วง (k, 3):
                        ถ้าดู [i] [j + l] == 0:
                            หยุดพัก
                        ถ้า (i == 0 หรือดู [i-1] [j + l]! = 0) และ (ไม่ใช่ missing_points หรือ i ใน {1, 3, 5}):
                     # print (pprint.pformat (ดู) + 'Turn:' + str (turn) + 'ผู้เล่น:' + str (สถานะ [0]) + 'ย้ายแพลตฟอร์ม')
                            return j + l, state

    #fallback -> สุ่ม
    ในขณะที่ True:
        j = random.randrange (0, 7)
        ถ้าดู [-1] [j] == 0:
            #print (pprint.pformat (ดู) + 'Turn:' + str (turn) + 'ผู้เล่น:' + str (สถานะ [0]) + 'การย้ายแบบสุ่ม')
            return j, state

ขอบคุณสำหรับการแก้ไข run_game!

การเปลี่ยนแปลง:

  • v2 เพิ่มการปิดกั้นแนวนอน - ถ้าในแถวที่ 4 มีจุดว่างสองจุดและจุดสองจุดที่เต็มไปด้วยผู้เล่นเดียวกันมันจะพยายามกรอกจุดใดจุดหนึ่งให้มีสามจุดต่อแถว / บล็อกแถวของฝ่ายตรงข้ามซึ่งหวังว่าจะ จะพิมพ์ใหญ่ในรอบต่อไปนี้

3
ยินดีต้อนรับสู่เว็บไซต์ ฉันโหวตให้ปฏิเสธการแก้ไขเพื่อเปลี่ยนรหัสมันจะดีที่สุดหากเป็นความคิดเห็นวิธีที่ OP สามารถตัดสินใจได้ว่าจะทำอย่างไรกับรหัส
Ad Hoc Garf Hunter

ฉันไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็นในโพสต์หลัก ฉันจะถอนการแก้ไขได้อย่างไร
Syfer Polski

ไม่จำเป็นต้องถอนการแก้ไข (ฉันไม่คิดว่าคุณจะทำได้) ในการแสดงความคิดเห็นในอนาคตจะเพียงพอ แต่เนื่องจากคุณได้กล่าวไว้ในคำตอบของคุณมีโอกาสที่ OP จะเห็น ฉันคิดว่า OP จะเห็นว่าคุณแนะนำและแก้ไขแม้ว่ามันจะถูกปฏิเสธ
Ad Hoc Garf Hunter

เหตุผลที่ฉันต้องการถอนการแก้ไขนั้นเป็นเพราะฉันพลาดหนึ่งบรรทัดในการเปลี่ยนแปลงโดยที่โค้ดที่แก้ไขจะไม่สามารถทำงานได้อย่างสมบูรณ์ ฉันได้รวมไว้ในคำแนะนำการแก้ไขในโพสต์ของฉัน ขอขอบคุณสำหรับความช่วยเหลือของคุณ!
Syfer Polski

2

NormalBot เล่นตามข้อสันนิษฐานว่าจุดตรงกลางมีค่ามากกว่าจุดที่อยู่ตรงปลาย ดังนั้นจึงใช้การแจกแจงปกติที่มีศูนย์กลางอยู่ตรงกลาง

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

เห็นได้ชัดว่านี่ไม่ใช่การแข่งขัน แต่อย่างไรก็ตามมีประโยชน์มากสำหรับการดีบั๊ก ... และสนุกอย่างน่าประหลาดใจถ้าคุณรู้ว่าบอทของคุณเก่งพอที่จะโกง: D ดังนั้นฉันจะโพสต์ด้วยความหวังว่าจะเป็นแรงบันดาลใจให้ส่งมากขึ้น:

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

กริดคว่ำกลับด้าน (แถวล่างสุด) ในการรับประกาศผู้ชนะคุณจะต้องแก้ไขตัวควบคุมเกมเพิ่มคำสั่งการพิมพ์ก่อนส่งคืน:

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]] เทิร์น: 0 ผู้เล่น: 1 คะแนนที่หายไป: 0
ท่าอะไรของคุณ (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]] เทิร์น: 2 ผู้เล่น: 1 คะแนนที่หายไป: 0
ท่าอะไรของคุณ (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]] Turn: ผู้เล่น 4 คน: 1 จุดที่ขาดไป: 1
ท่าอะไรของคุณ (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]] เทิร์น: 6 ผู้เล่น: 1 คะแนนที่ขาดไป: 2
ท่าอะไรของคุณ (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]] Turn: 6 ผู้ชนะ: 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]] Turn: ผู้เล่น 1 คน: 2 คะแนนที่ขาดไป: 1
ท่าอะไรของคุณ (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]] เทิร์น: 3 ผู้เล่น: 2 คะแนนที่ขาดไป: 2
ท่าอะไรของคุณ (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]] เทิร์น: 5 ผู้เล่น: 2 คะแนนที่ขาดไป: 1
ท่าอะไรของคุณ (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]] เทิร์น: 7 ผู้เล่น: 2 คะแนนที่ขาดไป: 2
ท่าอะไรของคุณ (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]] เทิร์น: ผู้เล่น 9 คน: 2 คะแนนที่ขาดไป: 1
ท่าอะไรของคุณ (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]] เทิร์น: 11 ผู้เล่น: 2 คะแนนที่หายไป: 1
ท่าอะไรของคุณ (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]] Turn: ผู้เล่น 13 คน: 2 คะแนนที่ขาดไป: 2
ท่าอะไรของคุณ (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]] เทิร์น: 15 ผู้เล่น: 2 คะแนนที่ขาดไป: 1
ท่าอะไรของคุณ (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]] เทิร์น: 17 ผู้เล่น: 2 คะแนนที่ขาดไป: 2
ท่าอะไรของคุณ (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]] เทิร์น: 19 ผู้เล่น: 2 คะแนนที่หายไป: 0
คุณย้ายอะไร (0-6) 
ท่าอะไรของคุณ (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]] เทิร์น: 21 ผู้เล่น: 2 คะแนนที่ขาดไป: 1
ท่าอะไรของคุณ (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]] เทิร์น: 23 ผู้เล่น: 2 คะแนนที่ขาดไป: 1
ท่าอะไรของคุณ (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]] เทิร์น: 25 ผู้เล่น: 2 คะแนนที่ขาดไป: 2
ท่าอะไรของคุณ (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]] เทิร์น: 27 ผู้เล่น: 2 คะแนนที่ขาดไป: 1
ท่าอะไรของคุณ (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]] เทิร์น: 29 ​​ผู้เล่น: 2 คะแนนที่หายไป: 0
ท่าอะไรของคุณ (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]] Turn: 29 ผู้ชนะ: 2
รอบที่ 1 จาก 1

ชื่อดึงขาดทุนแพ้คะแนน
manual_bot: 0 0 2 1.000 zsani_bot_2: 0 2 0 -1.000

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.