0

i would like it so when you cross their line the game closes and when the enemy hits your line the game restarts, any ideas on how to code that in? you don't have to rewrite the code just help me with some ideas on how i could add it in.

here is the current code

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

GREEN=(0,125,0)
BLUE=(0,0,125)

Yplayer = 225/2
Xplayer = 350

playerlinesavedata = []
playercurrent = []

Xplayerchange=0
Yplayerchange=0

Yenemy = 450
Xenemy = 300

enemylinesavedata = []
enemycurrent = []

Xenemychange=0
Yenemychange=0

windowX = 900
windowY = 600

pygame.init()
DISPLAY=pygame.display.set_mode((windowX,windowY),0,32)


def enemymovement():
    global Xplayer,Yplayer,Xenemy,Yenemy
    enemy1 = True
    enemydirection = random.randint(1,4)
    
    # enemy moves toward player
    if Xenemy > Xplayer: enemydirection = 1
    elif Xenemy < Xplayer: enemydirection = 2
    elif Yenemy > Yplayer: enemydirection = 3
    elif Yenemy < Yplayer: enemydirection = 4

    while enemy1 == True:    
        if enemydirection == 1:
            Xenemychange= -random.randint(1,2)
            Xenemy+=Xenemychange
            
        if enemydirection == 2:
            Xenemychange= random.randint(1,2)
            Xenemy+=Xenemychange
            
        if enemydirection == 3:            
            Yenemychange= -random.randint(1,2)
            Yenemy+=Yenemychange
            
        if enemydirection == 4:
            Yenemychange= random.randint(1,2)            
            Yenemy+=Yenemychange
            
        enemylinesavedata.append([Xenemy,Yenemy])
        enemy()
        break
            
def enemy():
    for XnY in enemylinesavedata:
        pygame.draw.rect(DISPLAY,BLUE, [XnY[0],XnY[1],5,5])

def player():
    for XnY in playerlinesavedata:
        pygame.draw.rect(DISPLAY,GREEN,[XnY[0],XnY[1],5,5])

def main():

    global Xplayer,Yplayer,Xenemy,Yenemy,Xplayerchange,Yplayerchange
    WHITE=(255,255,255)
    BLUE=(0,0,255)
    DISPLAY.fill(WHITE)

    
    pygame.display.update()
    while True:
        Yplayer+=Yplayerchange
        Xplayer+=Xplayerchange

        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
            if event.type==KEYDOWN:
                if event.key==K_d:
                    Xplayerchange+=1
                    
                if event.key==K_a:
                    Xplayerchange-=1
                if event.key==K_w:
                    Yplayerchange-=1
                if event.key==K_s:
                    Yplayerchange+=1
            if event.type==KEYUP:
                if event.key==K_a or K_d:
                    Yplayerchange=0
                if event.key==K_w or K_s:
                    Xplayerchange=0


       
        playercurrent = []
        playercurrent.append(Xplayer)
        playercurrent.append(Yplayer)
        playerlinesavedata.append(playercurrent)
        
        Yplayer+=Yplayerchange
        Xplayer+=Xplayerchange

        enemymovement()

        Yplayer+=Yplayerchange
        Xplayer+=Xplayerchange
        
       
        DISPLAY.fill(WHITE)
        
        player()
        enemy()
        pygame.display.update()

main()

i am putting this text down here so i can post this question. if your still reading this them im sorry for the amount of code but i really want to get a game like this working

thanks to Mike67 for helping me on this code

Rabbid76
  • 202,892
  • 27
  • 131
  • 174
Machai
  • 59
  • 1
  • 1
  • 6
  • are there any ways you could think of to stop the enemy losing almost straight away. avoid the player line – Machai Nov 15 '20 at 20:53

1 Answers1

0

Use pygame.time.Clock to control the frames per second and thus the game speed. Pygame clock and event loops:

clock = pygame.time.Clock()
while True:
    clock.tick(60)

pygame.key.get_pressed() returns a list with the state of each key. If a key is held down, the state for the key is True, otherwise False. Use pygame.key.get_pressed() to evaluate the current state of a button and get continuous movement:

size = 5

while True:
    # [...]

    keys = pygame.key.get_pressed()
    Xplayer += (keys[pygame.K_d] - keys[pygame.K_a]) * size
    Yplayer += (keys[pygame.K_s] - keys[pygame.K_w]) * size

For the collision detection see How to detect collisions between two rectangular objects or images in pygame and rect collision with list of rects.

I recommend to use a pygame.Rect object and either .collidepoint() or colliderect() to find a collision between a rectangle and an object. Use pygame.Rect.collidelist to test whether a rectangle collides with one of a list of rectangles.

Create a list of rectangles for the player and the enemy:

player_rectlist = [pygame.Rect(x, y, size, size) for x, y in playerlinesavedata]
eneymy_rectlist = [pygame.Rect(x, y, size, size) for x, y in enemylinesavedata]

If the last rectangle in player_rectlist (current position) collides with enemy_rectlist, the game is over. The last rectangle can be get by subscription (player_rectlist[-1]):

if player_rectlist[-1].collidelist(eneymy_rectlist) >= 0:
    pygame.quit()
    sys.exit()

If the last rectangle in enemy_rectlist (current position) collides with player_rectlist, the game restarts:

if enemy_rectlist[-1].collidelist(player_rectlist) >= 0:
    playerlinesavedata = []
    Yplayer = 225//2
    Xplayer = 350
    enemylinesavedata = []
    Yenemy = 450
    Xenemy = 300

main():

def main():

    global playerlinesavedata, enemylinesavedata
    global Xplayer, Yplayer, Xenemy, Yenemy
    WHITE = (255,255,255)
    size = 5

    clock = pygame.time.Clock()
    while True:
        clock.tick(60)
        
        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                sys.exit()

        keys = pygame.key.get_pressed()
        Xplayer += (keys[pygame.K_d] - keys[pygame.K_a]) * size
        Yplayer += (keys[pygame.K_s] - keys[pygame.K_w]) * size
       
        playerlinesavedata.append((Xplayer, Yplayer))
        enemymovement()

        player_rectlist = [pygame.Rect(x, y, size, size) for x, y in playerlinesavedata]
        enemy_rectlist = [pygame.Rect(x, y, size, size) for x, y in enemylinesavedata]

        if player_rectlist[-1].collidelist(enemy_rectlist) >= 0:
            pygame.quit()
            sys.exit()

        if enemy_rectlist[-1].collidelist(player_rectlist) >= 0:
            playerlinesavedata = []
            Yplayer = 225//2
            Xplayer = 350
            enemylinesavedata = []
            Yenemy = 450
            Xenemy = 300
       
        DISPLAY.fill(WHITE)
        player()
        enemy()
        pygame.display.update()
Rabbid76
  • 202,892
  • 27
  • 131
  • 174