我正在使用Sockets模块和python中的pygame制作在线游戏。
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()
值以元组的形式出现,我将其转换为字符串,然后转换为整数。
答案 0 :(得分:0)
当您将其转换为字符串时,格式为(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函数。
答案 1 :(得分:0)
很明显-正如其他人指出的那样,返回的错误是因为您试图将空字符串(或空格)转换为整数。
但是真正的问题是传入的坐标格式不正确。该代码未捕获此错误。您可以编写许多代码来确定错误是什么,并报告准确的错误。或者只是就好像一切都很好一样顺其自然,而且还可以通过合理的错误消息捕获任何异常。
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个字符才能具有有效的坐标字符串。另外,也可以使用|
之类的和坐标结束标记,然后套接字代码会不断抛光输入坐标,直到|
到达为止。