Python Tictaoe接头错误

Python Tictaoe接头错误,python,Python,这是我的Tic.Tac.Toe游戏,效果不错。但我有一个功能来检查电路板是否已满,但这不起作用。我可以让它转到播放器1,然后是播放器2,但在它停止之后。有人能帮忙吗 # Tic Tac Toe Game import time import sys who = 'p1' finished = 'no' board = [0,1,2, 3,4,5, 6,7,8] def show(): print (board[0], '|', board [1],

这是我的Tic.Tac.Toe游戏,效果不错。但我有一个功能来检查电路板是否已满,但这不起作用。我可以让它转到播放器1,然后是播放器2,但在它停止之后。有人能帮忙吗

# Tic Tac Toe Game
import time
import sys
who = 'p1'
finished = 'no'
board = [0,1,2,
         3,4,5,
         6,7,8]

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 checkWin():
    if board[0] == 'x' and board[3] == 'x' and board[6] == 'x':
        finished = 'yes'
        return True
    elif board[0] == 'y' and board[3] == 'y' and board[6] == 'y':
        finished = 'yes'
        return True
    elif board[1] == 'x' and board[4] == 'x' and board[7] == 'x':
        finished = 'yes'
        return True
    elif board[1] == 'y' and board[4] == 'y' and board[7] == 'y':
        finished = 'yes'
        return True
    elif board[2] == 'y' and board[5] == 'y' and board[8] == 'y':
        finished = 'yes'
        return True
    elif board[2] == 'x' and board[5] == 'x' and board[8] == 'x':
        finished = 'yes'
        return True
    elif board[0] == 'y' and board[1] == 'y' and board[2] == 'y':
        finished = 'yes'
        return True
    elif board[0] == 'x' and board[1] == 'x' and board[2] == 'x':
        finished = 'yes'
        return True
    elif board[3] == 'x' and board[4] == 'x' and board[5] == 'x':
        finished = 'yes'
        return True
    elif board[3] == 'y' and board[4] == 'y' and board[5] == 'y':
        finished = 'yes'
        return True
    elif board[6] == 'y' and board[7] == 'y' and board[8] == 'y':
        finished = 'yes'
        return True
    elif board[6] == 'x' and board[7] == 'x' and board[8] == 'x':
        finished = 'yes'
        return True
    elif board[0] == 'x' and board[4] == 'x' and board[8] == 'x':
        finished = 'yes'
        return True
    elif board[0] == 'y' and board[4] == 'y' and board[8] == 'y':
        finished = 'yes'
        return True
    elif board[2] == 'y' and board[4] == 'y' and board[6] == 'y':
        finished = 'yes'
        return True
    elif board[2] == 'x' and board[4] == 'x' and board[6] == 'x':
        finished = 'yes'
        return True
    else:
        return False

def boardFull():
    if board[0] == 'x' or board[0] == 'y' and board[1] == 'x' or board[1] == 'y' and board[2] == 'x' or board[2] == 'y' and board[3] == 'x' or board[3] == 'y' and board[4] == 'x' or board[4] == 'y' and board[5] == 'x' or board[5] == 'y' and board[6] == 'x' or board[6] == 'y' and board[6] == 'x' or board[6] == 'y' and board[7] == 'x' or board[7] == 'y' and board[8] == 'x' or board[8] == 'y':
        finished = 'yes'
        return True
    else:
        finished = 'no'
        return False


print ('Welcome to a two-player Tic.Tac.Toe Game!')
time.sleep(2)
print ("Just pick a spot to put your mark!")
time.sleep(1.5)
print ('Now, start!')
time.sleep(0.2)
print (show())

while checkWin() == False and boardFull() == False:
    while who == 'p1':
        try:
            p1 = int(input('Player 1, select a spot: '))

            if board[p1] != 'x' and board[p1] != 'o':
                board[p1] = 'x'
                who = 'p2'
                break

            else:
                print ('This spot is taken.')
                pass

        except (ValueError, IndexError):
            print ('That is not available. Please try again.')

    print (show())
    while who == 'p2':
        try:
            p2 = int(input('Player 2, select a spot: '))

            if board[p2] != 'x' and board[p2] != 'o':
                board[p2] = 'o'
                who = 'p1'
                break

            else:
                print ('This spot is taken.')
                pass

        except (ValueError, IndexError):
            print ('That is not available. Please try again.')

    print (show())
while checkWin() == True:
    if boardFull() == False:

        # x
        if board[0] == 'x' and board[3] == 'x' and board[6] == 'x':
            print ('Player 1 won!')
            sys.exit()
        elif board[1] == 'x' and board[4] == 'x' and board[7] == 'x':
            print ('Player 1 won!')
            sys.exit()
        elif board[2] == 'x' and board[5] == 'x' and board[8] == 'x':
            print ('Player 1 won!')
            sys.exit()
        elif board[0] == 'x' and board[1] == 'x' and board[2] == 'x':
            print ('Player 1 won!')
            sys.exit()
        elif board[3] == 'x' and board[4] == 'x' and board[5] == 'x':
            print ('Player 1 won!')
            sys.exit()
        elif board[6] == 'x' and board[7] == 'x' and board[8] == 'x':
            print ('Player 1 won!')
            sys.exit()
        elif board[0] == 'x' and board[4] == 'x' and board[8] == 'x':
            print ('Player 1 won!')
            sys.exit()
        elif board[2] == 'x' and board[4] == 'x' and board[6] == 'x':
            print ('Player 1 won!')
            sys.exit()
    # y
        else:
            print ('Player 2 won!')
        sys.exit()
    else:
        print ("It's a tie.")

很明显,问题在于101所说的boardFull的实现。我没有记忆优先级规则(这就是为什么在复杂表达式中使用括号是个好主意,即使在技术上不需要括号的地方),但我相信“或”的优先级低于“和”,意思是如果设置了
board[0]
,则
boardFull
将返回
True
,不管董事会的其他状态如何

我首先修改
boardFull
以接受
board
作为参数,而不是让它检查全局变量的状态。这使得函数更容易推理,更容易测试,并提高了可重用性。我还编写了一个简单的测试套件来测试其行为:

import unittest

def create_board():
    return list(range(0, 9))

def board_full(board):
    if board[0] == 'x' or board[0] == 'y' and board[1] == 'x' or board[1] == 'y' and board[2] == 'x' or board[2] == 'y' and board[3] == 'x' or board[3] == 'y' and board[4] == 'x' or board[4] == 'y' and board[5] == 'x' or board[5] == 'y' and board[6] == 'x' or board[6] == 'y' and board[6] == 'x' or board[6] == 'y' and board[7] == 'x' or board[7] == 'y' and board[8] == 'x' or board[8] == 'y':
        finished = 'yes'
        return True
    else:
        finished = 'no'
        return False

class TestBoardFull(unittest.TestCase):
    def setUp(self):
        self.board = create_board()

    def test_default_board_is_not_full(self):
        default_board = self.board
        self.assertFalse(board_full(default_board))

    def test_board_after_two_moves_is_not_full(self):
        board = self.board
        board[0] = 'x'
        board[1] = 'y'
        self.assertFalse(board_full(board))

    def test_board_is_full_after_all_tiles_marked(self):
        board = self.board
        board[0] = 'x'
        board[1] = 'y'
        board[2] = 'x'
        board[3] = 'y'
        board[4] = 'x'
        board[5] = 'y'
        board[6] = 'x'
        board[7] = 'y'
        board[8] = 'x'
        self.assertTrue(board_full(board))

if __name__ == '__main__':
    unittest.main()
目前,
board\u full(board)
使用您的原始实现,我们可以显示它不正确:

F。。
======================================================================
失败:两次移动后测试板未满(主测试板已满)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“C:/Users/.PyCharmCE2016.3/config/scratches/scratch.py”,第26行,在两次移动后的测试板中未满
自身资产虚假(董事会成员(董事会成员))
断言者错误:True不是false
----------------------------------------------------------------------
在0.000秒内运行了3次测试
失败(失败=1)
然后,我尝试更正实现:

def board_full(board):
    return all(tile == 'x' or tile == 'y' for tile in board)
至少根据我目前定义的测试,测试它是否有效:

。。。
----------------------------------------------------------------------
在0.000秒内运行了3次测试
好啊

您有很多问题。一种是你在船上设置了
x
o
,但你选择了
x
y
。接下来是两次移动后返回
True
。但您可以计算正确的移动,而不是检查所有单元格。正确移动9次后,棋盘将满


您的代码可以更短

show()

checkWin()
可以返回
False
或winner
x
o
,这被视为
True
,最后您不必再次检查谁是赢家

循环中,当玩家1和2移动时,你不检查棋盘是否已满,所以游戏挂起,因为玩家1移动后棋盘已满,玩家2无法移动


checkWin()。
我数了数正确的移动,以检查棋盘是否已满-移动9步后,棋盘应已满

# Tic Tac Toe Game

import time

# --- fucntions ---

def show(board):
    print('''-----------
 {} | {} | {}
-----------
 {} | {} | {}
-----------
 {} | {} | {}
-----------'''.format(*board))


def check_winner(board, q):

    if board[0] == q and board[3] == q and board[6] == q:
        return True
    elif board[1] == q and board[4] == q and board[7] == q:
        return True
    elif board[2] == q and board[5] == q and board[8] == q:
        return True

    elif board[0] == q and board[1] == q and board[2] == q:
        return True
    elif board[3] == q and board[4] == q and board[5] == q:
        return True
    elif board[6] == q and board[7] == q and board[8] == q:
        return True

    elif board[0] == q and board[4] == q and board[8] == q:
        return True
    elif board[2] == q and board[4] == q and board[6] == q:
        return True

    return False

# --- start ---

board = list(range(9))

player = 'x'
number = '1'

moves = 0

print('Welcome to a two-player Tic.Tac.Toe Game!')
time.sleep(2)

print("Just pick a spot to put your mark!")
time.sleep(1.5)

print('Now, start!')
time.sleep(0.2)

show(board)

while True:

    while True:
        try:
            idx = int(input('Player {}, select a spot: '.format(number)))

            if board[idx] not in ('x', 'o'):
                board[idx] = player
                moves += 1
                break
            else:
                print('This spot is taken.')

        except (ValueError, IndexError):
            print('That is not available. Please try again.')

    show(board)

    winner = check_winner(board, player)

    if winner or moves == 9:
        break

    # change player after checking who win 
    if player == 'x':
        player = 'o'
        number = '2' 
    else:
        player = 'x'
        number = '1'

if winner:
    print('Player {} won!'.format(number))
else:
    print("It's a tie.")

首先,如果电路板[0]=“x”或…,则函数
boardFull
开头:返回True
,这是错误的;即使只有平方0是
x
,它也将计算为
True
。您应该用一个值填充板-即
0
,然后您必须检查
board[0]!='0'
而不是
board[0]='x'或board[0]='y'
您可以使用参数创建
checkWin
,然后运行
checkWin('x')
checkWin('y'))
-这样,
checkWin
中的代码会更简单。who=='p1':
who=='p2':
中的循环非常相似-您可以创建一个函数并使用不同的参数执行-代码会更简单、更短。@Something,我对您的代码做了一些改进,以帮助您解决问题,并演示一种更具python风格和程序员友好的编写方法。如果您有任何疑问,请随时就要点发表评论。