Ti c Ta c Toe, Python, индекс уже заполнен проблема - PullRequest
3 голосов
/ 18 июня 2020

Я пытался решить этот код последние несколько дней, где, если я по ошибке поместил свой символ («x» или «o») в индекс, уже содержащий символ, тогда он должен отобразить сообщение «индекс уже заполнен! ", проблема в том, что это сообщение отображается даже для незаполненных индексов. Я новичок, пожалуйста, помогите мне с этим кодом и, пожалуйста, ответьте на мой вопрос своим кодом, так как я плохо разбираюсь в Engli sh.

import numpy

board=numpy.array([["-","-","-"],["-","-","-"],["-","-","-"]])

numpy.matrix(board)

def pos(row,col,symbol,altr):

    while(board[row][col]==symbol or board[row][col]==altr):
        print("index already filled")
        place(symbol,altr)
    board[row][col]=symbol
    return board

def place(symbol,altr):

    c=int(input("enter index: "))
    if(c==1):
         return pos(0,0,symbol,altr)
    elif(c==2):
         return pos(0,1,symbol,altr)
    elif(c==3):
         return pos(0,2,symbol,altr)
    elif(c==4):
         return pos(1,0,symbol,altr)
    elif(c==5):
         return pos(1,1,symbol,altr)
    elif(c==6):
         return pos(1,2,symbol,altr)
    elif(c==7):
        return pos(2,0,symbol,altr)
    elif(c==8):
         return pos(2,1,symbol,altr)
    elif(c==9):
         return pos(2,2,symbol,altr)
def won(symbol):

    return check_rows(symbol) or check_cols(symbol) or check_diagnols(symbol)
def check_rows(symbol):

    for i in range(3):
        count=0
        for j in range(3):
            if(board[i][j]==symbol):
                count+=1
        if(count==3):
            return True
    else:
        return False
def check_cols(symbol):

    for j in range(3):
        count=0
        for i in range(3):
            if(board[i][j]==symbol):
                count+=1
        if(count==3):
            return True
    else:
        return False
def check_diagnols(symbol):

    if(board[0][0]==board[1][1] and board[1][1]==board[2][2] and board[2][2]==symbol):
        return True
    if(board[0][2]==board[1][1] and board[1][1]==board[2][0] and board[2][0]==symbol):
        return True
    return False

def play():

    p1=input("player1,enter your name: ")
    p2=input("player2,enter your name: ")
    pl1="x"
    pl2="o"
    i=0
    while(i<9):
        if(i%2==0):
            print(board)
            print(p1,"your turn")
            place(pl1,pl2)
            if(won(pl1)):
                print(board)
                print(p1,"you won")
                break
        else:
            if(i%2==1):
                print(board)
                print(p2,"your turn")
                place(pl2,pl1)
                if(won(pl2)):
                    print(board)
                    print(p2,"you won")
                    break
        i+=1
    if not won(pl1) and not won(pl2):
        print(board)
        print("draw")

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

while не подходит: результат условия никогда не изменится, независимо от того, сколько раз вы oop. Так что фактически это бесконечное l oop: как только вы войдете, вы больше никогда не выйдете.

Это должно быть if. А во-вторых, когда условие if истинно, вам не нужно выполнение board[row][col]=symbol с этими значениями row и col. Вы должны позволить этому назначению произойти через рекурсивный вызов place. Это выполнение придет к этой функции с (надеюсь) лучшими значениями row и col и позаботится о том, чтобы поместить значение в плату. Итак, ... вам нужно поместить это назначение в блок else, так что это происходит только тогда, когда местоположение в порядке.

    if (board[row][col]==symbol or board[row][col]==altr):
        print("index already filled")
        place(symbol,altr)
    else:
        board[row][col]=symbol

Примечание: даже если это работает так, я бы не стал выбран для рекурсивного решения. Возможно, вы захотите посмотреть альтернативу, в которой у вас нет рекурсии, но есть while l oop в функции place.

1 голос
/ 18 июня 2020

Я думаю, что проблема в том, что место вызова pos и место вызова pos, снова и снова. В обеих функциях возвращать плату не нужно.

def pos(row,col,symbol,altr):

    if board[row][col]==symbol or board[row][col]==altr:
        print("index already filled")
        return False
    else:
        board[row][col]=symbol
        return True

def place(symbol,altr):

    while True
        c=int(input("enter index: "))
        if 1 <= c <= 9:
            c = c-1
            if pos(c//3, c%3, symbol, alter):
                return

Я объяснил это псевдокодом

def pos(row, column, player_symbol, another_player_sumbol):
    # Check (row, cell) if not occupied
    if selected_cell not with blank syambol:
        message('Cell occupied')
        return input_is_NG
    else:
        set cell occupied
        return input_is_OK

def place(symbol,altr):

    while True (until position_is_OK):
        input position of cell
        if position is from 1 to 9:
            position -= 1
            if pos(position//3, position%3, symbol, alter) is OK:
                return # exit from place, and next turn for another player
        user_input_is_NG, while loop again
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...