Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
def update_players(p_list):
    global PLAYER_LIST

    pids = [p.id for p in PLAYER_LIST]
    for p in p_list:
        if p["id"] not in pids:
            PLAYER_LIST.append(PlayerPaddle(const.SCREENSIZE, p["id"], p["color"]))
Ejemplo n.º 3
0
def handle_server(queue, server, pong, player_name):
    global PLAYER_LIST
    data = b'ack;\r\n'

    while True:
        msg = server.recv(const.RECV_BUFF).decode().split(";")

        if msg[0] == "newPlayer":
            try:
                detail = json.loads(msg[1])
                player = PlayerPaddle(const.SCREENSIZE, detail["id"], detail["color"])
                PLAYER_LIST.append(player)
                queue.append(["SERVER", "New player " + player_name + " has arrived."])
            except:
                print("new player could not be created:", msg)
        if msg[0] == "currentList":
            try:
                print("received list: ", msg[1])
                p_list = json.loads(msg[1])
                update_players(p_list)
            except:
                print("current list could not be read:", msg)
        elif msg[0] == "updateLocation":
            try:
                detail = json.loads(msg[1])
                player = next((player for player in PLAYER_LIST if player.get_id() == detail["id"]))
                player.update_local(detail["y"])
            except:
                print("something went wrong with msg", msg)
        elif msg[0] == "removePlayer":
            try:
                detail = json.loads(msg[1])
                player = next((player for player in PLAYER_LIST if player.get_id() == detail["id"]))
                PLAYER_LIST.remove(player)
                queue.append(["SERVER", "Player " + player_name + " has left."])
            except:
                print("could not remove stupid player")
        elif msg[0] == "updateBallLocation":
            try:
                detail = json.loads(msg[1])
                pong.update(
                    detail["x"],
                    detail["y"],
                    detail["lscore"],
                    detail["rscore"],
                    detail["lwin"],
                    detail["rwin"],
                    detail["sound"],
                )
            except Exception as e:
                print("ball error", e)
        elif msg[0] == "receivedMessage":
            global chat_box
            try:
                # Appends the message to the queue in main thread to avoid tkinter threading error
                queue.append([msg[1], msg[2]])
            except Exception as e:
                print("Chat Error", e)

    server.close()
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
def handle_serveur(queue, serveur, pong, player_name):
    global PLAYER_LIST
    data = b'ack;\r\n'

    while True:
        msg = serveur.recv(const.RECV_BUFF).decode().split(";")

        if msg[0] == "newPlayer":
            try:
                print(msg[1])
                detail = json.loads(msg[1])
                player = PlayerPaddle(const.SCREENSIZE, detail["id"],
                                      detail["color"])
                PLAYER_LIST.append(player)
                queue.append([
                    "SERVER", "Le nouveau joueur" + player_name + " est arrivé"
                ])
            except:
                print("le nouveau joueur n'a pu être créé", msg)

        if msg[0] == "currentList":
            try:
                print("received list: ", msg[1])
                p_list = json.loads(msg[1])
                update_players(p_list)
            except:
                print("current list could not be read:", msg)
        elif msg[0] == "updateLocation":

            try:
                detail = json.loads(msg[1])
                player = next((player for player in PLAYER_LIST
                               if player.get_id() == detail["id"]))
                player.update_local(detail["y"])
            except:
                print("problème avec le message", msg)
        elif msg[0] == "removePlayer":
            try:
                detail = json.loads(msg[1])
                player = next((player for player in PLAYER_LIST
                               if player.get_id() == detail["id"]))
                PLAYER_LIST.remove(player)
                queue.append(["SERVER", player_name + "est partit"])
            except:
                print("n'é pas pu enlevé je joueur", msg)
        elif msg[0] == "updateBallLocation":
            try:
                detail = json.loads(msg[1])
                pong.update(
                    detail["x"],
                    detail["y"],
                    detail["lscore"],
                    detail["rscore"],
                    detail["lwin"],
                    detail["rwin"],
                    detail["sound"],
                )
            except Exception as e:
                print("erreur de balle", e)
        elif msg[0] == "receivedMessage":
            global chat_box
            try:
                queue.append(msg[1], msg[2])
            except Exception as e:
                print("erreur chat", e)
    server.close()
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
def handle_serveur(queue, serveur, pong, player_name):
    global PLAYER_LIST
    data = b'ack;\r\n'

    while True:
        msg = serveur.recv(const.RECV_BUFF)
        liste2 = msg.decode().split(";")
        # liste actuelle
        if liste2[0] == "CurrentList":
            try:
                print("received list: ", liste2[1])
                p_list = json.loads(liste2[1])
                update_players(p_list)
            except:
                print("current list could not be read:", liste2)
        elif len(msg) < 250:
            print(msg)
            Resmsg = f.decrypt(msg)
            msg = Resmsg.decode().split(";")
            # Ajout d'un nouveau joueur
            if msg[0] == "newPlayer":
                try:
                    print(msg[1])
                    detail = json.loads(msg[1])
                    player = PlayerPaddle(const.SCREENSIZE, detail["id"],
                                          detail["color"])
                    PLAYER_LIST.append(player)
                    queue.append([
                        "SERVER",
                        "Le nouveau joueur" + player_name + " est arrivé"
                    ])
                except:
                    print("le nouveau joueur n'a pu être créé", msg)
            # mise à jour de la position d'un joueur.
            elif msg[0] == "updateLocation":

                try:
                    detail = json.loads(msg[1])
                    player = next((player for player in PLAYER_LIST
                                   if player.get_id() == detail["id"]))
                    player.update_local(detail["y"])
                except:
                    print("problème avec le message", msg)
            # mise à jour de la position de la balle
            elif msg[0] == "updateBallLocation":
                try:
                    detail = json.loads(msg[1])
                    pong.update(
                        detail["x"],
                        detail["y"],
                        detail["lscore"],
                        detail["rscore"],
                        detail["lwin"],
                        detail["rwin"],
                        detail["sound"],
                    )
                except Exception as e:
                    print("erreur de balle", e)
            elif msg[0] == "receivedMessage":
                global chat_box
                try:
                    queue.append(msg[1], msg[2])
                except Exception as e:
                    print("erreur chat", e)
    server.close()