tictactoe迭代问题。功能错误

时间:2015-08-03 21:31:33

标签: function python-3.x parameters

我是编程新手(约2个月自学)。我正在尝试创建一个tic tac toe游戏,并将其作为练习函数和传递参数的机会。

我已经完成了大部分工作(现在我将添加AI和计算机对手)但是当其中一个人类玩家获胜时,调用endgame()函数但是它没有按预期工作。它以某种方式调用自己,你必须说N在程序终止之前三次结束游戏。我无法在这一个人身上看到树木的木材,所以我将不胜感激。

我知道我的一些编码不会太棒,所以请不要拖钓。

由于

肖恩

def start():

    choices = [" "," "," "," "," "," "," "," "," "]
    while checkwin(choices)==False:
        board(choices)
        getchoice(choices)

def board(choices):

    print("+---+---+---+")
    print("+ "+choices[0]+" + "+choices[1]+" + "+choices[2]+" +")
    print("+---+---+---+")
    print("+ "+choices[3]+" + "+choices[4]+" + "+choices[5]+" +")
    print("+---+---+---+")
    print("+ "+choices[6]+" + "+choices[7]+" + "+choices[8]+" +")
    print("+---+---+---+")

def endgame(winner):

    print("The winner is "+ winner)
    playagain=input("Another game? Y/N")
    playagain = playagain.upper()
    if playagain == "N":
        print("Thanks, hope to see you again soon.")
    else:
        start()


def getchoice(choices):

    userchoice = int(input ("Where would you like to put your X?"))
    index = userchoice-1
    while choices[index]!=" ":
        userchoice = int(input ("That space is taken. Where would you like to put your X?"))
        index = userchoice-1

    choices[index]="X"
    board(choices)
    if checkwin(choices)==False:
        userchoice = int(input ("Where would you like to put your O?"))
        index = userchoice-1
        while choices[index]!=" ":
            userchoice = int(input ("That space is taken. Where would you like to put your O?"))
            index = userchoice-1

        choices[index]="O"
    checkwin(choices)
    return choices

def checkwin (c):

    if checkwin1(c)==False:
        if checkwin2 (c)==False:
            return False
        else:
            endgame("Player 2")
    else:
        endgame("Player 1")

def checkwin1(c):   

    return ((c[0]=="X" and c[1]=="X" and c[2]=="X") or
(c[3]=="X"and c[4]=="X" and c[5] =="X") or
(c[6]=="X"and c[7]=="X" and c[8] =="X") or
(c[0]=="X"and c[3]=="X" and c[6] =="X" )or
(c[1]=="X"and c[4]=="X" and c[7] =="X") or
(c[2]=="X"and c[5]=="X" and c[8] =="X") or
(c[0]=="X"and c[4]=="X" and c[8] =="X") or
(c[6]=="X"and c[4]=="X" and c[2] =="X"))

def checkwin2(c):   

    return ((c[0]=="O" and c[1]=="O" and c[2]=="O") or
(c[3]=="O"and c[4]=="O" and c[5] =="O") or
(c[6]=="O"and c[7]=="O" and c[8] =="O") or
(c[0]=="O"and c[3]=="O" and c[6] =="O" )or
(c[1]=="O"and c[4]=="O" and c[7] =="O") or
(c[2]=="O"and c[5]=="O" and c[8] =="O") or
(c[0]=="O"and c[4]=="O" and c[8] =="O") or
(c[6]=="O"and c[4]=="O" and c[2] =="O"))

start()   

1 个答案:

答案 0 :(得分:1)

让我们想象X赢了三次(因为这可能是导致它结束"结束")三次。

然后转到if checkwin(choices)==False:内的getchoice(), ' checkwin()'愉快地打电话给endgame()endgame()返回,然后getchoice()继续执行。

getchoice()结束时,再次调用checkwin(),结果相同。

getchoice()返回后,我们会再次回到while checkwin(choices)==False: start()内,再次使用相同的结果。

另请注意,如果您实际连续玩了多个游戏,您会发现这种情况发生的次数更多。

同时尝试取胜,我认为在这种情况下,你只需要对你的提示两次说不。

编辑:

class TicTacToeGame:
    INCOMPLETE = 0
    WINNER_PLAYER_1 = 1
    WINNER_PLAYER_2 = 2
    DRAW = 3

    SYMBOLS=["X","O"," "]

    def __init__(self,player_1, player_2):
        self.board = [[-1]*3,[-1]*3,[-1]*3]
        self.players = [player_1,player_2]
        self.current_turn = 0;

    def advance(self):
        if self.calcGameState() != TicTacToeGame.INCOMPLETE:
            return
        while True:
            x,y = self.players[self.current_turn].getMove();
            if x < 0 or x > 2 or y < 0 or y>2 :
                continue
            if self.board[y][x] == -1:
                break
        self.board[y][x] = self.current_turn
        self.current_turn += 1
        self.current_turn %= 2

    def stringify(self):
        re = ""
        fr = True
        for row in self.board:
            if fr:
                fr=False
            else:
                re+= "\n" + "---+" * 2 + "---\n"
            fe = True
            for el in row :
                if fe:
                    fe = False;
                else:
                    re += "|"
                re += " " + TicTacToeGame.SYMBOLS[el] + " "
        return re

    def calcGameState(self):
        for i in range(0,3):
            #col
            if all(self.board[i][j] == self.board[i][0] for j in range(0,3)) and self.board[i][0] != -1:
                return self.board[i][0] + 1
            #row
            if all(self.board[j][i] == self.board[0][i] for j in range(0,3)) and self.board[0][i] != -1:
                return self.board[0][i] + 1
        if all(self.board[i][i] == self.board[0][0] for i in range(0,3)) and self.board[0][0] != -1:
            return self.board[0][0] + 1
        if all(self.board[i][2-i] == self.board[0][2] for i in range(0,3)) and self.board[0][2] != -1:
            return self.board[0][2] + 1
        if all(self.board[i][j] != -1 for i in range(0,3) for j in range(0,3)):
            return TicTacToeGame.DRAW
        return TicTacToeGame.INCOMPLETE

    def stringResult(self):
        res = self.calcGameState()
        if res == TicTacToeGame.INCOMPLETE:
            return "Incomplete"
        if res == TicTacToeGame.DRAW:
            return "Draw"
        return "Player " + self.SYMBOLS[res-1] + " Won!"

class HumanPlayer:
    def __init__(self):
        self.board = None

    def setGame(self,game):
        self.game = game

    def getMove(self):
        print(self.game.stringify())
        print("Current turn is: " + self.game.SYMBOLS[self.game.current_turn])
        print("enter row for move")
        y = input()
        print("enter col for move")
        x = input()
        return int(x)-1,int(y)-1

def playAgain():
    playagain=input("Another game? Y/N\n > ")
    playagain = playagain.upper()
    if playagain == "N":
        print("Thanks, hope to see you again soon.")
        return False
    return True

while True:
    p = HumanPlayer()
    t = TicTacToeGame(p,p)
    p.setGame(t)

    while t.calcGameState() == TicTacToeGame.INCOMPLETE:
        t.advance()
    print(t.stringResult())
    if not playAgain():
        break;