@Andrsan91

Как применить функцию к каждому члену группы?

Добрый день, пару месяцев читал разные учебники и материалы по Python, и начал применять так сказать на практике, пишу АИ для псевдоигры, ниже приведу весь код, чтобы было понятнее:
import pygame,random,sys

WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)
GREEN = (0,255,0)
Blue = (0,0,255)
YELLOW = (255,255,0)
FPS = 30
pygame.init()
size = width,height = 1024,768                  #draw window
screen = pygame.display.set_mode(size)
screen.fill([255,255,255])
clock = pygame.time.Clock()

class MyShipClass(pygame.sprite.Sprite):        #ship class
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("ship.jpg")
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(10,1000)
        self.rect.y = random.randint(0,600)
        
    def update(self):                                   
        if self.rect.top < 0:
            self.rect.top = height
        if self.rect.left < 0:
            self.rect.left = width
        if self.rect.top > height:
            self.rect.top = 0
        if self.rect.left > width:
            self.rect.left = 0

    def moveup(self):
        self.rect.top -= speed
        self.rect.left += 0

    def movedown(self):
        self.rect.top += speed
        self.rect.left += 0

    def moveleftup(self):
        self.rect.top -= speed
        self.rect.left -= speed

    def moveleft(self):
        self.rect.top += 0
        self.rect.left -= speed

    def moveleftdown(self):
        self.rect.top += speed
        self.rect.left -= speed

    def moverightup(self):
        self.rect.top -= speed
        self.rect.left += speed

    def moveright(self):
        self.rect.top += 0
        self.rect.left += speed

    def moverightdown(self):
        self.rect.top += speed
        self.rect.left += speed

    moves = [moveup,movedown,moveleftup,moveleft,moveleftdown,
             moverightup,moveright,moverightdown]
    rand_moves = random.choice(moves)
 
class MyStoneClass(pygame.sprite.Sprite):       #stone class
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("block.jpg")
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0,1024)
        self.rect.y = random.randint(0,768)
        self.rect.right, self.rect.top,
        self.rect.topright, self.rect.bottom,
        self.rect.bottomleft, self.rect.left,
        self.rect.center, self.rect.bottomright

#speedleft = 0                                   #speed move left/right
#speedtop = -2                                   #speed move up/down
speed = 2
all_sprites = pygame.sprite.Group()
ships = pygame.sprite.Group()
stones = pygame.sprite.Group()

for row in range(4):                            #group of ships
    sh = MyShipClass()
    all_sprites.add(sh)
    ships.add(sh)
    
for row in range(20):                           #group of stones
    st = MyStoneClass()
    all_sprites.add(st)
    stones.add(st)

running = True                                  #run this 
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
           
    for sh in ships:                                    #this problem
        sh.rand_moves()
  
    collisions = pygame.sprite.groupcollide(ships,stones,False,False)
                                                #collide ship and stone
    for collision in collisions:
        for sh in collisions:
            #print "collision"
            sh.rect.left += -2
    
    all_sprites.update()                       #draw all
    screen.fill(WHITE)
    all_sprites.draw(screen)
    pygame.display.flip()
pygame.quit()


я создал в классе ship направления движения, далее объединил их в список, и далее настроил случайный выбор из этого списка, ниже после создания группы ships я хочу заставить все объекты группы двигаться в разном направлении на старте, но они все двигаются в одном направлении. Я уже по разному пробовал, и выносил методы направлений из класса, и создавал еще один список как с colisions чуть ниже, но или у меня двигается только один объект с увеличенной скоростью, или все объекты, подскажите как мне заставить каждый объект из группы двигаться в разном направлении? Уже 3 сутки пытаюсь это исправить, читаю уже 3 учебник, облазил разные гайды. Понимаю что пошел очень странным путем, но на данном уровне моих знаний, другого способа пока не придумал.
Использую Python 2.7.5, просто потому что учебник последний который читал был основан на этой версии.
Буду признателен за помощь.
при публикации к сожалению отступы съехали, но я придерживаюсь общепринятых норм при написании кода.
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
@AstraVlad
Финансист, консультант, программист-любитель
Сейчас и moves и rand_moves это переменные класса, а не объекта, насколько я вижу (без отступов тяжеловато читать), поэтому все корабли и двигаются одинаково. Тут надо просто разобраться в разнице между переменными класса и объекта и объявить их нужным образом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
deeplay Новосибирск
от 130 000 ₽
от 130 000 ₽
Enjoy PRO Санкт-Петербург
от 140 000 до 180 000 ₽
20 окт. 2020, в 22:57
5000 руб./за проект
20 окт. 2020, в 21:37
300000 руб./за проект
20 окт. 2020, в 21:18
500 руб./за проект