Skip to content

Instantly share code, notes, and snippets.

@Khazbs
Last active September 2, 2019 21:52
Show Gist options
  • Save Khazbs/7361e7d2024eb44cf016030fc522acbe to your computer and use it in GitHub Desktop.
Save Khazbs/7361e7d2024eb44cf016030fc522acbe to your computer and use it in GitHub Desktop.
Начали писать сервер для морского боя на двоих игроков
# В этом файле мы пишем сервер для игры в морской бой по сети для двух игроков
# Если ты не понял или забыл, что такое клиент и сервер, или то, как они общаются в сети, можешь почитать вот эту ржаку:
# https://gist.github.com/Khazbs/0be52e489d5ac086ea82dd0718786ecb
# Если тебя терзают какие-то вопросы, смело пиши мне в Скайп (khazbartur)
import tornado.ioloop # Импортируем модуль Торнадо, позволяющий принимать запросы
import tornado.web # Импортируем модуль Торнадо, позволяющий обрабатывать запросы и формировать ответы
import random as ran # Импортируем рандом
class MainHandler(tornado.web.RequestHandler): # Определяем обработчик запросов на ресурс "/" со стандартным приветствием (невероятно полезный):
def get(self): # Обрабатываем GET-запрос (который клиент отправляет, когда ему скучно и нечем заняться):
self.write("Hello, world") # Передаем клиенту прекрасную фразу "Hello, world"
class RegisterHandler(tornado.web.RequestHandler): # Определяем обработчик запросов на ресурс "/register" с возможностью зарегистрироваться:
def get(self): # Обрабатываем GET-запрос (который клиент посылает, когда игрок хочет зарегистрироваться в игре):
global player_1 # Мы используем переменную player_1, которая живет глобально, и наши изменения сохранятся даже вне этой функции
global player_2 # Мы используем переменную player_2, которая живет глобально, и наши изменения сохранятся даже вне этой функции
if player_1 == "": # Если первый игрок еще не зарегистрирован в игре:
player_1 = "".join(ran.choices(alphabet, k=16)) # Генерируем рандомный секретный ключ для первого игрока и запоминаем его
self.write({"player": 1, "key": player_1}) # Передаем клиенту информацию о том, что он успешно зарегистрировался первым, и его ключ для участия в игре
elif player_2 == "": # Таким же образом, если второй игрок еще не зарегистрирован в игре:
player_2 = "".join(ran.choices(alphabet, k=16)) # Генерируем рандомный секретный ключ для второго игрока и запоминаем его
self.write({"player": 2, "key": player_2}) # Передаем клиенту информацию о том, что он успешно зарегистрировался вторым, и его ключ для участия в игре
else: # А вот если оба игрока уже зарегистрированы, то мы:
self.write({"player": 0, "key": ""}) # Передаем клиенту информацию о том, что он не смог зарегистрироваться в игре (говорим, что он нулевой игрок)
class FetchHandler(tornado.web.RequestHandler): # Определяем обработчик запросов на ресурс "/fetch" с информацией о текущем состоянии игры:
def get(self): # Обрабатываем GET-запрос (который клиент отправляет, когда хочет узнать текущую обстановку в игре):
self.write({"area_1": area_1, "area_2": area_2}) # Передаем клиенту информацию о текущем состоянии игровых полей
def make_app(): # Определяем функцию, которая собирает все наши обработчики запросов в один Торнадо-сервер:
return tornado.web.Application([ # Функция создаст и вернет серверное приложение, в котором есть:
(r"/", MainHandler), # Ресурс "/", по которому нам всегда говорят "Hello, world"
(r"/register", RegisterHandler), # Ресурс "/register", который позволяет зарегистрировать игрока в игре и получить ключ для участия в ней
(r"/fetch", FetchHandler) # Ресурс "/fetch", по которому можно получить информацию о текущем состоянии игры
])
if _name_ == "__main__": # Данный блок кода выполнится при запуске этого Питон-файла, но не выполнится при его импортировании:
alphabet = "abcdefghijklmnopqrstuvwxyz0123456789" # Выписываем алфавит, из которого потом будут генерироваться ключи для игроков
player_1 = "" # В этой переменной мы будем хранить секретный ключ первого игрока, но пока он не зарегистрировался, здесь будет пустая строка
player_2 = "" # То же самое мы делаем и для второго игрока
area_1 = [[None] * 10 for i in range(10)] # На этой и следующей строке мы создаем одинаковые игровые поля 10 x 10 для каждого из двух игроков
area_2 = [[None] * 10 for i in range(10)] # Мы генерируем 10 строк, в каждой из которых будет по 10 клеток (а в каждой клетке будет None, у нас это обозначает неизвестную игроку клетку)
app = make_app() # Используем нашу функцию make_app, чтобы создать Торнадо-сервер
app.listen(8888) # Занимаем сетевой порт под номером 8888 (это число можно поменять, если данный порт уже занят чем-то важным)
tornado.ioloop.IOLoop.current().start() # Начинаем принимать запросы от клиентов
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment