2017-12-03 158 views
1

我創建一個管理井字棋遊戲,我創建列表簡單的幫助

[['', '', ''], 
['', '', ''], 
['', '', '']] 

列表創建遊戲網的節目,我想程序停止,當它發現像

[['x', 'x', 'x'], 
['', '', ''], 
[ '', '', ''] 

在這種情況下,例如一場比賽,我會因此需要能夠說,在其他框中有可能是任何字符,「O」,' x',''

我會那python如果網格是一個獲勝的網格程序必須停止

+0

我不知道怎麼跟蟒蛇,在另一種情況可能是任何符號,遊戲必須停止 – MISTERCEC

回答

1

你會做什麼來檢查「手動」?

  1. 檢查第一行,如果這三個位置的球員

    if b[0][0]==code and b[0][1]==code and b[0][2]==code: return True

  2. 檢查第二行

  3. 檢查第三排
  4. 檢查第一列的代碼,如果所有三個是玩家的代碼

    if b[0][0]==code and b[1][0]==code and b[2][0]==code: return True

  5. 檢查第二和第三列太

  6. 檢查第一和第二傾斜太

的行列數很容易寫一個循環,而不是複製粘貼代碼

還有其他方法可以編寫較短的代碼(使用諸如all(b[i][j] == code for j in range(3))之類的東西)或更快的代碼(使用諸如比特而不是字符和單個整數的所有東西x s或o S)。

另一個「技巧」是將電路板保持在一個單一的陣列而不是一個矩陣,並使用佔位符(例如,「 - 」)爲空方塊

board = ['-', '-', '-', 
     '-', '-', '-', 
     '-', '-', '-'] 

,那麼你可以檢查使用正則表達式

s = "".join(board) # change to a single string 
if re.match("xxx......", s) return True # first row check 
if re.match("...xxx...", s) return True # second row check 
if re.match("......xxx", s) return True # third row check 
if re.match("x..x..x..", s) return True # first col check 
if re.match(".x..x..x.", s) return True # second col check 
if re.match("..x..x..x", s) return True # third col check 

我會用做位獲獎罷工:董事會是由兩個數字來表示0 .. 0.511:用於x馬克是其中一個號碼,另一個用於o馬克是其中:

# board bits are 
# 
#  1  2  4 
#  8  16  32 
# 64 128 256 
# 
Xs = Os = 0 # empty board 

win_codes = [1+2+4, 8+16+32, 64+128+256, # rows 
      1+8+64, 2+16+128, 4+32+256, # cols 
      1+16+256, 4+16+64]   # diags 

def wins(pos): 
    return any((pos & c) == c for c in win_codes) 

鑑於位置的總數目也SM所有(512)獲勝者還可以預先計算和存儲在表

win_pos = [wins(pos) for pos in range(512)] 

然後檢查僅僅是

if win_pos[Xs]: ... # player X won the game 
+0

isn'不可能做一個包含所有可能獲勝格子的列表,所以一個原始格子中所有位置的格子都是相等的,另一個格子可能是一切,也許用re.match模塊我可以這樣說? – MISTERCEC

+0

@MISTERCEC:我已經添加了一個基於正則表達式的方法 – 6502

+0

哦完美,所以我可以直接在一個列表中轉換列表的列表? – MISTERCEC

0

如果我正確地解釋了你想說的話,你不需要。 Python不是靜態類型 - 也就是說,任何變量都可以包含任何類型。在靜態類型語言中,您需要聲明(或者爲您推斷)您的遊戲網格類型爲list of list of char或同等類型。因此,您可以將元素設置在任何位置,以滿足您的需求 - 包括像'o'和'x'這樣的字符。

TL; DR你不需要。

注意:在程序中間無意間更改變量的類型通常被認爲是不好的風格,因爲這會混淆你和其他人。

+0

不,我必須改變標題你說得對,我希望當程序到達像這樣的位置時:[['x','x','x'], [ '','o',''], ['o','',o'']。它停止,因爲一個球員贏了,所以當在列表中我有這個。 ['x','x','x'],不管角色在其他列表中出現,遊戲必須停止 – MISTERCEC

+0

@MISTERCEC,這似乎與您在問題中寫下的內容不同。你的標題'如何判斷任何字符是否正確'意味着你想要一種方法向翻譯人員顯示你的鋸齒狀列表可以包含任何字符,而這正如我在我的回答中所說的,沒有必要 – Restioson