#!/usr/local/bin/python # MulpyPong v0.5 by Jonathan Dearborn # MulpyPong is a multiplayer Pong clone that supports up to four players and an unlimited number of balls. # No AI is currently implemented. # Controls: # 1P: w/s # 2P: UP/DOWN # 3P: g/b # 4P: o/l # Add ball: Enter # Change players: 2,3,4 # Quit: Escape import sys, pygame, random pygame.init() random.seed() def randcolor(): return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) screen_size = screen_width, screen_height = 600, 300 black = 0, 0, 0 white = 255, 255, 255 delta_t = 0 screen = pygame.display.set_mode(screen_size) ball_list = [] paddle_list = [] num_paddles = 0 left_hits = 0 right_hits = 0 class Font: def __init__(self, fontname, fontsize): self.fontname = fontname self.fontsize = fontsize self.color = white self.fontobj = pygame.font.SysFont(fontname, fontsize) def draw(self, text, pos): screen.blit(self.fontobj.render(text, True, self.color), pos) font1 = Font("times", 18) class Ball: #radius, pos, speed, color def __init__(self): self.radius = 10*random.random() + 1 self.speed = [random.uniform(-1, 1)/4, random.uniform(-1, 1)/4] self.color = randcolor() self.pos = [screen_width/2, screen_height/2] def move(self): self.pos[0] += self.speed[0]*delta_t self.pos[1] += self.speed[1]*delta_t if self.pos[0] < 0: #self.speed[0] = -self.speed[0] #self.pos[0] = 0 ball_list.remove(self) ball_list.append(Ball()) global left_hits left_hits += 1 elif self.pos[0] > screen_width: #self.speed[0] = -self.speed[0] #self.pos[0] = screen_width ball_list.remove(self) ball_list.append(Ball()) global right_hits right_hits += 1 if self.pos[1] < 0: self.speed[1] = -self.speed[1] self.pos[1] = 0 if self.pos[1] > screen_height: self.speed[1] = -self.speed[1] self.pos[1] = screen_height for paddle in paddle_list: if self.pos[0] >= paddle.pos[0] and self.pos[0] <= paddle.pos[0] + paddle.width: if self.pos[1] >= paddle.pos[1] and self.pos[1] <= paddle.pos[1] + paddle.height: self.speed[0] = -self.speed[0] def draw(self): pygame.draw.circle(screen, self.color, map(int, self.pos), int(self.radius)) class Paddle: # width, height, speed, color, pos, constraint def __init__(self): self.width = 10 self.height = 30 self.speed = [0.3, 0.3] self.color = randcolor() global num_paddles num_paddles += 1 if num_paddles == 1: self.pos = [20, screen_height/2] elif num_paddles == 2: self.pos = [screen_width - 30, screen_height/2] elif num_paddles == 3: self.pos = [40, screen_height/2] elif num_paddles == 4: self.pos = [screen_width - 50, screen_height/2] else: self.pos = [20, screen_height/2] def moveup(self): self.pos[1] -= self.speed[1]*delta_t if self.pos[1] < 0: self.pos[1] = 0 def movedown(self): self.pos[1] += self.speed[1]*delta_t if self.pos[1] > screen_height - self.height: self.pos[1] = screen_height - self.height def draw(self): pygame.draw.rect(screen, self.color, self.pos + [ self.width, self.height ]) ball_list.append(Ball()) paddle_list.append(Paddle()) paddle_list.append(Paddle()) timer = pygame.time.Clock() timer.tick() done = 0 while not done: delta_t = timer.get_time() #Events for event in pygame.event.get(): if event.type == pygame.QUIT: done = 1 if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: done = 1 if event.key == pygame.K_RETURN: ball_list.append(Ball()) if event.key == pygame.K_2: paddle_list = paddle_list[0:0] num_paddles = 0 paddle_list.append(Paddle()) paddle_list.append(Paddle()) if event.key == pygame.K_3: paddle_list = paddle_list[0:0] num_paddles = 0 for i in range(3): paddle_list.append(Paddle()) if event.key == pygame.K_4: paddle_list = paddle_list[0:0] num_paddles = 0 for i in range(4): paddle_list.append(Paddle()) if event.key == pygame.K_r: ball_list = ball_list[0:0] left_hits = 0 right_hits = 0 ball_list.append(Ball()) #Key states (Paddle movement) keystate = pygame.key.get_pressed() if keystate[pygame.K_w]: for paddle in paddle_list[0:1]: paddle.moveup() if keystate[pygame.K_s]: for paddle in paddle_list[0:1]: paddle.movedown() if keystate[pygame.K_g]: for paddle in paddle_list[2:3]: paddle.moveup() if keystate[pygame.K_b]: for paddle in paddle_list[2:3]: paddle.movedown() if keystate[pygame.K_UP]: for paddle in paddle_list[1:2]: paddle.moveup() if keystate[pygame.K_DOWN]: for paddle in paddle_list[1:2]: paddle.movedown() if keystate[pygame.K_o]: for paddle in paddle_list[3:4]: paddle.moveup() if keystate[pygame.K_l]: for paddle in paddle_list[3:4]: paddle.movedown() for ball in ball_list: ball.move() #Drawing screen.fill(black) for ball in ball_list: ball.draw() for paddle in paddle_list: paddle.draw() font1.draw(str(right_hits) + " : " + str(left_hits), (screen_width/2, 40)) pygame.display.flip() timer.tick(40) sys.exit()