def main(chat_box, screen, window, menu, player_name, host, port): global PLAYER_LIST msg_queue = [] menu.destroy() server = socket(AF_INET, SOCK_STREAM) udp_server = socket(AF_INET, SOCK_DGRAM) try: server.connect((host, port)) except error as msg: print("Could not connect to server", msg) sys.exit(1) ''' Grabs a player from server instead of creating individually Upon initial connection the server creates a player with an id and sends this to the server. it's the first response and lets the new client know their client id ''' res = json.loads(server.recv(const.RECV_BUFF).decode()) player_id = res[0]["id"] player_color = res[0]["color"] data = b'ack;\r\n' server.sendall(data) print("Loaded new player from server with id:", player_id) def command(txt): print(txt) msg = 'sentMessage;' + player_name + ';' + txt + ';\r\n' server.sendall(msg.encode()) running = True clock = pygame.time.Clock() pong = Pong( const.SCREENSIZE, res[1]["id"], res[1]["x"], res[1]["y"], res[1]["lscore"], res[1]["rscore"], ) player_paddle1 = PlayerPaddle(const.SCREENSIZE, player_id, player_color) PLAYER_LIST.append(player_paddle1) print("player:", player_id, "created and added") pygame.display.set_caption('Multi Pong') win = pygame.mixer.Sound(os.path.join('data/win.wav')) lose = pygame.mixer.Sound(os.path.join('data/lose.wav')) start_new_thread(handle_server, (msg_queue, server, pong, player_name)) chat_box.set_nick("SERVER") chat_box.set_command(command) chat_box.send("Welcome to Multi Pong " + player_name + "!") chat_box.send("Waiting for players to connect...") chat_box.set_nick(player_name) while running: if len(PLAYER_LIST) <= 0: continue else: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if event.type == KEYDOWN: if event.key == K_UP: player_paddle1.direction = -1 elif event.key == K_DOWN: player_paddle1.direction = 1 if event.type == KEYUP: if event.key == K_UP and player_paddle1.direction == -1: player_paddle1.direction = 0 elif event.key == K_DOWN and player_paddle1.direction == 1: player_paddle1.direction = 0 player_paddle1.update(udp_server) screen.fill(const.BLACK) #pygame.draw.line(screen, const.WHITE, (const.SCREEN_WIDTH / 2, 0), (const.SCREEN_WIDTH / 2, const.SCREEN_LENGTH), 5) #Deterimine win if pong.lwin== True: running = False elif pong.rwin == True: running = False for player in PLAYER_LIST: player.render(screen) pong.render(screen) default_font = pygame.font.get_default_font() font = pygame.font.Font(default_font, 30) left_score = font.render("West Side " + str(pong.lscore), True, const.WHITE) screen.blit(left_score, (20, 0)) right_score = font.render("East Side " + str(pong.rscore), True, const.WHITE) screen.blit(right_score, ((const.SCREEN_WIDTH/2)+20, 0)) user_font = pygame.font.Font(default_font, 20) user_msg = user_font.render(player_name, True, player_color) screen.blit(user_msg, ((const.SCREEN_WIDTH/2)+5, const.SCREEN_LENGTH-20)) for msg in msg_queue: chat_box.user_message(msg[0], msg[1]) msg_queue.remove(msg) chat_box.interior.pack(expand=True, fill=BOTH) window.update() clock.tick(const.FPS) pygame.display.flip() if pong.lwin == True and player_paddle1.side == 1: txt = font.render(" You Won!!!!", True, const.WHITE) screen.blit(txt, (100, 200)) win.play() elif pong.rwin == True and player_paddle1.side == 0: txt = font.render(" You Won!!!!", True, const.WHITE) screen.blit(txt, (100, 200)) win.play() print("left won") else: txt2 = font.render("Sorry, You Lost!", True, const.WHITE) screen.blit(txt2, (100, 200)) lose.play() pygame.display.flip() server.close() pygame.time.delay(5000) pygame.quit()
def main(chat_box, screen, window, menu, player_name, host, port): global PLAYER_LIST msg_queue = [] menu.destroy() server = socket(AF_INET, SOCK_STREAM) udp_server = socket(AF_INET, SOCK_DGRAM) try: server.connect((host, port)) except error as msg: print("Erreure de connexion au serveur", msg) sys.exit(1) ''' envoie des info joueur par le serveur ''' res = json.loads(server.recv(const.RECV_BUFF).decode()) player_id = res[0]["id"] player_color = res[0]["color"] data = b'ack;\r\n' server.sendall(data) print("nouveau jouer chargé depuis le serveur avec l'id:", player_id) def command(txt): print(txt) msg = 'sentMessage;' + player_name + ';' + txt + ';\r\n' server.sendall(msg.encode()) running = True clock = pygame.time.Clock() pong = Pong( const.SCREENSIZE, res[1]["id"], res[1]["x"], res[1]["y"], res[1]["lscore"], res[1]["rscore"], ) player_paddle1 = PlayerPaddle(const.SCREENSIZE, player_id, player_color) PLAYER_LIST.append(player_paddle1) print("joueur:", player_id, "créé et ajouté") pygame.display.set_caption('Multi Pong') win = pygame.mixer.Sound(os.path.join('data/win.wav')) lose = pygame.mixer.Sound(os.path.join('data/lose.wav')) start_new_thread(handle_serveur, (msg_queue, server, pong, player_name)) chat_box.set_nick("SERVER") chat_box.set_command(command) chat_box.send("Bienvenu " + player_name + "!") chat_box.send("En attente de connexion...") chat_box.set_nick(player_name) while running: if len(PLAYER_LIST) <= 0: continue else: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if event.type == KEYDOWN: if event.key == K_UP: player_paddle1.direction = -1 elif event.key == K_DOWN: player_paddle1.direction = 1 if event.type == KEYUP: if event.key == K_UP and player_paddle1.direction == -1: player_paddle1.direction = 0 elif event.key == K_DOWN and player_paddle1.direction == 1: player_paddle1.direction = 0 player_paddle1.update(udp_server) screen.fill(const.BLACK) # pygame.draw.line(screen, const.WHITE, (const.SCREEN_WIDTH / 2, 0), (const.SCREEN_WIDTH / 2, const.SCREEN_LENGTH), 5) # Deterimine win if pong.lwin == True: running = False elif pong.rwin == True: running = False for player in PLAYER_LIST: player.render(screen) pong.render(screen) default_font = pygame.font.get_default_font() font = pygame.font.Font(default_font, 30) left_score = font.render("West Side " + str(pong.lscore), True, const.WHITE) screen.blit(left_score, (20, 0)) right_score = font.render("East Side " + str(pong.rscore), True, const.WHITE) screen.blit(right_score, ((const.SCREEN_WIDTH / 2) + 20, 0)) user_font = pygame.font.Font(default_font, 20) user_msg = user_font.render(player_name, True, player_color) screen.blit( user_msg, ((const.SCREEN_WIDTH / 2) + 5, const.SCREEN_LENGTH - 20)) for msg in msg_queue: chat_box.user_message(msg[0], msg[1]) msg_queue.remove(msg) chat_box.interior.pack(expand=True, fill=BOTH) window.update() clock.tick(const.FPS) pygame.display.flip() if pong.lwin == True and player_paddle1.side == 1: txt = font.render(" Victoire!!!!", True, const.WHITE) screen.blit(txt, (100, 200)) win.play() elif pong.rwin == True and player_paddle1.side == 0: txt = font.render(" Victoire!!!!", True, const.WHITE) screen.blit(txt, (100, 200)) win.play() print("left won") else: txt2 = font.render("Défaite!", True, const.WHITE) screen.blit(txt2, (100, 200)) lose.play() pygame.display.flip() server.close() pygame.time.delay(5000) pygame.quit()
class App: size: Tuple[float, float] running: bool window_title: str screen: Surface font: pygame.font.Font ball: Ball player: PlayerPaddle ai_paddle: AIPaddle left_score: int right_score: int clock: pygame.time.Clock last_time: float delta_time: float def __init__(self, width, height, title): self.size = (width, height) self.running = False self.window_title = title def begin(self): pygame.init() self.screen = pygame.display.set_mode(self.size) pygame.display.set_caption(self.window_title) self.clock = pygame.time.Clock() self.setup_game() self.last_time = 0 self.running = True self.game_loop() def setup_game(self): self.font = pygame.font.Font("resources/font/prstartk.ttf", 36) self.ball = Ball() self.ball.reset(self.size[0], self.size[1]) self.player = PlayerPaddle(self.size) self.ai_paddle = AIPaddle(self.size) self.left_score = 0 self.right_score = 0 def poll_event(self): for event in pygame.event.get(): if event.type == pygame.QUIT: self.running = False pass def update(self): self.ball.update(self.size[0], self.size[1], self.delta_time) self.player.update(self.size[1], self.delta_time) self.ai_paddle.update(self.ball, self.size[1], self.delta_time) self.ball.collide_left(self.player.bounds) self.ball.collide_right(self.ai_paddle.bounds) if self.ball.bounds.x < -100: self.ball.reset(self.size[0], self.size[1]) self.right_score += 1 if self.ball.bounds.x > self.size[0] + 100: self.ball.reset(self.size[0], self.size[1]) self.left_score += 1 def draw(self): self.screen.fill(BLACK) self.draw_center() self.draw_text(self.font, str(self.left_score), (self.size[0] * 0.25, self.size[1] * 0.15)) self.draw_text(self.font, str(self.right_score), (self.size[0] * 0.75, self.size[1] * 0.15)) self.ball.display(self.screen, WHITE) self.player.display(self.screen, WHITE) self.ai_paddle.display(self.screen, WHITE) pygame.display.flip() pass def draw_center(self): rect_width = 10 rect_height = 5 rect_x = (self.size[0] * 0.5) - (rect_width * 0.5) rect_y = rect_height * 0.5 while rect_y + rect_height < self.size[1]: pygame.draw.rect(self.screen, WHITE, pygame.rect.Rect(rect_x, rect_y, rect_width, rect_height)) rect_y += rect_height * 2 def draw_text(self, font: pygame.font.Font, string, center: Tuple[float, float]): text = font.render(string, False, WHITE) text_rect = text.get_rect() text_rect.center = center self.screen.blit(text, text_rect) def step(self): self.poll_event() self.update() self.draw() def calculate_delta_time(self): current_time = pygame.time.get_ticks() self.delta_time = (current_time - self.last_time) / 1000.0 self.last_time = current_time def game_loop(self): while self.running: self.calculate_delta_time() self.step()