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

    @Andrsan91 Автор вопроса
    Владимир, спасибо, я действительно не так все понял, буду перечитывать материалы по классам, правда есть один минус, теперь надо как то заставить каждый корабль двигаться только в одном направлении, а то сейчас они у меня с ума сходят двигайся во все стороны по очередности, видимо где то зациклился выбор, но тут думаю сам разберусь, еще раз спасибо
  • Как применить функцию к каждому члену группы?

    @Andrsan91 Автор вопроса
    Владимир, прошу меня простить, но я видимо не так понял первый пункт который вы предложили, если я пытаюсь объявить константу со списком до самих функций из списка компилятор говорит что так нельзя, а если прописать все в функции в теле __init__ то метод move который уже принадлежит классу жалуется что константа MOVES не определена
    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 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]
    
        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 move(self, method = 'random'):
            random.choice(MOVES)
  • Как применить функцию к каждому члену группы?

    @Andrsan91 Автор вопроса
    Спасибо за ваш ответ, вы имеет ввиду вынести функции перемещения за пределы класса? просто объявить в основном коде? вот так:
    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
     
    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)
    
        def moveup():
            sh.rect.top -= speed
            sh.rect.left += 0
    
        def movedown():
            sh.rect.top += speed
            sh.rect.left += 0
    
        def moveleftup():
            sh.rect.top -= speed
            sh.rect.left -= speed
    
        def moveleft():
            sh.rect.top += 0
            sh.rect.left -= speed
    
        def moveleftdown():
            sh.rect.top += speed
            sh.rect.left -= speed
    
        def moverightup():
            sh.rect.top -= speed
            sh.rect.left += speed
    
        def moveright():
            sh.rect.top += 0
            sh.rect.left += speed
    
        def moverightdown():
            sh.rect.top += speed
            sh.rect.left += speed
    
        moves = [moveup,movedown,moveleftup,moveleft,moveleftdown,
                 moverightup,moveright,moverightdown]
        rand_moves = random.choice(moves)
        
    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:
            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()

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