Livraison gratuite à partir de 74,95 € NL (99,95 € BE / DE)

Livraison rapide avec DHL

Commandé avant 16:00 = Expédié aujourd'hui

14 jours de retour*


Transport routier

Vous vous souvenez probablement de Pong! Le très célèbre jeu des années 70.
Contrôlez désormais votre bloc avec un cadran comme les anciennes versions de ce jeu !

Pong est un jeu simple où vous avez deux plates-formes verticales et une balle. Le but du jeu est d'amener la balle à frapper le mur de votre adversaire. Il doit essayer d'éviter cela avec son plateau. S'il ne réussit pas, vous obtiendrez un point, donc cela ressemble à une sorte de ping-pong.

Au cours de ce projet, vous apprendrez à en créer votre propre version, alors lisez la suite. La différence avec cette variante est que vous devez jouer avec l'adversaire pour obtenir le score le plus élevé possible. Si vous le manquez accidentellement, vous recommencez à partir de zéro. Alors ne le manquez pas!

  • Niveau - débutant 40% 40%
  • Durée - 20/25 Min 30% 30%
  • Coûts - 60.78 € complets 37% 37%

Étape 1: Fournitures

Étape 2 : Construire et câbler 

Câblage du Raspberry Pi est simple.

Le câble HDMI va dans le port HDMI de l'écran et dans celui du Raspberry Pi. Ensuite, l'alimentation passe dans le micro USB et le clavier et la souris dans les ports USB.

Connectez le bouton rotatif comme indiqué dans le schéma ci-dessous.

Maintenant que vous avez tout connecté, vous pouvez commencer à programmer votre propre jeu de pong.

Étape 3: programmation

Maintenant que vous êtes sur le point de programmer votre projet pong, ouvrez d'abord l'IDE Thonny Python.

Là, vous écrivez le code ci-dessous et lorsque vous l'avez écrit, vous enregistrez le projet. Assurez-vous de le faire avec un nom que vous pourrez facilement retrouver car: "vous ne voulez pas perdre votre code!"

Maintenant que votre code est terminé, vous pouvez l'ouvrir et commencer à jouer au pong, quel est votre meilleur score?

 

import pygame, sys
from pygame.locals import *

# Source code Pong
# https://www.raspberrypiportugal.pt/jogo-atari-pong-python-pygame/
# Toevoeging Rotary encoder 
# Elektronicavoorjou.nl

from RPi import GPIO
clk = 17
dt = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

clkLastState = GPIO.input(clk)

FPS = 200
WINDOWWIDTH = 800
WINDOWHEIGHT = 600
LINETHICKNESS = 12
PADDLESIZE = 50
PADDLEOFFSET = 20
counter = int(WINDOWHEIGHT/2)

BLACK     = (0  ,0  ,0  )
WHITE     = (255,255,255)

def drawArena():
    DISPLAYSURF.fill((0,0,0))
    pygame.draw.rect(DISPLAYSURF, WHITE, ((0,0),(WINDOWWIDTH,WINDOWHEIGHT)), LINETHICKNESS*2)
    pygame.draw.line(DISPLAYSURF, WHITE, ((int(WINDOWWIDTH/2)),0),((int(WINDOWWIDTH/2)),WINDOWHEIGHT), (int(LINETHICKNESS/4)))

def drawPaddle(paddle):
    if paddle.bottom > WINDOWHEIGHT - LINETHICKNESS:
        paddle.bottom = WINDOWHEIGHT - LINETHICKNESS
    elif paddle.top < LINETHICKNESS:
        paddle.top = LINETHICKNESS
    pygame.draw.rect(DISPLAYSURF, WHITE, paddle)

def drawBall(ball):
    pygame.draw.rect(DISPLAYSURF, WHITE, ball)

def moveBall(ball, ballDirX, ballDirY):
    ball.x += ballDirX
    ball.y += ballDirY
    return ball

def checkEdgeCollision(ball, ballDirX, ballDirY):
    if ball.top == (LINETHICKNESS) or ball.bottom == (WINDOWHEIGHT - LINETHICKNESS):
        ballDirY = ballDirY * -1
    if ball.left == (LINETHICKNESS) or ball.right == (WINDOWWIDTH - LINETHICKNESS):
        ballDirX = ballDirX * -1
    return ballDirX, ballDirY
    
def checkHitBall(ball, paddle1, paddle2, ballDirX):
    if ballDirX == -1 and paddle1.right == ball.left and paddle1.top < ball.top and paddle1.bottom > ball.bottom:
        return -1
    elif ballDirX == 1 and paddle2.left == ball.right and paddle2.top < ball.top and paddle2.bottom > ball.bottom:
        return -1
    else: return 1

def checkPointScored(paddle1, ball, score, ballDirX):
    
    if ball.left == LINETHICKNESS: 
        return 0
   
    elif ballDirX == -1 and paddle1.right == ball.left and paddle1.top < ball.top and paddle1.bottom > ball.bottom:
        score += 1
        return score
   
    elif ball.right == WINDOWWIDTH - LINETHICKNESS:
        score += 5
        return score
    
    else: return score

def artificialIntelligence(ball, ballDirX, paddle2):
    if ballDirX == -1:
        if paddle2.centery < (WINDOWHEIGHT/2):
            paddle2.y += 1
        elif paddle2.centery > (WINDOWHEIGHT/2):
            paddle2.y -= 1
   
    elif ballDirX == 1:
        if paddle2.centery < ball.centery:
            paddle2.y += 1
        else:
            paddle2.y -=1
    return paddle2
def displayScore(score):
    resultSurf = BASICFONT.render('Score = %s' %(score), True, WHITE)
    resultRect = resultSurf.get_rect()
    resultRect.topleft = (WINDOWWIDTH - 150, 25)
    DISPLAYSURF.blit(resultSurf, resultRect)
def main():
    pygame.init()
    global DISPLAYSURF
    global BASICFONT, BASICFONTSIZE
    BASICFONTSIZE = 20
    BASICFONT = pygame.font.Font('freesansbold.ttf', BASICFONTSIZE)

    FPSCLOCK = pygame.time.Clock()
    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT)) 
    pygame.display.set_caption('Pong')
    ballX = WINDOWWIDTH/2 - LINETHICKNESS/2
    ballY = WINDOWHEIGHT/2 - LINETHICKNESS/2
    playerOnePosition = (WINDOWHEIGHT - PADDLESIZE) /2
    playerTwoPosition = (WINDOWHEIGHT - PADDLESIZE) /2
    score = 0

    ballDirX = -1 
    ballDirY = -1  

    paddle1 = pygame.Rect(PADDLEOFFSET,playerOnePosition, LINETHICKNESS,PADDLESIZE)
    paddle2 = pygame.Rect(WINDOWWIDTH - PADDLEOFFSET - LINETHICKNESS, playerTwoPosition, LINETHICKNESS,PADDLESIZE)
    ball = pygame.Rect(ballX, ballY, LINETHICKNESS, LINETHICKNESS)

    drawArena()
    drawPaddle(paddle1)
    drawPaddle(paddle2)
    drawBall(ball)
    pygame.mouse.set_visible(0) 
    while True: 
        for event in pygame.event.get():
            if event.type == QUIT:
                GPIO.cleanup()
                pygame.quit()
                sys.exit()
    
        global clkLastState
        global counter
        clkState = GPIO.input(clk)
        dtState = GPIO.input(dt)
        if clkState != clkLastState:
                if dtState != clkState:
                        counter += 10
                        if counter > WINDOWHEIGHT:
                            counter = WINDOWHEIGHT
                else:
                        counter -= 10
                        if counter < 1:
                            counter = 1
                paddle1.y = counter
        clkLastState = clkState

        drawArena()
        drawPaddle(paddle1)
        drawPaddle(paddle2)
        drawBall(ball)

        ball = moveBall(ball, ballDirX, ballDirY)
        ballDirX, ballDirY = checkEdgeCollision(ball, ballDirX, ballDirY)
        score = checkPointScored(paddle1, ball, score, ballDirX)
        ballDirX = ballDirX * checkHitBall(ball, paddle1, paddle2, ballDirX)
        paddle2 = artificialIntelligence (ball, ballDirX, paddle2)

        displayScore(score)

        pygame.display.update()
        FPSCLOCK.tick(FPS)

if __name__=='__main__':
    main()

La note de www.elektronicavoorjou.nl à Avis sur WebwinkelKeur est 9.3 / 10 basé sur 4988 avis.