Как сделать разные комнаты сервера в игре на python? - Общение Python мододелов

Вопрос Как сделать разные комнаты сервера в игре на python?

Регистрация
29 Июл 2013
Сообщения
71
Репутация
0
Спасибо
0
Монет
0
Я создал онлайн игру агарио, по гайду из ютуба на яп python, с помощью библиотеки socket, я запускаю сначала сервер, позже клиент, у меня все работает, если я отключусь и подключусь я буду в той же самой комнате. Как сделать так чтобы было много комнат, например первая занята 10 игроками, это максимум для подключения к одной комнате, и нало чтобы меня перекинуло в другую комнату, как создавать много таких комнат? Это связано с портами, как на сервере Майнкрафт? То есть можно ввести айпи сервера и порт, если введешь другой порт то будешь уже в другой комнате, но на том же сервере. Как вообще называется такая структура?
 
Регистрация
20 Дек 2013
Сообщения
95
Репутация
0
Спасибо
1
Монет
0
На import socket
import threading

# Максимальное количество игроков в комнате
MAX_PLAYERS = 10

# Словарь для хранения комнат
rooms = {
1: [],
2: []
}

# Функция для выбора комнаты
def get_available_room():
for room_id, players in rooms.items():
if len(players) < MAX_PLAYERS:
return room_id
return None

# Функция для обработки клиента
def handle_client(conn, addr):
print(f"Подключен: {addr}")

# Определяем доступную комнату
room_id = get_available_room()

if room_id is not None:
rooms[room_id].append(conn)
conn.send(f"Вы подключены к комнате {room_id}".encode())
else:
conn.send("Нет доступных комнат. Пожалуйста, подождите.".encode())
conn.close()
return

try:
while True:
# Обработка сообщений от клиента (пример)
message = conn.recv(1024).decode()
if not message:
break

print(f"Сообщение от {addr}: {message}")
# Отправка сообщения всем игрокам в комнате
for player in rooms[room_id]:
if player != conn: # Не отправляем сообщение обратно отправителю
player.send(f"Игрок {addr} говорит: {message}".encode())

finally:
print(f"Отключен: {addr}")
rooms[room_id].remove(conn)
conn.close()

# Основной серверный код
def start_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 5000))
server_socket.listen()

print("Сервер запущен и ожидает подключения...")

while True:
conn, addr = server_socket.accept()
threading.Thread(target=handle_client, args=(conn, addr)).start()

if __name__ == "__main__":
start_server()
 
Регистрация
30 Окт 2013
Сообщения
96
Репутация
0
Спасибо
0
Монет
0
Слушаете, простейшему серверу пофиг на «комнаты», он обрабатывает все соединения сокетов одинаково. Комнаты — это у пользователей. А на сервере лишь логика взаимодействия со всеми. Вот сервер и должен объединять пользователей в группы на основе переполнения предыдущих и отправлять юзерам номер комнаты. Никакие разные порты для этого не нужны. Вы, судя по всему, очень плохо представляете, что вообще такое сервер в вашем приложении и что делает тот код, который вы сами же написали. Юзеров изначально 0.Когда кто-то подключается, становится 1. Создаём словарь (комнату) и ожидаем в нём трёх юзеров. Каждый последующий юзер добавляется в этот словарь или в последующий, если предыдущий «переполнен».При дисконнекте юзера (корректном или по пинг-понгу) сообщаем удаляем его из соответствующего словаря.Также делаем проверку при коннекте юзера сколько людей в каждом словаре-комнате: если кто-то вышел, то кидаем новичка на первое «свободное» местоВсе изменения сообщаем юзерам по сокетам.Когда юзер совершает какое-то действие, сервер проверяет, к какой комнате он относится, и применяет нужные изменения лишь в прогрессе этой комнаты. Отправляя изменения только её обитателям.Нужно вести ещё один общий словарь, где указывается номер комнаты пользователя в формате {"username": 3}, чтобы не бегать циклом по всем словарям в поисках юзера (а делать отправку номера своей комнаты юзером-клиентом нельзя по причинам безопасности).
Простейшая работа с циклами и словарями.

В реальных проектах, конечно, разные комнаты могут находится на разных физических или «логических» «серверах»-кластерах, может работать балансировщик нагрузки и прочее такое, но у вас такого нет и не будет. Но даже в этом случает порт один, а логику балансировки между кластерами берут на себя инструменты вроде кубернетеса, это девопс уже.
 
Сверху Снизу