Sie erinnern sich wahrscheinlich an Pong! Das sehr berühmte Spiel aus den 70er Jahren.
Steuern Sie Ihren Block jetzt mit einem Drehrad wie in den alten Versionen dieses Spiels!
Pong ist ein einfaches Spiel, bei dem Sie zwei vertikale Plateaus und einen Ball haben. Das Ziel des Spiels ist es, den Ball gegen die Wand Ihres Gegners schlagen zu lassen. Er muss versuchen, dies mit seinem Plateau zu verhindern. Wenn es ihm nicht gelingt, bekommen Sie einen Punkt, also sieht es aus wie eine Art Tischtennis.
Während dieses Projekts lernen Sie, wie Sie Ihre eigene Version davon erstellen, also lesen Sie weiter. Der Unterschied zu dieser Variante besteht darin, dass Sie mit dem Gegner passen müssen, um die höchstmögliche Punktzahl zu erzielen. Wenn Sie es versehentlich verpassen, fangen Sie von vorne an. Verpassen Sie es also nicht!
- Level - Anfänger 40%
- Dauer - 20/25 min 30%
- Kosten - 60.78 € abgeschlossen 37%
Schritt 1: Anforderungen
- Raspberry Pi 4 of Himbeere 5
- HDMI-Kabel
- Überwachen
- Maus & Tastatur
- Drehcodierer
Schritt 2: Bauen und verkabeln
Verkabelung der Raspberry Pi Ist einfach.
Das HDMI-Kabel geht in den HDMI-Anschluss des Displays und in den des Raspberry Pi. Dann geht der Strom in den Micro-USB und die Tastatur und Maus in die USB-Anschlüsse.
Schließen Sie den Drehknopf wie in der Abbildung unten gezeigt an.
Nachdem Sie alles angeschlossen haben, können Sie mit der Programmierung Ihres eigenen Pong-Spiels beginnen.
Schritt 3: Programmierung
Nachdem Sie mit der Programmierung Ihres Pong-Projekts begonnen haben, öffnen Sie zunächst die Thonny Python-IDE.
Dort schreiben Sie den folgenden Code und wenn Sie ihn aufgeschrieben haben, speichern Sie das Projekt. Stellen Sie sicher, dass Sie dies mit einem Namen tun, den Sie leicht wiederfinden können, weil: "Sie möchten Ihren Code nicht verlieren!"
Nachdem Ihr Code fertig ist, können Sie ihn öffnen und Pong spielen. Was ist Ihr Highscore?
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()