You've already forked juegos-python
Create repo
This commit is contained in:
259
Pong/Pong.py
Normal file
259
Pong/Pong.py
Normal file
@@ -0,0 +1,259 @@
|
||||
# -----------------------------------------------------------------------------
|
||||
#
|
||||
# Pong
|
||||
# Language - Python
|
||||
# Modules - pygame, sys, random, math
|
||||
#
|
||||
# Controls - Arrow Keys for Right Paddle and WASD Keys for Left Paddle
|
||||
#
|
||||
# By - Jatin Kumar Mandav
|
||||
#
|
||||
# Website - https://jatinmandav.wordpress.com
|
||||
#
|
||||
# YouTube Channel - https://www.youtube.com/channel/UCdpf6Lz3V357cIZomPwjuFQ
|
||||
# Twitter - @jatinmandav
|
||||
#
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
import pygame
|
||||
import sys
|
||||
import random
|
||||
from math import *
|
||||
|
||||
pygame.init()
|
||||
|
||||
width = 600
|
||||
height = 400
|
||||
display = pygame.display.set_mode((width, height))
|
||||
pygame.display.set_caption("Pong!")
|
||||
clock = pygame.time.Clock()
|
||||
|
||||
background = (27, 38, 49)
|
||||
white = (236, 240, 241)
|
||||
red = (203, 67, 53)
|
||||
blue = (52, 152, 219)
|
||||
yellow = (244, 208, 63)
|
||||
|
||||
top = white
|
||||
bottom = white
|
||||
left = white
|
||||
right = white
|
||||
|
||||
margin = 4
|
||||
|
||||
scoreLeft = 0
|
||||
scoreRight = 0
|
||||
maxScore = 20
|
||||
|
||||
font = pygame.font.SysFont("Small Fonts", 30)
|
||||
largeFont = pygame.font.SysFont("Small Fonts", 60)
|
||||
|
||||
# Draw the Boundary of Board
|
||||
def boundary():
|
||||
global top, bottom, left, right
|
||||
pygame.draw.rect(display, left, (0, 0, margin, height))
|
||||
pygame.draw.rect(display, top, (0, 0, width, margin))
|
||||
pygame.draw.rect(display, right, (width-margin, 0, margin, height))
|
||||
pygame.draw.rect(display, bottom, (0, height - margin, width, margin))
|
||||
|
||||
l = 25
|
||||
|
||||
pygame.draw.rect(display, white, (width/2-margin/2, 10, margin, l))
|
||||
pygame.draw.rect(display, white, (width/2-margin/2, 60, margin, l))
|
||||
pygame.draw.rect(display, white, (width/2-margin/2, 110, margin, l))
|
||||
pygame.draw.rect(display, white, (width/2-margin/2, 160, margin, l))
|
||||
pygame.draw.rect(display, white, (width/2-margin/2, 210, margin, l))
|
||||
pygame.draw.rect(display, white, (width/2-margin/2, 260, margin, l))
|
||||
pygame.draw.rect(display, white, (width/2-margin/2, 310, margin, l))
|
||||
pygame.draw.rect(display, white, (width/2-margin/2, 360, margin, l))
|
||||
|
||||
# Paddle Class
|
||||
class Paddle:
|
||||
def __init__(self, position):
|
||||
self.w = 10
|
||||
self.h = self.w*8
|
||||
self.paddleSpeed = 6
|
||||
|
||||
if position == -1:
|
||||
self.x = 1.5*margin
|
||||
else:
|
||||
self.x = width - 1.5*margin - self.w
|
||||
|
||||
self.y = height/2 - self.h/2
|
||||
|
||||
# Show the Paddle
|
||||
def show(self):
|
||||
pygame.draw.rect(display, white, (self.x, self.y, self.w, self.h))
|
||||
|
||||
# Move the Paddle
|
||||
def move(self, ydir):
|
||||
self.y += self.paddleSpeed*ydir
|
||||
if self.y < 0:
|
||||
self.y -= self.paddleSpeed*ydir
|
||||
elif self.y + self.h> height:
|
||||
self.y -= self.paddleSpeed*ydir
|
||||
|
||||
|
||||
leftPaddle = Paddle(-1)
|
||||
rightPaddle = Paddle(1)
|
||||
|
||||
# Ball Class
|
||||
class Ball:
|
||||
def __init__(self, color):
|
||||
self.r = 20
|
||||
self.x = width/2 - self.r/2
|
||||
self.y = height/2 -self.r/2
|
||||
self.color = color
|
||||
self.angle = random.randint(-75, 75)
|
||||
if random.randint(0, 1):
|
||||
self.angle += 180
|
||||
|
||||
self.speed = 8
|
||||
|
||||
# Show the Ball
|
||||
def show(self):
|
||||
pygame.draw.ellipse(display, self.color, (self.x, self.y, self.r, self.r))
|
||||
|
||||
# Move the Ball
|
||||
def move(self):
|
||||
global scoreLeft, scoreRight
|
||||
self.x += self.speed*cos(radians(self.angle))
|
||||
self.y += self.speed*sin(radians(self.angle))
|
||||
if self.x + self.r > width - margin:
|
||||
scoreLeft += 1
|
||||
self.angle = 180 - self.angle
|
||||
if self.x < margin:
|
||||
scoreRight += 1
|
||||
self.angle = 180 - self.angle
|
||||
if self.y < margin:
|
||||
self.angle = - self.angle
|
||||
if self.y + self.r >=height - margin:
|
||||
self.angle = - self.angle
|
||||
|
||||
# Check and Reflect the Ball when it hits the padddle
|
||||
def checkForPaddle(self):
|
||||
if self.x < width/2:
|
||||
if leftPaddle.x < self.x < leftPaddle.x + leftPaddle.w:
|
||||
if leftPaddle.y < self.y < leftPaddle.y + 10 or leftPaddle.y < self.y + self.r< leftPaddle.y + 10:
|
||||
self.angle = -45
|
||||
if leftPaddle.y + 10 < self.y < leftPaddle.y + 20 or leftPaddle.y + 10 < self.y + self.r< leftPaddle.y + 20:
|
||||
self.angle = -30
|
||||
if leftPaddle.y + 20 < self.y < leftPaddle.y + 30 or leftPaddle.y + 20 < self.y + self.r< leftPaddle.y + 30:
|
||||
self.angle = -15
|
||||
if leftPaddle.y + 30 < self.y < leftPaddle.y + 40 or leftPaddle.y + 30 < self.y + self.r< leftPaddle.y + 40:
|
||||
self.angle = -10
|
||||
if leftPaddle.y + 40 < self.y < leftPaddle.y + 50 or leftPaddle.y + 40 < self.y + self.r< leftPaddle.y + 50:
|
||||
self.angle = 10
|
||||
if leftPaddle.y + 50 < self.y < leftPaddle.y + 60 or leftPaddle.y + 50 < self.y + self.r< leftPaddle.y + 60:
|
||||
self.angle = 15
|
||||
if leftPaddle.y + 60 < self.y < leftPaddle.y + 70 or leftPaddle.y + 60 < self.y + self.r< leftPaddle.y + 70:
|
||||
self.angle = 30
|
||||
if leftPaddle.y + 70 < self.y < leftPaddle.y + 80 or leftPaddle.y + 70 < self.y + self.r< leftPaddle.y + 80:
|
||||
self.angle = 45
|
||||
else:
|
||||
if rightPaddle.x + rightPaddle.w > self.x + self.r > rightPaddle.x:
|
||||
if rightPaddle.y < self.y < leftPaddle.y + 10 or leftPaddle.y < self.y + self.r< leftPaddle.y + 10:
|
||||
self.angle = -135
|
||||
if rightPaddle.y + 10 < self.y < rightPaddle.y + 20 or rightPaddle.y + 10 < self.y + self.r< rightPaddle.y + 20:
|
||||
self.angle = -150
|
||||
if rightPaddle.y + 20 < self.y < rightPaddle.y + 30 or rightPaddle.y + 20 < self.y + self.r< rightPaddle.y + 30:
|
||||
self.angle = -165
|
||||
if rightPaddle.y + 30 < self.y < rightPaddle.y + 40 or rightPaddle.y + 30 < self.y + self.r< rightPaddle.y + 40:
|
||||
self.angle = 170
|
||||
if rightPaddle.y + 40 < self.y < rightPaddle.y + 50 or rightPaddle.y + 40 < self.y + self.r< rightPaddle.y + 50:
|
||||
self.angle = 190
|
||||
if rightPaddle.y + 50 < self.y < rightPaddle.y + 60 or rightPaddle.y + 50 < self.y + self.r< rightPaddle.y + 60:
|
||||
self.angle = 165
|
||||
if rightPaddle.y + 60 < self.y < rightPaddle.y + 70 or rightPaddle.y + 60 < self.y + self.r< rightPaddle.y + 70:
|
||||
self.angle = 150
|
||||
if rightPaddle.y + 70 < self.y < rightPaddle.y + 80 or rightPaddle.y + 70 < self.y + self.r< rightPaddle.y + 80:
|
||||
self.angle = 135
|
||||
|
||||
# Show the Score
|
||||
def showScore():
|
||||
leftScoreText = font.render("Score : " + str(scoreLeft), True, red)
|
||||
rightScoreText = font.render("Score : " + str(scoreRight), True, blue)
|
||||
|
||||
display.blit(leftScoreText, (3*margin, 3*margin))
|
||||
display.blit(rightScoreText, (width/2 + 3*margin, 3*margin))
|
||||
|
||||
# Game Over
|
||||
def gameOver():
|
||||
if scoreLeft == maxScore or scoreRight == maxScore:
|
||||
while True:
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
close()
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_q:
|
||||
close()
|
||||
if event.key == pygame.K_r:
|
||||
reset()
|
||||
if scoreLeft == maxScore:
|
||||
playerWins = largeFont.render("Left Player Wins!", True, red)
|
||||
elif scoreRight == maxScore:
|
||||
playerWins = largeFont.render("Right Player Wins!", True, blue)
|
||||
|
||||
display.blit(playerWins, (width/2 - 100, height/2))
|
||||
pygame.display.update()
|
||||
|
||||
def reset():
|
||||
global scoreLeft, scoreRight
|
||||
scoreLeft = 0
|
||||
scoreRight = 0
|
||||
board()
|
||||
|
||||
|
||||
def close():
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
|
||||
def board():
|
||||
loop = True
|
||||
leftChange = 0
|
||||
rightChange = 0
|
||||
ball = Ball(yellow)
|
||||
|
||||
while loop:
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
close()
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_q:
|
||||
close()
|
||||
if event.key == pygame.K_SPACE or event.key == pygame.K_p:
|
||||
Pause()
|
||||
if event.key == pygame.K_r:
|
||||
reset()
|
||||
if event.key == pygame.K_w:
|
||||
leftChange = -1
|
||||
if event.key == pygame.K_s:
|
||||
leftChange = 1
|
||||
if event.key == pygame.K_UP:
|
||||
rightChange = -1
|
||||
if event.key == pygame.K_DOWN:
|
||||
rightChange = 1
|
||||
if event.type == pygame.KEYUP:
|
||||
leftChange = 0
|
||||
rightChange = 0
|
||||
|
||||
leftPaddle.move(leftChange)
|
||||
rightPaddle.move(rightChange)
|
||||
ball.move()
|
||||
ball.checkForPaddle()
|
||||
|
||||
display.fill(background)
|
||||
showScore()
|
||||
|
||||
ball.show()
|
||||
leftPaddle.show()
|
||||
rightPaddle.show()
|
||||
|
||||
boundary()
|
||||
|
||||
gameOver()
|
||||
|
||||
pygame.display.update()
|
||||
clock.tick(60)
|
||||
|
||||
board()
|
||||
Reference in New Issue
Block a user