Skip to content

code review + refactoring #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
207 changes: 106 additions & 101 deletions pypong.py
Original file line number Diff line number Diff line change
@@ -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()
Expand All @@ -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()
Expand Down