आंशिक-अवलोकन योग्य कनेक्ट -4


8

खेल

आप कनेक्ट -4 के एक (लगभग) मानक खेल खेल रहे होंगे । दुर्भाग्य से, यह एक पत्राचार का खेल है और किसी ने नीचे से शुरू होने वाली प्रत्येक दूसरी पंक्ति पर काला टेप रखा है, ताकि आप अपने किसी भी प्रतिद्वंद्वी को इन पंक्तियों के भीतर न देख सकें।

पहले से ही पूर्ण स्तंभों के भीतर कोई भी चाल आपकी बारी को पार करने के रूप में गिना जाएगा, और यदि कोई खेल अधिक समय तक चलता है, तो 6 * 7इसे ड्रा के रूप में ठहराया जाएगा।

चुनौती विशिष्टता

आपके कार्यक्रम को पायथन 3 फ़ंक्शन के रूप में लागू किया जाना चाहिए। पहला तर्क बोर्ड का एक 'दृश्य' है, जिसे ज्ञात बोर्ड राज्य को नीचे से ऊपर तक पंक्तियों की 2 डी सूची के रूप में दर्शाया जाता है, जहां 1पहले खिलाड़ी 2द्वारा एक चाल है, दूसरे खिलाड़ी द्वारा एक चाल, और 0एक खाली स्थिति या एक छिपी हुई है। अपने प्रतिद्वंद्वी से आगे बढ़ें।

दूसरा तर्क एक बारी संख्या से अनुक्रमित है 0, और इसकी समता आपको बताती है कि आप किस खिलाड़ी हैं।

अंतिम तर्क एक मनमाना राज्य है None, जिसे प्रत्येक खेल की शुरुआत में आरम्भ किया जाता है, जिसका उपयोग आप घुमावों के बीच राज्य को संरक्षित करने के लिए कर सकते हैं।

आपको उस स्तंभ अनुक्रमणिका का 2-टुपल वापस करना चाहिए जिसे आप खेलना चाहते हैं, और अगली अवस्था में आपके पास नया राज्य लौटाया जाएगा।

स्कोरिंग

एक जीत के रूप में +1, एक ड्रा के रूप में मायने रखता है 0, और एक के रूप में नुकसान -1। आपका लक्ष्य एक राउंड-रॉबिन टूर्नामेंट में उच्चतम औसत स्कोर हासिल करना है। मैं एक स्पष्ट विजेता की पहचान करने के लिए आवश्यक रूप से कई मैच चलाने की कोशिश करूंगा।

नियम

किसी भी प्रतियोगी को किसी भी एक समय में सबसे अधिक प्रतिस्पर्धी बॉट होना चाहिए, लेकिन यदि आप सुधार करते हैं तो अपनी प्रविष्टि को अपडेट करना ठीक है। कृपया अपने बॉट को प्रति सेकंड सोचने के समय के ~ 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 12

1
आपको पास के रूप में पहले से ही पूर्ण कॉलम में रखने की गणना नहीं करनी चाहिए। कई कनेक्ट 4 गेम को केवल एक कॉलम के साथ नहीं भरते हैं और यदि कोई खिलाड़ी उस कॉलम में खेलकर हार जाएगा, तो यह गेम को टाई बना देगा जब यह अन्यथा एक खिलाड़ी के लिए एक मजबूर जीत होगी।
soktinpk

@soktinpk क्या यह रणनीति की एक और परत नहीं है? कनेक्ट -4 एक सब के बाद एक सॉल्व्ड गेम है, इसलिए टर्न स्किपिंग फैक्टर एक नियम में बदलाव के लिए पर्याप्त हो सकता है जो योगदानकर्ता सिर्फ मानक एल्गोरिदम का उपयोग नहीं कर सकते।
मायपेटियन

1
नीचे से शून्य-अनुक्रमित, टेप-ओवर पंक्तियाँ (0,2,4,6) या (1,3,5) हैं? कुछ ASCII कला सहायक होगी।
SIGSTACKFAULT

जवाबों:


6

यह बॉट सभी सुनिश्चित जीत लेता है, और प्रतिद्वंद्वियों को ब्लॉक करने के लिए वापस आता है, दूसरा उन्हें लंबवत और क्षैतिज रूप से लगता है या यादृच्छिक चालें बनाता है।

आयात पदचिह्न, गणित, संग्रह, प्रतिलिपि
def zsani_bot_2 (दृश्य, बारी, स्थिति):
    अगर राज्य == कोई नहीं: # खुद की बारी - हमेशा मध्य के लिए
        राज्य = (१, २) यदि बारी == ० और (२, १) # (my_symbol, आपका प्रतीक)
        #print (pprint.pformat (view) + 'Turn:' + str (टर्न) + 'खिलाड़ी:' + str (स्थिति [0]))
        वापसी 3, राज्य

    # स्पष्ट अंक लाएं
    मैं सीमा में (1, 6): # पहली पंक्ति
        j के लिए रेंज में (len (देखें [i])): #TODO: ज़िप के साथ ऑप्टिमाइज़ करें। अब स्पष्टता के लिए जाओ
            अगर देखें [i] [j]! = ० और देखें [i-१] [j] == ०]
                देखें [i-1] [j] = राज्य [१]
    दुश्मन_पॉइंट्स = math.floor (टर्न / 2)
    ++ शत्रु_ पॉइंट यदि राज्य [0] == 2 अन्य शत्रु_ पॉइंट
    ज्ञात_ बिंदु = योग ([i.count (राज्य [1]) मेरे विचार से]]
    लापता_पॉइंट्स = शत्रु_प्वाइंट्स - ज्ञात_पॉइंट्स

    किसी भी दिशा में जीतता है
    j के लिए रेंज में (0, 7): # हर कॉलम
        मैं सीमा में (4, -1, -1):
            अगर देखें [i] [j]! = ०:
                ब्रेक #find उच्चतम ज्ञात भरा बिंदु
        यदि (अनुपलब्ध_नोट्स या i + 1 in {1, 3, 5}):
            view1 = copy.deepcopy (देखें)
            प्रयास = apply_move (देखें 1, राज्य [0], जे)
            यदि प्रयास == WON:
               # प्रिंट (pprint.pformat (view) + 'Turn:' + str (टर्न) + 'खिलाड़ी:' + str (स्थिति [0]) + 'विजेता चाल')
                वापसी जम्मू, राज्य

    # यकीन है कि दुश्मन किसी भी दिशा में जीतता है
    j के लिए रेंज में (0, 7):
        मैं सीमा में (4, -1, -1):
            अगर देखें [i] [j]! = ०:
                ब्रेक #find उच्चतम ज्ञात भरा बिंदु
        यदि (अनुपलब्ध नहीं है / या (i + 1 in {1, 3, 5})):
            view1 = copy.deepcopy (देखें)
            प्रयास = apply_move (देखें 1, राज्य [1], जे)
            यदि प्रयास == WON:
              # प्रिंट (pprint.pformat (दृश्य) + 'टर्न:' + str (टर्न) + 'प्लेयर:' + str (स्थिति [0]) + 'सेविंग मूव')
                वापसी जम्मू, राज्य

    # दीवारें
    i for रेंज (0, 3): कॉलम पूरा होने पर एक पंक्ति में 4 प्राप्त करना असंभव है
        j के लिए रेंज में (0, 6):
            अगर देखें [i] [j]! = ० और देखें [i] [j] == देखें [i + १] [j] और देखें [i + २] [j] == देखें [i + ३] [j ] == 0:
             # प्रिंट (pprint.pformat (view) + 'टर्न:' + str (टर्न) + 'प्लेयर:' + str (स्थिति [0]) + 'कॉलम मूव')
                वापसी जम्मू, राज्य

    # प्लेटफ़ॉर्म नीचे पंक्ति और ड्रॉप पॉइंट पर सही जानकारी रखने पर प्लेटफ़ॉर्म करें
    मैं सीमा में (0, 5):
        j के लिए रेंज में (0, 3):
            आँकड़े = संग्रह। मुठभेड़ ([देखें [i] [j], [i] [j + १], दृश्य [i] [j + २], देखें [i] [j + ३]])
            यदि आंकड़े [0] == 2 और (आंकड़े [राज्य [0]] == 2 या आंकड़े [राज्य [0]] = 2:
                k में सीमा के लिए (0, 3):
                    अगर देखें [i] [j + k] == ०:
                        टूटना
                अगर (i == 0 या दृश्य [i-1] [j + k]! = 0) और (अनुपलब्ध_प्वाइंट्स या i in {1, 3, 5}):
                    #print (pprint.pformat (view) + 'Turn:' + str (टर्न) + 'खिलाड़ी:' + str (स्थिति [0]) + 'प्लेटफ़ॉर्म मूव')
                    वापसी j + k, राज्य
                अन्य:
                    एल में सीमा के लिए (k, 3):
                        अगर देखें [i] [j + l] == 0:
                            टूटना
                        अगर (i == 0 या दृश्य [i-1] [j + l]! = 0) और (अनुपलब्ध_प्वाइंट्स या i in {1, 3, 5}):
                     # प्रिंट (pprint.pformat (view) + 'Turn:' + str (टर्न) + 'खिलाड़ी:' + str (स्थिति [0]) + 'प्लेटफ़ॉर्म मूव')
                            वापसी j + l, स्थिति

    #fallback -> यादृच्छिक
    जबकि सच:
        j = random.randrange (0, 7)
        अगर देखें [-1] [जे] == ०:
            #print (pprint.pformat (view) + 'Turn:' + str (टर्न) + 'खिलाड़ी:' + str (स्थिति [0]) + 'random Move')
            वापसी जम्मू, राज्य

Run_game को ठीक करने के लिए धन्यवाद!

बदलाव का:

  • v2 क्षैतिज अवरोधन जोड़ता है - यदि, 4 की एक पंक्ति में, दो खाली स्थान हैं और एक ही खिलाड़ी द्वारा दो स्पॉट भरे गए हैं, तो यह उनमें से एक को भरने के लिए तीन को एक पंक्ति में भरने का प्रयास करेगा / विरोधियों की पंक्ति को अवरुद्ध करेगा, जो कि उम्मीद है कि निम्नलिखित घुमावों पर पूंजीकृत होना।

3
साइट पर आपका स्वागत है। मैंने कोड को बदलने के लिए संपादन को अस्वीकार करने के लिए मतदान किया, यह एक टिप्पणी के रूप में सबसे अच्छा होगा, इस तरह से ओपी यह तय कर सकता है कि कोड के साथ क्या करना है।
एड हॉक गार्फ हंटर

मुख्य पोस्ट पर टिप्पणी करने के लिए मेरे पास पर्याप्त प्रतिष्ठा नहीं है। मैं एक संपादन कैसे वापस ले सकता हूं?
Syfer Polski

संपादन वापस लेने की आवश्यकता नहीं है (मुझे नहीं लगता कि आप वैसे भी कर सकते हैं)। भविष्य में टिप्पणी करना पर्याप्त होगा लेकिन चूंकि आपने अपने उत्तर में कहा है कि संभावना है कि ओपी देखेगा। साथ ही मुझे लगता है कि ओपी यह देखेगा कि आपने सुझाव दिया था और भले ही उसे अस्वीकार कर दिया गया हो, उसे संपादित करें।
तदर्थ गार्फ हंटर

कारण यह है कि मैं संपादन वापस लेना चाहता हूं क्योंकि मैं परिवर्तनों में एक पंक्ति से चूक गया था, जिसके बिना संपादित कोड चलाने में पूरी तरह से विफल हो जाएगा। मैंने इसे अपने पोस्ट में संपादित सुझाव में शामिल किया है। आपके सहयोग के लिए धन्यवाद!
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

यह स्पष्ट रूप से गैर-प्रतिस्पर्धात्मक है, लेकिन फिर भी डिबगिंग के लिए बहुत उपयोगी है ... और आश्चर्यजनक रूप से मज़ेदार, यदि आप अपने बॉट को अच्छी तरह से जानते हैं कि धोखा देना है: डी तो मैं और अधिक प्रस्तुतियाँ प्रेरित करने की उम्मीद में पोस्ट कर रहा हूं:

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-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-6) 1
[[२, १, १, १, १, २, ०],
 [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],
 [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 प्लेयर: 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-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-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, 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-6) 2
[[०, २, २, १, २, ०, ०],
 [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-6) 4
[[०, २, २, १, २, ०, ०],
 [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-6) 4
[[०, २, २, १, २, ०, ०],
 [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, 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],
 [०, ०, १, ०, ०, ०, ०]] मोड़: १ 2 खिलाड़ी: २ मिसिंग पॉइंट: २
आपकी चाल क्या है? (0-6) 5
[[०, २, २, १, २, १, १],
 [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-6) 
आपकी चाल क्या है? (0-6) 6
[[०, २, २, १, २, १, १],
 [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-6) 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, 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-6) 6
[[०, २, २, १, २, १, १],
 [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],
 [०, ०, १, १, ०, ०, ०] मोड़: २ 2 खिलाड़ी: २ मिसिंग पॉइंट: १
आपकी चाल क्या है? (0-6) 5
[[१, २, २, १, २, १, १],
 [१, १, १, २, २, २, १],
 [0, 2, 1, 2, 1, 2, 2],
 [0, 1, 1, 2, 2, 0, 2],
 [0, 0, 2, 1, 0, 0, 0],
 [०, ०, १, १, ०, ०, ०] मोड़: २ ९ खिलाड़ी: २ मिसिंग पॉइंट: ०
आपकी चाल क्या है? (0-6) 5
[[१, २, २, १, २, १, १],
 [१, १, १, २, २, २, १],
 [0, 2, 1, 2, 1, 2, 2],
 [0, 1, 1, 2, 2, 2, 2],
 [0, 0, 2, 1, 0, 0, 0],
 [०, ०, १, १, ०, ०, ०] मोड़: २ ९ विजेता: २
1 का 1 राउंड

नाम ड्रॉ हानियाँ जीत स्कोर
मैनुअल_बॉट: 0 0 2 1.000 zsani_bot_2: 0 2 0 -1.000

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.