Python Forum
Noob´s first game goes wrong
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Noob´s first game goes wrong
#1
Hello, i am new to coding and just tried to make a game. I´ve been following a tutorial and made everything exactly
as it said, but the game is stuck showing a red square. Can somebody tell me what i´m doing wrong? I installed Pygame and sys.
Here is the code:

import pygame
import random
import sys

pygame.init()

WIDTH = 800
HEIGHT = 600

RED = (255,0,0)
BLUE = (0,0,255)
YELLOW = (255,255,0)
BACKGROUND_COLOR = (0,0,0)

player_size = 50
player_pos = [WIDTH/2, HEIGHT-2*player_size]

enemy_size = 50
enemy_pos = [random.randint(0,WIDTH-enemy_size), 0]
enemy_list = [enemy_pos]

SPEED = 10

screen = pygame.display.set_mode((WIDTH, HEIGHT))

game_over = False

score = 0

clock = pygame.time.Clock()

myFont = pygame.font.SysFont("monospace", 35)

def set_level(score, SPEED):
	if score < 20:
		SPEED = 5
	elif score < 40:
		SPEED = 8
	elif score < 60:
		SPEED = 12
	else:
		SPEED = 15
	return SPEED
	# SPEED = score/5 + 1


def drop_enemies(enemy_list):
	delay = random.random()
	if len(enemy_list) < 10 and delay < 0.1:
		x_pos = random.randint(0,WIDTH-enemy_size)
		y_pos = 0
		enemy_list.append([x_pos, y_pos])

def draw_enemies(enemy_list):
	for enemy_pos in enemy_list:
		pygame.draw.rect(screen, BLUE, (enemy_pos[0], enemy_pos[1], enemy_size, enemy_size))

def update_enemy_positions(enemy_list, score):
	for idx, enemy_pos in enumerate(enemy_list):
		if enemy_pos[1] >= 0 and enemy_pos[1] < HEIGHT:
			enemy_pos[1] += SPEED
		else:
			enemy_list.pop(idx)
			score += 1
	return score

def collision_check(enemy_list, player_pos):
	for enemy_pos in enemy_list:
		if detect_collision(enemy_pos, player_pos):
			return True
	return False

def detect_collision(player_pos, enemy_pos):
	p_x = player_pos[0]
	p_y = player_pos[1]

	e_x = enemy_pos[0]
	e_y = enemy_pos[1]

	if (e_x >= p_x and e_x < (p_x + player_size)) or (p_x >= e_x and p_x < (e_x+enemy_size)):
		if (e_y >= p_y and e_y < (p_y + player_size)) or (p_y >= e_y and p_y < (e_y+enemy_size)):
			return True
	return False

while not game_over:

	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			sys.exit()

		if event.type == pygame.KEYDOWN:

			x = player_pos[0]
			y = player_pos[1]

			if event.key == pygame.K_LEFT:
				x -= player_size
			elif event.key == pygame.K_RIGHT:
				x += player_size

			player_pos = [x,y]

	screen.fill(BACKGROUND_COLOR)

	drop_enemies(enemy_list)
	score = update_enemy_positions(enemy_list, score)
	SPEED = set_level(score, SPEED)

	text = "Score:" + str(score)
	label = myFont.render(text, 1, YELLOW)
	screen.blit(label, (WIDTH-200, HEIGHT-40))

	if collision_check(enemy_list, player_pos):
		game_over = True
		break

	draw_enemies(enemy_list)

	pygame.draw.rect(screen, RED, (player_pos[0], player_pos[1], player_size, player_size))

	clock.tick(30)

	pygame.display.update()
Reply
#2
I'm mobile now. But when I get a desktop I will check your issue out. What are you trying to acheive?
Recommended Tutorials:
Reply
#3
Your code works fine. My opinion find a better tutorial.

1. Just don't render text every frame. Update it when it needs to be.
This will cause a slow down.

2. Use rects. Most of the math is built in.

Here my example.
import pygame
import random

pygame.init()

def update_score_label(font, score):
    return font.render("Score: {}".format(score), 1, pygame.Color("Yellow"))

def main():
    # Game Variables
    size = 50
    score = 0
    speed = 5
    bounds = pygame.Rect(0, 0, 800, 600)
    mono_font = pygame.font.SysFont("monospace", 35)
    # store player as rect
    player = pygame.Rect(bounds.width / 2, bounds.height - 2 * size, size, size)
    score_label = update_score_label(mono_font, score)

    # Enemy Variables
    enemy_list = []
    enemy_next_drop = 600
    enemy_interval_value = [200, 600]
    enemy_interval = random.randint(enemy_interval_value[0], enemy_interval_value[1])

    # Basic Pygame Setup
    pygame.display.set_caption("Falling Blocks Example")
    screen = pygame.display.set_mode(bounds.size)
    clock = pygame.time.Clock()

    # Mainloop
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    player.x -= size
                elif event.key == pygame.K_RIGHT:
                    player.x += size

            elif event.type == pygame.QUIT:
                running = False

        # Update
        ticks = pygame.time.get_ticks()
        if ticks > enemy_next_drop:
            enemy_next_drop += enemy_interval
            enemy_interval = random.randint(enemy_interval_value[0], enemy_interval_value[1])
            enemy_list.append(pygame.Rect(random.randint(0, bounds.width - size), -size, size, size))

        remove_enemies = []
        for enemy in enemy_list:
            enemy.y += speed
            if enemy.y > bounds.height:
                score += 1
                score_label = update_score_label(mono_font, score)
                remove_enemies.append(enemy)

                if score < 20:
                    speed = 5
                    enemy_interval_value = [200, 600]
                elif score < 40:
                    speed = 8
                    enemy_interval_value = [150, 400]
                elif score < 60:
                    speed = 12
                    enemy_interval_value = [100, 200]
                else:
                    speed = 15
                    enemy_interval_value = [75, 150]

        for enemy in remove_enemies:
            enemy_list.remove(enemy)

        # Collision
        if player.collidelist(enemy_list) > -1:
            # player dies
            running = False

        # Drawing
        screen.fill(pygame.Color("Black"))
        pygame.draw.rect(screen, pygame.Color("Red"), player)
        for enemy in enemy_list:
            pygame.draw.rect(screen, pygame.Color("Blue"), enemy)

        screen.blit(score_label, (bounds.width - 200, bounds.height - 40))

        # flip it because of so many moving images
        pygame.display.flip()
        clock.tick(30)

if __name__ == "__main__":
    main()
    pygame.quit()
99 percent of computer problems exists between chair and keyboard.
Reply
#4
(Mar-30-2019, 08:35 PM)metulburr Wrote: I'm mobile now. But when I get a desktop I will check your issue out. What are you trying to acheive?
This should be a completed game. I want it to work xD

I have just copied your code and it does not work for me. I think it is a problem with PyGame.
Reply
#5
(Mar-30-2019, 09:13 PM)asadodetira123 Wrote: I have just copied your code and it does not work for me. I think it is a problem with PyGame
In what way does it not work? What is the error that you get?
(Mar-30-2019, 05:11 PM)asadodetira123 Wrote: but the game is stuck showing a red square.
What does stuck showing a red square mean?
Recommended Tutorials:
Reply
#6
What operating system are you using ?

What do you mean you installed sys ?

Do you know your python version ?
99 percent of computer problems exists between chair and keyboard.
Reply
#7
When i run the console, i can see only a red square (The one i´ve created)but cannot move it...Is it possible that Pygame is bugged?
Reply
#8
when i run either of your codes, it moves. It moves once upon arrow key press. Im not sure if that what you intended or not, but it does move. I would answer these questions:
(Mar-31-2019, 03:01 AM)Windspar Wrote: What operating system are you using ? What do you mean you installed sys ? Do you know your python version ?
Because Mac users can experience some weird issues.

Did you compile pygame yourself or did you just install a wheel or use pip? Verify that your arrows keys work correctly on your keyboard by other means.
Recommended Tutorials:
Reply
#9
Do blue blocks show falling ?
If so change arrows to letters.
if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    player.x -= size
                elif event.key == pygame.K_d:
                    player.x += size
99 percent of computer problems exists between chair and keyboard.
Reply
#10
(Mar-31-2019, 12:27 PM)Windspar Wrote: Do blue blocks show falling ? If so change arrows to letters.
if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: player.x -= size elif event.key == pygame.K_d: player.x += size
Still does not work. Pycharm shows me some yellow warnings in some pygame commands (pygame.Recto, pygame.init)
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020