Program a Pong!

Step 5

You learned some basic programming principles in the previous step, it's time to have some fun!

Delete your code (you can save it into another file if you wich to reuse it later), and put the code below instead. Remember to save to run it on your Gamebuino.

from gamebuino_meta import begin, waitForUpdate, display, color, buttons, collide

# Size, speed and initial position of the ball:
ball_size = 3
ball_x_speed = 1
ball_y_speed = 1
ball_x_position = 20
ball_y_position = 20

# Initial size of the player's racket:
player_height = 12
player_width = 3
player_speed = 2

# Initial position of the racket:
player_x_position = 10
player_y_position = 30

# Score
score = 0

while True:
    waitForUpdate()
    display.clear()

    # If you press the UP or DOWN buttons, we move the racket up or down:
    if buttons.repeat(buttons.UP, 0):
        player_y_position = player_y_position - player_speed

    if buttons.repeat(buttons.DOWN, 0):
        player_y_position = player_y_position + player_speed

    # We move the ball
    ball_x_position = ball_x_position + ball_x_speed
    ball_y_position = ball_y_position + ball_y_speed

    # Check if the ball collides with the top, bottom or right of the screen
    # If so, we reverse its direction
    if ball_y_position <= 0:
        ball_y_speed = -ball_y_speed

    if ball_y_position >= 64 - ball_size:
        ball_y_speed = -ball_y_speed

    if ball_x_position + ball_size >= 80:
        ball_x_speed = -ball_x_speed

    # We test if there is a collision between the ball and the player's racket
    if collide.rectRect(ball_x_position, ball_y_position, ball_size, ball_size, 
                        player_x_position, player_y_position, player_width, player_height):
        ball_x_speed = -ball_x_speed
        score = score + 1

    # Check if the ball is out of the screen
    if ball_x_position <= 0:
        score = 0  # Nous remettons le score à 0
        ball_x_speed = -ball_x_speed
				
		# Prevent the racket from getting out the screen
    if player_y_position <= 0:
        player_y_position = 0
    
    if player_y_position >= 64 - player_height:
        player_y_position = 64 - player_height

    # Ball display
    display.fillRect(ball_x_position, ball_y_position, ball_size, ball_size)

    # Display of the player's racket
    display.fillRect(player_x_position, player_y_position, player_width, player_height)
		

Well done, you just launched your first game! Simple, isn't it? Try to play! Use the arrows on your Gamebuino to move the racket, and return the ball.

Look at the code a little: don't worry, it's quite normal if you don't understand everything. But, if you look closely, you will notice things you already know: variables! There are many, but you must have noticed the one called "score": it is equal to 0 when you start the game.

The rules are as follows: as soon as you succeed in sending the ball back, you earn one point. As soon as you miss the ball, your score goes back to 0. Everything is already programmed, you don't have to do it! But there is a problem: the score is not displayed on the screen. That's where you come in!

Challenge #4

Try to display the following sentence on the screen, in green: "My score is X" (where X is of course the value of our score). Normally, you have all the knowledge to do it, but if you block, read the help below!

Need help?

  • Remember: the instruction to display something on the screen is display.print("My text"). You can also replace "My text" with a variable.
  • The instruction to change the color to green is as follows: display.setColor(color.GREEN). Place it just before the instruction to write your text!
  • You can write the display instructions anywhere in the code, but in general, we do it all at the end.

Expected result

Solution

See
from gamebuino_meta import begin, waitForUpdate, display, color, buttons, collide

# Size, speed and initial position of the ball:
ball_size = 3
ball_x_speed = 1
ball_y_speed = 1
ball_x_position = 20
ball_y_position = 20

# Initial size of the player's racket:
player_height = 12
player_width = 3
player_speed = 2

# Initial position of the racket:
player_x_position = 10
player_y_position = 30

# Score
score = 0

while True:
    waitForUpdate()
    display.clear()

    # If you press the UP or DOWN buttons, we move the racket up or down:
    if buttons.repeat(buttons.UP, 0):
        player_y_position = player_y_position - player_speed

    if buttons.repeat(buttons.DOWN, 0):
        player_y_position = player_y_position + player_speed

    # We move the ball
    ball_x_position = ball_x_position + ball_x_speed
    ball_y_position = ball_y_position + ball_y_speed

    # Check if the ball collides with the top, bottom or right of the screen
    # If so, we reverse its direction
    if ball_y_position <= 0:
        ball_y_speed = -ball_y_speed

    if ball_y_position >= 64 - ball_size:
        ball_y_speed = -ball_y_speed

    if ball_x_position + ball_size >= 80:
        ball_x_speed = -ball_x_speed

    # We test if there is a collision between the ball and the player's racket
    if collide.rectRect(ball_x_position, ball_y_position, ball_size, ball_size, 
                        player_x_position, player_y_position, player_width, player_height):
        ball_x_speed = -ball_x_speed
        score = score + 1

    # Check if the ball is out of the screen
    if ball_x_position <= 0:
        score = 0  # Nous remettons le score à 0
        ball_x_speed = -ball_x_speed
				
		# Prevent the racket from getting out the screen
    if player_y_position <= 0:
        player_y_position = 0
    
    if player_y_position >= 64 - player_height:
        player_y_position = 64 - player_height

    # Ball display
    display.fillRect(ball_x_position, ball_y_position, ball_size, ball_size)

    # Display of the player's racket
    display.fillRect(player_x_position, player_y_position, player_width, player_height)
		
		# Score display
    display.setColor(color.GREEN)
    display.print("My score is")
    display.print(score)

Explanations

You have simply put into practice what we have seen before. Pretty easy, isn't it? Just remember one thing: for clarity, display instructions are usually placed at the end. As seen above, the score variable is modified by the program, and we display its new value each time.

Go further

Our score is reset each time the ball hits the left side of the screen. What if we wanted to display the total number of times we sent the ball back? Try creating a variable called "total" and displaying it on the screen in a different color. Observe how we manage the "score" variable throughout the program. All you have to do is do the same with "total", but without the instruction that resets it to zero!

If you want inspiration, here's what we've done:

See
from gamebuino_meta import begin, waitForUpdate, display, color, buttons, collide

# Size, speed and initial position of the ball:
ball_size = 3
ball_x_speed = 1
ball_y_speed = 1
ball_x_position = 20
ball_y_position = 20

# Initial size of the player's racket:
player_height = 12
player_width = 3
player_speed = 2

# Initial position of the racket:
player_x_position = 10
player_y_position = 30

# Score
score = 0
total = 0

while True:
    waitForUpdate()
    display.clear()

    # If you press the UP or DOWN buttons, we move the racket up or down:
    if buttons.repeat(buttons.UP, 0):
        player_y_position = player_y_position - player_speed

    if buttons.repeat(buttons.DOWN, 0):
        player_y_position = player_y_position + player_speed

    # We move the ball
    ball_x_position = ball_x_position + ball_x_speed
    ball_y_position = ball_y_position + ball_y_speed

    # Check if the ball collides with the top, bottom or right of the screen
    # If so, we reverse its direction
    if ball_y_position <= 0:
        ball_y_speed = -ball_y_speed

    if ball_y_position >= 64 - ball_size:
        ball_y_speed = -ball_y_speed

    if ball_x_position + ball_size >= 80:
        ball_x_speed = -ball_x_speed

    # We test if there is a collision between the ball and the player's racket
    if collide.rectRect(ball_x_position, ball_y_position, ball_size, ball_size, 
                        player_x_position, player_y_position, player_width, player_height):
        ball_x_speed = -ball_x_speed
        score = score + 1
        total = total + 1

    # Check if the ball is out of the screen
    if ball_x_position <= 0:
        score = 0  # Nous remettons le score à 0
        ball_x_speed = -ball_x_speed
				
    # Prevent the racket from getting out the screen
    if player_y_position <= 0:
        player_y_position = 0
    
    if player_y_position >= 64 - player_height:
        player_y_position = 64 - player_height

    # Ball display
    display.fillRect(ball_x_position, ball_y_position, ball_size, ball_size)

    # Display of the player's racket
    display.fillRect(player_x_position, player_y_position, player_width, player_height)
		
		# Score display
    display.setColor(color.GREEN)
    display.print("My score is")
    display.print(score)
		    
    display.print("\n")
    
    display.setColor(color.BLUE)
    display.print("Total:")
    display.print(total)

Not bad, is it? Now, let's have some fun with the graphics and the gameplay.

Next step