Обсуждение:Python

Материал из Абсурдопедии
Перейти к навигацииПерейти к поиску

У меня появилась идея: вставить в абсурдопедию коды на Python для простых игр (чтобы можно было скопировать отсюда, вставить в VS Code и играть без обязательных дополнительных файлов, примеры: змейка, танчики, угадай число, симулятор водорослей и т.д.) Как это лучше сделать: новый раздел в этой статье или вообще новую статью? Prionosuchus (обсуждение) 08:31, 11 июля 2026 (UTC)

Отличная идея, но игры должны быть не абы какие, а абсурдопедийные. Славянск1989 (обсуждение) 08:43, 11 июля 2026 (UTC)
Помню, юзал аппку «Текстовые квесты — играй и пиши», где возможностей для квеста куда больше, чем в вики, а в Питоне их ещё больше, так что это очень здравая мысль. Славянск1989 (обсуждение) 08:55, 11 июля 2026 (UTC)
  • Вообще, я не очень сильна в придумывании абсурдных игр, но вот есть забавная библиотека antigravity (та, которая в std[1], а не от Гугла):
    import antigravity
    Просто пишите строку в сорцах программы или даже в REPL (то есть интерактивный терминал языка IDLE Shell) — она откроет веб-страницу. Если что, не нужно вызывать никакие там функции модуля, включая конструкторы классов, — так работает.
  • Ainya-san (обсуждение) 21:47, 11 июля 2026 (UTC)
  • Ещё мона написать побрякушку типа такого (^^):
import enum
import random
import time

class LoadingState(enum.Enum):
    FIRST = enum.auto()
    SECOND = enum.auto()
    DONE = enum.auto()

def _loading(message: str, time_interval=.05) -> None:
    try:
        print(message, "\t|", end="\b", flush=True)
        for _ in range(4):
            for e in "|/-\\":
                print(e, end="\b", flush=True)
                time.sleep(time_interval)
        print(flush=True)
    except KeyboardInterrupt:
        print(flush=True)
        raise

def loading1(time_interval=.05) -> LoadingState:
    try:
        while True:
            _loading("Загрузка игры...", time_interval)
    except KeyboardInterrupt:
        return LoadingState.SECOND

def loading2(time_interval=.05) -> LoadingState:
    messages = [
        "Исправлена ошибка.",
        "Появились две новые ошибки.",
        "Обновляется pip...",
        "Обновляется uv... (^^\")",
        "Переустанавливается virtualenv...",
        "Игра почти готова.",
    ]
    print(messages[2], "\t|", flush=True)
    try:
        while True:
            _loading(messages[random.randint(0, 4)], time_interval)
    except KeyboardInterrupt:
        return LoadingState.DONE


def main():
    print(
        "\x1b[1;91m"
        "Чтобы прервать загрузку игры, нажмите Ctrl + C.\nヾ(•ω•`)o"
        "\x1b[0m",
        flush=True
    )
    loading_state = LoadingState.FIRST
    while True:
        match loading_state:
            case LoadingState.FIRST:
                loading1()
                loading_state = LoadingState.SECOND
            case LoadingState.SECOND:
                loading2()
                loading_state = LoadingState.DONE
            case _: return print(
                "\x1b[1;91;107m"
                "Для запуска игры необходимо сначала написать игру. :\"3"
                "\x1b[0m",
                flush=True
            )
if __name__ == "__main__":
    main()

refs[править]

  1. Стандартная библиотека, то есть встроенная разработчиками языка
import tkinter as tk
import random
# Параметры
WIDTH = 800
HEIGHT = 800
CELL = 10
SPEED = 150  # мс
class Snake:
   def __init__(self, start_x, start_y, color, is_player=False):
       self.color = color
       self.is_player = is_player
       self.score = 0
       self.alive = True
       self.body = [
           [start_x, start_y],
           [start_x - CELL, start_y],
           [start_x - 2 * CELL, start_y]
       ]
       self.direction = "right"
       self.next_direction = "right"
       self.grow = False
   def head(self):
       return self.body[0]
   def set_direction(self, new_dir):
       opposites = {"up": "down", "down": "up", "left": "right", "right": "left"}
       if new_dir != opposites.get(self.direction):
           self.next_direction = new_dir
   def compute_new_head(self):
       dx = dy = 0
       if self.direction == "up":    dy = -CELL
       elif self.direction == "down": dy = CELL
       elif self.direction == "left": dx = -CELL
       elif self.direction == "right": dx = CELL
       return [self.head()[0] + dx, self.head()[1] + dy]
   def get_all_positions(self):
       return self.body

class AISnake(Snake):

   def __init__(self, start_x, start_y, color):
       super().__init__(start_x, start_y, color, is_player=False)
   def decide_direction(self, food, obstacles, width, height):
       if not self.alive:
           return
       head = self.head()
       possible = []
       for dx, dy, d in [(0, -CELL, "up"), (0, CELL, "down"),
                         (-CELL, 0, "left"), (CELL, 0, "right")]:
           nx, ny = head[0] + dx, head[1] + dy
           if (0 <= nx < width and 0 <= ny < height and [nx, ny] not in obstacles):
               possible.append((nx, ny, d))
       if not possible:
           self.direction = random.choice(["up", "down", "left", "right"])
           return
       food_x, food_y = food
       best = min(possible, key=lambda p: abs(p[0]-food_x) + abs(p[1]-food_y))
       self.set_direction(best[2])

class Game:

   def __init__(self, master):
       self.master = master
       master.title("Змейка 2 игрока (ИИ) — теперь с юмором!")
       master.resizable(False, False)
       # Верхняя панель с очками
       info = tk.Frame(master, bg="black")
       info.pack(side=tk.TOP, fill=tk.X)
       self.score_label1 = tk.Label(info, text="Игрок: 0", font=("Arial", 14), fg="lime", bg="black")
       self.score_label1.pack(side=tk.LEFT, padx=20)
       self.score_label2 = tk.Label(info, text="ИИ: 0", font=("Arial", 14), fg="cyan", bg="black")
       self.score_label2.pack(side=tk.RIGHT, padx=20)
       # Игровое поле (растягивается, занимает всё оставшееся место)
       self.canvas = tk.Canvas(master, width=WIDTH, height=HEIGHT, bg="black")
       self.canvas.pack(expand=True, fill=tk.BOTH)
       # Нижняя панель с управлением
       control_frame = tk.Frame(master, bg="black")
       control_frame.pack(side=tk.BOTTOM, fill=tk.X)
       control_text = "Управление: ↑ ↓ ← →  — движение, ПРОБЕЛ — новая игра"
       self.control_label = tk.Label(control_frame, text=control_text,
                                     font=("Arial", 12), fg="gray", bg="black")
       self.control_label.pack(pady=5)
       # Привязка клавиш
       master.bind("<Up>", lambda e: self.player_snake.set_direction("up") if self.player_snake.alive else None)
       master.bind("<Down>", lambda e: self.player_snake.set_direction("down") if self.player_snake.alive else None)
       master.bind("<Left>", lambda e: self.player_snake.set_direction("left") if self.player_snake.alive else None)
       master.bind("<Right>", lambda e: self.player_snake.set_direction("right") if self.player_snake.alive else None)
       master.bind("<space>", lambda e: self.reset_game())
       master.focus_set()
       # Абсурдные фразы для еды
       self.player_eat_phrases = [
           "Ням! Вкус байтика!",
           "Еда — это топливо для безумия!",
           "Я всё захаваю!",
           "Ммм… пиксельная диета!",
           "Я ем, чтобы не думать!",
           "Это не еда, это баг!",
           "Кальций для хвоста!"
       ]
       self.ai_eat_phrases = [
           "Приём пищи засчитан!",
           "Энергия для алгоритма!",
           "Вкусный байт, анализ…",
           "Тактическое подкрепление!",
           "Я ем, чтобы вычислять!",
           "Это не еда, это данные!",
           "Кушаем, чтобы побеждать!"
       ]
       # Абсурдные фразы при смерти (в стиле абсурдопедии)
       self.player_death_phrases = [
           "Ваша змея вошла в параллельную вселенную, где она — кот Шрёдингера.",
           "Змея устала от бесконечной гонки и ушла в монастырь.",
           "ИИ изменил программу — змея удалена.",
           "Ваша змея была съедена червём в яблоке.",
           "Змея утонула в серной кислоте.",
           "Змея оценила перспективы и сделала единственно верное решение.",
           "Змея решила, что жизнь — это боль, и самоуничтожилась.",
           "Игрок потерял управление, змея убилась апстену.",
           "Змея встретила свою вторую половинку — стену.",
           "Нестабильность пространства-времени поглотила змею."
       ]
       self.ai_death_phrases = [
           "ИИ запутался в собственных пикселях и упал.",
           "ИИ наступил на грабли своих же алгоритмов.",
           "ИИ потерпел фиаско из-за бага в квантовом процессоре.",
           "ИИ думал, что он умный, но оказался просто змеёй.",
           "ИИ попытался понять 67, но ниасилил.",
           "ИИ попытался предсказать движение и предсказал свою смерть.",
           "ИИ заснул на посту, змея уснула вечным сном.",
           "ИИ был сбит с толку Медведом.",
           "ИИ решил, что игра не стоит свеч, и вышел.",
           "Ошибка 404: интеллект не найден — змея исчезла."
       ]
       # Показываем заставку
       self.show_start_screen()
   def show_start_screen(self):
       """Рисует забавную заставку в стиле абсурдопедии."""
       self.canvas.delete("all")
       # Заголовок
       self.canvas.create_text(WIDTH//2, 150, text="🐍 ЗМЕЙКА: БИТВА С ИИ 🐍",
                               fill="yellow", font=("Arial", 32, "bold"))
       # Подзаголовок
       self.canvas.create_text(WIDTH//2, 220, text="Съешь красную точку или умри смеясь!",
                               fill="lime", font=("Arial", 20))
       # Абсурдные факты
       facts = [
           "Змеи не имеют ног, но имеют баги.",
           "ИИ думает, что он умный, но он всего лишь змея.",
           "Красная точка — это не еда, а просто пиксели.",
           "Стены — это друзья, пока в них не врежешься.",
           "В этой игре даже смерть смешна."
       ]
       y = 300
       for fact in facts:
           self.canvas.create_text(WIDTH//2, y, text=fact,
                                   fill="cyan", font=("Arial", 16, "italic"))
           y += 40
       # Инструкция
       self.canvas.create_text(WIDTH//2, 550, text="Нажми ПРОБЕЛ, чтобы начать безумие!",
                               fill="white", font=("Arial", 18, "bold"))
       # Улыбающаяся змея (ASCII-арт)
       self.canvas.create_text(WIDTH//2, 660, text="(:-)-~-~-~-~-~-~-~-~",
                               fill="lime", font=("Courier", 24))
       self.canvas.create_text(WIDTH//2, 700, text="(Эта змея улыбается, ибо знает, что вы проиграете)",
                               fill="gray", font=("Arial", 12))
   def reset_game(self):
       """Сбрасывает игру (или запускает после заставки)."""
       # Убираем заставку (если она есть)
       self.canvas.delete("all")
       # Инициализируем змей
       self.player_snake = Snake(WIDTH//4, HEIGHT//2, "lime", is_player=True)
       self.ai_snake = AISnake(3*WIDTH//4, HEIGHT//2, "cyan")
       self.snakes = [self.player_snake, self.ai_snake]
       self.food = None
       self.create_food()
       if hasattr(self, 'timer'):
           self.master.after_cancel(self.timer)
       self.update_scores()
       self.draw_all()
       # Показываем приветственные фразы
       self.show_message(self.player_snake, "Я крутой!", 2000)
       self.show_message(self.ai_snake, "Вычисляю...", 2000)
       self.timer = self.master.after(SPEED, self.update)
   def create_food(self):
       self.canvas.delete("food")
       occupied = []
       for s in self.snakes:
           occupied.extend(s.get_all_positions())
       while True:
           x = random.randint(0, WIDTH//CELL - 1) * CELL
           y = random.randint(0, HEIGHT//CELL - 1) * CELL
           if [x, y] not in occupied:
               self.food = [x, y]
               self.canvas.create_rectangle(x, y, x+CELL, y+CELL,
                                            fill="red", outline="darkred", tags="food")
               break
   def draw_snake(self, snake):
       for seg in snake.body:
           self.canvas.create_rectangle(seg[0], seg[1], seg[0]+CELL, seg[1]+CELL,
                                        fill=snake.color, outline="black", tags="snake")
   def draw_all(self):
       self.canvas.delete("snake")
       for s in self.snakes:
           if s.alive:
               self.draw_snake(s)
       if self.food:
           self.canvas.create_rectangle(self.food[0], self.food[1],
                                        self.food[0]+CELL, self.food[1]+CELL,
                                        fill="red", outline="darkred", tags="food")
   def update_scores(self):
       self.score_label1.config(text=f"Игрок: {self.player_snake.score}")
       self.score_label2.config(text=f"ИИ: {self.ai_snake.score}")
   def get_obstacles(self, exclude=None):
       occ = []
       for s in self.snakes:
           if s is exclude or not s.alive:
               continue
           occ.extend(s.get_all_positions())
       return occ
   def show_message(self, snake, text, duration=1500):
       """Показывает реплику над головой змейки (без рамки) с задержкой исчезновения."""
       if not snake.alive:
           return
       head = snake.head()
       x, y = head[0], head[1]
       y -= 25
       # Рамка убрана, только текст
       self.canvas.create_text(x, y, text=text, fill=snake.color,
                               font=("Arial", 10, "bold"), tags="speech")
       self.master.after(duration, lambda: self.canvas.delete("speech"))
   def update(self):
       if not any(s.alive for s in self.snakes):
           self.end_game()
           return
       # ИИ выбирает направление
       if self.ai_snake.alive:
           obstacles = self.get_obstacles(exclude=self.ai_snake)
           self.ai_snake.decide_direction(self.food, obstacles, WIDTH, HEIGHT)
       # Сохраняем старые тела
       old_bodies = {s: s.body.copy() for s in self.snakes if s.alive}
       # Вычисляем новые головы
       new_heads = {}
       for s in self.snakes:
           if s.alive:
               s.direction = s.next_direction
               new_heads[s] = s.compute_new_head()
       # Кто съел еду?
       ate = []
       for s, head in new_heads.items():
           if head == self.food:
               ate.append(s)
       # Строим новые тела
       new_bodies = {}
       for s in self.snakes:
           if not s.alive:
               continue
           head = new_heads[s]
           body = [head] + s.body
           if s not in ate:
               body.pop()
           new_bodies[s] = body
       # Проверяем столкновения
       dead = set()
       # Стены
       for s, body in new_bodies.items():
           hx, hy = body[0]
           if not (0 <= hx < WIDTH and 0 <= hy < HEIGHT):
               dead.add(s)
       # Столкновения с телами
       all_positions = {}
       for s, body in new_bodies.items():
           all_positions[s] = set(tuple(p) for p in body)
       for s, body in new_bodies.items():
           head = body[0]
           head_tuple = tuple(head)
           for other_s, other_positions in all_positions.items():
               if other_s == s:
                   if head_tuple in other_positions and head_tuple != tuple(body[0]):
                       dead.add(s)
                       break
               else:
                   if head_tuple in other_positions:
                       dead.add(s)
                       break
       # Столкновения голов
       head_positions = {}
       for s, body in new_bodies.items():
           head_positions[s] = tuple(body[0])
       for s1 in self.snakes:
           if not s1.alive or s1 in dead:
               continue
           for s2 in self.snakes:
               if s2 is s1 or not s2.alive or s2 in dead:
                   continue
               if head_positions[s1] == head_positions[s2]:
                   dead.add(s1)
                   dead.add(s2)
       # Применяем изменения
       for s in self.snakes:
           if s.alive and s not in dead:
               s.body = new_bodies[s]
               if s in ate:
                   s.score += 1
                   if s.is_player:
                       phrase = random.choice(self.player_eat_phrases)
                   else:
                       phrase = random.choice(self.ai_eat_phrases)
                   self.show_message(s, phrase, 1500)
                   self.food = None
                   self.create_food()
           else:
               if s.alive:
                   if s.is_player:
                       phrase = random.choice(self.player_death_phrases)
                   else:
                       phrase = random.choice(self.ai_death_phrases)
                   self.show_message(s, phrase, 2000)
               s.alive = False
       self.update_scores()
       self.draw_all()
       if not any(s.alive for s in self.snakes):
           self.end_game()
           return
       self.timer = self.master.after(SPEED, self.update)
   def end_game(self):
       if self.player_snake.alive and not self.ai_snake.alive:
           winner = "Игрок победил!"
           self.show_message(self.player_snake, "Я лучший! И не будет победы у ИИ!", 3000)
       elif self.ai_snake.alive and not self.player_snake.alive:
           winner = "ИИ победил!"
           self.show_message(self.ai_snake, "Человеки слабы! Кхтулху вас захавает!", 3000)
       else:
           winner = "Ничья (обе змеи убились апстену)"
       self.canvas.create_text(WIDTH//2, HEIGHT//2-20, text="ИГРА ОКОНЧЕНА",
                               fill="white", font=("Arial", 24, "bold"))
       self.canvas.create_text(WIDTH//2, HEIGHT//2+20, text=winner,
                               fill="yellow", font=("Arial", 16))
       self.canvas.create_text(WIDTH//2, HEIGHT//2+60,
                               text="Нажми ПРОБЕЛ для новой игры",
                               fill="white", font=("Arial", 14))

if __name__ == "__main__":

   root = tk.Tk()
   game = Game(root)
   root.mainloop()

Вот такого мастодонта можно вставить, но лучше в отдельную статью, где будут только игры. Должна работать начиная с версии Python 3.6. Prionosuchus (обсуждение) 10:22, 12 июля 2026 (UTC)

Ого, это вы сами написали? Славянск1989 (обсуждение) 12:05, 12 июля 2026 (UTC)
В соавторстве с ИИ (deepseek). Prionosuchus (обсуждение) 12:16, 12 июля 2026 (UTC)
Игра чисто для ПК, мобильной версии нет? Славянск1989 (обсуждение) 12:20, 12 июля 2026 (UTC)
Вставлять код мобильной версии сюда смысла нет, так как без установки сред программирования со специальными библиотеками (что большинство пользователей сделать не смогут или не захотят) игра работать не будет. Если есть желание и возможность, то могу вам в ваше обсуждение скинуть её код (у меня нет возможности его протестировать). Prionosuchus (обсуждение) 07:13, 13 июля 2026 (UTC)

Может, лучше написать игру не в реальном времени и без кнопок? Те же текстовые квесты при наличии фантазии могут быть очень сложные и интересные. А чтобы игра не была деревянным деревом, можно добавить рандом. Славянск1989 (обсуждение) 12:35, 12 июля 2026 (UTC)

Если писать квесты на Python, то их будет довольно сложно открывать с телефона, но попробовать можно. Ниже код игры, в которой нужно угадывать числа. В VS Code работает. Prionosuchus (обсуждение) 07:13, 13 июля 2026 (UTC)

import random

def play_game():

   print("\n" + "*=*"*10)
   print("Окак! Ещё один человек хочет попытать удачи.  ")
   print("*=*"*10)
   
   # Настройки диапазона
   lower = 1
   upper = 100
   secret = random.randint(lower, upper)
   attempts = 0
   max_attempts = 50  # можно убрать или увеличить
   
   print(f"Я загадал целое число от {lower} до {upper}.")
   print(f"У вас есть {max_attempts} попыток. Поехали!\n")
   
   while attempts < max_attempts:
       try:
           guess = int(input(f"Попытка {attempts+1}. Ваше число: "))
       except ValueError:
           print("Ты ДУРАК?! Тебя целое просили ввести!!!")
           continue
       
       attempts += 1
       
       if guess < lower or guess > upper:
           print(f"Число должно быть в диапазоне [{lower}, {upper}].")
           attempts -= 1  # не засчитываем попытку
           continue
       
       if guess < secret:
           print("АХАХАХА!!! Загаданное число БОЛЬШЕ.")
       elif guess > secret:
           print("Ну ты мазила! число МЕНЬШЕ.")
       else:
           print(f"\n🎉 Поздравляю! Вы угадали число {secret} за дохрена ({attempts}) попыток!")
           break
   else:
       print(f"\n😞 Расстрелять! Этот чувак даже число найти не может. Было загадано число {secret}.")
   
   # Спросить, хочет ли игрок продолжить
   while True:
       again = input("\nХотите проиграть ещё раз? (да/нет): ").strip().lower()
       if again in ("да", "нет", "д", "н"):
           break
       print("Что что? Введите 'да' или 'нет'.")
   return again in ("да", "д")

def main():

   print("\n" + "="*40)
   print("    ИГРА 'УГАДАЙ ЧИСЛО'")
   print("="*40)
   
   while True:
       if not play_game():
           print("\nСпасибо за игру! С вашего счёта списаны все деньги. До новых встреч!")
           break

if __name__ == "__main__":

   main()


50 попыток для 1 до 100, когда очевидно, что нужно бить по центру интервала? А предлагается ещё и убрать или увеличить? 🤣🤣🤣🤣🤣 Славянск1989 (обсуждение) 22:01, 13 июля 2026 (UTC)

В этой игре довольно легко менять настройки и каждый может подогнать игру под себя, но соглашусь, что 50 — многовато. А ведь найдутся и те, кто не смогут. Prionosuchus (обсуждение) 06:28, 14 июля 2026 (UTC)