Язык программирования Перфолента.Net - Официальный сайт

 Язык программирования Перфолента.Net - Официальный сайт.

Поиск   
Главная :: О проекте :: Контакты :: Обратная связь :: Благодарности :: ВходГость

   >   >   > 


Пример «Игра Змейка»

Файлы:

  • Игры
    • Игра Змейка.перфо

Пример программы на языке программирования Перфо:



//Эта игра написана на скриптовом языке Перфо

//Программа портирована с языка Перфолента

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

//Импорт имен применяется, что бы не писать много раз пространство и/или имя типа
(ИмпортИмен Промкод.Перфолента.Консоль)
      
//--- Инициализируем консоль ---

(Очистить)

//проверим, что работает идентификатор начинающийся с точки
//это значит, что имя типа находится в одном из импортированных пространств имен
//в данном случае это Консоль
(Уст .Заголовок "Змейка!")

(.РазмерОкна 1 1) //это необходимо, что бы не было ошибки на следующих двух строках,
//хотя ошибка все равно может случиться, если в консоли установлен большой размер шрифта
//и в результате изменения размеров окна консоль не помещается на экран
(.РазмерБуфера 56 38)
(.РазмерОкна 56 38)

//дальше буду писать Консоль явно, что бы начинающие программисты видели
//какому типу принадлежит вызываемый член
(Уст Консоль.ВидимостьКурсора Ложь)

(Консоль.Показать)
(Консоль.НеИзменятьРазмерКонсоли)  

(Перем ГСЧ (Новый ГенераторСлучайныхЧисел))

//--- Выводим приветствие

(Консоль.ПозицияКурсора 20 14)
(Вывод "Игра - ЗМЕЙКА")
(Перем Синт (Новый Речь.Синтезатор))
(Синт.Произнести "Начинаем игру!" Истина)

#Область "Главный цикл игры"

//бесконечный цикл игры   
(Цикл

    //--- Инициализация уровня игры

    (Уст Консоль.ЦветТекста ЦветаКонсоли.Зеленый)
    (Уст Консоль.ЦветФона ЦветаКонсоли.Черный)
    
    (Очистить)  
    
    (Перем ТекЦветТекста Консоль.ЦветТекста)
    (Перем ТекЦветФона Консоль.ЦветФона)
    
    (Перем Счет 0)
    (Перем Задержка 100)
    (Перем НаправлениеДвижения "вправо")
    
    (Перем КроликЕсть Ложь)
    (Перем КроликЛево 0)
    (Перем КроликВерх 0)
    
    (Перем ТемныйЦветТелаЗмейки Ложь)

    //в этих массивах будем хранить координаты тела змейки
    (Перем ЗмейкаЛево (Новый Массив<Целое>))
    (Перем ЗмейкаВерх (Новый Массив<Целое>))
    
    //заполним координаты тела змейки
    (Перем ДлинаЗмейки 8)
    (Перем ТекЛево 13)
    (Перем ТекВерх 20)
    (Для (ТекЛево ТекЛево (+ ТекЛево (- ДлинаЗмейки 1))) 
        (ЗмейкаЛево.Добавить ТекЛево)
        (ЗмейкаВерх.Добавить ТекВерх)
    ) 

    (Перем Играем Истина)

    //цикл уровня игры  
    (Пока Играем
    
        (Если (= КроликЕсть Ложь)
          (
            //если кролик съеден, то нарисуем нового
            (Перем КроликЛево (ГСЧ.СлучайноеЦелое 4 (- Консоль.ШиринаОкна 4)))
            (Перем КроликВерх (ГСЧ.СлучайноеЦелое 4 (- Консоль.ВысотаОкна 4)))
        
            //проверим, что бы кролик не попал в тело змейки    
            (Перем ПопалиВТело Ложь)
            (Для (Инд (- ЗмейкаЛево.Количество 1) 1 -1)
                (Если (и (= (ЗмейкаЛево.Получить Инд) КроликЛево) 
                          (= (ЗмейкаВерх.Получить Инд) КроликВерх)
                       )
                    (
                    (Перем ПопалиВТело Истина)
                    (Прервать)
                    )
                )
            )
            
            (Если ПопалиВТело //(= ПопалиВТело Истина)
                //идем на следующую попытку создания нового кролика
                (Продолжить)
                //иначе
                (
                    //получилось, новые координаты кролика подходят
                    (Перем КроликЕсть Истина)
                    (Консоль.ПозицияКурсора КроликЛево КроликВерх)
                    (Уст Консоль.ЦветТекста ЦветаКонсоли.Циан)
                    (Уст Консоль.ЦветФона ТекЦветФона)
                    (Консоль.Вывод "V") //такой вот у нас кролик, одни уши :)
                )
            )
          )
        )//КонецЕсли
        
        //если длина змейки выросла, то увеличим размер массивов хранящих координаты тела змейки
        (Если (НЕ (= ЗмейкаЛево.Количество (+ ДлинаЗмейки 1)))
            (Для (Инд 1 (- (+ ДлинаЗмейки 1) ЗмейкаЛево.Количество)) 
                (ЗмейкаЛево.Добавить 0)
                (ЗмейкаВерх.Добавить 0)
            )
        )
        
        //притормозим программу, что бы змейка не бегала слишком быстро
        //с каждым съеденным кроликом задержка будет уменьшаться
        (ЭтаПрограмма.Пауза Задержка)
        
        //если есть нажатая клавиша, то обработаем направление движения
        (Если (Консоль.ЕстьНажатаяКлавиша)
            (
            (Перем Клавиша (Консоль.ВвестиКлавишу "" Истина))
            (Уст Клавиша Клавиша.Клавиша)
            (Если (= Клавиша КлавишиКонсоли.СтрелкаВправо)
                (Если (НЕ (= НаправлениеДвижения "лево"))
                    (Перем НаправлениеДвижения "вправо")
                )
            )
            (Если (= Клавиша КлавишиКонсоли.СтрелкаВлево)
                (Если (НЕ (= НаправлениеДвижения "вправо"))
                    (Перем НаправлениеДвижения "лево")
                )
            )
            (Если (= Клавиша КлавишиКонсоли.СтрелкаВверх)
                (Если (НЕ (= НаправлениеДвижения "вниз"))
                    (Перем НаправлениеДвижения "вверх")
                )
            )
            (Если (= Клавиша КлавишиКонсоли.СтрелкаВниз)
                (Если (НЕ (= НаправлениеДвижения "вверх"))
                    (Перем НаправлениеДвижения "вниз")
                )
            )
            )
        ) 

        //двигаем голову в новую точку    
        (Если (= НаправлениеДвижения "вправо")
            (++ ТекЛево)
        (Если (= НаправлениеДвижения "лево")
            (-- ТекЛево)
        (Если (= НаправлениеДвижения "вниз")
            (++ ТекВерх)
        (Если (= НаправлениеДвижения "вверх")
            (-- ТекВерх)
        ))))

        //установим новую координату головы
        (ЗмейкаЛево.Установить 0 ТекЛево)
        (ЗмейкаВерх.Установить 0 ТекВерх)

        //передвинем тело змейки на один шаг
        (Для (Инд (- ЗмейкаЛево.Количество 1) 1 -1)
            (ЗмейкаЛево.Установить Инд (ЗмейкаЛево.Получить (- Инд 1)))
            (ЗмейкаВерх.Установить Инд (ЗмейкаВерх.Получить (- Инд 1)))
        )

        //нарисуем новое положение головы        
        (Если (Консоль.ПозицияВОкне (ЗмейкаЛево.Получить 0) (ЗмейкаВерх.Получить 0))
            (Консоль.ПозицияКурсора (ЗмейкаЛево.Получить 0) (ЗмейкаВерх.Получить 0))
            //исключение
            (
            (Перем Играем Ложь)
            (Синт.Произнести "Ой! Змейка подавилась!" Ложь)
            )
        )
        
        //будем чередовать цвета тела змейки
        (Перем ТемныйЦветТелаЗмейки (НЕ ТемныйЦветТелаЗмейки)) 
        (Если ТемныйЦветТелаЗмейки
            (Уст Консоль.ЦветФона ЦветаКонсоли.ТемноЗеленый)
            (Уст Консоль.ЦветФона ЦветаКонсоли.Зеленый)
        )
        (Уст Консоль.ЦветТекста ТекЦветТекста)
        (Консоль.Вывод "*")

        //стираем последнюю фалангу хвоста змейки
        (Консоль.ПозицияКурсора (ЗмейкаЛево.Получить (- ЗмейкаЛево.Количество 1)) (ЗмейкаВерх.Получить (- ЗмейкаВерх.Количество 1)))
        (Уст Консоль.ЦветФона ТекЦветФона)
        (Консоль.Вывод " ")

        //проверка съедания кролика
        (Если (И (= ТекЛево КроликЛево) (= ТекВерх КроликВерх))
            (
            (Перем КроликЕсть Ложь)
            (Перем ДлинаЗмейки (+ ДлинаЗмейки 1))
            (Перем Задержка (Целое (- Задержка (/ Задержка 30))))
            (Звук.Сигнал Звук.Сигналы.Вопрос)
            (Синт.Произнести "Ам ням ням!" Ложь)
            (Если (= 18 ДлинаЗмейки)
                (Синт.Произнести "Поздравляю с первым десятком!" Ложь)
            ) 
            )
        )

        //проверка на укус себя за хвост    
        (Для (Инд (- ЗмейкаЛево.Количество 1) 2 -1)
            (Если (И 
              (= (ЗмейкаЛево.Получить Инд) (ЗмейкаЛево.Получить 0)) 
              (= (ЗмейкаВерх.Получить Инд) (ЗмейкаВерх.Получить 0))
              )
                (
                (Перем Играем Ложь)
                (Синт.Произнести "Ой! Укусили себя за хвост!" Ложь)
                )
            )
        )
        
        (Перем Счет (- ДлинаЗмейки 8)               )//ровненько :) 
        (Консоль.ПозицияКурсора 2 2                 )
        (Уст Консоль.ЦветТекста ЦветаКонсоли.Белый  )
        (Уст Консоль.ЦветФона  ЦветаКонсоли.Черный  )
        (Вывод "Счет: " Счет                        )

    ) //КонецЦикла
    
    //уровень закончился, очистим игровое поле
    (Уст Консоль.ЦветФона ЦветаКонсоли.Черный)
    (Очистить)
    
    //подадим сигнал конца игры и помигаем надписью
    (Звук.Сигнал Звук.Сигналы.Перезвон)
    (Для (Инд 0 3) //повторим 4 раза
        (Для (Инд2 9 15) //мигаем только яркими цветами
            (Консоль.ПозицияКурсора 0 0)
            //получим цвет по индексу
            (Уст Консоль.ЦветТекста (ЦветаКонсоли.Получить Инд2)) 
            (Очистить)
            //функция СиСтр() демонстрирует внедрение в строку переносов строки и табуляций
            //как в языке Си
            (Вывод (СиСтр "\n\n\n\n\n") ПС)
            (Вывод (СиСтр "\n\t\t    Игра окончена!!!") ПС)
            (Вывод (СиСтр "\n\n\t\t  Вы набрали ") Счет " очков!" ПС)
            (ЭтаПрограмма.Пауза 100)
        )
    )
    
    (ЭтаПрограмма.Пауза 1000)
    (Вывод (СиСтр "\n\n\n\n\n\n       -- Нажмите любую клавишу для продолжения --") ПС)
    (ЭтаПрограмма.Пауза 500)
    //очистим буфер нажатых клавиш от случайно нажатых во время мигания надписей 
    (Пока (Консоль.ЕстьНажатаяКлавиша)
        (Консоль.ВвестиКлавишу "" Истина)
    )        
    //ждем последнего нажатия
    (Консоль.ВвестиКлавишу "" Истина)

) //КонецЦикла

#КонецОбласти  


К началу статьи


Вернуться в раздел:
Примеры по языку Перфо

Перейти в раздел:
Примеры
  Поддержи проект!

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

  Новости:
      29.12.2025 Анонс: Новая возможность - разрабатываем веб-сайты, веб-приложения и веб-API на Перфоленте!
      07.06.2025 Небольшие дополнения к документации на сайте - описание атрибута поля &Атомарное
      09.05.2025 На сайте опубликован релиз 0.4.16.0_SE дистрибутива языка программирования Перфолента.Net
      27.04.2025 Дополнена статья про циклы
      04.01.2025 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.15.0_CE
      23.09.2024 Опубликована новая статья: "Конструируем класс. Делегаты."
      30.08.2024 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.14.0
      24.05.2024 Обновлён справочный раздел сайта
      01.07.2023 Новая версия 0.4.13.0 языка программирования Перфолента.Net
       Все новости