UProLa

Неокріпші думки

Тетріс на Хаскелі

with 3 comments

Нещодавно я закінчив перший етап написання тетрісу, а саме добився того, щоб фігури падали і стакалися на дні дисплею. Перед тим, як поділитись своїми враженнями, хочу щоб бажаючі могли уявити собі складність (або простоту — як для кого) вирішення поставленої задачі на вибраному інстурменті — GHCi, найпопулярнішому інтерпретаторі Хаскеля.

Зазначу, що в даному пості зібрано задачі, які “щось виводять на консоль” і по своїй природі є процедурами як у Паскалі. Кожна наступна задача складніша за попередню. Розв’язки до задач надруковано білим текстом під умовою.

Нестандартні бібліотеки не використовуються! Єдиною довзоленою операцією при роботі з консоллю є вивід рядка на екран — putStrLn або print.

Задача 0 (розігрівка). Написати функцію clrscr, котра очищує екран консолі. Очищення робити через вивід великої кількості порожніх рядків.

Prelude> let clrscr = putStrLn (replicate 100 '\n')

Задача 1. Нехай задано дисплей гри у такому вигляді:

let screen = [ "           "
             , "           "
             , "           "
             , "  # ##   # "
             , "### ##  ###"
             ]

Вивести його на екран консолі.

Prelude> mapM_ print screen

Задача 2. Написати функцію showFigure, яка приймає на вхід h — висоту дисплею , (x, y) — координати фігури відносно правого верхнього кута дисплею, fig — геометрію фігури та виводить фігуру на консоль. Геометрія фігури задається у такому вигляді:

let figure = [" # "
             ,"###"
             ]

Prelude> let showFigure h (x, y) fig = putStrLn$ replicate y '\n' ++ foldr (++) "" (map (\line -> replicate x ' ' ++ line ++ "\n") fig) ++ replicate (h-y-1-length fig) '\n'

Задача 3. Нехай стан гри задано у вигляді наступного кортежу:

    let gameState = (screen, (x, y, figure))

Призначення елементів кортежу, сподіваюсь, зрозуміле. Завдання: написати функцію, яка виводить на екран цей стан так, щоб фігура знаходилась на дисплеї у вказаних координатах. Важливо, що якщо фігура частково або повністю виходить за дисплей, то не відображати невидимі блоки.

Я маю справді геніальне рішення цієї задачі, але воно не вміщується на полях даного посту.

Задача 4. Нехай стан гри задано у вигляді наступного кортежу:

    let gameState = (screen, Just (figure, x, y), Just figure, speed)

Відобразити на консоль наступне: дисплей у потовщеній рамці, поверх нього першу фігуру по вказаним координатам, зліва від дисплей відобразити другу фігуру (так звана “наступна фігура”), а також зробити зліва підпис “Швидкість: ” з вказаною швидкістю. Як видно по опису, фігури можуть бути не задані.

Признаюсь чесно: цю задачку я придумав, чисто щоб зайняти ваші мізки чимось корисним. Коли зробите, відішліть мені на e-mail розв’язок, я використаю у своїй грі =)

Written by danbst

Березень 3, 2012 at 21:37

Оприлюднено в Програмування

Відповідей: 3

Subscribe to comments with RSS.

  1. Етапи написання тетрісу? Він ж пишеться за вечір, навіть в функціональному стилі.

    alexyakushev

    Березень 3, 2012 at 22:10

    • це коли ти знаєш мову та ідіоми. В моєму випадку це був як “Hello world” =)

      danbstt

      Березень 4, 2012 at 00:37

      • А, вибачай. Я думав ти бородатий хаскеліст, раз ти його Бунику рекомендував:)

        alexyakushev

        Березень 4, 2012 at 00:41


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: