Click here to Skip to main content
15,887,477 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
import tkinter as tk
import random

# Create the Tkinter window
root = tk.Tk()
root.title("Character Movement")

canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()

# Create the character (rectangle)
character = canvas.create_rectangle(180, 180, 220, 220, fill="blue")

# Create a list to keep track of falling blocks
falling_blocks = []

# Function to move the character
def move(event):
    x, y = 0, 0
    if event.keysym == 'Up':
        y = -10
    elif event.keysym == 'Down':
        y = 10
    elif event.keysym == 'Left':
        x = -10
    elif event.keysym == 'Right':
        x = 10
    # Check if the character is within the window boundaries before moving
    if 0 < canvas.coords(character)[0] + x < 400 and 0 < canvas.coords(character)[1] + y < 400:
        canvas.move(character, x, y)
        check_collision()

# Function to create falling blocks
def create_falling_block():
    x = random.randint(0, 400)
    block = canvas.create_rectangle(x, 0, x+30, 30, fill="red")
    falling_blocks.append(block)
    animate_falling_block(block)

# Function to animate the falling blocks
def animate_falling_block(block):
    if canvas.coords(block)[3] < 400:
        canvas.move(block, 0, 5)
        if check_collision(block):
            end_game()
        else:
            root.after(100, animate_falling_block, block)

# Function to check for collisions
def check_collision(block=None):
    character_coords = canvas.coords(character)
    if block:
        block_coords = canvas.coords(block)
        if (character_coords[0] < block_coords[2] and character_coords[2] > block_coords[0] and character_coords[1] < block_coords[3] and character_coords[3] > block_coords[1]):
            return True
    return False

# Function to end the game
def end_game():
    canvas.create_text(200, 200, text="You lose!", font=("Helvetica", 20), fill="red")

# Create falling blocks every 2 seconds
root.after(2000, create_falling_block)

# Bind arrow key presses to the move function
root.bind('<Up>', move)
root.bind('<Down>', move)
root.bind('<Left>', move)
root.bind('<Right>', move)

# Run the Tkinter main loop
root.mainloop()


How to spawn more than one

What I have tried:

Adding loops like while true and sys.sleep, etc
Posted
Comments
Richard MacCutchan 12-Jan-24 9:12am    
Maybe because there is a bug in your code. Try running it in the debugger to find out what is going wrong.

1 solution

Python
# Create falling blocks every 2 seconds
root.after(2000, create_falling_block)

You only do this once, at the beginning. You need to do it more often.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900