Школьные забавы или мультиплеерная игра без сокетов и p2p

в 13:25, , рубрики: fun, game development, Gamedev, говнокод, ненормальное программирование, Песочница, школа, метки: , , ,

Здравствуйте, дорогие читатели!

Сразу хочу оговориться, что эта статья создана just for fun, и не претендует на какое-либо обучающее свойство.

В нашей школе информатику преподают с 6 класса, но ничему практически не научили, ибо мы так дружно и старательно форматировали тексты в Word'e, что закончили его изучать только к 9 классу. Было несколько уныло, и я занялся программированием. Помню, как копипастил «Hello, World!» из книжки по С++, потом первый калькулятор, потом еще калькулятор, затем познал ActionScript, сделал пару жутких игр, ну а потом обленился.
После очередного скучного задания по Excel, мы с другом решили воплотить нашу давнюю идею — сделать мультиплеерную игру. На школьных компьютерах стоял еще Macromedia Flash 8, Borland Delphi 7, и в другом конце класса на мониторе блестела эмблема Windows Server 2003.

Первая попытка...

… и первая же неудача. Мы пытались использовать стандартный компонент сокет сервера из Делфи, но тут сказался наш малый опыт в программировании и у нас не получилось даже подключиться. Даже тот поиск возможных проблем в Интернете не помог — жутко мешал бесполезныйИнтернет-цензор. Порядком отчаявшись, мы уже подумывали бросить нашу затею, как вдруг другу в голову пришла странная мысль: «А что если нам все сделать с помощью текстовых файлов?!». Сначала, я посмотрел на него, как на сумасшедшего, а потом понял, что в его идее что-то есть.

В итоге, мы сошлись, что надо бы попробовать разместить текстовые файлы на общем диске, любезно предоставленным сервером, и посмотреть, что из этого выйдет.

Выбор языка

Я придал этому большое значение, хоть выбор был совсем небольшой: старый ActionScript, Delphi или Pascal. Отстаивая Флеш, я долго и упорно пытался сделать чтение файлов, но(опять же из-за моего малого опыта) он не хотел открывать текстовый файл. Долго я бесился, успокаивался, думал, что же не так, но все без толку. В конце концов, бросил это дело, и мы опять с счастливыми рожами приступили к Excel'ю.

Спустя около половины четверти, выдался свободный урок — учителя не было. Сели мы за компьютер, открыли Turbo Pascal и решили написать «что-нибудь с WinApi». Порывшись в справке, мы нашли такие штуки, как SetCursorPos() и GetCursorPos(). С хитрым выражением лица, мы написали программки, которые синхронизировали курсоры мыши на двух компьютерах. Происходило это примерно так:
image

Для «засыпания» использовали костыль:

while (true) do
begin
/*здесь происходит чтение/запись в файл и присвоение через SetCursorPos()*/
delay:=0;
while delay<10 do
delay:=delay+0.00001;
end;

По неизвестной нам причине, не работала функция засыпания, и пришлось грузить компьютер лишними вычислениями.

Невозможно передать нашу радость, когда курсор на другом компьютере двигается без помощи мыши! Исходники можно найти здесь. Воодушевленные, мы приступили к создания пинг-понга.

Собственно, создание

Итак, мы, окрыленные своим маленьким, но жизнеутверждающим Win'ом, приступили к созданию пинг-понга. Клином стал вопрос визуализации. Решили использовать двумерный массив символов, в котором пробелами заполняется поле, несколькими символами ' | ' — игроки и «мяч». Программы вышло 3 — управляющая первым игроком, управляющая вторым игроком и управляющая мячом и его физикой.

Управление

Управление осуществляется мышкой, с помощью все той же GetCursorPos(). Первая неприятность, с которой встретились — масштабирование координат курсора относительно нашей «сетки»-массива. Если наша сетка имеет атрибуты 70x24, то школьные мониторы с разрешением 1024х640, что гораздо больше. Мы узнали соотношение атрибутов «сетки» и монитора, и делили координаты мыши на полученное отношение:

getCursorPos(cursorPos);

py := cursorPos.y div 20;

if(py > h - 5) then py := h - 5;
if(py < 1) then py := 1;

В нашем случае, отношение получилось равно 20. Также мы блокируем выход нашего курсора за пределы координат массива (h- высота поля, 5 — высота игрока).

Физика мяча

Как я заметил выше, вся физика мяча просчитывается в отдельной программе. Физика простейшая — при достижении мячом границ поля или столкновения с игроками вектор его скорости меняется на противоположный. При столкновении с игроками для придания геймплею хоть какого-то интереса, увеличиваем скорость нашего мяча. При выходе мяча за пределы массива, помещаем его в центр нашего поля и придаем случайную скорость. Отлично, с мячом закончили.

Синхронизация

Пожалуй, самое забавное в этой игре — синхронизация. У нас есть три текстовых файла: ball.txt, player_1.txt и player_2.txt. В ball.txt записываются координаты мяча, в файлы игроков — верхняя граница игрока. Каждый файл одновременно держат открытым сразу три программы, что существенно тормозит весь игровой процесс. Но тем не менее, существенных лагов не обнаружено.

Мораль сей басни...

… очевидна. Если нечего делать, то можно создать даже такую ерунду, как эта. и можно сказать, что время мы потратили не совсем бесполезно — когда играешь в свою, пусть корявую, дурацкую, но игру… Эмоции передать невозможно. Разумеется, что мы только самое обычное школоло и восхищаемся всему (как в свое восхищались «Hello World'ом»), что хоть как-то связано с программированием, но мне кажется, что мы не зря потратили время.

P.S. Исходники лежат здесь. Комментариев мало!

P.P.S Совсем забыл. Программы у нас запускались сразу в общей папке, так что они заточены под то, чтобы лежать в одной папке с текстовыми файлами.

Автор: Morozov_5F

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js