[英]python pygame - Multiplayer game
I'm trying to create a "Draw Something" game for at least three participants from different computers.我正在尝试为来自不同计算机的至少三个参与者创建一个“Draw Something”游戏。
I have a code that works for two players.我有一个适用于两个玩家的代码。 Does anyone know how can I make it for three or more?有谁知道我怎样才能做到三个或更多?
............................................................... ..................................................... ......
Here is my server code:这是我的服务器代码:
............................................................... ..................................................... ......
server = ""
port = 5555
games = {}
idCount = 0
currentPlayer = 0
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((server, port))
s.listen()
print("Waiting for a connection, Server Started")
class Game:
def __init__(self, id):
self.connected = False
players = [Player(0), Player(1)]
def threaded_client(conn, player, gameId):
global idCount
conn.send(pickle.dumps(players[player]))
reply = ""
while True:
try:
data = pickle.loads(conn.recv(2048))
players[player] = data
if gameId in games:
game = games[gameId]
if not data:
print("Disconnected")
break
else:
if player == 1:
reply = players[0]
else:
reply = players[1]
conn.sendall(pickle.dumps(reply))
except:
break
print("Lost connection")
try:
del games[gameId]
print("Closing game", gameId)
except:
pass
idCount -= 1
conn.close()
while True:
conn, addr = s.accept()
print("Connected to:", addr)
idCount += 1
p = 0
gameId = (idCount - 1) // 2
if idCount % 2 == 1:
games[gameId] = Game(gameId)
players[0].connected = True
print("Creating a new game")
print("Waiting for another player")
else:
games[gameId].connected = True
p = 1
players[1].connected = True
print("Game is available")
start_new_thread(threaded_client, (conn, currentPlayer, gameId))
currentPlayer += 1
............................................................... ..................................................... ......
thanks:):):):)谢谢:):):):)
............................................................... ..................................................... ......
I am not sure if this helps but I have an old 2-player game.我不确定这是否有帮助,但我有一个旧的 2 人游戏。 here is the code:这是代码:
the client:客户端:
import socket, pickle, pygame, pygame.gfxdraw
pygame.init()
screen = pygame.display.set_mode((800, 800))
pygame.display.set_caption('client')
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = int(input(f'port: '))
mysocket.connect((socket.gethostname(), port))
def player(pos, color):
x1, y1 = pos
x2 = x1+10
y2 = y1
x3 = x1+10
y3 = y1+10
x4 = x1
y4 = y1+10
pygame.gfxdraw.filled_polygon(screen, [(x1, y1), (x2, y2), (x3, y3), (x4, y4)], color)
player1 = (0, 0)
up, down, left, right = False, False, False, False
while True:
tosend = player1
mysocket.send(pickle.dumps(tosend))
player2 = pickle.loads(mysocket.recv(1024))
screen.fill(0)
player(player1, (0, 255, 0))
player(player2, (0, 0, 255))
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
break
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
up = True
if event.key == pygame.K_DOWN:
down = True
if event.key == pygame.K_LEFT:
left = True
if event.key == pygame.K_RIGHT:
right = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_UP:
up = False
if event.key == pygame.K_DOWN:
down = False
if event.key == pygame.K_LEFT:
left = False
if event.key == pygame.K_RIGHT:
right = False
if up:
ychange = -1
elif down:
ychange = 1
else:
ychange = 0
if left:
xchange = -1
elif right:
xchange = 1
else:
xchange = 0
x, y = player1
x += xchange
y += ychange
player1 =(x, y)
mysocket.send(pickle.dumps('stop'))
mysocket.close()
the server:服务器:
import socket, pygame, pickle, pygame.gfxdraw
pygame.init()
screen = pygame.display.set_mode((800, 800))
pygame.display.set_caption('server')
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 1000
while True:
try:
mysocket.bind((socket.gethostname(), port))
break
except:
port += 1
print(f'hosting server on {socket.gethostname()}:{port}')
def player(pos, color):
x1, y1 = pos
x2 = x1+10
y2 = y1
x3 = x1+10
y3 = y1+10
x4 = x1
y4 = y1+10
pygame.gfxdraw.filled_polygon(screen, [(x1, y1), (x2, y2), (x3, y3), (x4, y4)], color)
player1 = (0, 0)
up, down, left, right = False, False, False, False
running = True
while running:
# socket actions here
mysocket.listen()
client, address = mysocket.accept()
while True:
try:
player2 = pickle.loads(client.recv(1024))
client.send(pickle.dumps(player1))
if player2 == 'stop':
break
except:
break
# pygame actions here
try:
screen.fill(0)
player(player1, (0, 255, 0))
player(player2, (0, 0, 255))
pygame.display.flip()
except:
pass
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
up = True
if event.key == pygame.K_DOWN:
down = True
if event.key == pygame.K_LEFT:
left = True
if event.key == pygame.K_RIGHT:
right = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_UP:
up = False
if event.key == pygame.K_DOWN:
down = False
if event.key == pygame.K_LEFT:
left = False
if event.key == pygame.K_RIGHT:
right = False
if up:
ychange = -1
elif down:
ychange = 1
else:
ychange = 0
if left:
xchange = -1
elif right:
xchange = 1
else:
xchange = 0
x, y = player1
x += xchange
y += ychange
player1 =(x, y)
print('connection lost')
mysocket.close()
What you can do is when aa game is running with 2 players and a 3rd player joins show them a Waiting for more player screen then when a 4th player joins run a new thread/instance and make the server handle the new instance您可以做的是,当一个游戏与 2 名玩家一起运行并且第 3 名玩家加入时向他们显示等待更多玩家屏幕,然后当第 4 名玩家加入时运行一个新线程/实例并让服务器处理新实例
But use a powerful pc to run the server because if a lot of people join the server will crash due to overloading+ your pc where you ran the server can lag但是使用功能强大的电脑来运行服务器,因为如果很多人加入服务器会由于过载而崩溃+你运行服务器的电脑可能会滞后
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.