程序可以在 Python 2.7 中运行,但不能在 3.10 中运行
所以基本上我用 python 做了一个 LAN 石头剪刀布..我设法让它在 python 2.7 上运行得很好,但是当我用 3.10 运行它时,它似乎无缘无故地陷入了无限循环..(我已经包含了一个代码中的注释 (#) 向您展示卡在哪里)
这是 3 个脚本
服务器脚本 2.7(两者的服务器脚本相同,所以这也是 3.10)
import socket
import threading
Host=("localhost")
Port=9090
Server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Server.bind((Host, Port))
Server.listen(5)
Clients=[]
Players=[]
PlayersMoved=[0,0]
Moves=[0,0]
def Broadcast(Result):
for Client in Clients:
Client.send(Result)
def Game(Moves):
# 1=Rock, 2=Paper, 3=Scissors
if Moves[0]==1:
if Moves[1]==1:
Result="Tie"
elif Moves[1]==2:
Result=str(PlayersMoved[1]+" Won")
elif Moves[1]==3:
Result=str(PlayersMoved[0]+" Won")
elif Moves[0]==2:
if Moves[1]==2:
Result="Tie"
elif Moves[1]==3:
Result=str(PlayersMoved[1]+" Won")
elif Moves[1]==1:
Result=str(PlayersMoved[0]+" Won")
elif Moves[0]==3:
if Moves[1]==3:
Result="Tie"
elif Moves[1]==1:
Result=str(PlayersMoved[1]+" Won")
elif Moves[1]==2:
Result=str(PlayersMoved[0]+" Won")
print ("im here7")
Broadcast(Result)
def GetMoves(Client):
while True:
try:
Message=Client.recv(1024)
PlayerMove=""
Parted=False
for i in range(len(list(Message))):
if Message[i]==":":
Parted=True
print ("im here2")
pass
elif not Parted:
PlayerMove+=list(Message)[i]
print ("im here1")
elif Parted:
Move=int(Message[i+1])
print ("im here3")
break
if PlayersMoved[0]==0:
PlayersMoved[0]=PlayerMove
Moves[0]=Move
print ("im here5")
else:
PlayersMoved[1]=PlayerMove
Moves[1]=Move
print ("im here6")
Process2=threading.Thread(target=Game, args=(Moves,))
Process2.start()
except:
index=Clients.index(Client)
Clients.remove(Client)
Client.close()
Player=Players[index]
Broadcast(str(Player+" left!").encode('ascii'))
Players.remove(Player)
break
def Connections():
while True:
Client, Address=Server.accept()
print("Connected with ",Address)
Client.send('NICK'.encode('ascii'))
Player=Client.recv(1024).decode('ascii')
Players.append(Player)
Clients.append(Client)
print("Nickname is ",Player)
Broadcast(str(Player+" joined!").encode('ascii'))
Client.send('Connected to server!'.encode('ascii'))
Process1=threading.Thread(target=GetMoves, args=(Client,))
Process1.start()
print ("Server is listening...")
Connections()
客户端 2.7
import socket
import threading
Nickname=raw_input("Choose your nickname: ")
Host=("localhost")
Port=9090
Client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Client.connect((Host, Port))
def Receive():
while True:
try:
Message=Client.recv(1024).decode('ascii')
print (Message)
if Message=='NICK':
Client.send(str(Nickname).encode('ascii'))
print ("im here1")
else:
print ("im here2")
print(Message)
except:
print("An error occured!")
Client.close()
break
def Write():
while True:
MyMove=str(Nickname+": "+raw_input("1=Rock, 2=Paper, 3=Scissors:"))
while MyMove!=str(Nickname+": 1") and MyMove!=str(Nickname+": 2") and MyMove!=str(Nickname+": 3"):
MyMove=str(Nickname+": "+raw_input("1=Rock, 2=Paper, 3=Scissors:"))
Client.send(MyMove.encode('ascii'))
break
Receive_Thread=threading.Thread(target=Receive)
Receive_Thread.start()
Write_Thread=threading.Thread(target=Write)
Write_Thread.start()
客户端3.10
import socket
import threading
Nickname=str(input("Choose your nickname: "))
Host=("localhost")
Port=9090
Client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Client.connect((Host, Port))
def Receive():
while True:
try:
Message=Client.recv(1024).decode('ascii')
print (Message)
if Message=='NICK':
Client.send(str(Nickname).encode('ascii'))
print ("im here1")
else:
print ("im here2") #(it gets stuck here)
print(Message) #(it gets stuck here)
except:
print("An error occured!")
Client.close()
break
def Write():
while True:
MyMove=str(Nickname+": "+str(input("1=Rock, 2=Paper, 3=Scissors:")))
while MyMove!=str(Nickname+": 1") and MyMove!=str(Nickname+": 2") and MyMove!=str(Nickname+": 3"):
MyMove=str(Nickname+": "+str(input("1=Rock, 2=Paper, 3=Scissors:")))
Client.send(MyMove.encode('ascii'))
break
Receive_Thread=threading.Thread(target=Receive)
Receive_Thread.start()
Write_Thread=threading.Thread(target=Write)
Write_Thread.start()
So basically i made a LAN Rock Paper Scissors in python.. i managed to make it work just fine on python 2.7 but when i run it with 3.10 it seems to get stuck on an infinite loop for no reason.. (i have included a comment (#) in the code to show you where it gets stuck)
heres the 3 Scripts
Server Script 2.7 (Server Script is the same for both so this is the 3.10 too)
import socket
import threading
Host=("localhost")
Port=9090
Server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Server.bind((Host, Port))
Server.listen(5)
Clients=[]
Players=[]
PlayersMoved=[0,0]
Moves=[0,0]
def Broadcast(Result):
for Client in Clients:
Client.send(Result)
def Game(Moves):
# 1=Rock, 2=Paper, 3=Scissors
if Moves[0]==1:
if Moves[1]==1:
Result="Tie"
elif Moves[1]==2:
Result=str(PlayersMoved[1]+" Won")
elif Moves[1]==3:
Result=str(PlayersMoved[0]+" Won")
elif Moves[0]==2:
if Moves[1]==2:
Result="Tie"
elif Moves[1]==3:
Result=str(PlayersMoved[1]+" Won")
elif Moves[1]==1:
Result=str(PlayersMoved[0]+" Won")
elif Moves[0]==3:
if Moves[1]==3:
Result="Tie"
elif Moves[1]==1:
Result=str(PlayersMoved[1]+" Won")
elif Moves[1]==2:
Result=str(PlayersMoved[0]+" Won")
print ("im here7")
Broadcast(Result)
def GetMoves(Client):
while True:
try:
Message=Client.recv(1024)
PlayerMove=""
Parted=False
for i in range(len(list(Message))):
if Message[i]==":":
Parted=True
print ("im here2")
pass
elif not Parted:
PlayerMove+=list(Message)[i]
print ("im here1")
elif Parted:
Move=int(Message[i+1])
print ("im here3")
break
if PlayersMoved[0]==0:
PlayersMoved[0]=PlayerMove
Moves[0]=Move
print ("im here5")
else:
PlayersMoved[1]=PlayerMove
Moves[1]=Move
print ("im here6")
Process2=threading.Thread(target=Game, args=(Moves,))
Process2.start()
except:
index=Clients.index(Client)
Clients.remove(Client)
Client.close()
Player=Players[index]
Broadcast(str(Player+" left!").encode('ascii'))
Players.remove(Player)
break
def Connections():
while True:
Client, Address=Server.accept()
print("Connected with ",Address)
Client.send('NICK'.encode('ascii'))
Player=Client.recv(1024).decode('ascii')
Players.append(Player)
Clients.append(Client)
print("Nickname is ",Player)
Broadcast(str(Player+" joined!").encode('ascii'))
Client.send('Connected to server!'.encode('ascii'))
Process1=threading.Thread(target=GetMoves, args=(Client,))
Process1.start()
print ("Server is listening...")
Connections()
Client 2.7
import socket
import threading
Nickname=raw_input("Choose your nickname: ")
Host=("localhost")
Port=9090
Client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Client.connect((Host, Port))
def Receive():
while True:
try:
Message=Client.recv(1024).decode('ascii')
print (Message)
if Message=='NICK':
Client.send(str(Nickname).encode('ascii'))
print ("im here1")
else:
print ("im here2")
print(Message)
except:
print("An error occured!")
Client.close()
break
def Write():
while True:
MyMove=str(Nickname+": "+raw_input("1=Rock, 2=Paper, 3=Scissors:"))
while MyMove!=str(Nickname+": 1") and MyMove!=str(Nickname+": 2") and MyMove!=str(Nickname+": 3"):
MyMove=str(Nickname+": "+raw_input("1=Rock, 2=Paper, 3=Scissors:"))
Client.send(MyMove.encode('ascii'))
break
Receive_Thread=threading.Thread(target=Receive)
Receive_Thread.start()
Write_Thread=threading.Thread(target=Write)
Write_Thread.start()
Client 3.10
import socket
import threading
Nickname=str(input("Choose your nickname: "))
Host=("localhost")
Port=9090
Client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Client.connect((Host, Port))
def Receive():
while True:
try:
Message=Client.recv(1024).decode('ascii')
print (Message)
if Message=='NICK':
Client.send(str(Nickname).encode('ascii'))
print ("im here1")
else:
print ("im here2") #(it gets stuck here)
print(Message) #(it gets stuck here)
except:
print("An error occured!")
Client.close()
break
def Write():
while True:
MyMove=str(Nickname+": "+str(input("1=Rock, 2=Paper, 3=Scissors:")))
while MyMove!=str(Nickname+": 1") and MyMove!=str(Nickname+": 2") and MyMove!=str(Nickname+": 3"):
MyMove=str(Nickname+": "+str(input("1=Rock, 2=Paper, 3=Scissors:")))
Client.send(MyMove.encode('ascii'))
break
Receive_Thread=threading.Thread(target=Receive)
Receive_Thread.start()
Write_Thread=threading.Thread(target=Write)
Write_Thread.start()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论