Advertisement
Chl_Snt

№10. Server

Mar 20th, 2023 (edited)
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.62 KB | None | 0 0
  1. import random
  2. import socket
  3. import time
  4. import psycopg2
  5. from sqlalchemy import create_engine
  6. from sqlalchemy.orm import declarative_base
  7. from sqlalchemy import Column, Integer, String
  8. from sqlalchemy.orm import sessionmaker
  9. import pygame
  10.  
  11. engine = create_engine("postgresql+psycopg2://postgres:1111@localhost/rebotica")
  12. Session = sessionmaker(bind=engine)
  13. Base = declarative_base()
  14. s = Session()
  15.  
  16. # Настройка констант для pygame
  17. pygame.init()
  18. WIDHT_ROOM, HEIGHT_ROOM = 4000, 4000
  19. WIDHT_SERVER, HEIGHT_SERVER = 300, 300
  20. FPS = 100
  21.  
  22. # Создание окна сервера
  23. screen = pygame.display.set_mode((WIDHT_SERVER, HEIGHT_SERVER))
  24. pygame.display.set_caption("Сервер")
  25. clock = pygame.time.Clock()
  26.  
  27.  
  28. def find(vector: str):
  29.     first = None
  30.     for num, sign in enumerate(vector):
  31.         if sign == "<":
  32.             first = num
  33.         if sign == ">" and first is not None:
  34.             second = num
  35.             result = list(map(float, vector[first + 1:second].split(",")))
  36.             return result
  37.     return ""
  38.  
  39.  
  40. # Декларативный класс таблицы игроков
  41. class Player(Base):
  42.     __tablename__ = "gamers"
  43.     id = Column(Integer, primary_key=True, autoincrement=True)
  44.     name = Column(String(250))
  45.     address = Column(String)
  46.     x = Column(Integer, default=500)
  47.     y = Column(Integer, default=500)
  48.     size = Column(Integer, default=50)
  49.     errors = Column(Integer, default=0)
  50.     abs_speed = Column(Integer, default=2)
  51.     speed_x = Column(Integer, default=2)
  52.     speed_y = Column(Integer, default=2)
  53.  
  54.     def __init__(self, name, address):
  55.         self.name = name
  56.         self.address = address
  57.  
  58.  
  59. def update(player):
  60.     player.x += player.speed_x
  61.     player.y += player.speed_y
  62.  
  63.  
  64. def change_speed(player, vector):
  65.     vector = find(vector)
  66.     if vector[0] == 0 and vector[1] == 0:
  67.         player.speed_x = player.speed_y = 0
  68.     else:
  69.         vector = vector[0] * player.abs_speed, vector[1] * player.abs_speed
  70.         player.speed_x = vector[0]
  71.         player.speed_y = vector[1]
  72.  
  73.  
  74. Base.metadata.create_all(engine)
  75.  
  76. main_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # Настраиваем сокет
  77. main_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)  # Отключаем пакетирование
  78. main_socket.bind(("localhost", 10000))  # IP и порт привязываем к порту
  79. main_socket.setblocking(False)  # Непрерывность, не ждём ответа
  80. main_socket.listen(5)  # Прослушка входящих соединений, 5 одновременных подключений
  81. print("Сокет создался")
  82.  
  83. players = {}
  84. server_works = True
  85. while server_works:
  86.     clock.tick(FPS)
  87.     try:
  88.         # проверяем желающих войти в игру
  89.         new_socket, addr = main_socket.accept()  # принимаем входящие
  90.         print('Подключился', addr)
  91.         new_socket.setblocking(False)
  92.         player = Player("Имя", addr)
  93.         s.merge(player)
  94.         s.commit()
  95.  
  96.         addr = f'({addr[0]},{addr[1]})'
  97.         data = s.query(Player).filter(Player.address == addr)
  98.         for user in data:
  99.             players[user.id] = new_socket
  100.  
  101.     except BlockingIOError:
  102.         pass
  103.  
  104.     # Считываем команды игроков
  105.     for id in list(players):
  106.         try:
  107.             data = players[id].recv(1024).decode()
  108.             player = s.get(Player, id)
  109.             change_speed(player, data)
  110.  
  111.         except:
  112.             pass
  113.  
  114.     # Отправляем статус игрового поля
  115.     for id in list(players):
  116.         try:
  117.             players[id].send("Игра".encode())
  118.         except:
  119.             players[id].close()
  120.             del players[id]
  121.             # Так же удаляем строчку из БД
  122.             s.query(Player).filter(Player.id == id).delete()
  123.             s.commit()
  124.             print("Сокет закрыт")
  125.  
  126.     # Отрисовываем серверное окно
  127.     for event in pygame.event.get():
  128.         if event.type == pygame.QUIT:
  129.             server_works = False
  130.  
  131.     screen.fill('black')
  132.     for id in players:
  133.         player = s.get(Player, id)
  134.         x = player.x * WIDHT_SERVER // WIDHT_ROOM
  135.         y = player.y * HEIGHT_SERVER // HEIGHT_ROOM
  136.         size = player.size * WIDHT_SERVER // WIDHT_ROOM
  137.         pygame.draw.circle(screen, "yellow2", (x, y), size)
  138.  
  139.     for id in players:
  140.         player = s.get(Player, id)
  141.         update(player)
  142.  
  143.     pygame.display.update()
  144.  
  145.  
  146.  
  147. pygame.quit()
  148. main_socket.close()
  149.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement