Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Snake-4 #5

Open
Stervar opened this issue Oct 22, 2024 · 0 comments
Open

Snake-4 #5

Stervar opened this issue Oct 22, 2024 · 0 comments
Assignees
Labels
documentation Improvements or additions to documentation

Comments

@Stervar
Copy link
Owner

Stervar commented Oct 22, 2024

Импорт необходимых библиотек

import sys # Для системных операций
import time # Для работы со временем
import random # Для генерации случайных чисел
import curses # Для создания текстового интерфейса
from curses import textpad # Для отрисовки рамок

def main(stdscr):
# Инициализация curses
curses.curs_set(0) # Скрыть курсор
stdscr.nodelay(1) # Неблокирующий режим ввода
stdscr.timeout(50) # Установка задержки для getch()

# Настройка цветовых пар
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)   # Зеленый для тела змейки
curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)     # Красный для обычного яблока
curses.init_pair(3, curses.COLOR_BLUE, curses.COLOR_BLACK)    # Синий для большого яблока
curses.init_pair(4, curses.COLOR_YELLOW, curses.COLOR_BLACK)  # Желтый для головы змейки

# Инициализация игровых переменных
direction = curses.KEY_RIGHT  # Начальное направление - вправо
score = 0                     # Начальный счет
start_time = time.time()      # Время начала игры
difficulty = 1                # Начальная сложность
map_size = 'medium'           # Начальный размер карты
paused = False               # Флаг паузы

def create_apple(snake, box):
    """Создание яблока в случайной позиции, не занятой змейкой"""
    while True:
        apple = [random.randint(box[0][0] + 1, box[1][0] - 1), 
                random.randint(box[0][1] + 1, box[1][1] - 1)]
        if apple not in snake:
            return apple

def show_menu():
    """Отображение главного меню с ASCII-артом"""
    # ... (код меню)

def show_info():
    """Отображение информации об игре"""
    # ... (код информации)

def set_difficulty():
    """Установка уровня сложности"""
    # ... (код установки сложности)

def set_map_size():
    """Установка размера карты"""
    # ... (код установки размера карты)

# Главный цикл меню
while True:
    action = show_menu()
    if action == 'play': break
    elif action == 'info': show_info()
    elif action == 'difficulty': set_difficulty()
    elif action == 'map_size': set_map_size()
    elif action == 'exit': sys.exit()

# Установка размеров карты
if map_size == 'small': sh, sw = 20, 40
elif map_size == 'medium': sh, sw = 30, 60
else: sh, sw = 40, 80

w = sw - 2
h = sh - 2

# Создание игрового поля
box = [[1, 1], [h, w]]
textpad.rectangle(stdscr, box[0][0], box[0][1], box[1][0], box[1][1])

# Инициализация змейки и яблок
snake = [[sh//2, sw//2]]  # Начальная позиция змейки
apple = create_apple(snake, box)       # Создание обычного яблока big_apple = create_apple(snake, box)   # Создание большого яблока
last_move_time = time.time()          # Время последнего движения змейки

# Главный игровой цикл
while True:
    current_time = time.time()
    stdscr.clear()
    textpad.rectangle(stdscr, box[0][0], box[0][1], box[1][0], box[1][1])
    stdscr.addstr(0, 0, f"Счет: {score} | Время: {int(current_time - start_time)} сек.")
    stdscr.addstr(0, w-5, "Выход: Q | Пауза: P")

    # Отрисовка змейки и яблок
    for i, (y, x) in enumerate(snake):
        if i == 0:
            stdscr.addch(y, x, '@', curses.color_pair(4))  # Голова змейки
        else:
            stdscr.addch(y, x, '#', curses.color_pair(1))  # Тело змейки

    stdscr.addch(apple[0], apple[1], '*', curses.color_pair(2))  # Обычное яблоко
    stdscr.addch(big_apple[0], big_apple[1], '*', curses.color_pair(3))  # Большое яблоко

    stdscr.refresh()

    # Обработка ввода пользователя
    key = stdscr.getch()
    if key != -1:
        if key == ord('q'): break
        elif key == ord('p'): 
            paused = not paused
            while paused:
                stdscr.addstr(sh//2, sw//2 - 5, "Пауза. Нажмите P, чтобы продолжить.")
                stdscr.refresh()
                key = stdscr.getch()
                if key == ord('p'):
                    paused = False
                    break
        elif key in [curses.KEY_UP, ord('w')] and direction != curses.KEY_DOWN:
            direction = curses.KEY_UP
        elif key in [curses.KEY_DOWN, ord('s')] and direction != curses.KEY_UP:
            direction = curses.KEY_DOWN
        elif key in [curses.KEY_LEFT, ord('a')] and direction != curses.KEY_RIGHT:
            direction = curses.KEY_LEFT
        elif key in [curses.KEY_RIGHT, ord('d')] and direction != curses.KEY_LEFT:
            direction = curses.KEY_RIGHT

    # Механика движения змейки
    if current_time - last_move_time > 0.1 / difficulty and not paused:
        last_move_time = current_time
        head = snake[0]
        if direction == curses.KEY_UP:
            new_head = [head[0] - 1, head[1]]
            time.sleep(0.01)  # Добавить небольшую задержку для вертикального движения
        elif direction == curses.KEY_DOWN:
            new_head = [head[0] + 1, head[1]]
            time.sleep(0.01)  # Добавить небольшую задержку для вертикального движения
        elif direction == curses.KEY_LEFT:
            new_head = [head[0], head[1] - 1]
        elif direction == curses.KEY_RIGHT:
            new_head = [head[0], head[1] + 1]

        # Проверка столкновения с границами
        if new_head[0] < box[0][0] + 1:
            new_head[0] = box[1][0] - 1
        elif new_head[0] > box[1][0] - 1:
            new_head[0] = box[0][0] + 1
        if new_head[1] < box[0][1] + 1:
            new_head[1] = box[1][1] - 1
        elif new_head[1] > box[1][1] - 1:
            new_head[1] = box[0][1] + 1

        snake.insert(0, new_head)

        # Проверка столкновения с собой
        if snake[0] in snake[1:]:
            stdscr.addstr(sh//2, sw//2 - 5, "Вы проиграли!")
            stdscr.refresh()
            time.sleep(2)
            break
        # Проверка столкновения с яблоком
        elif snake[0] == apple:
            score += 1
            apple = create_apple(snake, box)
        elif snake[0] == big_apple:
            score += 2
            big_apple = create_app le(snake, box)
            snake.insert(0, [snake[0][0], snake[0][1]])  # Добавить дополнительный сегмент
        else:
            snake.pop()

    # Проверка победы
    if len(snake) == w * h:
        stdscr.addstr(sh//2, sw//2 - 5, "Вы выиграли!")
        stdscr.refresh()
        time.sleep(2)
        break

curses.wrapper(main)

@Stervar Stervar self-assigned this Oct 22, 2024
@Stervar Stervar added the documentation Improvements or additions to documentation label Oct 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

1 participant