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

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

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

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 40

    +5
    у нас в школьные (конец 90х) годы был чат на делфи — тоже через расшаренные текстовые фаилы работал
      0
      Да, были времена :)
        +7
        А у нас основным развлечением было рисовать:
        LINE (100, 50) — (50, 100)…
        Особо терпеливым удавалось создать шедевры компьютерной графики.
        Эх… И анимацию можно было делать простым FOR…
          0
          А у нас… А у нас ничего не было. «Учитель информатики» просил чтобы мы ничего сломали в виндоусе, потому что чинить некому. Даже бейсик сами протащили почти контрабандой.
          +1
          Мы этими LINEами и CIRCLEами на QBASIC делали тесты по разным предметам с подсчетом очков и выводом оценки. Школа нас таким образом использовала, а мы еще и деньги платили за посещение этого класса. Но всё равно все были безумно рады каждый раз приходить в эту волшебную комнату, полную гудящих машин и цветных мониторов с защитными экранами :)
          0
          Мы тоже делали, но потом наши проги снесли с компов, так как они жутко тормозили сеть. Весело было.
            0
            У нас в 2000-е в одной московской конторе с очень строгими правилами был такой чат на HTML и JS, в папке для временных файлов. Папка очищалась каждую ночь, поэтому история терялась. Иногда некоторые энтузиасты пытались ее сохранять и утром восстанавливать. В конторе была довольно большая текучка, и чатик допиливался коллективно. Одни умельцы уходили, другие принимали эстафету. Однажды подхватить было некому и чатик умер, так как админы в очередной раз закрутили гайки (то ли права на папку урезали, то ли еще что, не помню). Но потом стихийно возродился в другой папке.

            P.S. Если кто узнает и вспомнит, всем привет :)
              +1
              История хранилась в текстовых файлах? И как же js её туда писал?)
                0
                html файл лежал в той же папке, так что FileSystemObject работал.
              0
              В школьные годы нам не повезло. так как писали программы исключительно на листочках, не смотря на двухтысячные. А в универе уже развернулись. Самым примечательным проектом был чат на VB моего друга, который имел около 50 версий, 3 раза начинал писаться заново в связи с потерей исходников и только к 5 курсу чат переехал с файлов на сокеты. И через два месяца после этого исходники были благополучно потеряны через записывание на диск.
                0
                У нас в школьные годы была сеть под DOS+Netware на IPX, и чат писали на IPX-броадкастах…
                0
                Эх, как оно тормозит, походу…

                  0
                  Еще как тормозит,. Но это же не главная наша цель, верно? В целом, играбельно)
                    0
                    Очень за вас рад! Думаю, многие согласятся, что эта эйфория мало с чем сравнима.
                    Кстати, вспомнил хабростатью, в которой на bat писали подобным образом морской бой. дерзните ;) еще есть немного школьного времени
                      +1
                      Хмм, а это мысль :) Я думаю, можно попробовать.
                      0
                      delay:=0;
                      while delay<10 do
                      delay:=delay+0.00001;

                      Для такого Sleep() существует, который не сжирает ядро процессора на время задержки.
                        0
                        И который по неизвестной мне причине не работал
                          0
                          А в каких единицах вы передавали в sleep() время?
                            0
                            В милисекундах. Но наш turbo pascal почему-то вообще не распознавал Sleep() как процедуру!)
                              0
                              Насколько я помню, в Турбо Паскале должна быть совершенно шикарная встроенная справка. Неужели ничего похожего там нет?
                                0
                                Память вам не изменяет) Справка хорошая, но странная: о функциях WinApi — пожалуйста, а о функции засыпания — ничего.
                                  +1
                                  Turbo Pascal for Windows довольно быстро заменили Delphi, поэтому большинства функций в нем нет. Разве что загружать через LoadLibrary/GetProcAddress…
                                0
                                Хм… Хоть накатывай виртуалку и ищи Turbo Pascal. Аж прям заинтересовали. =) Кстати, а функции delay() тоже нету? Такое ощущение, что вы какую-то либу забыли подключить.
                                  0
                                  да кстати, насколько я помню там это не слип зовется а delay :)
                                    0
                                    Мда, до Delay() мы не додумались… Учитель нам долго говорил, что sleep()…
                                      0
                                      Ну вот будет время — проверите. =) Вообще, по Паскалю советую почитать Немнюгина. У него были неплохие книги, я по ним учился. Ну и поставить Паскаль на домашнюю машину тоже не помешает. Если уделять в день хотя бы полчаса-час времени, то знания можно прокачать очень неплохо, что особенно пригодится в техническом вузе.
                                        0
                                        На домашней машине у меня Flash, который привлек своей простотой :)
                                          0
                                          Уважаю. =) Я к флешу сделал пару подходов в свое время, так и не осилил его в достаточной степени.
                              –1
                              в делфи uses Windows нужен, это функция операционной системы.

                              В турбо паскале, ее, очевидно нет, и там чтобы задержки делать нужно использовать прерывания по таймеру (иначе задержки будут зависеть от мощности процессора, чем и грешили поделия того времени)
                            +3
                            [nosarcazm]Господи! Благослови этих отроков![/nosarcazm]
                            Реально, молодцы ребята! В правильном направлении развиваетесь.
                              +1
                              Чатик в Delphi довольно просто пишется при помощи компонтов Indy для с UDP. Правда, для нескольких подсетей оно вряд ли сработает, но пофиг. Для отправки сообщений используются широковещательные сообщения. А если изобрести какие-нибудь команды чата, то можно и играть, и рисовать посредством них. В школе и колледже на первом курсе тоже таким баловался :-)
                                +2
                                На Delphi даже писать не надо, в демках есть готовый проект :)
                                  0
                                  Точно помню, что у одноклассника были проблемы с Indy: начальный пакет не доходил. Решается быстро, но сначала надо обнаружить проблему.
                                  +1
                                  Молодцы, что не сдались, а довели задуманное до работающего продукта, про который ещё и статью написали!
                                  И да, это чувство, когда твоё детище работает, действительно неописуемо прекрасно. Поздравляю.
                                    –2
                                    А теперь сделать игру для андройда без постоянного подключения к интернету, и растянуть например игру шахмат на 2-3 дня
                                      0
                                      Помнится тоже только познавал сокеты, но ничего не работало еще, а начальство поставило задание срочно сделать прогу для приема экзаменов по ПДД в компьютерном классе, по сети. Сделал на файлах через расшаренную папку, и оно работало!
                                        +3
                                        Хотел было написать комментарий вида «что Это делает на хабре?!». Но последние строки тронули, поставил за статью плюс :)
                                          +1
                                          Ох, а я не открывая статьи понял, о чём будет речь!
                                          Мы то же самое делали в школе, только у нас был сервак на Novell NetWare, а клиенты все бездисковые с DOSом. Нас действительно учили программированию (Basic, потом Pascal), и сорцы все хранились на серваке. Соответственно, были доступны всем одновременно. Можно было чужой подсмотреть, или удалить. Ещё развлечение было — зафлудить общий диск файлами «вася.лох», при помощи небольшой программки :)

                                          Так вот, я тоже писал сетевую игру с синхронизацией через файл (клоподавка)! Очень приятно было почитать статью и повспоминать, спасибо!
                                            0
                                            О, да) флуд общего диска через батник… Я помню те несколько тысяч файлов)

                                          Only users with full accounts can post comments. Log in, please.