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%
- Durée - 20/25 Min 30%
- Coûts - 60.78 € complets 37%
Étape 1: Fournitures
- Raspberry Pi 4 of Framboise 5
- Câble HDMI
- Surveiller
- Souris et clavier
- codeur rotatif
É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()