From e92e88f6d1f09927880b4905fd85fc091e3c2fc1 Mon Sep 17 00:00:00 2001 From: maccden Date: Mon, 20 Jun 2022 11:42:17 -0800 Subject: [PATCH] code review + refactoring --- pypong.py | 207 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 106 insertions(+), 101 deletions(-) diff --git a/pypong.py b/pypong.py index 9075f5e..c4c1087 100644 --- a/pypong.py +++ b/pypong.py @@ -1,142 +1,148 @@ -import pygame, sys, random +import pygame +import sys +import random + +# Conf. princ. +pygame.init() +clock = pygame.time.Clock() +pygame.mixer.pre_init(44100, -16, 2, 512) +pygame.mouse.set_visible(0) + + +# Conf. ventana +displayInfo = pygame.display.Info() +screenWidth = displayInfo.current_w +screenHeight = displayInfo.current_h +screen = pygame.display.set_mode((screenWidth, screenHeight)) +pygame.display.set_caption('Pypong!') + + +# Variables de texto +gameFont = pygame.font.Font("./font/PressStart2P.ttf", 60) + +# Variables de sonido +pongSound = pygame.mixer.Sound("./sound/pong.ogg") +scoreSound = pygame.mixer.Sound("./sound/score.ogg") + +# Colores +white = (255, 255, 255) +green = (0, 192, 0) +grey = (220, 220, 220) +bgColor = (0, 0, 0) + +state = { + "player1": {"speed": 0, + "sprite": pygame.Rect(40, screenHeight / 2.4, 10, 100), + "score": 0}, + "player2": {"speed": 0, + "sprite": pygame.Rect(screenWidth - 50, screenHeight / 2.4, 10, 100), + "score": 0}, + "ball": {"sprite": pygame.Rect(screenWidth / 2 - 15, screenHeight / 2 - 15, 15, 15), + "speed": pygame.math.Vector2(13, 13)}, + "scoreTime": 0 +} def ballLogic(): - global ballSpeedX, ballSpeedY, player1Score, player2Score, score_time - ball.x += ballSpeedX - ball.y += ballSpeedY + ball = state["ball"]["sprite"] + ball.x += state["ball"]["speed"].x + ball.y += state["ball"]["speed"].y # Colisiones if ball.top <= 0 or ball.bottom >= screenHeight: pygame.mixer.Sound.play(pongSound) - ballSpeedY *= -1 + state["ball"]["speed"].y *= -1 if ball.left <= 0: pygame.mixer.Sound.play(scoreSound) - player2Score += 1 - score_time = pygame.time.get_ticks() + state["player2"]["score"] += 1 + state["scoreTime"] = pygame.time.get_ticks() if ball.right >= screenWidth: pygame.mixer.Sound.play(scoreSound) - player1Score += 1 - score_time = pygame.time.get_ticks() + state["player1"]["score"] += 1 + state["scoreTime"] = pygame.time.get_ticks() - if ball.colliderect(player1) or ball.colliderect(player2): + if ball.colliderect(state["player1"]["sprite"]) or ball.colliderect(state["player2"]["sprite"]): pygame.mixer.Sound.play(pongSound) - ballSpeedX *= -1 + state["ball"]["speed"].x *= -1 def playerLogic(): - player1.y += player1Speed - player2.y += player2Speed + _playerLogic(state["player1"]) + _playerLogic(state["player2"]) + + +def _playerLogic(player): + sprite = player["sprite"] + sprite.y += player["speed"] # Boundary - if player1.top <= 10: - player1.top = 10 - if player1.bottom >= screenHeight - 10: - player1.bottom = screenHeight - 10 - if player2.top <= 10: - player2.top = 10 - if player2.bottom >= screenHeight - 10: - player2.bottom = screenHeight - 10 + if sprite.top <= 10: + sprite.top = 10 + + if sprite.bottom >= screenHeight - 10: + sprite.bottom = screenHeight - 10 def ballRestart(): - global ballSpeedX, ballSpeedY, score_time currentTime = pygame.time.get_ticks() - ball.center = (screenWidth / 2, screenHeight / 2) + state["ball"]["sprite"].center = (screenWidth / 2, screenHeight / 2) # Conteo - if currentTime - score_time < 700: + if currentTime - state["scoreTime"] < 700: number3 = gameFont.render("3", False, green) screen.blit(number3, (screenWidth / 2 - 30, screenHeight / 2 - 30)) - if 700 < currentTime - score_time < 1400: + + if 700 < currentTime - state["scoreTime"] < 1400: number2 = gameFont.render("2", False, green) screen.blit(number2, (screenWidth / 2 - 30, screenHeight / 2 - 30)) - if 1400 < currentTime - score_time < 2100: + + if 1400 < currentTime - state["scoreTime"] < 2100: number1 = gameFont.render("1", False, green) screen.blit(number1, (screenWidth / 2 - 30, screenHeight / 2 - 30)) # Reset - if currentTime - score_time < 2100: - ballSpeedX, ballSpeedY = 0, 0 + if currentTime - state["scoreTime"] < 2100: + state["ball"]["speed"] = pygame.math.Vector2(0, 0) else: - ballSpeedY = 13 * random.choice((-1, 1)) - ballSpeedX = 13 * random.choice((-1, 1)) - score_time = None + state["ball"]["speed"] = 13 * pygame.math.Vector2( + random.choice((-1, 1)), random.choice((-1, 1))) + state["scoreTime"] = 0 -# Conf. princ. -pygame.init() -clock = pygame.time.Clock() -pygame.mixer.pre_init(44100, -16, 2, 512) -pygame.mouse.set_visible(0) -score_time = True +def gameExit(): + pygame.quit() + sys.exit() -# Conf. ventana -displayInfo = pygame.display.Info() -screenWidth = displayInfo.current_w -screenHeight = displayInfo.current_h -screen = pygame.display.set_mode((screenWidth, screenHeight)) -pygame.display.set_caption('Pypong!') - -# Variables de veloc. -player1Speed, player2Speed = 0, 0 -ballSpeedX, ballSpeedY = 13, 13 -# Variables de texto -player1Score, player2Score = 0, 0 -gameFont = pygame.font.Font("./font/PressStart2P.ttf", 60) - -# Variables de sonido -pongSound = pygame.mixer.Sound("./sound/pong.ogg") -scoreSound = pygame.mixer.Sound("./sound/score.ogg") +def playerController(event, player, upKey, downKey, speed=10): + if event.type == pygame.KEYDOWN: + # Player 2 + if event.key == upKey: + player["speed"] -= speed + if event.key == downKey: + player["speed"] += speed + if event.type == pygame.KEYUP: + if event.key == upKey: + player["speed"] += speed + if event.key == downKey: + player["speed"] -= speed -# Colores -white = (255, 255, 255) -green = (0, 192, 0) -grey = (220, 220, 220) -bgColor = (0, 0, 0) -# Figuritas -player1 = pygame.Rect(40, screenHeight / 2.4, 10, 100) -player2 = pygame.Rect(screenWidth - 50, screenHeight / 2.4, 10, 100) -ball = pygame.Rect(screenWidth / 2 - 15, screenHeight / 2 - 15, 15, 15) +def renderScore(player, pos): + playerText = gameFont.render(f"{player['score']}", False, grey) + screen.blit(playerText, (screenWidth / pos - 30, 50)) while True: for event in pygame.event.get(): - if event.type == pygame.QUIT: - pygame.quit() - sys.exit() - + if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE): + gameExit() # Conf. teclado - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - pygame.quit() - sys.exit() - # Player 1 - if event.key == pygame.K_w: - player1Speed -= 9 - if event.key == pygame.K_s: - player1Speed += 9 - # Player 2 - if event.key == pygame.K_i: - player2Speed -= 9 - if event.key == pygame.K_k: - player2Speed += 9 - if event.type == pygame.KEYUP: - # Player 1 - if event.key == pygame.K_w: - player1Speed += 9 - if event.key == pygame.K_s: - player1Speed -= 9 - # Player 2 - if event.key == pygame.K_i: - player2Speed += 9 - if event.key == pygame.K_k: - player2Speed -= 9 + playerController(event, state["player1"], pygame.K_w, pygame.K_s) + playerController(event, state["player2"], pygame.K_i, pygame.K_j) # Lógica ballLogic() @@ -147,19 +153,18 @@ def ballRestart(): for x in range(10, screenHeight, screenHeight // 15): if x % 2 == 1: continue - pygame.draw.rect(screen, grey, (screenWidth // 2 - 5, x, 10, screenHeight // 30)) - pygame.draw.rect(screen, grey, player1) - pygame.draw.rect(screen, grey, player2) - pygame.draw.rect(screen, white, ball) + pygame.draw.rect(screen, grey, (screenWidth // + 2 - 5, x, 10, screenHeight // 30)) + pygame.draw.rect(screen, grey, state["player1"]["sprite"]) + pygame.draw.rect(screen, grey, state["player2"]["sprite"]) + pygame.draw.rect(screen, white, state["ball"]["sprite"]) - if score_time: + if state["scoreTime"] > 0: ballRestart() # Render de texto - playerText1 = gameFont.render(f"{player1Score}", False, grey) - screen.blit(playerText1, (screenWidth / 4 - 30, 50)) - playerText2 = gameFont.render(f"{player2Score}", False, grey) - screen.blit(playerText2, (screenWidth / 1.3 - 30, 50)) + renderScore(state["player1"], 4) + renderScore(state["player2"], 1.3) pygame.display.update() pygame.display.flip()