2017-08-25 110 views
1

我正在做一個井字遊戲,並試圖創建一個函數,檢查是否連續3個相同的點有相同的輸入'x'或' 0' 。我正在試圖觸發遊戲的three_in_row功能。我試圖找出如何以一種簡單的方式做到這一點,所以如果播放3個X或0,所有的行或列都將觸發......這就是我迄今爲止所做的。這是蟒蛇2.7.13如何檢查連續3在井字棋遊戲

(這只是部分的代碼,我認爲應該是相關的)

def setup_board(size): 
    board = [] 
    for row in range(size): 
     board.append([]) 
     for col in range(size): 
      board[row].append(empty) 
    return board 

def three_in_row(b):  
    b[0][0] and b[0][1] and b[0][2] == 'x' 

def game_over(b): 
    if three_in_row(b) == True: 
     print "Congratulations You Win!" 
    else: 
     return False 

def tic_tac_toe(): 
    b = setup_board(3) 
    run_game(b) 
+0

'和'不像那樣鏈接。 '如果b [0] [0] == b [0] [1] == b [0] [2] =='x''會做你所期望的。 – TemporalWolf

+1

我建議你製作if和ifelse語句,以便檢查所有可能的場景,並且如果任何獲勝結果匹配時返回,如果我在Python中聲明不太昂貴,如果我記得正確,那麼你的程序不應該在速度上受到影響。這也應該使代碼易於閱讀,這是python – Sentinel

回答

1

在我看來,它可能會更有意義存儲X的爲+1和O的作爲-1,以便您可以輕鬆地進行算術檢查遊戲是否結束。

例如:

def three_in_row(b): 
    xWin = check_winner(b,3) 
    oWin = check_winner(b,-3) 
    return xWin | oWin 

def check_winner(b, valToCheck): 
    foundWin = any(sum(r) in {valToCheck} for r in b) # check rows 
    # now check columns 
    for i in range(3): 
     foundWin = foundWin | (sum([b[j][i] for j in range(3)]) == valToCheck) 
    # now check diagonals 
    foundWin = foundWin | (sum([b[i][i] for i in range(3)]) == valToCheck) 
    foundWin = foundWin | (sum([b[i][2-i] for i in range(3)]) == valToCheck) 
    return foundWin 

由於攪拌機的以下更簡潔方法:

def three_in_row(b): 
    return any(sum(r) in {3, -3} for r in b) 
+2

中的王原則,b中的任何(在{3,-3}中的sum(r)}都是更清潔的。 – Blender

+0

不錯,我喜歡那樣!我會補充答案。 – nanojohn

+0

此解決方案是否檢查對角線? –

0
def line_match(game): 
    for i in range(3): 
     set_r = set(game[i]) 
     if len(set_r) == 1 and game[i][0] != 0: 
      return game[i][0] 
    return 0 
#transposed column function for future use 
#def column(game): 
# trans = numpy.transpose(game) 
# for i in range(3): 
#  set_r = set(trans[i]) 
#  if len(set_r) == 1 and trans[i][0] != 0: 
#   return list(set_r)[0] 

def diagonal_match(game): 
    if game[1][1] != 0: 
     if game[1][1] == game[0][0] == game[2][2]: 
      return game[1][1] 
     elif game[1][1] == game[0][2] == game[2][0]: 
      return game[1][1]   
    return 0 
0

的正確語法的檢查可以是:

b[0][0] == 'x' and b[0][1] == 'x' and b[0][2] == 'x' 

或(更簡潔地):

b[0][0] == b[0][1] == b[0][2] == 'x' 

您還缺少一個只是你的檢查之前,如:

return b[0][0] == b[0][1] == b[0][2] == 'x' 

不管怎麼說,您的代碼不遍歷所有行。一個可能的修正將是:

def three_in_row(b): 
    for row in rage(0, 3): 
     if b[row][0] == b[row][1] == b[row][2] == 'x': 
      return True 
    return False 

做一個three_in_column(B)應該是相當容易(改變B [行] [N]中B [n]的[柱]),所以也是手動檢查兩條對角線。