Как стать автором
Обновить

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

Время на прочтение 4 мин
Количество просмотров 3.9K
Здравствуйте, дорогие Хабражители!

Сразу хочу оговориться, что эта статья создана 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 Совсем забыл. Программы у нас запускались сразу в общей папке, так что они заточены под то, чтобы лежать в одной папке с текстовыми файлами.
Теги:
Хабы:
+27
Комментарии 40
Комментарии Комментарии 40

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн