2015-10-16 39 views
2
#!/usr/bin/python3.4 
import tkinter as tk 
import time 
import os 
root = tk.Tk() 




label = tk.Label(root) 
root.configure(background='#0C142E') 

ButtonTable=[] 

Turn = 0 # 0(x) 1(O) 
XO=["X","O"] 
wins = [ 
    '111 000 000', '000 111 000', '000 000 111', # Across 
    '100 100 100', '010 010 010', '001 001 001', # Down 
    '100 010 001', '001 010 100',     # Diagonal 
] 
GridArray=["","","","","","","","","",] # Gets replaced with x,o to record progress 
def CheckWin(): 
    #something goes here? 
def CreateButtonmid(Text,side, Return): 
    return CreateButton 
def ChooseButton(xx,b): 
    global Turn 
    b.configure(state = "disabled") 
    print(xx) 
    b.config(text=XO[Turn]) 
    GridArray[int(xx)]=XO[Turn] 
    CheckWon() 
    if Turn == 0: 
     Turn = 1 
    else: 
     Turn=0 
    label.configure(text="Turn: "+XO[Turn]) 
    print(GridArray) 
def CreateButton(Text,side,Return): 
    b = tk.Button(side,text=Text) 
    b.pack(side="left") 

    b.config(command=lambda: ChooseButton(Return,b)) 
    ButtonTable.append(b) 
    b.configure(background='#323642',bd=0,fg="white",height=5,width=10) 
    return b 

label.pack(side = "top") 
label.config(bg="#0C142E",fg="#fff",text="(STARTING:X)") 

topframe = tk.Frame(root) 
topframe.pack(side = "top") 

CreateButton("[]",topframe,("0")) 
CreateButton("[]",topframe,("1")) 
CreateButton("[]",topframe,("2")) 

midframe = tk.Frame(root) 
midframe.pack(side = "top") 
CreateButton("[]",midframe,("3")) 
CreateButton("[]",midframe,("4")) 
CreateButton("[]",midframe,("5")) 

bottomframe = tk.Frame(root) 
bottomframe.pack(side = "top") 
CreateButton("[]",bottomframe,("6")) 
CreateButton("[]",bottomframe,("7")) 
CreateButton("[]",bottomframe,("8")) 


root.mainloop() 

基本上它是一個多人遊戲,需要兩個人玩。什麼是檢查是否有人獲勝的最好方法。我不知道,我是新來編程,任何資源,以幫助這個或我的編碼隨時歡迎Python編程3.4.2,Naughts and Crosses。檢查如何查看遊戲是否獲勝的最佳方法?

+0

井字棋== Naughts翻山 –

+0

這取決於你是從哪裏來的。 –

+2

我沒有糾正你。我試圖幫助其他讀者(可能是不必要的)。 –

回答

2
def get_winner(grid): 
    '''returns 'X', 'O', or None''' 
    line_dxs = [ 
     # rows 
     (0,1,2), 
     (3,4,5), 
     (6,7,8), 
     # cols 
     (0,3,6), 
     (1,4,7), 
     (2,5,8), 
     # diags 
     (0,4,8), 
     (2,4,6) 
    ] 
    for dxs in line_dxs: 
     line = [grid[dx] for dx in dxs] 
     if line == ['X', 'X', 'X']: 
      return 'X' 
     elif line == ['O', 'O', 'O']: 
      return 'O' 

在行動:

>>> get_winner(['X', 'O', 'X', 
...    'O', 'O', 'X', 
...    'X', 'O', '' ]) 
'O' 
>>> get_winner(['X', 'O', 'X', 
...    'O', 'O', 'X', 
...    'X', '' , 'O' ]) 
>>> get_winner(['X', 'O', 'X', 
...    'O', 'O', 'X', 
...    'X', '' , 'X' ]) 
'X' 
1

您的數據表示使得比它需要更加努力這樣成爲。目前,您將網格存儲爲9個方格的列表,從左上角開始,按行進行,然後向下進行。例如,只需訪問(第1行第2列)中的方塊,就必須進行算術運算。

更好的表示方式可以讓你直接按行列索引尋址方塊。在Python中,計數從0開始,所以假設行是0,1,2,並且同樣也是列。兩個備選方案考慮:

  • 行的3元素的列表,每行3元素列表中的平方值在相應的欄目:

    grid = [["", "", ""], ["", "", ""], ["", "", ""]]

    有了這個grid,第i行中的正方形,第j列正好是grid[i][j]

  • dict

    dgrid = {(i,j): "" for i in range(3) for j in range(3)}

    利用該表示,在i行的正方形,柱j只是dgrid[i,j]。我將在後面的代碼中使用它。

檢查網格獲勝狀態現在簡單得多。這裏有一個函數來檢查排i是否具有player一場勝利(等於「X」或「O」,讓我們說):

def winning_row(i, player): 
    '''Return True if all entries in row i are equal to player. 
     player is either 'X' or 'O'. 
    ''' 
    return all(dgrid[i,j] == player for j in range(3)) 

您可以定義功能winning_column(j, player)類似。檢查對角線有點不同。我們可以使用winning_main_diagonal(player)winning_other_diagonal(player)這兩個函數。下面是後者:

def winning_other_diagonal(player): 
    return all(dgrid[i,2-i] for i in range(3)) 

這些功能都需要player參數,因爲你只需要一個特定的player後,檢查是否有獲勝的配置已經移動了。你不要需要檢查整個網格,看看是否有一些玩家贏了,如果是這樣的話。

這個函數報告是否誰只是通過標記方(i,j)移動player剛剛獲得:

def just_won(i, j, player): 
    if winning_row(i, player): 
     return True 
    if winning_column(j, player): 
     return True 
    if i == j and winning_diagonal(player): 
     return True 
    if I + j == 2 and winning_other_diagonal(player): 
     return True 
    return False 
相關問題