Пост #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