Дори най-обикновените врагове трябва да се движат по някакъв начин, така че вземете малко вдъхновение как да се справите с кодирането зад моделите на атака.

Един от ключовите елементи на страхотната видео игра е наличието на врагове. Независимо дали са зомбита, извънземни или други играчи, враговете могат да направят играта по-предизвикателна и вълнуваща.

В PyGame можете лесно да програмирате различни поведения на движение на врага, като следване на играча, произволно движение или поемане на определени пътища.

Създаване на проста игра

Започнете, като създадете проста игра, в която играч ще се движи хоризонтално и вертикално. Ако играчът докосне врага, играчът ще умре.

Можете да намерите пълния код тук GitHub репо.

Започнете, като импортирате необходимия модул PyGame и го инициализирате.

импортиране pygame

pygame.init()

След това настройте екрана и създайте играч и вражески обекти, като използвате pygame. Rect() функция.

# Настройте екрана
екран = pygame.display.set_mode((800, 600))

# Настройте цветовете
черно = (0, 0, 0)
бял = (255, 255, 255)

instagram viewer

# Настройте правоъгълника на играча и вражеския обект
играч = pygame. Rect(350, 500, 50, 50)
враг = pygame. Rect(350, 0, 50, 50)

След това създайте цикъл на играта, който работи, докато играчът или се сблъска с врага, или излезе от играта. Също така проверете за сблъсък между играча и врагаи нарисувайте обектите на играта на екрана.

# Настройте цикъла на играта
бягане = Вярно

докато работи:
за събитие в pygame.event.get():
ако event.type == pygame. ИЗХОД:
бягане = Невярно

# Напълнете екрана с бяло
screen.fill (бял)

# Преместете правоъгълника на играча
ключове = pygame.key.get_pressed()

ако ключове [pygame. K_LEFT]:
играч.x -= 5

ако ключове [pygame. K_RIGHT]:
играч.x += 5

ако ключове [pygame. K_UP]:
player.y -= 5

ако ключове [pygame. K_DOWN]:
player.y += 5

# Проверете за сблъсък между играч и враг
ако player.colliderect (враг):
бягане = Невярно

# Начертайте правоъгълника на играча и вражеския обект на екрана
pygame.draw.rect (екран, черен, плейър)
pygame.draw.rect (екран, черно, враг)

# Актуализирайте екрана
pygame.display.update()

# Излезте от играта
pygame.quit()

Насочете враговете към играча

За да придвижите врага към играча, трябва да изчислите разстоянието между двамата, което можете да направите с помощта на Питагоровата теорема. След това можете да използвате това разстояние, за да определите скоростта и посоката на движение на врага към играча.

За да реализирате това, създайте променлива за скорост и я използвайте, за да актуализирате позицията на врага спрямо играча.

# Изчислете разстоянието между врага и играча
разстояние_x = играч.x - враг.x
разстояние_y = играч.y - враг.y
разстояние = (разстояние_x ** 2 + разстояние_y ** 2) ** 0.5

# Преместете врага към играча
скорост = 2

ако разстояние!= 0:
враг.x += скорост * разстояние_x / разстояние
враг.y += скорост * разстояние_y / разстояние

Рандомизирайте движението на врага на екрана

Можете също така да накарате врага да се движи на случаен принцип по екрана, за да направите играта по-предизвикателна.

За да направите това, генерирайте произволна посока за движение на врага, като използвате произволния модул в Python. Използвай избор() функция за избор на произволна посока от списък с посоки, в които врагът може да се движи. След това актуализирайте позицията на врага въз основа на избраната посока.

импортиране случаен

# Преместете врага произволно на екрана
посока = random.choice(['наляво', "точно", "нагоре", "надолу"])

ако посока == 'наляво':
враг.x -= 5
елиф посока == "точно":
враг.x += 5
елиф посока == "нагоре":
враг.y -= 5
елиф посока == "надолу":
враг.y += 5

Базирано на близост вражеско движение

В някои игри врагът се движи само когато играчът е близо до него. Можете да постигнете това, като изчислите разстоянието между врага и играча.

Ако разстоянието е по-малко от определена стойност, накарайте врага да се придвижи към играча. Това прави играта по-стратегическа и принуждава играча да бъде по-внимателен в движенията си.

# Преместете врага към играча, ако играчът е близо
скорост = 2

ако разстояние < 300:
ако разстояние!= 0:
враг.x += скорост * разстояние_x / разстояние
враг.y += скорост * разстояние_y / разстояние

Врагът избягва атаките на играча

Можете също така да накарате врага да избягва движението на играча. Врагът ще се опита да избегне играча, като се движи перпендикулярно на позицията на играча.

За да постигнете това, изчислете единичния вектор към играча, като използвате distance_x и distance_y, изчислени по-рано. След това изчислете перпендикулярния вектор, за да преместите врага перпендикулярно на единичния вектор. Накрая изчислете точковото произведение на перпендикулярния вектор и единичния вектор, за да определите посоката на движение на врага.

За да приложите това, добавете кодовия фрагмент по-долу след изчислението на разстоянието.

скорост = 2

ако разстояние < 400:
ако разстояние!= 0:
# Изчислете единичния вектор към играча
единица_вектор_x = разстояние_x / разстояние
единица_вектор_y = разстояние_y / разстояние

# Изчислете перпендикулярния вектор
перпендикулярен_вектор_x = -единичен_вектор_y
перпендикулярен_вектор_y = единичен_вектор_x

# Изчислете скалярното произведение на перпендикулярния вектор и
# единичен вектор
точков_продукт = перпендикулярен_вектор_x * единичен_вектор_x
+ перпендикулярен_вектор_y * единичен_вектор_y

# Преместете врага перпендикулярно на единичния вектор
ако dot_product > 0:
враг.x += скорост * перпендикулярен_вектор_x
враг.y += скорост * перпендикулярен_вектор_y
друго:
enemy.x -= скорост * перпендикулярен_вектор_x
враг.y -= скорост * перпендикулярен_вектор_y

С тези модификации врагът ще се опита да избегне приближаването твърде много до играча. Това прави играта по-предизвикателна и забавна за игра.

Добавяне на допълнителни функции

Можете също да добавите повече функции в играта си, за да я направите по-предизвикателна. Например, можете да добавите множество врагове, които се движат произволно на екрана, препятствия, които играчът трябва да избягва, докато се движи, бонуси, които подобряват способностите на играча и т.н.

Можеш използвайте модула Clock, за да зададете скоростта на кадрите на вашата игра и я направете да работи по-гладко. По-долу е изпълнението:

# Добавете множество врагове, които се движат произволно на екрана
врагове = []

за аз в диапазон (5):
враг = pygame. Rect (random.randint(0, 750), random.randint(0, 550), 50,
50)

enemies.append (враг)

# Добавете препятствия, които играчът трябва да избягва
пречка = pygame. Rect(200, 250, 50, 50)

# Настройте цикъла на играта
часовник = pygame.time. Часовник()
бягане = Вярно

докато работи:
за събитие в pygame.event.get():
ако event.type == pygame. ИЗХОД:
бягане = Невярно

# Напълнете екрана с бяло
screen.fill (бял)

# Преместете правоъгълника на играча
ключове = pygame.key.get_pressed()

ако ключове [pygame. K_LEFT]:
играч.x -= 5
ако ключове [pygame. K_RIGHT]:
играч.x += 5
ако ключове [pygame. K_UP]:
player.y -= 5
ако ключове [pygame. K_DOWN]:
player.y += 5

# Преместете враговете произволно на екрана
за враг в врагове:
посока = random.choice(['наляво', "точно", "нагоре", "надолу"])

ако посока == 'наляво':
враг.x -= 5
елиф посока == "точно":
враг.x += 5
елиф посока == "нагоре":
враг.y -= 5
елиф посока == "надолу":
враг.y += 5

# Проверете за сблъсък между играч и враг
ако player.colliderect (враг):
бягане = Невярно

# Начертайте правоъгълника на играча, вражеските обекти и препятствието
# екрана
pygame.draw.rect (екран, черен, плейър)

за враг в врагове:
pygame.draw.rect (екран, черно, враг)

pygame.draw.rect (екран, черно, препятствие)

# Актуализирайте екрана
pygame.display.update()

# Задайте скоростта на кадрите на играта
clock.tick(60)

# Излезте от играта
pygame.quit()

Подобрете игровото си изживяване с врагове

Като добавите врагове с уникални движения, поведение и способности, можете да направите игрите си по-ангажиращи и предизвикателни за играчите. Играчите ще трябва да изготвят стратегия и да адаптират своя геймплей, за да преодолеят различни видове врагове. Това може да увеличи ангажираността, да подобри стойността на повторение и да накара играчите да се връщат за още.