Добрый день, пару месяцев читал разные учебники и материалы по 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, просто потому что учебник последний который читал был основан на этой версии.
Буду признателен за помощь.
при публикации к сожалению отступы съехали, но я придерживаюсь общепринятых норм при написании кода.