Python Forum

Full Version: Pygame Rect Not Responding
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
In my Code I try to move the yellow Rectangles over my Pygame Window but they dont respond. The green and the red rectangle respond to my commands. Only 1 of my 3 yellow rectangles respond.

This is my Code:
import pygame
from random import *

pygame.init()

run = True
score = 0
lives = 3

game_over_counter = 0
spawn_protection = 0

spike_increase = 5
smove_counter = 0

# Colors -----------------------------------------------------------------------

white = (255, 255, 255)
blue = (0, 0, 255)
green = (0, 255, 0)
red = (255, 0, 0)
black = (0, 0, 0)
orange = (255, 100, 10)
yellow = (255, 255, 0)
blue_green = (0, 255, 170)
maroon = (115, 0, 0)
lime = (180, 255, 100)
pink = (255, 100, 180)
purple = (240, 0, 255)
gray = (127, 127, 127)
magenta = (255, 0, 230)
brown = (100, 40, 0)
forest_green = (0, 50, 0)
navy_blue = (0, 0, 100)
rust = (210, 150, 75)
dandylion_yellow = (255, 200, 0)
highlighter = (255, 255, 100)
sky_blue = (0, 255, 255)
light_gray = (200, 200, 200)
dark_gray = (50, 50, 50)

# Display ----------------------------------------------------------------------

SCREEN_WIDTH = 950
SCREEN_HEIGHT = 950

WIN = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('Eat Game')

clock = pygame.time.Clock()
FPS = 60

# Writing ----------------------------------------------------------------------

font = pygame.font.SysFont('comicsans', 40)
game_over_font = pygame.font.SysFont('comicsans', 100)

# Character --------------------------------------------------------------------

x = 100
y = 100
width = 90
height = 90
vel = 3

# Food

fx = randint(41, SCREEN_WIDTH - width)
fy = randint(41, SCREEN_HEIGHT - height)
fwidth = 30
fheight = 30

# Spikes

sx = randint(41, SCREEN_WIDTH - width)
sy = randint(41, SCREEN_HEIGHT - height)
swidth = 50
sheight = 50
sx2 = randint(41, SCREEN_WIDTH - width)
sy2 = randint(41, SCREEN_HEIGHT - height)
s2width = 50
s2height = 50
sx3 = randint(41, SCREEN_WIDTH - width)
sy3 = randint(41, SCREEN_HEIGHT - height)
s3width = 50
s3height = 50

# Main Loop --------------------------------------------------------------------

while run:
    clock.tick(FPS)

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

    WIN.fill(white)

    spike = pygame.draw.rect(WIN, yellow, (sx, sy, swidth, sheight))
    spike2 = pygame.draw.rect(WIN, yellow, (sx2, sy2, s2width, s2height))
    spike3 = pygame.draw.rect(WIN, yellow, (sx3, sy3, s3width, s3height))
    food = pygame.draw.rect(WIN, green, (fx, fy, fwidth, fheight))
    character = pygame.draw.rect(WIN, red, (x, y, width, height))

# Texts --------------------------------------------------------------------------

    score_text = font.render(f'Score: {score}', True, lime)
    lives_text = font.render(f'Lives: {lives}', True, red)
    game_over_text = game_over_font.render('Game Over', True, red)
    WIN.blit(score_text, (10, 10))
    WIN.blit(lives_text, (823, 10))

# Player Movement ----------------------------------------------------------------

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT] and x > 0:
        x -= vel
    if keys[pygame.K_RIGHT] and x < SCREEN_WIDTH - width:
        x += vel
    if keys[pygame.K_UP] and y > 0:
        y -= vel
    if keys[pygame.K_DOWN] and y < SCREEN_HEIGHT - height:
        y += vel
    if keys[pygame.K_ESCAPE]:
        run = False
    if keys[pygame.K_SPACE]:
        spawn_protection = 0

# Food Movement --------------------------------------------------------------------------------

    if keys[pygame.K_LEFT] and fx > 0:
        fx -= vel/2
    if keys[pygame.K_RIGHT] and fx < SCREEN_WIDTH - fwidth:
        fx += vel/2
    if keys[pygame.K_UP] and fy > 0:
        fy -= vel/2
    if keys[pygame.K_DOWN] and fy < SCREEN_HEIGHT - fheight:
        fy += vel/2

# Spikes Movement -----------------------------------------------------------------------------

    if smove_counter < 130:
        sx += vel
        sy -= vel
        sx2 -= vel
        sx2 += vel
        sx3 += vel
        sx3 -= vel
    else:
        sx -= vel
        sy += vel
        sx2 += vel
        sx2 -= vel
        sx3 -= vel
        sx3 += vel

    if smove_counter > 260:
        smove_counter = 0

# Checking for Collision ----------------------------------------------------------------------

    if character.colliderect(food):
        spawn_protection = 0
        score += 1
        fx = randint(41, SCREEN_WIDTH - fwidth)
        fy = randint(41, SCREEN_HEIGHT - fheight)
        sx = randint(41, SCREEN_WIDTH - fwidth)
        sy = randint(41, SCREEN_HEIGHT - fheight)
        sx2 = randint(41, SCREEN_WIDTH - fwidth)
        sy2 = randint(41, SCREEN_HEIGHT - fheight)
        sx3 = randint(41, SCREEN_WIDTH - fwidth)
        sy3 = randint(41, SCREEN_HEIGHT - fheight)
        swidth += spike_increase
        sheight += spike_increase
        s2width += spike_increase
        s2height += spike_increase
        s3width += spike_increase
        s3height += spike_increase

    spawn_protection += 1
    smove_counter += 1

    if spawn_protection > 80:

        if character.colliderect(spike):
            lives -= 1
            fx = randint(41, SCREEN_WIDTH - swidth)
            fy = randint(41, SCREEN_HEIGHT - sheight)
            sx = randint(41, SCREEN_WIDTH - swidth)
            sy = randint(41, SCREEN_HEIGHT - sheight)
            sx2 = randint(41, SCREEN_WIDTH - swidth)
            sy2 = randint(41, SCREEN_HEIGHT - sheight)
            sx3 = randint(41, SCREEN_WIDTH - swidth)
            sy3 = randint(41, SCREEN_HEIGHT - sheight)
        if character.colliderect(spike2):
            lives -= 1
            fx = randint(41, SCREEN_WIDTH - swidth)
            fy = randint(41, SCREEN_HEIGHT - sheight)
            sx = randint(41, SCREEN_WIDTH - swidth)
            sy = randint(41, SCREEN_HEIGHT - sheight)
            sx2 = randint(41, SCREEN_WIDTH - swidth)
            sy2 = randint(41, SCREEN_HEIGHT - sheight)
            sx3 = randint(41, SCREEN_WIDTH - swidth)
            sy3 = randint(41, SCREEN_HEIGHT - sheight)
        if character.colliderect(spike3):
            lives -= 1
            fx = randint(41, SCREEN_WIDTH - swidth)
            fy = randint(41, SCREEN_HEIGHT - sheight)
            sx = randint(41, SCREEN_WIDTH - swidth)
            sy = randint(41, SCREEN_HEIGHT - sheight)
            sx2 = randint(41, SCREEN_WIDTH - swidth)
            sy2 = randint(41, SCREEN_HEIGHT - sheight)
            sx3 = randint(41, SCREEN_WIDTH - swidth)
            sy3 = randint(41, SCREEN_HEIGHT - sheight)

# Checking for Game Over -----------------------------------------------------------------------

    if lives <= 0:
        WIN.blit(game_over_text, (SCREEN_WIDTH/5, SCREEN_HEIGHT/3))

        game_over_counter += 1

    if game_over_counter > 180:
        run = False

    pygame.display.update()
The problem is here :

if smove_counter < 130:
    sx += vel
    sy -= vel
    sx2 -= vel
    sx2 += vel
    sx3 += vel
    sx3 -= vel
else:
    sx -= vel
    sy += vel
    sx2 += vel
    sx2 -= vel
    sx3 -= vel
    sx3 += vel
You assign sx2 and sx3 twice instead of sy2 and sy3 once adding vel and then subtracting vel. Here is the working code.

import pygame
from random import *

pygame.init()

run = True
score = 0
lives = 3

game_over_counter = 0
spawn_protection = 0

spike_increase = 5
smove_counter = 0

# Colors -----------------------------------------------------------------------

white = (255, 255, 255)
blue = (0, 0, 255)
green = (0, 255, 0)
red = (255, 0, 0)
black = (0, 0, 0)
orange = (255, 100, 10)
yellow = (255, 255, 0)
blue_green = (0, 255, 170)
maroon = (115, 0, 0)
lime = (180, 255, 100)
pink = (255, 100, 180)
purple = (240, 0, 255)
gray = (127, 127, 127)
magenta = (255, 0, 230)
brown = (100, 40, 0)
forest_green = (0, 50, 0)
navy_blue = (0, 0, 100)
rust = (210, 150, 75)
dandylion_yellow = (255, 200, 0)
highlighter = (255, 255, 100)
sky_blue = (0, 255, 255)
light_gray = (200, 200, 200)
dark_gray = (50, 50, 50)

# Display ----------------------------------------------------------------------

SCREEN_WIDTH = 950
SCREEN_HEIGHT = 950

WIN = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('Eat Game')

clock = pygame.time.Clock()
FPS = 60

# Writing ----------------------------------------------------------------------

font = pygame.font.SysFont('comicsans', 40)
game_over_font = pygame.font.SysFont('comicsans', 100)

# Character --------------------------------------------------------------------

x = 100
y = 100
width = 90
height = 90
vel = 3

# Food

fx = randint(41, SCREEN_WIDTH - width)
fy = randint(41, SCREEN_HEIGHT - height)
fwidth = 30
fheight = 30

# Spikes

sx = randint(41, SCREEN_WIDTH - width)
sy = randint(41, SCREEN_HEIGHT - height)
swidth = 50
sheight = 50
sx2 = randint(41, SCREEN_WIDTH - width)
sy2 = randint(41, SCREEN_HEIGHT - height)
s2width = 50
s2height = 50
sx3 = randint(41, SCREEN_WIDTH - width)
sy3 = randint(41, SCREEN_HEIGHT - height)
s3width = 50
s3height = 50

# Main Loop --------------------------------------------------------------------

while run:
	clock.tick(FPS)

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

	WIN.fill(white)

	spike = pygame.draw.rect(WIN, yellow, (sx, sy, swidth, sheight))
	spike2 = pygame.draw.rect(WIN, yellow, (sx2, sy2, s2width, s2height))
	spike3 = pygame.draw.rect(WIN, yellow, (sx3, sy3, s3width, s3height))
	food = pygame.draw.rect(WIN, green, (fx, fy, fwidth, fheight))
	character = pygame.draw.rect(WIN, red, (x, y, width, height))

# Texts --------------------------------------------------------------------------

	score_text = font.render(f'Score: {score}', True, lime)
	lives_text = font.render(f'Lives: {lives}', True, red)
	game_over_text = game_over_font.render('Game Over', True, red)
	WIN.blit(score_text, (10, 10))
	WIN.blit(lives_text, (823, 10))

# Player Movement ----------------------------------------------------------------

	keys = pygame.key.get_pressed()

	if keys[pygame.K_LEFT] and x > 0:
		x -= vel
	if keys[pygame.K_RIGHT] and x < SCREEN_WIDTH - width:
		x += vel
	if keys[pygame.K_UP] and y > 0:
		y -= vel
	if keys[pygame.K_DOWN] and y < SCREEN_HEIGHT - height:
		y += vel
	if keys[pygame.K_ESCAPE]:
		run = False
	if keys[pygame.K_SPACE]:
		spawn_protection = 0

# Food Movement --------------------------------------------------------------------------------

	if keys[pygame.K_LEFT] and fx > 0:
		fx -= vel/2
	if keys[pygame.K_RIGHT] and fx < SCREEN_WIDTH - fwidth:
		fx += vel/2
	if keys[pygame.K_UP] and fy > 0:
		fy -= vel/2
	if keys[pygame.K_DOWN] and fy < SCREEN_HEIGHT - fheight:
		fy += vel/2

# Spikes Movement -----------------------------------------------------------------------------

	if smove_counter < 130:
		sx += vel
		sy -= vel
		sx2 -= vel
		sy2 += vel
		sx3 += vel
		sy3 -= vel
	else:
		sx -= vel
		sy += vel
		sx2 += vel
		sy2 -= vel
		sx3 -= vel
		sy3 += vel
	if smove_counter > 260:
		smove_counter = 0

# Checking for Collision ----------------------------------------------------------------------

	if character.colliderect(food):
		spawn_protection = 0
		score += 1
		fx = randint(41, SCREEN_WIDTH - fwidth)
		fy = randint(41, SCREEN_HEIGHT - fheight)
		sx = randint(41, SCREEN_WIDTH - fwidth)
		sy = randint(41, SCREEN_HEIGHT - fheight)
		sx2 = randint(41, SCREEN_WIDTH - fwidth)
		sy2 = randint(41, SCREEN_HEIGHT - fheight)
		sx3 = randint(41, SCREEN_WIDTH - fwidth)
		sy3 = randint(41, SCREEN_HEIGHT - fheight)
		swidth += spike_increase
		sheight += spike_increase
		s2width += spike_increase
		s2height += spike_increase
		s3width += spike_increase
		s3height += spike_increase

	spawn_protection += 1
	smove_counter += 1

	if spawn_protection > 80:
		if character.colliderect(spike):
			lives -= 1
			fx = randint(41, SCREEN_WIDTH - swidth)
			fy = randint(41, SCREEN_HEIGHT - sheight)
			sx = randint(41, SCREEN_WIDTH - swidth)
			sy = randint(41, SCREEN_HEIGHT - sheight)
			sx2 = randint(41, SCREEN_WIDTH - swidth)
			sy2 = randint(41, SCREEN_HEIGHT - sheight)
			sx3 = randint(41, SCREEN_WIDTH - swidth)
			sy3 = randint(41, SCREEN_HEIGHT - sheight)
		if character.colliderect(spike2):
			lives -= 1
			fx = randint(41, SCREEN_WIDTH - swidth)
			fy = randint(41, SCREEN_HEIGHT - sheight)
			sx = randint(41, SCREEN_WIDTH - swidth)
			sy = randint(41, SCREEN_HEIGHT - sheight)
			sx2 = randint(41, SCREEN_WIDTH - swidth)
			sy2 = randint(41, SCREEN_HEIGHT - sheight)
			sx3 = randint(41, SCREEN_WIDTH - swidth)
			sy3 = randint(41, SCREEN_HEIGHT - sheight)
		if character.colliderect(spike3):
			lives -= 1
			fx = randint(41, SCREEN_WIDTH - swidth)
			fy = randint(41, SCREEN_HEIGHT - sheight)
			sx = randint(41, SCREEN_WIDTH - swidth)
			sy = randint(41, SCREEN_HEIGHT - sheight)
			sx2 = randint(41, SCREEN_WIDTH - swidth)
			sy2 = randint(41, SCREEN_HEIGHT - sheight)
			sx3 = randint(41, SCREEN_WIDTH - swidth)
			sy3 = randint(41, SCREEN_HEIGHT - sheight)

# Checking for Game Over -----------------------------------------------------------------------

	if lives <= 0:
		WIN.blit(game_over_text, (SCREEN_WIDTH/5, SCREEN_HEIGHT/3))

	game_over_counter += .0001

	if game_over_counter > 180:
		run = False

	pygame.display.update()