2016-12-14 88 views
0

嗨我在编码tic tac toe游戏时遇到了一些麻烦,其中计算机通过选择0到1之间的数字随机播放。我尝试了一个代码,但是我得到了如下代表的虚幻情形:Tic Tac Toe WinCheck Def

OOO

XXX

OOO

我希望把我的代码,检查是否存在一举一动赢家东西。如果有人获胜,我希望比赛停止并告诉谁是胜利者,或者谁没有赢。而且我也不希望输出如下图所示。我只想要一块显示板(如果可能的话)。

The output of this programme is that.

这里是我的代码:

import random 

board = [] 
line= 3 
col = 3 
for i in range (line) : 
    for j in range (col): 
     board.append(" ") 


def show(): 
    print(board[0],'|',board[1],'|',board[2]) 
    print('--------------') 
    print(board[3],'|',board[4],'|',board[5]) 
    print('--------------') 
    print(board[6],'|',board[7],'|',board[8]) 
    print() 

# Verify the possibility of position to take. 
B=1 
C=2 
D=3   
def check(A, B, C, D): 
    if board[B] == A and board[C] == A and board[D] == A : 
     return True    

# Win conditions 
def Winner(G): 
    if check(G, 0, 1, 2): 
      True 
    if check(G, 0, 3, 6): 
      True 
    if check(G, 0, 4, 8): 
      True 
    if check(G, 1, 4, 7): 
      True    
    if check(G, 2, 5, 8): 
      True   
    if check(G, 2, 4, 6): 
      True  
    if check(G, 3, 4, 5): 
      True 
    if check(G, 6, 7, 8): 
      True 


player1 = "O" 
player2 = "X" 
play=random.randint(0,1) 
if play == 1: 
    player1 = "X" 
    player2 = "O" 

while True: 
     random.seed() 
     place=random.randint(0,8) 
     if board[place] != "O" and board[place] != "X" : 
      board[place] = player1 
      if Winner(player1)==True: 
       print("~~~~~~~ the player ",player1," wins~~~~~~~")   
       break; 

      while True: 
       random.seed() 
       place=random.randint(0,8) 

       if board[place] != "O" and board[place] != "X" : 
        board[place] = player2 
        if Winner(player2)==True: 
         print("~~~~~~~ the player ",player2," wins~~~~~~~")   
         break; 

        break; 

     else: 
      print("This position is already taken")   

     show() 
+0

作为一个声明''真''完全没有。你需要''返回True''才能真正表明胜利。 (另外,在循环中调用''random.seed()''是一个非常糟糕的主意 - 每次运行一个程序就足够了,或者是零,因为这已经完成了。) – jasonharper

回答

0

代码:

import random 
board = [] 
for x in range(9): 
    board.append(" ") 
def show(): 
    print(board[0],'|',board[1],'|',board[2]) 
    print('--------------') 
    print(board[3],'|',board[4],'|',board[5]) 
    print('--------------') 
    print(board[6],'|',board[7],'|',board[8]) 
def check(A, B, C, D): 
    if board[B] == A and board[C] == A and board[D] == A : 
     return True 
def Winner(G): 
    ret = False 
    if check(G, 0, 1, 2): 
      ret = True 
    if check(G, 0, 3, 6): 
      ret = True 
    if check(G, 0, 4, 8): 
      ret = True 
    if check(G, 1, 4, 7): 
      ret = True    
    if check(G, 2, 5, 8): 
      ret = True   
    if check(G, 2, 4, 6): 
      ret = True  
    if check(G, 3, 4, 5): 
      ret = True 
    if check(G, 6, 7, 8): 
      ret = True 
    return ret 
def filled(): 
    ll = 0 
    for x in board: 
     if x == " ": 
      ll = 11 + 1 
    if ll > 0: 
     return False 
    else: 
     return True 
done = False 
turn = "O" 
tie = False 
while done == False: 
    place = random.randint(0, 8) 
    if board[place] == " ": 
     board[place] = turn 
     if Winner(turn) == True: 
      done = True 
     else: 
      if filled() == True: 
       done = True 
       tie = True 
      else:#change turn 
       if turn == "X": 
        turn = "O" 
       else: 
        turn = "X" 
if tie == True: 
    print ("The game was a tie. No winner.") 
    show() 
else: 
    print("~~~~~~~ the player '",turn,"' wins~~~~~~~") 
    show() 

这应该完成您的所有需求。

只需在每次有效转弯后检查赢家()和填充()。在每一次成功的循环之后都有循环改变,以防止重复。

注意:'O'首先在循环开始前将变化变量改为'X'。

+0

非常感谢它,现在效果很好:) –

0

Winner()功能不返回任何东西,所以默认它含蓄地返回False无论输入是什么。它应该包括return True,而不是仅仅True(这确实什么都没有),是这样的:

def Winner(G): 
    if check(G, 0, 1, 2) or check(G, 0, 3, 6) or check(G, 0, 4, 8) or check(G, 1, 4, 7) or check(G, 2, 5, 8) or check(G, 2, 4, 6) or check(G, 3, 4, 5) or check(G, 6, 7, 8): 
     return True 
    else 
     return False 

主要的一点是应该return True。其余主要只是款式偏好 - 我更喜欢单一的if,有很多or条件。其他人可能更喜欢大量if陈述全部与return True

(从技术上讲,你不需要else部分,因为这将有效地默认返回False无论如何,但它使得它更具有可读性。你也可以只删除else线和反向缩进return False这使得它包罗万象的整个函数,而不是为if

+0

是的。但是如果是平局,我该怎么办? –

+0

这是另外一个问题。但是,您可以为两个用户运行'winner()'(即运行两次),如果您获得'赢家(A)==赢家(B)',那么这将是一个平局。 –

+0

在完成所有位置之前,它会显示消息(玩家x赢或玩家O赢)。我希望在赢得消息之前将所有职位填入O或X –