Пост #1350
Изображение
// Змейка — классическая игра на языке Ы
// Управление: стрелки / WASD
// q — выход

функция змейка() ::> {
сырой_режим(истина)
вывести("\x1b[?1049h\x1b[?25l")

своя т = размер_терминала()
своя ширина = т[0]
своя высота = т[1]
своя поле_ш = ширина - 2
своя поле_в = высота - 3
если (поле_ш < 10) ступень ::> { поле_ш = 10 }
если (поле_в < 10) ступень ::> { поле_в = 10 }

своя длина_тела = 3
своя голова_х = 5
своя голова_у = поле_в / 2
своя напр_х = 1
своя напр_у = 0

// тело[0] = голова (O), тело[1..] = хвост (o)
своя тело = (голова_у * поле_ш + голова_х)..(голова_у * поле_ш + голова_х + 1)
тело = тело ++ ((голова_у * поле_ш + (голова_х - 1))..(голова_у * поле_ш + голова_х))
тело = тело ++ ((голова_у * поле_ш + (голова_х - 2))..(голова_у * поле_ш + (голова_х - 1)))

своя еда_поз = 0
своя еда_годна = ложь
своя счёт = 0
своя работаем = истина
своя игра_идёт = истина

пока (работаем) ступень ::> {
если (не еда_годна) ступень ::> {
еда_поз = случайное(поле_ш * поле_в)
еда_годна = истина
своя к = 0
пока (к < длина_тела) ступень ::> {
если (тело[к] == еда_поз) ступень ::> { еда_годна = ложь }
к = к + 1
}
}

своя буфер = "\x1b[H"
своя к = 0
буфер = буфер ++ "#"
пока (к < поле_ш) ступень ::> {
буфер = буфер ++ "#"
к = к + 1
}
буфер = буфер ++ "#\r\n"

своя у = 0
пока (у < поле_в) ступень ::> {
буфер = буфер ++ "#"
своя х = 0
пока (х < поле_ш) ступень ::> {
своя поз = у * поле_ш + х
своя символ = " "
если (поз == еда_поз) ступень ::> { символ = "*" }
иначе ступень ::> {
своя з = 0
пока (з < длина_тела) ступень ::> {
если (тело[з] == поз) ступень ::> {
если (з == 0) ступень ::> { символ = "O" }
иначе ступень ::> { символ = "o" }
}
з = з + 1
}
}
буфер = буфер ++ символ
х = х + 1
}
буфер = буфер ++ "#\r\n"
у = у + 1
}

к = 0
буфер = буфер ++ "#"
пока (к < поле_ш) ступень ::> {
буфер = буфер ++ "#"
к = к + 1
}
буфер = буфер ++ "#\r\n"
буфер = буфер ++ " Счёт: " ++ счёт ++ " Q:Выход"
если (не игра_идёт) ступень ::> { буфер = буфер ++ " ИГРА ОКОНЧЕНА!" }
вывести(буфер)

своя кл = клавиша()
если (кл == "q") ступень ::> { работаем = ложь }
если (игра_идёт) ступень ::> {
если (кл == "\x1b[A") ступень ::> {
если (напр_у != 1) ступень ::> {
напр_х = 0
напр_у = -1
}
}
}
если (игра_идёт) ступень ::> {
если (кл == "\x1b[B") ступень ::> {
если (напр_у != -1) ступень ::> {
напр_х = 0
напр_у = 1
}
}
}
если (игра_идёт) ступень ::> {
если (кл == "\x1b[D") ступень ::> {
если (напр_х != 1) ступень ::> {
напр_х = -1
напр_у = 0
}
}
}
если (игра_идёт) ступень ::> {
если (кл == "\x1b[C") ступень ::> {
если (напр_х != -1) ступень ::> {
напр_х = 1
напр_у = 0
}
}
}
если (игра_идёт) ступень ::> {
если (кл == "w") ступень ::> {
если (напр_у != 1) ступень ::> {
напр_х = 0
напр_у = -1
}
}
}
если (игра_идёт) ступень ::> {
если (кл == "s") ступень ::> {
если (напр_у != -1) ступень ::> {
напр_х = 0
напр_у = 1
}
}
}
если (игра_идёт) ступень ::> {
если (кл == "a") ступень ::> {
если (напр_х != 1) ступень ::> {
напр_х = -1
напр_у = 0
}
}
}
если (игра_идёт) ступень ::> {
если (кл == "d") ступень ::> {
если (напр_х != -1) ступень ::> {
напр_х = 1
напр_у = 0
}
}
}

если (игра_идёт) ступень ::> {
своя нов_х = голова_х + напр_х
своя нов_у = голова_у + напр_у
своя нов_поз = нов_у * поле_ш + нов_х
если (нов_х < 0) ступень ::> { игра_идёт = ложь }
если (нов_х >= поле_ш) ступень ::> { игра_идёт = ложь }
если (нов_у < 0) ступень ::> { игра_идёт = ложь }
если (нов_у >= поле_в) ступень ::> { игра_идёт = ложь }
если (игра_идёт) ступень ::> {
своя к_т = 1
пока (к_т < длина_тела) ступень ::> {
если (тело[к_т] == нов_поз) ступень ::> { игра_идёт = ложь }
к_т = к_т + 1
}
}
если (игра_идёт) ступень ::> {
если (нов_поз == еда_поз) ступень ::> {
длина_тела = длина_тела + 1
счёт = счёт + 1
еда_годна = ложь
}
// Новое тело: [нов_голова, тело[0], тело[1], ..., тело[длина_тела-2]]
своя новое_тело = (нов_поз..(нов_поз + 1))
своя предел = длина_тела - 1
своя к_дв = 0
пока (к_дв < предел) ступень ::> {
новое_тело = новое_тело ++ (тело[к_дв]..(тело[к_дв] + 1))
к_дв = к_дв + 1
}
тело = новое_тело
голова_х = нов_х
голова_у = нов_у
}
}

пауза(150)
}

вывести("\x1b[?1049l\x1b[?25h")
сырой_режим(ложь)
вывести("Счёт: " ++ счёт)
}

змейка()


Ы скоро...
Аватар
Автор: oxi Мастер
1
+1 / -0