Search code examples
pythonturtle-graphicspython-turtle

I have problem with my game, when the ball goes over the block, it is not deleting from my screen


Someone can help me please?

I spent many hours to understand the problem.. (Without success 🤣)

I tried to built a 80s hit game.

The problem is that when the ball goes on one of the stones, I catch the event (shows me in the console) and update the list of blocks but the block is not deleted from the screen as if nothing happened and I did not update any list

this is my code:

import time
from turtle import Screen, Turtle
import random

screen = Screen()
screen.bgcolor("black")
screen.setup(width=800, height=600)
screen.tracer(0)

player = Turtle("square")
player.shapesize(1.0, 4.0, 0)
player.color("blue")
player.penup()
player.goto(0, -250)
screen.tracer(0)




blue_turtle = []
blue_positions = []
for i in range(7):
    turtle = Turtle("square")
    turtle.shapesize(2.0 ,4.0, 0)
    turtle.color("blue")
    turtle.penup()
    blue_positions.append((-300 + i * 100, 200))
    blue_turtle.append(turtle)
    
def renderBlocks(b):
    for i in range(len(b) - 1):
        if b[i] == None:
            print("Skipped")
            continue
        else:
            x, y= blue_positions[i]
            b[i].goto(x=x, y=y)
            # total += 100
    
ball = Turtle("circle")
ball.color("white")
    
    
game_on = True
    
def move():
    x = ball.xcor() + 10
    y = ball.ycor()+ 10
    ball.goto(x=x, y=y)

while game_on:
    move()
    
    renderBlocks(blue_turtle)
    for i in range(len(blue_turtle) - 1):
        if (blue_turtle[i] != None) and ball.distance(blue_turtle[i]) < 20:
            blue_turtle[i] = (None)
    
 
    time.sleep(0.1)
    
    screen.update()

screen.exitonclick()

Solution

  • I believe the problem is here:

    blue_turtle[i] = (None)
    

    You tell your code that the turtle has been eliminated but you don't tell turtle graphics that it should be removed. Instead consider:

    blue_turtle[i].hideturtle()
    blue_turtle[i] = None
    

    My rework of your code addressing this issue and some others:

    from turtle import Screen, Turtle
    
    def renderBlocks(b):
        for i in range(len(b) - 1):
            if b[i]:
                x, y = blue_positions[i]
                b[i].goto(x, y)
    
    def move():
        if game_on:
            x = ball.xcor() + 10
            y = ball.ycor() + 10
            ball.goto(x, y)
    
            renderBlocks(blue_turtles)
    
            for i in range(len(blue_turtles) - 1):
                if blue_turtles[i] and ball.distance(blue_turtles[i]) < 20:
                    blue_turtles[i].hideturtle()
                    blue_turtles[i] = None
    
            screen.update()
            screen.ontimer(move, 100)  # milliseconds
    
    screen = Screen()
    screen.setup(width=800, height=600)
    screen.bgcolor('black')
    screen.tracer(0)
    
    player = Turtle('square')
    player.shapesize(1, 4, 0)
    player.color('blue')
    player.penup()
    player.sety(-250)
    
    blue_turtles = []
    blue_positions = []
    
    for i in range(7):
        turtle = Turtle('square')
        turtle.shapesize(2, 4, 0)
        turtle.color('blue')
        turtle.penup()
        blue_positions.append((-300 + i * 100, 200))
        blue_turtles.append(turtle)
    
    ball = Turtle('circle')
    ball.color('white')
    
    game_on = True
    
    move()
    
    screen.exitonclick()