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

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

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

   >   >   > 


Пример «Игра Перфо-Тетрис»

Файлы:

  • Игры
    • Игра Перфо-Тетрис.перфо

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



//Это программа-пример на языке Перфо,
//которая написана для демонстрации синтаксиса языка

//В создании игры принял активное участие ИИ Копилот!

//Вы можете самостоятельно доработать игру:
//- добавить цвет
//- добавить показ следующей фигуры
//- сделать так, что бы при нажатии клавиши вниз фигура сразу падала на дно 

//Проявите фантазию!

(ИмпортИмен Промкод.Перфолента.Консоль)

(Консоль.Заголовок "Перфо-Тетрис")

(Перем Синт (Новый Речь.Синтезатор))
(Синт.Произнести "Начинаем игру!" Ложь)

(Функция (СоздатьБлок Y X)
    (Перем Блок (Новый Массив<Целое>))
    (Блок.Добавить Y)
    (Блок.Добавить X)
    //тут можно добавить цвет, тип блока и т.д.
    (Блок)
)

(Функция (МожноСдвинутьФигуру DX)
    (Перем Результат Истина)
    (Для (I 0 (- Фигура1.Количество 1))
        (Перем Блок (Фигура1.Получить I))
        (Перем Y (Блок.Получить 0))
        (Перем X (+ (Блок.Получить 1) DX))
        (Если (ИЛИ (< X 0) (> X Ширина))
            (
            (Уст Результат Ложь)
            (Прервать)
            )
            (Если (= (. (Поле.Получить Y) Получить X) 1)
                (
                (Уст Результат Ложь)
                (Прервать)
                )
            )
        )
    )
    (Результат)
)

(Функция (МожноПадать)
    (Перем Результат Истина)
    (Для (I 0 (- Фигура1.Количество 1))
        (Перем Блок (Фигура1.Получить I))
        (Перем Y (+ (Блок.Получить 0) 1))
        (Перем X (Блок.Получить 1))
        (Если (= Y Поле.Количество)
            (
            (Уст Результат Ложь)
            (Прервать)
            )
            (Если (ИЛИ (> Y Высота) (= (. (Поле.Получить Y) Получить X) 1))
                (
                (Уст Результат Ложь)
                (Прервать)
                )
            )
        ) 
    )
    (Результат)
)

(Функция (ЗафиксироватьФигуру)
    (Для (I 0 (- Фигура1.Количество 1))
        (Перем Блок (Фигура1.Получить I))
        (Перем Y (Блок.Получить 0))
        (Перем X (Блок.Получить 1))
        (. (Поле.Получить Y) Установить X 1)
    )
)

(Функция (ОчиститьЗаполненныеСтроки)
    (Перем Y (+ 1 Высота))
    (Пока (> Y 0)
        (-- Y)
        (Перем Строка (Поле.Получить Y))
        (Перем Заполнена Истина)
        (Для (X 0 Ширина)
            (Если (= (Строка.Получить X) 0)
                (
                (Уст Заполнена Ложь)
                (Прервать)
                )
            )
        )
        (Если Заполнена
            (
                // Удаляем строку
                (Поле.Удалить Y)
                // Вставляем новую пустую строку сверху
                (Перем Новая (Новый Массив<Целое>))
                (Для (X 0 Ширина)
                    (Новая.Добавить 0)
                )
                (Поле.Вставить 0 Новая)
                // Проверим ту же строку снова, т.к. она теперь сдвинулась
                (++ Y)
                (Уст Счет (+ 1 Счет))
                (Если (= 0 (% Счет 3))
                    (Синт.Произнести "Поздравляю!" Ложь)
                ) 
            )
        )
    )
)

(Функция (ПовернутьФигуру)
    // Центр поворота — второй блок.
    // Нужна доработка: Блок типа О (квадрат) вращать не надо...
    (Перем Центр (Фигура1.Получить 1))
    (Перем ЦентрY (Центр.Получить 0))
    (Перем ЦентрX (Центр.Получить 1))

    (Перем Новая (Новый Массив<Массив<Целое>>))
    (Перем МожноИстина Истина)

    (Для (I 0 (- Фигура1.Количество 1))
        (Перем Блок (Фигура1.Получить I))
        (Перем Y (Блок.Получить 0))
        (Перем X (Блок.Получить 1))

        (Перем dy (- Y ЦентрY))
        (Перем dx (- X ЦентрX))

        (Перем НовыйY (+ ЦентрY dx))
        (Перем НовыйX (- ЦентрX dy))

        (Если (ИЛИ (< НовыйX 0) (>= НовыйX Ширина) (< НовыйY 0) (>= НовыйY Высота))
            (
            (Уст МожноИстина Ложь)
            (Прервать)
            )
        )

        (Если (= (. (Поле.Получить НовыйY) Получить НовыйX) 1)
            (
            (Уст МожноИстина Ложь)
            (Прервать)
            )
        )

        (Перем НовыйБлок (СоздатьБлок НовыйY НовыйX))
        (Новая.Добавить НовыйБлок)
    )

    (Если (МожноИстина)
        (Уст Фигура1 Новая)
    )

    (Неопределено)
)

(Функция (СоздатьФигуруПоТипу Тип)
    (Перем Новая (Новый Массив<Массив<Целое>>))
    (Если (= Тип "I")
        ((Новая.Добавить (СоздатьБлок 0 10))
        (Новая.Добавить (СоздатьБлок 1 10))
        (Новая.Добавить (СоздатьБлок 2 10))
        (Новая.Добавить (СоздатьБлок 3 10)))
    )
    (Если (= Тип "O")
        ((Новая.Добавить (СоздатьБлок 0 10))
        (Новая.Добавить (СоздатьБлок 0 11))
        (Новая.Добавить (СоздатьБлок 1 10))
        (Новая.Добавить (СоздатьБлок 1 11)))
    )
    (Если (= Тип "T")
        ((Новая.Добавить (СоздатьБлок 0 11))
        (Новая.Добавить (СоздатьБлок 1 11))
        (Новая.Добавить (СоздатьБлок 1 10))
        (Новая.Добавить (СоздатьБлок 1 12)))
    )
    (Если (= Тип "S")
        ((Новая.Добавить (СоздатьБлок 0 12))
        (Новая.Добавить (СоздатьБлок 0 11))
        (Новая.Добавить (СоздатьБлок 1 10))
        (Новая.Добавить (СоздатьБлок 1 11)))
    )
    (Если (= Тип "Z")
        ((Новая.Добавить (СоздатьБлок 0 10))
        (Новая.Добавить (СоздатьБлок 0 11))
        (Новая.Добавить (СоздатьБлок 1 11))
        (Новая.Добавить (СоздатьБлок 1 12)))
    )
    (Если (= Тип "J")
        ((Новая.Добавить (СоздатьБлок 0 10))
        (Новая.Добавить (СоздатьБлок 1 10))
        (Новая.Добавить (СоздатьБлок 2 10))
        (Новая.Добавить (СоздатьБлок 2 11)))
    )
    (Если (= Тип "L")
        ((Новая.Добавить (СоздатьБлок 0 11))
        (Новая.Добавить (СоздатьБлок 1 11))
        (Новая.Добавить (СоздатьБлок 2 11))
        (Новая.Добавить (СоздатьБлок 2 10)))
    )
    (Новая)
)

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

(Функция (СоздатьСлучайнуюФигуру)
    (Перем Типы (Новый Массив<Строка>))
    (Типы.Добавить "I")
    (Типы.Добавить "O")
    (Типы.Добавить "T")
    (Типы.Добавить "S")
    (Типы.Добавить "Z")
    (Типы.Добавить "J")
    (Типы.Добавить "L")
    (Перем Индекс (ГСЧ.СлучайноеЦелое 0 (- Типы.Количество 1)))
    
    (СоздатьФигуруПоТипу (Типы.Получить Индекс))
    //(СоздатьФигуруПоТипу "I") //для теста можно только палки выводить
)

(Функция (МожноСоздатьФигуру Фигура)
    (Перем Результат Истина)
    (Для (I 0 (- Фигура.Количество 1))
        (Перем Блок (Фигура.Получить I))
        (Перем Y (Блок.Получить 0))
        (Перем X (Блок.Получить 1))
        (Если (ИЛИ (< Y 0) (>= Y Высота) (< X 0) (>= X Ширина))
            (
            (Уст Результат Ложь)
            (Прервать)
            )
        )
        (Если (= (. (Поле.Получить Y) Получить X) 1)
            (
            (Уст Результат Ложь)
            (Прервать)
            )
        )
    )
    (Результат)
)

(Уст Консоль.ВидимостьКурсора Ложь)
(.РазмерБуфера 40 25)
(.РазмерОкна 40 25)
(Очистить)

(Перем ОтступСлева 5)
(Перем ОтступСверху 2)
(Перем Ширина 20)
(Перем Высота 21)
(Перем Поле (Новый Массив<Массив<Целое>>))

// Инициализация поля
(Для (Y 0 Высота)
    (Поле.Добавить (Новый Массив<Целое>))
    (Для (X 0 Ширина)
        (. (Поле.Получить Y) Добавить 0)
    )
)

// Создадим начальную фигуру
(Перем Фигура1 (СоздатьСлучайнуюФигуру))

(Перем Задержка 300)
(Перем Счет 0)

// Основной цикл игры
(Цикл
    //выводим счет
    (Консоль.ПозицияКурсора 5 1)
    (Вывод "Счет: " Счет)
    // Отрисовка поля
    (Для (Y 0 Высота)
        (Для (X 0 Ширина)
            (Консоль.ПозицияКурсора (+ X ОтступСлева) (+ Y ОтступСверху))
            (Если (= (. (Поле.Получить Y) Получить X) 1)
                (Вывод "#")
                (Вывод ".")
            )
        )
    )
    // Отрисовка фигуры
    (Для (I 0 (- Фигура1.Количество 1))
        (Перем Блок (Фигура1.Получить I))
        (Перем Y (Блок.Получить 0))
        (Перем X (Блок.Получить 1))
        (Консоль.ПозицияКурсора (+ X ОтступСлева) (+ Y ОтступСверху))
        (Вывод "Ш")
    )

    (ЭтаПрограмма.Пауза Задержка)
     
     // Обработка нажатий клавиш
     // Выполним два раза для большей подвижности фигур
     (Для (Инд 0 1)
        (Если (Консоль.ЕстьНажатаяКлавиша)
            (
                (Перем Клавиша (Консоль.ВвестиКлавишу "" Истина))
                (Уст Клавиша Клавиша.Клавиша)
        
                (Если (И (= Клавиша КлавишиКонсоли.СтрелкаВлево) (МожноСдвинутьФигуру -1))
                    // Сдвиг фигуры влево
                    (Для (I 0 (- Фигура1.Количество 1))
                        (Перем Блок (Фигура1.Получить I))
                        (Блок.Установить 1 (- (Блок.Получить 1) 1)) // X--
                    )
                )
        
                (Если (И (= Клавиша КлавишиКонсоли.СтрелкаВправо) (МожноСдвинутьФигуру 1))
                    // Сдвиг фигуры вправо
                    (Для (I 0 (- Фигура1.Количество 1))
                        (Перем Блок (Фигура1.Получить I))
                        (Блок.Установить 1 (+ (Блок.Получить 1) 1)) // X++
                    )
                )
                
                (Если (= Клавиша КлавишиКонсоли.СтрелкаВверх)
                    (ПовернутьФигуру)
                )        
                
                (Если (= Клавиша КлавишиКонсоли.СтрелкаВниз)
                    (Если (МожноПадать)
                        (Для (I 0 (- Фигура1.Количество 1))
                            (Перем Блок (Фигура1.Получить I))
                            (Блок.Установить 0 (+ (Блок.Получить 0) 1))
                        )
                    )
                )        
            )
        )   
     ) 
    
    (Если (МожноПадать)
        (
            // Сдвигаем фигуру вниз
            (Для (I 0 (- Фигура1.Количество 1))
                (Перем Блок (Фигура1.Получить I))
                (Блок.Установить 0 (+ (Блок.Получить 0) 1))
            )
        )
        (
            // Фиксируем фигуру и создаём новую
            (ЗафиксироватьФигуру)
            (ОчиститьЗаполненныеСтроки)
            (Перем НоваяФигура (СоздатьСлучайнуюФигуру))
            (Если (МожноСоздатьФигуру НоваяФигура)
                (Уст Фигура1 НоваяФигура)
                (Прервать)
            )        
        )
    )    
    
    //Почистим буфер клавиатуры, что бы там не накапливались нажатия
    (Пока (Консоль.ЕстьНажатаяКлавиша)
        (Перем Клавиша (Консоль.ВвестиКлавишу "" Истина))    
    )
    
    
)

(Очистить)
(Консоль.ПозицияКурсора 10 10)
(Вывод "ИГРА ОКОНЧЕНА!")
(Консоль.ПозицияКурсора 10 12)
(Вывод "Ваш результат " Счет "!" ПС ПС)

//подадим сигнал конца игры
(Звук.Сигнал Звук.Сигналы.Перезвон Истина)
(ЭтаПрограмма.Пауза 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
       Все новости