Last active
September 2, 2019 21:52
-
-
Save Khazbs/7361e7d2024eb44cf016030fc522acbe to your computer and use it in GitHub Desktop.
Начали писать сервер для морского боя на двоих игроков
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# В этом файле мы пишем сервер для игры в морской бой по сети для двух игроков | |
# Если ты не понял или забыл, что такое клиент и сервер, или то, как они общаются в сети, можешь почитать вот эту ржаку: | |
# 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