Ошибка - ValueError: неверный литерал для int () с основанием 10: '' - PullRequest
0 голосов
/ 20 марта 2019

Я делаю онлайн-игру, используя модуль сокетов и pygame на python.

def read_pos(str):
    if str is not None:
        string = str.split(",")
        return int(string[0]), int(string[1])
    else:
        pass

def make_pos(tup):
    return str(tup[0]) + "," + str(tup[1])


def redrawWindow(win,player, player2):
    win.fill((255,255,255))
    player.draw(win)
    player2.draw(win)
    pygame.display.update()


def main():
    run = True
    n = Network()
    startPos = read_pos(n.getPos())
    p = Player(startPos[0],startPos[1],100,100,(0,255,0))
    p2 = Player(0,0,100,100,(255,0,0))
    clock = pygame.time.Clock()

    while run:
        clock.tick(60)
        p2Pos = read_pos(n.send(make_pos((p.x, p.y))))
        p2.x = p2Pos[0]
        p2.y = p2Pos[1]
        p2.update()

Это код, который я использую в своем клиенте. на моем сервере код выглядит следующим образом

def convertPos(str):
    if str is not None:
        str = str.split(",")
        return int(str[0]), int(str[1])
    else:
        pass

def make_pos(tup):
    return str(tup[0]) + "," + str(tup[1])


pos = [(0,0),(100,100)]


def threaded_client(conn,player):
    conn.send(str.encode(make_pos(pos[player])))
    reply = " "
    while True:
        try:
            data = conn.recv(2048).decode()
            pos[player] = data

            if not data:
                print("Disconnected")
                break
            else:
                if player == 1:
                    reply = (pos[0])
                else:
                    reply = (pos[1])
                print("Received: ", data)
                print("Sending : ", reply)

            conn.sendall(str.encode(make_pos(reply)))
        except:
            break

    print("Lost connection")
    conn.close()

Я получаю ошибку ValueError: invalid literal for int() with base 10: ' '.

Может кто-нибудь сказать мне, почему это происходит? Значение str в функции convertPos() входит как кортеж, который я преобразовываю в строку, а после этого в целое число.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Очевидно, что, как отмечали другие, возвращаемая ошибка связана с тем, что вы пытаетесь преобразовать пустую строку (или пробелы) в целое число.

Но настоящая проблема в том, что входящая координата искажена. Код не ловит эту ошибку. Вы можете написать много кода, чтобы определить, что это за ошибка, и сообщить точную ошибку. Или просто вспахать, как будто все в порядке, но также поймать любое исключение с разумным сообщением об ошибке.

def convertPos(str):
    coord = None
    try:
        parts = str.split( ',', 2 )
        x = int( parts[0] )
        y = int( parts[1] )
        coord = ( x, y )
    except:
        raise ValueError( 'Malformed co-ordinate string [' + str.strip() + ']' )
    return coord

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

Таким образом, вы можете ввести пробел между своими координатами, чтобы сказать блок из 11 символов - таким образом, вы знаете, что вы должны были получить 11 символов, чтобы иметь действительную строку координат. В качестве альтернативы используйте маркер конца-и-конца, например |, а затем код сокета продолжает буферизовать входную координату до тех пор, пока не прибудет |.

0 голосов
/ 20 марта 2019

Поскольку вы преобразовали его в строку, у вас есть формат (x, y), вам необходимо снять скобки. Вам нужно переписать вашу функцию convertPos как:

def convertPos(str):
    if str is not None:
        str=str.strip("()")
        str = str.split(",")
        return int(str[0]), int(str[1])

РЕДАКТИРОВАТЬ Вы не используете деталь else, поэтому вы можете удалить ее.

И, как говорит @Azat Ibrakov, вам не следует преобразовывать кортеж в строку, но если вам нужно это сделать, вы можете использовать ast.literal_eval следующим образом:

import ast
def convertPos(str):
    return ast.literal_eval(str)

или используйте его непосредственно вместо функции convertPos.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...