Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的Tic-Tac-Toe Python脚本有问题_Python_Python 3.x_Tic Tac Toe - Fatal编程技术网

我的Tic-Tac-Toe Python脚本有问题

我的Tic-Tac-Toe Python脚本有问题,python,python-3.x,tic-tac-toe,Python,Python 3.x,Tic Tac Toe,我在做一个基于控制台的井字游戏。我的脚本如下: game_board = [ ["_", "_", "_",], ["_", "_", "_",], ["_", "_", "_",], ] #This variable is made for checking eligible ans el

我在做一个基于控制台的井字游戏。我的脚本如下:

game_board = [
    ["_", "_", "_",],
    ["_", "_", "_",],
    ["_", "_", "_",],

]

#This variable is made for checking eligible ans
eligible_ans = [0, 1, 2, 3]

#Game and is a variable by which game will continue or not
end = False


#Player list with all values
#player = [row, col, player num , state]
player1 = [0, 0, 1, False]
player2 = [0, 0, 2, False]

#Shows game board:
def show_gameboard():
    for num in range(3):
        print("|" + game_board[num][0] + "|" + game_board[num][1] + "|" + game_board[num][2] + "|")

#Takes eligible input from player
def get_move(player):
    x = 4
    y = 4
  
    while x not in eligible_ans and y not in eligible_ans:
        x = int(input("Enter your row: ")) - 1
        y = int(input("Enter your colum: ")) - 1

    player[0] = x
    player[1] = y

#Switches on the state item on player list
def switch_on_state(player):
    player[3] = True

def switch_off_state(player):
    player[3] = False

#Checks if the slot is empty    
def check_slot(player):
    if game_board[player[0]][player[1]] == "_":
        switch_on_state(player)
    else:
        while not player[3]:
            get_move(player)
            if game_board[player[0]][player[1]] == "_":
                switch_on_state(player)     

#Places the move
def move(player):
    if player[3] == True:
        if player[2] == 1:
            game_board[player[0]][player[1]] = "X"

        else:
            game_board[player[0]][player[1]] = "O"
    
    switch_off_state(player)

#Checks row for winner
def check_row():
    if game_board[0][0] == game_board[0][1] and game_board[0][1] == game_board[0][2]:
        end = True
    elif game_board[1][0] == game_board[1][1] and game_board[1][1] == game_board[1][2]:
        end = True
    elif game_board[2][0] == game_board[2][1] and game_board[2][1] == game_board[2][2]:
        end = True

#Check column for winner
def check_col():
    if game_board[0][0] == game_board[1][0] and game_board[1][0] == game_board[2][0]:
        end = True
    elif game_board[0][1] == game_board[1][1] and game_board[1][1] == game_board[2][1]:
        end = True
    elif game_board[0][2] == game_board[1][2] and game_board[1][2] == game_board[2][2]:
        end = True
    else:
        pass

#Check diagonal for winner
def check_diagonal():
        #Down to up check
        if game_board[2][0] == game_board[1][1] and game_board[1][1] == game_board[0][2]:
            end = True 

        #Up to down check
        elif game_board[0][0] == game_board[1][1] and game_board[1][1] == game_board[2][2]:
            end = True


#Checks for whole winner
def check_winner():
    check_row()
    check_col()
    check_diagonal()

#The main workarround
def main():
    i = 0
    while not end and i < 3:
        show_gameboard()
        print("Player1=> \n")
        get_move(player1)
        check_slot(player1)
        move(player1)
        check_winner()
        if end:
            print("Player 1 won")
            break
        print(end)

        show_gameboard()
        print("Player2=> \n")
        get_move(player2)
        check_slot(player2)
        move(player2)
        check_winner()
        if end:
            print("Player 2 won")
            break
        print(end)         #*****The problem is here******

        i += 1

if __name__ == "__main__":
    try:
        main()
    except:
        print("\nProgram Failed.\nTry again!!!\n")
游戏板=[
["_", "_", "_",],
["_", "_", "_",],
["_", "_", "_",],
]
#此变量用于检查符合条件的ans
合格答案=[0,1,2,3]
#游戏和是一个变量,游戏是否会继续
结束=错误
#所有值的播放器列表
#玩家=[行、列、玩家数量、状态]
player1=[0,0,1,False]
player2=[0,0,2,False]
#显示游戏板:
def show_gameboard():
对于范围(3)中的num:
打印(“|”+游戏板[num][0]+“|”+游戏板[num][1]+“|”+游戏板[num][2]+“|”)
#从玩家那里获取符合条件的输入
def get_移动(玩家):
x=4
y=4
当x不在合格答案中且y不在合格答案中时:
x=int(输入(“输入您的行:”)-1
y=int(输入(“输入列:”)-1
玩家[0]=x
游戏者[1]=y
#打开玩家列表中的状态项
def开关打开状态(播放器):
玩家[3]=正确
def关闭状态(播放器):
玩家[3]=错误
#检查插槽是否为空
def检查_插槽(播放机):
如果游戏板[玩家[0]][玩家[1]==“\uU”:
打开状态(播放器)
其他:
虽然不是玩家[3]:
移动(玩家)
如果游戏板[玩家[0]][玩家[1]==“\uU”:
打开状态(播放器)
#下棋
def移动(玩家):
如果播放器[3]==真:
如果玩家[2]==1:
游戏板[玩家[0]][玩家[1]]=“X”
其他:
游戏板[玩家[0]][玩家[1]]=“O”
关闭状态(播放器)
#检查一排是否有获胜者
def check_row():
如果游戏板[0][0]==游戏板[0][1]和游戏板[0][1]==游戏板[0][2]:
结束=真
elif game_-board[1][0]==game_-board[1][1]和game_-board[1][1]==game_-board[1][2]:
结束=真
elif game_-board[2][0]==game_-board[2][1]和game_-board[2][1]==game_-board[2][2]:
结束=真
#检查列中是否有获胜者
def check_col():
如果游戏板[0][0]==游戏板[1][0]和游戏板[1][0]==游戏板[2][0]:
结束=真
elif game_-board[0][1]==game_-board[1][1]和game_-board[1][1]==game_-board[2][1]:
结束=真
elif game_-board[0][2]==game_-board[1][2]和game_-board[1][2]==game_-board[2][2]:
结束=真
其他:
通过
#检查对角线是否为赢家
def check_对角线()
#向下检查
如果游戏板[2][0]==游戏板[1][1]和游戏板[1][1]==游戏板[0][2]:
结束=真
#上下检查
elif game_-board[0][0]==game_-board[1][1]和game_-board[1][1]==game_-board[2][2]:
结束=真
#全胜支票
def check_winner():
检查第行()
检查_col()
检查对角线()
#主要工作区
def main():
i=0
当未结束且i<3时:
show_gameboard()
打印(“Player1=>\n”)
快走(玩家1)
检查插槽(播放器1)
移动(播放器1)
勾选
如果结束:
打印(“玩家1赢得”)
打破
列印(完)
show_gameboard()
打印(“Player2=>\n”)
快走(玩家2)
检查插槽(播放器2)
移动(播放器2)
勾选
如果结束:
打印(“玩家2赢”)
打破
打印(结束)#****问题就在这里******
i+=1
如果名称=“\uuuuu main\uuuuuuuu”:
尝试:
main()
除:
打印(“\n程序失败。\n请重试!!!\n”)
我的问题是,为什么即使有人赢了,打印(end)也会将end的值显示为False?

print(end)位于main()函数中,其中写入了“问题就在这里”


即使有人赢了,通过函数check_winner(),end变量也应该为True。但是为什么end变量仍然显示/包含False作为值。

end是一个局部变量。尝试添加:

global end
在check_row()的第一行,check_col()和check_diagonal()中 主要是()

例如:

#Check column for winner
def check_col():
    global end
    if game_board[0][0] == game_board[1][0] and game_board[1][0] == game_board[2][0]:
        end = True
    elif game_board[0][1] == game_board[1][1] and game_board[1][1] == game_board[2][1]:
        end = True
    elif game_board[0][2] == game_board[1][2] and game_board[1][2] == game_board[2][2]:
        end = True
    else:
        pass

您可以通过另一种方式执行此操作,尝试从这些函数返回“end”,并在main()中接收返回值。

end是一个局部变量。尝试添加:

global end
在check_row()的第一行,check_col()和check_diagonal()中 主要是()

例如:

#Check column for winner
def check_col():
    global end
    if game_board[0][0] == game_board[1][0] and game_board[1][0] == game_board[2][0]:
        end = True
    elif game_board[0][1] == game_board[1][1] and game_board[1][1] == game_board[2][1]:
        end = True
    elif game_board[0][2] == game_board[1][2] and game_board[1][2] == game_board[2][2]:
        end = True
    else:
        pass

您可以通过另一种方式执行此操作,尝试从这些函数返回“end”,并在main()中接收返回值。

语句可以打印任何内容的唯一方法是如果
end
False
,因为如果它为
True
,通过
if
分支主体中的
break
可以打破循环。
print
语句可以打印任何内容的唯一方法是if
end
False
,因为如果它是
True
,您可以通过
if
分支主体中的
break
来打破循环。还有一件事。。。我可以在每个if语句中使用
global end=True
来做同样的工作吗?不,这是一个语法错误还有。。。我可以在每个if语句中使用
global end=True
来完成相同的工作吗?不,这是一个语法错误