【问题标题】:Why the win_check function is not working properly?为什么 win_check 功能不能正常工作?
【发布时间】:2019-07-28 17:01:33
【问题描述】:

我是新手,我在 python 中创建了一个井字游戏,我制定了逻辑,但代码没有按预期运行我尝试调试它,但找不到错误。

我是 python 新手,并在课程中学习 udemy 课程,起初我被要求自己编写一个井字游戏。我想出了一个不太好的逻辑,但它会完成这项工作。我只是无法弄清楚为什么 win_check 功能无法正常工作。是 win_check 函数还是别的什么?对改进我的代码有什么建议? 很抱歉没有在代码中提供 cmets 我只是想先完成它并成功运行它。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Jul 27 20:11:38 2019

@author: sandeep
"""

from os import name,system
from time import sleep
from random import randint



def game_board(turns):
    print(turns[6],"|",turns[7],"|",turns[8])
    print("--|---|---")
    print(turns[3],"|",turns[4],"|",turns[5])
    print("--|---|---")
    print(turns[0],"|",turns[1],"|",turns[2])



def check_input(player1,player2):
    if (player1 == 'X' or player1 == 'O') and (player2 == 'X' or player2 == 'O'):
        return True
    else:
        print("Please choose between X and O")
        global initial_player_value
        initial_player_value = take_input()
        return False






def take_input():
    player1 = input("Do you want 'X' or 'O'?\n")
    if player1 == 'X':
        player2 = 'O'
    else:
        player2 = 'X'
    return (player1,player2)







def clear():
    if name == 'nt':
        _ = system('cls')
    else:
        _ = system('clear')





def player_turn(initial_player_value0,initial_player_value1):
    clear()
    global turns
    game_board(turns)
    print(f"Player {initial_player_value0} turn")
    print("Enter position")
    player1_input =input()
    turns.pop(int(player1_input)-1)
    turns.insert(int(player1_input)-1,initial_player_value0)
    clear()
    game_board(turns)

    print(f"Player {initial_player_value1} turn")
    print("Enter position")
    player2_input = input()
    turns.pop(int(player2_input)-1)
    turns.insert(int(player2_input)-1,initial_player_value1)
    clear()
    game_board(turns)



def win_check(check,initial_player_value3,initial_player_value4):

   # print(check)

    global game_status
    if initial_player_value3 == 'X':
        if ((['X','X','X'] == check[:3]) or (['X','X','X'] == check[3:6]) or (['X','X','X'] == check[6:])):
            game_status = "Player X wins"
        elif ((['X','X','X'] == check[::3]) or (['X','X','X'] == check[1::3]) or (['X','X','X'] == check[2::3])):
            game_status = "Player X wins"
        elif ((['X','X','X'] == check[::4]) or (['X','X','X'] == check[2:7:2])):
            game_status = "Player X wins"
        else:
            game_status = "_"

    else:
        if ((['O','O','O'] == check[:3]) or (['O','O','O'] == check[3:6]) or (['O','O','O'] == check[6:])):
            game_status = "Player O wins"
        elif ((['O','O','O'] == check[::3]) or (['O','O','O'] == check[1::3]) or (['O','O','O'] == check[2::3])):
            game_status = "Player O wins"
        elif ((['O','O','O'] == check[::4]) or (['O','O','O'] == check[2:7:2])):
            game_status = "Player O wins"
        else:
            game_status = "_"

    if initial_player_value4 == 'O':
        if ((['O','O','O'] == check[:3]) or (['O','O','O'] == check[3:6]) or (['O','O','O'] == check[6:])):
            game_status = "Player O wins"
        elif ((['O','O','O'] == check[::3]) or (['O','O','O'] == check[1::3]) or (['O','O','O'] == check[2::3])):
            game_status = "Player O wins"
        elif ((['O','O','O'] == check[::4]) or (['O','O','O'] == check[2:7:2])):
            game_status = "Player O wins"
        else:
            game_status = "_"

    else :
        if ((['X','X','X'] == check[:3]) or (['X','X','X'] == check[3:6]) or (['X','X','X'] == check[6:])):
            game_status = "Player X wins"
        elif ((['X','X','X'] == check[::3]) or (['X','X','X'] == check[1::3]) or (['X','X','X'] == check[2::3])):
            game_status = "Player X wins"
        elif ((['X','X','X'] == check[::4]) or (['X','X','X'] == check[2:7:2])):
            game_status = "Player X wins"
        else:
            game_status = "_"
    draw_check = ''.join(str(x) for x in check)
    print(draw_check)
    #sleep(5)
    if draw_check.isalpha():
        game_status ="Game draws"

    else:
        game_status= "_"









#def welcome():
print("Welcome to the tic tac toe game\n")
initial_player_value = take_input()
check = check_input(initial_player_value[0],initial_player_value[1])
while check is False:
    check = check_input(initial_player_value[0],initial_player_value[1])
print(f"Player 1 is {initial_player_value[0]} and Player 2 is {initial_player_value[1]}\nLet's start the game" )

turns = [1,2,3,4,5,6,7,8,9]
sleep(2)
clear()
game_board(turns)
game_status = '_'
decide_first = randint(1,2)
replay = 'yes'



while replay == "yes":
    #global game_status
    if decide_first == 1:
        player_turn(initial_player_value[0],initial_player_value[1])
        game_board(turns)
        win_check(turns,initial_player_value[0],initial_player_value[1])
    else:
        player_turn(initial_player_value[1],initial_player_value[0])
        game_board(turns)
        win_check(turns,initial_player_value[0],initial_player_value[1])

    #win_check(turns,tuple(initial_player_value))    
    if game_status != '_':
        print(game_status)
        replay = input("Do you want to play again?\n")
        turns = [1,2,3,4,5,6,7,8,9]

运行代码时没有错误。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    您面临的问题在于 win_check。 win_check 执行以下步骤:

    1. 它检查第一个玩家是否获胜,并将变量 game_status 设置为"Player X wins",或"Player Y wins",或"_"
    2. 它检查第二个玩家是否获胜,并将变量 game_status 设置为"Player X wins",或"Player Y wins",或"_"
    3. 它检查是否发生了平局并将变量 game_status 设置为"game draws" 或"_"

    在每一步之后,它都会删除最后一步的结果。

    如果您使用单个 ifelif 链来管理控制流,它将更具可读性和功能正确性。 我还会将检查玩家是否获胜的检查转移到自己的名为has_won 的函数中,这将提高可读性并减少代码重复。

    def win_check(board, player_1, player_2):
        global game_status
        if has_won(board, player_1):
            game_status = "Player " + player_1 + " has won"
        elif has_won(board, player_2):
            game_status = "Player " + player_2 + " has won"
        elif is_draw(board):
            game_status = "Game draws"
        else:
            game_status = "_"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 2019-01-04
      • 2020-09-03
      相关资源
      最近更新 更多