Я вот задался задачей добавить рандомное появление врагов так, чтобы между ними можно было пройти(ну например запретить спавниться стеной, изза чего запарывать весь уровень), и чтобы не спавнились друг в друге, чтобы двигались постоянно вниз и чтобы это все вызывалось функцией.
Ниже скинул код, в котором запускается игра, отрисовывается два куба(один игрок, другой враг), игрок движеться влево вправо по клавишам ad, враг движеться вниз постоянно. Еще настроил паузу, и экран отладки на котором показывает положение игрока, умер он или нет(Если его корды совпали с вражескими то игрок погиб), и по идее положение всех врагов в зоне видимости.
from menu import menu import pygame as pg import random #menu() # Вызов pg.init() # импортируем библиотеку для игрушки win = pg.display.set_mode((900, 600)) # Создвние главного окна программы screen = pg.Surface((900, 600)) # Втоой слой screen1 = pg.Surface((900, 600)) # Третий слой pg.display.set_caption('game') #Создание окна "GAME" width = 100 # Ширина height = 100 # Высота x = 600 # Позиция Y Игрока y = 400 # Позиция X игрока speed = 20 # Скорость игрока spd = 20 # Скорость врага sy = 0 # Позиция Y врага sx = 600 myfont = pg.font.SysFont("monospace", 15) # Системный шрифт в отладчике, выставленный на размер 15 myfont1 = pg.font.SysFont("arial", 50) # Системный шрифт в паузе, выставленный на размер 50 clock = pg.time.Clock() #Для обозначения фпс death = False # Смерть выключена cord = False # Экран отладки выключен run = True # Цикл включен paused = False # Пауза выключена while run: # Главный цикл игры pg.time.delay(20) #a = pg.mouse.get_pos() #print(a) for event in pg.event.get(): if event.type == pg.QUIT: run = False # Разрешает завершение программы через крестик keys = pg.key.get_pressed() # Для регистрации клавиш if keys[pg.K_RETURN]: # Выключение паузы paused = False if keys[pg.K_ESCAPE]: # Включение паузы paused = True if paused == False: sy += spd # Бесконечное движение врага вниз if sy == 700: sy = 0 sx = random.uniform(0, 900) # Позиция X врага, if keys[pg.K_d]: # Движение вправо по клавише D x += speed if x > 730: x = 730 if keys[pg.K_a]: # Движение влево по клавише A x -= speed if x < 80: x = 70 if keys[pg.K_g] and cord == False: # Включатель экрана отладки cord = True if keys[pg.K_h] and cord == True: # Выключатель экрана отладки cord = False if x == sx and y == sy: print("GAME OVER") # Столкновение игрока и врага death = True screen.fill((0, 255, 0)) #Заливка 2 слоя if paused == True: pause = myfont1.render('ПАУЗА!', 10, (200, 200, 200)) # Строки паузы pause1 = myfont1.render("Чтобы продолжить жмите ENTER", 10, (200, 200, 200)) screen.set_alpha(100) # Прозрачность слоя выставленна на 100 win.blit(screen1, (0, 0)) # Включение слоя скрин1 screen1.blit(pause, (350, 250)) # Отрисовка надписи паузы screen1.blit(pause1, (50, 350)) # Отрисовка надписи паузы else: screen.set_alpha(255) if cord == True: # Вывод строк в экран отладки string1 = myfont.render('Игрок: X '+ str(x) + ' Y ' + str(y), 0, (255, 0, 0)) # Строки экрана отладки string2 = myfont.render('Враг(и) в зоне видимости: X' + str(sx) + ' Y' + str(sy), 0, (255, 0, 0)) string3 = myfont.render('Вы проигали!', 0, (255, 0, 0)) string4 = myfont.render('Вы пока не прогирали!', 0, (255, 0, 0)) screen.blit(string1, (0, 30)) screen.blit(string2, (0, 10)) if death == True: screen.blit(string3, (0, 50)) # Если умер else: screen.blit(string4, (0, 50)) # Если жив pg.draw.rect(screen, (60,200,50), (sx,sy,width,height)) #враг pg.draw.rect(screen, (60,50,50), (x,y,width,height)) #игрок win.blit(screen, (0, 0)) pg.display.update() # Обновление экрана clock.tick(60) # Фпс = 60 pg.quit()
код меняю почти каждый день, т.к. работаю в реал тайм.
Я думаю что противники должны спавниться не совсем рандомно, а структурно(ну тоесть заготовленная структура, там где враги появляются так как записанно изначально. Но эта структура не может спавниться с другой такой структурой, или вот с этой может).
Вот и думаю как это реализовать?(Если будете кидать код, то кидайте свой код уже внутри моего, мне новичку будет трудно новый код пихать)