3
votes

I'm trying to create a game (pygame) where there is a sprite, which when, collided into by the player randomnly moves to another place on the surface, i am not sure how i would do this, as i have very basic knowledge, one guess i had would be to assign random.randint to the sprite, but where would i go from there? Thanks a lot, i'd appreciate the help. Code is below :)

    import pygame, sys
from pygame.locals import *
import random

pygame.init()

game=0
width=450
height=613

blue=(100,149,237)
white=(255,255,255)
purple =(128,0,128)

Level=pygame.image.load("level.jpg")
background=pygame.image.load("background.jpg")
startscreen=pygame.image.load("ocean.jpg")
gamescreen=pygame.image.load("screengame.jpg")
Display=pygame.display.set_mode((width,height))
pygame.display.set_caption("Ocean")

movex = 100

movey = 100

DirectX = 0
DirectY = 0

game = 0

MoveEnemy1X = 150
MoveEnemy1Y = 50
rectDirectX = 10
rectDirectY = 9

MoveEnemy2X = 300
MoveEnemy2Y = 100
rectDirect2X = 30
rectDirect2Y = 10

MoveEnemy3X = 400
MoveEnemy3Y = 200
rectDirect3X = 12
rectDirect3Y = 10

clock = pygame.time.Clock()

gameScore = 0
scorefont = pygame.font.SysFont("Arial",30)
score = scorefont.render("Score: " +str(gameScore),True,white)

##pygame.mixer.music.load('ocean.mp3')
##pygame.mixer.music.play(-1,0.0)

direc1 = 5
direc2 =  5

class Player(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width  = width
        self.height = height
        self.rect = pygame.Rect(x,y,width,height)

    def RenderPlayer(self):
        pygame.draw.rect(Display,blue,(self.x,self.y,self.width,self.height))
        self.rect = pygame.Rect(self.x,self.y,self.width,self.height)

class EnemySprite(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.rect = pygame.Rect(x,y,width,height)

    def RenderEnemy(self):
        pygame.draw.rect(Display,white,(MoveEnemy1X,MoveEnemy1Y,30,30))
        self.rect = pygame.Rect(MoveEnemy1X,MoveEnemy1Y,self.width,self.height)

class EnemySprite2(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.rect = pygame.Rect(x,y,width,height)

    def RenderEnemy2(self):
        pygame.draw.rect(Display,white,(MoveEnemy2X,MoveEnemy2Y,40,10))
        self.rect = pygame.Rect(MoveEnemy2X,MoveEnemy2Y, self.width,self.height)

class EnemySprite3(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.rect = pygame.Rect(x,y,width,height)

    def RenderEnemy3(self):
        pygame.draw.rect(Display, white,(MoveEnemy3X,MoveEnemy3Y,10,10))
        self.rect = pygame.Rect(MoveEnemy3X,MoveEnemy3Y, self.width,self.height)


class GoodSprite(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.rect = pygame.Rect(x,y,width,height)

    def RenderGoodSprite(self):
        pygame.draw.rect(Display,purple,(100,100,10,10))
        self.rect = pygame.Rect(100,100,self.width,self.height)


Player1=Player(100,100,20,20)
Enemy1=EnemySprite(200,200,30,30)
Enemy2=EnemySprite2(300,200,40,10)
Enemy3=EnemySprite3(240,190,30,20)
Good=GoodSprite(150,400,10,10)

TheGameLoop = True

while TheGameLoop:

    for event in pygame.event.get():
        if (event.type==pygame.QUIT):
            TheGameLoop=False

        if (event.type==pygame.KEYDOWN):

            if (event.key==pygame.K_LEFT):
                direc1 = -4
                gameScore+=1
            score = scorefont.render("Score: " +str(gameScore),True,white)

            if (event.key==pygame.K_RIGHT):
                direc1 = 4
                gameScore+=1

            score = scorefont.render("Score: " +str(gameScore),True,white)

            if (event.key==pygame.K_DOWN):
                direc2 = 4
                gameScore+=1
            score = scorefont.render("Score: " +str(gameScore),True,white)

            if (event.key==pygame.K_UP):
                direc2 = -4
                gameScore+=1
            score = scorefont.render("Score: " +str(gameScore),True,white)

        if (event.type==pygame.KEYUP):

            if (event.key==pygame.K_LEFT):
                direc1 = 0

            if (event.key==pygame.K_RIGHT):
                direc1 = 0

            if (event.key==pygame.K_UP):
                direc2 = 0

            if (event.key==pygame.K_DOWN):
                direc2 = 0

    if MoveEnemy1X > 430:
        MoveEnemy1X = 425
        rectDirectX = -5

    elif MoveEnemy1X < 0:
        MoveEnemy1X = 10
        rectDirectX = 5

    elif MoveEnemy1Y > 613:
        MoveEnemy1Y = 600
        rectDirectY = -9

    elif MoveEnemy1Y < 0:
        MoveEnemy1Y = 0
        rectDirectY = 11

    if MoveEnemy2X > 430:
        MoveEnemy2X = 425
        rectDirect2X = -5

    elif MoveEnemy2X < 0:
        MoveEnemy2X = 11
        rectDirect2X = 6

    elif MoveEnemy2Y > 613:
        MoveEnemy2Y = 600
        rectDirect2Y = -12

    elif MoveEnemy2Y < 0:
        MoveEnemy2Y = 0
        rectDirect2Y = 8

    if MoveEnemy3X > 430:
        MoveEnemy3X = 422
        rectDirect3X = -7
    elif MoveEnemy3X < 0:
        MoveEnemy3X = 11
        rectDirect3X = 8
    elif MoveEnemy3Y > 613:
        MoveEnemy3Y = 600
        rectDirect3X = -12
    elif MoveEnemy3Y < 0:
        MoveEnemy3Y = 0
        rectDirect3Y = 5

    if direc1 > 430:
        Display.blit(Level,(0,0))


    pygame.display.update()



    if game==0:
        Display.blit(startscreen,(0,0))

        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_SPACE:
                game=1
                Display.blit(gamescreen,(0,0))
            elif event.key==pygame.K_ESCAPE:
                pygame.quit()

        pygame.display.update()

    if game==1:
        Display.blit(gamescreen,(0,0))
        Display.blit(score,(220,10))
        Player1.RenderPlayer()
        Enemy1.RenderEnemy()
        Enemy2.RenderEnemy2()
        Enemy3.RenderEnemy3()
        Good.RenderGoodSprite()
        Player1.x +=direc1
        Player1.y +=direc2
        MoveEnemy1X +=rectDirectX
        MoveEnemy1Y +=rectDirectY
        MoveEnemy2X +=rectDirect2X
        MoveEnemy2Y +=rectDirect2Y
        MoveEnemy3X + rectDirect3X
        MoveEnemy3Y += rectDirectY
##        pygame.mixer.music.load("ocean.mp3")
##        pygame.mixer.music.play(-1,0.0)

        pygame.display.update()

        if pygame.sprite.collide_rect(Player1,Enemy1):
            game=2
            Display.blit(background,(0,0))
            pygame.mixer.music.load("untitled.mp3")
            pygame.mixer.music.play(1,0.0)

        if pygame.sprite.collide_rect(Player1,Enemy2):
            game=2
            Display.blit(background,(0,0))
            pygame.mixer.music.load("untitled.mp3")
            pygame.mixer.music.play(1,0.0)

        if pygame.sprite.collide_rect(Player1,Good):
            gameScore+=1
            Good.x=random.randint(0,500)
            Good.y=random.randint(0,600)
            pygame.display.update()


    if game==2:
        Display.blit(background,(0,0))
        Display.blit(score,(200,20))
        gameScore=0
        pygame.display.update()
        pygame.mixer.music.stop()

        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_SPACE:
                game=1


    pygame.display.update()
    clock.tick(50)
1

1 Answers

1
votes

Focusing on this section of your code:

    if pygame.sprite.collide_rect(Player1,Enemy1):
        game=2
        Display.blit(background,(0,0))
        pygame.mixer.music.load("untitled.mp3")
        pygame.mixer.music.play(1,0.0)

I usually use pygame.sprite.spritecollide().

I am not sure if "collide_rect" can do this too, but here's the trick:

pygame.sprite.spritecollide() returns a list of collisions. This is super helpful.

(Also, I would put all your sprites you want to behave this way in a list.)

--So if I were to use all this in your situation:

for each_enemy in enemy_list:

   # see if player hit an enemy; 
   # the 'False' flag means DON'T delete anything in the event of a collision
    enemy_touched_list = pygame.sprite.spritecollide(each_enemy, Player1, False)

    # good, now each enemy that was touching a player is in this list
    # now we will iterate through this list and find a random place for the enemy.

    for enemy_touched in enemy_touched_list:
        enemy_touched.render(random.randint(0,width), random.randint(0,height))

Ok, so that code will go through each enemy in your list of enemies, check to see if it is touching a player, and if it is the enemy's position will be reset with your Enemy classes .render() method.

For that last line to work, we need to tweak you class a bit.\

CLASSES:

It looks like you understand the syntax of setting up a class, but you are missing out on their power.

There is no reason you should Have 4 enemy classes! They are all almost identical. The only difference is a few values! That sounds like an object to me!

You should have ONE enemysprite class and then make as many objects from that class as your heart desires. That is why classes are the best. Any slight customization you want between sprites, set up your class so you can pass those in when creating an object.

--let me know if you need more help changing the class stuff.--

--maybe you're new to OOP and these classes are from a tutorial, if that's the case, I can give more info--

and like I said earlier, for my version of your code to work, we need to change your (soon to be single) enemy class's .render() method:

The original:

def RenderEnemy3(self):
    pygame.draw.rect(Display, white,(MoveEnemy3X,MoveEnemy3Y,10,10))
    self.rect = pygame.Rect(MoveEnemy3X,MoveEnemy3Y, self.width,self.height)

MODIFIED:

def RenderEnemy3(self,xpos,ypos):
    pygame.draw.rect(Display, white,(MoveEnemy3X,MoveEnemy3Y,xpos,ypos))
    self.rect = pygame.Rect(MoveEnemy3X,MoveEnemy3Y, self.width,self.height)

If you want, I can edit this answer to include the whole "EnemySprite" class modified to communicate well with itself and need only ONE class.

Hope this helps. Just comment if you need clarification on anything. Pygame is way fun.