Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- # coding: utf-8
- import constant
- import pygame
- class Keyboard:
- def listen_keys(self):
- pygame.event.pump()
- keys = pygame.key.get_pressed()
- keys_players = {
- self.player_one: { pygame.K_w: -10, pygame.K_s: +10},
- self.player_two: { pygame.K_UP: -10, pygame.K_DOWN: +10}
- }
- for player,v in keys_players.items():
- for key_number,add in keys_players[player].items():
- if keys[key_number]:
- player.move(add)
- if keys[pygame.K_r] and self.ball_tmp is not None:
- self.ball = self.ball_tmp
- self.ball_tmp = None
- self.init_settings()
- class Ball:
- def __init__(self, pos_x, pos_y):
- self.x, self.y = pos_x, pos_y
- self.xspeed, self.yspeed = 5, 0
- self.width, self.height = 20, 20
- self.last_move = pygame.time.get_ticks()
- self.last_player_touched = None
- def draw(self, surface):
- self.rect = pygame.draw.rect(surface, (constant.WHITE), (self.x, self.y,
- self.width, self.height))
- def move(self):
- diff = (pygame.time.get_ticks() - self.last_move)
- if diff > 0.3: # each 0,3*10**-3μs move
- self.yspeed = +5 if self.y <= 0 else self.yspeed
- self.yspeed = -5 if self.y >= (constant.HEIGHT - self.height) else self.yspeed
- if (self.x >= 0) and (self.x <= constant.WIDTH):
- self.x += self.xspeed
- if (self.y >= -constant.HEIGHT) and (self.y <= constant.HEIGHT):
- self.y += self.yspeed
- self.last_move = pygame.time.get_ticks()
- def collide_with(self, *players):
- for player in players:
- if player.rect.colliderect(self.rect):
- self.last_player_touched = player
- self.xspeed = abs(self.xspeed) if player.x < 30 else -abs(self.xspeed)
- self.yspeed = ((self.y**1.3) - (player.y**1.3)) / player.height
- def has_gone(self):
- if (self.x <= self.width) or (self.x >= constant.WIDTH):
- return True
- class Player:
- def __init__(self, pos_x, pos_y, name):
- self.name = name
- self.width, self.height = 10, 100
- self.x, self.y = pos_x, (pos_y - (self.height // 2))
- def draw(self, surface):
- self.rect = pygame.draw.rect(surface, (constant.WHITE), (self.x, self.y,
- self.width, self.height))
- def move(self, y):
- if (self.y + y > self.width) and ((self.y + y) < constant.HEIGHT - (self.height + self.width)):
- self.y += y
- class Game(Keyboard):
- def __init__(self):
- pygame.init()
- pygame.font.init()
- pygame.display.set_caption("Pong in Python")
- pygame.event.set_allowed([pygame.QUIT, pygame.KEYDOWN])
- self._game_border = 25
- self.font = pygame.font.Font(pygame.font.get_default_font(), 32)
- self.screen = pygame.display.set_mode(constant.SIZE, pygame.DOUBLEBUF)
- self.screen.set_alpha(None)
- self.ball = Ball(self.on_center(constant.WIDTH), self.on_center(constant.HEIGHT))
- self.ball_tmp = None
- self.player_one = Player(self._game_border, self.on_center(constant.HEIGHT), "1")
- self.player_two = Player(constant.WIDTH - self._game_border, self.on_center(constant.HEIGHT), "2")
- self.init_settings()
- self.start()
- def on_center(self, size):
- return size // 2
- def init_settings(self):
- self.ball.x, self.ball.y = self.on_center(constant.WIDTH), self.on_center(constant.HEIGHT)
- self.player_one_x, self.player_one_y = self._game_border, self.on_center(constant.HEIGHT)
- self.player_two_x, self.player_two_y = constant.WIDTH - self._game_border, self.on_center(constant.HEIGHT)
- def start(self):
- while True:
- try:
- if pygame.event.get(pygame.QUIT): break
- self.screen.fill(constant.BLACK)
- self.ball.draw(self.screen)
- self.ball.move()
- self.player_one.draw(self.screen)
- self.player_two.draw(self.screen)
- self.ball.collide_with(self.player_one, self.player_two)
- if self.ball.has_gone():
- self.ball_tmp = self.ball
- del self.ball
- except AttributeError as e:
- someone_wins = self.font.render("player {} wins!".format(self.ball_tmp.last_player_touched.name), True, (constant.WHITE))
- info = self.font.render("press R to restart", True, (constant.WHITE))
- self.screen.blit(someone_wins, (self.on_center(constant.WIDTH) - 100, 50))
- self.screen.blit(info, (self.on_center(constant.WIDTH) - 115, 100))
- finally:
- self.listen_keys()
- pygame.display.flip()
- if __name__ == '__main__':
- Game()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement