Пример «Игра Перфо-Тетрис»
Файлы:
- Игры
- Игра Перфо-Тетрис.перфо
Пример программы на языке программирования Перфо:
//Это программа-пример на языке Перфо,
//которая написана для демонстрации синтаксиса языка
//В создании игры принял активное участие ИИ Копилот!
//Вы можете самостоятельно доработать игру:
//- добавить цвет
//- добавить показ следующей фигуры
//- сделать так, что бы при нажатии клавиши вниз фигура сразу падала на дно
//Проявите фантазию!
(ИмпортИмен Промкод.Перфолента.Консоль)
(Консоль.Заголовок "Перфо-Тетрис")
(Перем Синт (Новый Речь.Синтезатор))
(Синт.Произнести "Начинаем игру!" Ложь)
(Функция (СоздатьБлок 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)
(Синт.Произнести "Спасибо за игру!" Истина)
К началу статьи
Вернуться в раздел:
Примеры по языку Перфо
Перейти в раздел:
Примеры