Пример #1
0
class gameSpace(object):

    # Initializes all necessary variable
    def __init__(self):

        # Initialize window variables and reactor
        pygame.init()
        self.size = self.width, self.height = screenWidth, screenHeight
        self.white = 255, 255, 255
        self.screen = pygame.display.set_mode(self.size)

        # Various screen fonts and labels
        self.byeFont = pygame.font.SysFont("freeserif", 100)
        self.winFont = pygame.font.SysFont("freeserif", 50)
        self.scoreKeeper = pygame.font.SysFont("freeserif", 25)
        self.wait = self.winFont.render(
            "Player 2 has not connected, please wait...", 1, (0, 0, 0))
        self.bye = self.byeFont.render("Goodbye!", 1, (0, 0, 0))
        self.lost = self.winFont.render("Game Server Connection Lost.", 1,
                                        (0, 0, 0))

        # Setup game mode, difficulty, chosen sprite images
        self.player_num = 0
        self.connected = 0
        self.setup = Setup()
        self.mode, self.diff, self.player_img, self.ball_img = self.setup.run_setup(
        )

        ### Check chosen mode ###

        # If quit occurred, leave game
        if self.mode == 0:
            self.goodbye()

        # If player want to play computer, set 1 player up
        elif self.mode == 1:
            self.player_num = 1
            self.connected = 1
            self.player = Player(self.player_num, self.player_img)
            spriteGroup.add(self.player)
            self.computer = Computer(self.diff, self.player_img)
            spriteGroup.add(self.computer)
            self.ball = Ball(self.player, self.diff, self.ball_img,
                             self.computer)

        # If mode 2 selected, set a variable for other player
        elif self.mode == 2:

            # Your player inits
            self.player = Player(self.player_num, self.player_img)
            self.ball = Ball(self.player, self.diff, self.ball_img)
            spriteGroup.add(self.player)

            # Initialize other player attributes
            self.other_score = 0
            self.barWidth = 30
            self.barHeight = 80
            self.other_img = pygame.image.load(self.player_img)
            self.other_img = pygame.transform.scale(
                self.other_img, (self.barWidth, self.barHeight))
            self.other_rect = self.other_img.get_rect()

            # place off screen for the time being
            self.other_rect.x = -50
            self.other_rect.y = 900

    # Runs one game loop
    def play(self):

        # If playing online but P2 hasn't connected, wait
        if self.connected == 0:
            self.screen.fill(self.white)
            self.wait_screen()

        # else, do game loop
        else:

            # Set white background for pong math
            self.screen.fill(self.white)

            # check for system exit
            event = pygame.event.poll()
            if event.type == pygame.QUIT:
                if self.mode == 1:
                    sys.exit()
                elif self.mode == 2:
                    os._exit()

            # Draw everything for mode 1
            if self.mode == 1:
                self.player.keyHandler()
                self.ball.move()
                self.ball.collision(spriteGroup)
                self.ball.draw()
                self.player.draw()
                self.player.goal()
                self.computer.move(self.ball.get_x(), self.ball.get_y())
                self.computer.draw()
                self.computer.goal()

            # Draw everything for mode 2
            else:
                self.player.keyHandler()
                self.ball.move()
                self.ball.collision(spriteGroup)
                self.ball.draw()
                self.player.draw()
                self.player.goal()

                # Draw other player, blit other score
                screen.blit(self.other_img, self.other_rect)
                scoreBlit = self.scoreKeeper.render(self.other_score, 1,
                                                    (0, 0, 0))

                # Blit score in proper place
                if self.player_num == 2:
                    screen.blit(scoreBlit, (32, 16))
                else:
                    screen.blit(scoreBlit, (968, 16))

                # Check if other player won
                if self.game_over():
                    self.winner()

            # Display all blits
            pygame.display.flip()

    # Wait Screen
    def wait_screen(self):
        screen.blit(self.wait, (150, 400))
        pygame.display.flip()

    # Function receives other player position
    def update(self, data):

        # If data is P1 message, set to P1
        if data == "1":
            self.set_player(1)

        # If data is P2 message, set to P2
        elif data == "2":
            self.set_player(2)

        # Begin game if player 2 has connected
        elif data == "3":
            self.connected()

    # Otherwise, parse other player data
        else:
            info = data.split()
            self.other_rect.x = int(info[0])
            self.other_rect.y = int(info[1])
            self.other_score = info[2]
            self.ball.set_pos(int(info[3]), int(info[4]), float(info[5]))

    # Function sets player number, cannot start mode 2 without this

    def set_player(self, num):

        self.player_num = num

        # If player_num is 2, begin game
        if self.player_num == 2:
            self.connected = 1

        # Set x position according to player number
        self.player.set_pos(self.player_num)

    # Indicates player 2 is connected
    def connected(self):
        self.connected = 1

    # Function returns current player position to send
    def player_pos(self):
        return self.ball.get_full_pos()

    # Returns game mode for main
    def get_mode(self):
        return self.mode

    # Indicates if game is over
    def game_over(self):

        # If playing computer, check those scores
        if self.mode == 1:
            if self.player.get_score() == 10 or self.computer.get_score(
            ) == 10:
                return 1
            else:
                return 0

        # If playing other player, check those scores
        elif self.mode == 2:
            if self.player.get_score() == 10 or self.other_score == 10:
                return 1
            else:
                return 0

    # function displays winner screen
    def winner(self):

        # Winner variable
        winner = 0

        # If playing computer, check those scores
        if self.mode == 1:
            if self.player.get_score() > self.computer.get_score():
                winner = 1
            else:
                winner = 2

        # If playing other player, check those scores
        elif self.mode == 2:
            if self.player.get_score() > self.other_score:
                winner = 1
            else:
                winner = 2

        self.screen.fill(self.white)
        self.win = self.winFont.render(
            "Player " + str(winner) + " won the game!", 1, (0, 0, 0))
        screen.blit(self.win, (250, 300))

        # Display for 3 seconds then leave
        pygame.display.flip()
        time.sleep(3)
        self.goodbye()

    # function displays lost connection screen
    def connection_lost(self):

        # Lost connection and goodbye
        self.screen.fill(self.white)
        screen.blit(self.lost, (200, 300))
        pygame.display.flip()
        time.sleep(3)
        self.goodbye()

    # Screen say good bye as you exit
    def goodbye(self):

        self.screen.fill(self.white)
        screen.blit(self.bye, (300, 300))
        pygame.display.flip()
        time.sleep(3)
        os._exit()