Как мне реализовать произвольное изменение направления на моем враге-пигмеи? - PullRequest
0 голосов
/ 17 марта 2020

Итак, у меня есть класс противника, который двигается влево, встречает конец экрана, затем поворачивает направление на 180 градусов и идет вправо. Он делает это постоянно.

I w * sh, чтобы случайным образом изменить направление, что делает его более непредсказуемым. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я реализую генератор случайных чисел для расстояния направления, как бы я потом наследовал его в переменную при создании экземпляра? Или есть более эффективный способ сделать это? Весь класс врага:

class enemy(object):#need to use self to access these
    walkRight = [pygame.image.load('Game/R1E.png'),pygame.image.load('Game/R2E.png'),pygame.image.load('Game/R3E.png'),pygame.image.load('Game/R4E.png'),pygame.image.load('Game/R5E.png'),pygame.image.load('Game/R6E.png'),pygame.image.load('Game/R7E.png'),pygame.image.load('Game/R8E.png'),pygame.image.load('Game/R9E.png'),pygame.image.load('Game/R10E.png'),pygame.image.load('Game/R11E.png')]
    walkLeft = [pygame.image.load('Game/L1E.png'),pygame.image.load('Game/L2E.png'),pygame.image.load('Game/L3E.png'),pygame.image.load('Game/L4E.png'),pygame.image.load('Game/L5E.png'),pygame.image.load('Game/L6E.png'),pygame.image.load('Game/L7E.png'),pygame.image.load('Game/L8E.png'),pygame.image.load('Game/L9E.png'),pygame.image.load('Game/L10E.png'),pygame.image.load('Game/L11E.png')]

    def __init__(self,x,y,width,height,end): #get R3E png
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.end = end
        self.path = [self.x,self.end]
        self.walkCount = 0
        self.vel = 3

    def draw(self,window): #enemy is gonna move from left, to right, left, to right etc between 2 co ordinate points
        self.move()
        if self.walkCount + 1 >= 33: #if sign is changed, as walkcount would always be less than 33, it wouldn't change
            self.walkCount = 0

        #rather than using self.left, sel.right, we can use out velocity
        if self.vel > 0: #this means we're moving right, integer division 3 so it doesn't look like we going too fast
            window.blit(self.walkRight[self.walkCount //3],(self.x,self.y))
            self.walkCount += 1
        else:
            window.blit(self.walkLeft[self.walkCount //3],(self.x,self.y))
            self.walkCount += 1 #if not moving right, we're moving left


        #check if we're drawing an image to the left or right


    def move(self): #move method #to change directions, he needs to change velocity (multiply by -1 etc)

        if self.vel > 0:
            if self.x < self.path[1] + self.vel:#check if he's about to move past the point on screen, we're accessing the self.end eleme
                self.x += self.vel
            else: #e.g. if it's greater than, we change direction
                self.vel = self.vel * -1 #flipped 180 degrees, so goes other direction
                self.x += self.vel
                self.walkCount = 0
        else: #if our vel is negative
            if self.x > self.path[0] - self.vel:
                self.x += self.vel #vel is gonna be negative already if we've changed directions
            else:
                self.vel = self.vel * -1
                self.x += self.vel
                self.walkCount = 0

Функция перемещения:

def move(self): #move method #to change directions, he needs to change velocity (multiply by -1 etc)

        if self.vel > 0:
            if self.x < self.path[1] + self.vel:#check if he's about to move past the point on screen, we're accessing the self.end eleme
                self.x += self.vel
            else: #e.g. if it's greater than, we change direction
                self.vel = self.vel * -1 #flipped 180 degrees, so goes other direction
                self.x += self.vel
                self.walkCount = 0
        else: #if our vel is negative
            if self.x > self.path[0] - self.vel:
                self.x += self.vel #vel is gonna be negative already if we've changed directions
            else:
                self.vel = self.vel * -1
                self.x += self.vel
                self.walkCount = 0

Создание экземпляра непосредственно перед основным l oop (x, y, высота, ширина, расстояние ходьбы):

goblin = enemy(0,440,64,64,450)

Моя попытка - все еще принимает только одно случайное число и постоянно использует его во время игры.

def timerthing():
    pathenemy = random.randint(0,450)
    return pathenemy



#now to write main loop which checks for collisions, mouse events etc
#make path randomly change
man = player(200,444,64,66) #creates instance of the player / object
goblin = enemy(0,440,64,64,timerthing())#need to create instance of enemy so he appears on the screen, path ends at timerthing
run = True
bullets = []
while run: 
    clock.tick(15) #frame rate

    timerthing()

Вместо константы 450, я после постоянно меняющейся переменной вместо этого, поэтому его движение непредсказуемо. Любые другие предложения будут оценены - спасибо.

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Если бы мне приходилось кодировать этого случайно движущегося врага, я бы сначала реализовал два метода:

  • Один метод, который возвращает возможные направления, по которым мой враг может go пройти, учитывая состояние платы. И все же я не могу вам с этим помочь, поскольку у нас нет «бортовой» части вашего кода. Давайте назовем этот метод getPossibleDirections ()

  • Один метод, с одним аргументом направления, представляет направление, принятое моим врагом. Давайте назовем этот метод move (direction)

Исходя из вашего кода, я думаю, вы можете реализовать эти два метода самостоятельно. А может быть, вы хотите, чтобы ваш враг тоже двигался в направлении y?

Как сказал @Mark Storer, вы можете использовать случайный пакет, но я буду использовать случайную часть библиотеки numpy (уже включена в python) для моего ответа:

# you will need to import numpy in the beginning of your file
import numpy as np

class enemy(...)
# your code goes there

    def getPossibleDirections(self):
        #your implementation
        pass

    def move(self, direction):
        #your implementation
        pass

    def moveRandomly(self):
        possibleDirections = self.getPossibleDirections()
        chosenDirection = np.random.randint(0,len(possibleDirections))
        # returns one number between 0 and len(possibleDirections) (not included) that can represent your direction
        self.move(possibleDirection[chosenDirection])

Для случайного перемещения вашего врага, вам просто нужно вызвать врага.moveRandomly ().

0 голосов
/ 18 марта 2020
import random

def timerthing():
    pathenemy = random.randint(0,450)
    time.sleep(1)
    return pathenemy

Но я подозреваю, что это не совсем ваша проблема. Похоже, что у вас проблема с конфигурацией, а не проблема с источником, и для ее решения нам понадобится совершенно другая информация от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...