def play(self):
        print("Start game")
        # game_state = ts.GameState.TITLE
        #
        # while True:
        #     if game_state is ts.GameState.TITLE:
        #         game_state = ts.title_screen(self.screen)
        #
        #     if game_state is ts.GameState.PlAY:

        self.level.reset()
        levelmap = self.level.getLevel()
        self.maze.getMaze(levelmap["name"].split(".")[0])
        self.maze.constructMaze(self.background, self.background_flash, levelmap["row"])
        self.nodes = NodeGroup(levelmap["name"])
        self.pellets = PelletGroup(levelmap["name"])
        self.pacman = Pacman(self.sound, self.nodes, self.sheet)
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.pelletsEaten = 0
        self.fruit = None
        self.pause.force(True)
        self.text.showReady()
        self.sound.intro()
        self.text.updateLevel(self.level.level + 1)
        self.gameover = False
        self.maze.reset()
        self.flashBackground = False
Exemple #2
0
 def nextLevel(self):
     self.setBackground()  ###
     self.level += 1
     self.maze.setup(self.level)
     self.nodes = NodeGroup(self.maze.filename + ".txt")
     self.pellets = PelletGroup(self.maze.filename + ".txt")
     self.pacman.updateNodes(self.nodes)
     self.pacman.reset()
     self.ghosts = GhostGroup(self.nodes, self.sheet)
     self.paused = True
     self.started = False
     self.pausedByPlayer = False
     self.fruit = None
     self.pelletsEaten = 0
     self.lifeIcons = LifeIcon(self.sheet)
     self.maze.stitchMaze(self.background, self.background_white)
     self.pellets = PelletGroup(self.maze.filename + ".txt")
     self.levelLabel.updateText(str(self.level).zfill(2))
     self.pauseTime = 0
     self.timer = 0
     self.nextLevelAfterPause = False
     self.startAfterPause = False
     self.restartAfterPause = False
     self.gameover = False
     self.flash_background = False
     self.flash_rate = 0.2
     self.flashtime = 0
     self.show_white_background = False
Exemple #3
0
 def startGame(self):
     print("Restarting the game")
     self.maze.setup(self.level)
     self.nodes = NodeGroup(self.maze.filename + ".txt")
     self.pellets = PelletGroup(self.maze.filename + ".txt")
     self.pacman = Pacman(self.nodes, self.sheet)
     self.ghosts = GhostGroup(self.nodes, self.sheet)
     self.paused = True
     self.fruit = None
     self.pelletsEaten = 0
     self.lifeIcons = LifeIcon(self.sheet)
     self.maze.stitchMaze(self.background, self.background_white)
     self.hiScoreTxtStatic = Text("HI SCORE", WHITE, 0, 0, 16)
     self.scoreTxtStatic = Text("SCORE", WHITE, 208, 0, 16)
     self.levelTxtStatic = Text("LEVEL", WHITE, 368, 0, 16)
     self.score = 0
     self.scoreLabel = Text(str(self.score).zfill(8), WHITE, 208, 16, 16)
     self.started = False
     self.pausedByPlayer = False
     self.pauseTime = 0
     self.timer = 0
     self.nextLevelAfterPause = False
     self.startAfterPause = False
     self.restartAfterPause = False
     self.flash_background = False
     self.flash_rate = 0.2
     self.flashtime = 0
     self.show_white_background = False
     self.gameover = False
     self.level = 1  #####
Exemple #4
0
 def restartLevel(self):
     print("Restart current level")
     self.pacman.reset()
     self.ghosts = GhostGroup(self.nodes, self.sheet)
     self.pause.force(True)
     self.fruit = None
     self.flashBackground = False
     self.maze.reset()
Exemple #5
0
 def restartLevel(self):
     print("Restart current level")
     self.pacman.reset()
     self.ghosts = GhostGroup(self.nodes, self.sheet)
     self.pause.force(True)
     self.fruit = None
     self.flashBackground = False
     self.maze.reset()
     sound = pygame.mixer.Sound('themesong.mp3')
     sound.play()
Exemple #6
0
    def start_game(self):

        self.sheet = Spritesheet()
        self.nodes = NodeGroup("maze.txt")
        self.pellets = Pellets_Group("maze.txt")
        self.pacman = Pacman(self.nodes, self.sheet)
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.life_icons = LifeIcon(self.sheet)
        self.paused = False
        self.maze = Maze(self.sheet)
        self.maze.get_maze("maze")
        self.maze.combine_maze(self.background)
Exemple #7
0
 def restartLevel(self):
     print("Restarting the level")
     self.pacman.reset()
     self.ghosts = GhostGroup(self.nodes, self.sheet)
     self.paused = True
     self.started = False
     self.pausedByPlayer = False
     self.fruit = None
     self.pauseTime = 0
     self.timer = 0
     self.nextLevelAfterPause = False
     self.startAfterPause = False
     self.restartAfterPause = False
     self.gameover = False
     self.flash_background = False
     self.flash_rate = 0.2
     self.flashtime = 0
     self.show_white_background = False
Exemple #8
0
 def startLevel(self):
     print("Start new level")
     levelmap = self.level.getLevel()
     self.setBackground()
     self.maze.getMaze(levelmap["name"].split(".")[0])
     self.maze.constructMaze(self.background, self.background_flash,
                             levelmap["row"])
     self.nodes = NodeGroup(levelmap["name"])
     self.pellets = PelletGroup(levelmap["name"])
     self.pacman.nodes = self.nodes
     self.pacman.reset()
     self.ghosts = GhostGroup(self.nodes, self.sheet)
     self.pelletsEaten = 0
     self.fruit = None
     self.pause.force(True)
     self.text.updateLevel(self.level.level + 1)
     self.flashBackground = False
     self.maze.reset()
Exemple #9
0
 def commonSetup(self):
     self.pacman = Pacman(self.nodes, self.level, self.sheet)
     self.ghosts = GhostGroup(self.nodes, self.level, self.sheet)
     self.paused = True
     self.fruit = None
     self.fruitTimer = 0
     self.pauseTimer = 0
     self.pauseTime = 5
     self.playerPaused = False
     self.startDelay = False
     self.restartDelay = False
     self.scoreAccumulator = 0
     self.maxLives = 5
     self.allText.add("start_label",
                      "BEGIN",
                      y=20 * HEIGHT,
                      align="center",
                      color=YELLOW)
     self.flashLevel = False
     self.drawBackgroundFlash = False
     self.levelFlashTimer = 0
     self.fruitScoreTimer = 0
Exemple #10
0
class GameController(object):
    def __init__(self):
        pygame.init()
        pygame.mixer.music.load('sound/pacman_beginning.wav')
        pygame.mixer.music.play(-1)
        self.screen = pygame.display.set_mode(SCREENSIZE, 0, 32)
        self.background = None
        self.background_flash = None
        self.setBackground()
        self.clock = pygame.time.Clock()
        self.pelletsEaten = 0
        self.fruit = None
        self.pause = Pauser(True)
        self.level = LevelController()
        self.text = TextGroup()
        self.score = 0
        self.gameover = False
        self.sheet = Spritesheet()
        self.maze = Maze(self.sheet)
        self.flashBackground = False
        self.eat_sound = pygame.mixer.Sound("sound/pacman_chomp.wav")
        self.music_sound = pygame.mixer.Sound("sound/pacman_beginning.wav")
        self.death_sound = pygame.mixer.Sound("sound/pacman_death.wav")
        self.eatghost_sound = pygame.mixer.Sound("sound/pacman_eatghost.wav")
        self.eatfruit_sound = pygame.mixer.Sound("sound/pacman_eatfruit.wav")
        self.intermission_sound = pygame.mixer.Sound(
            "sound/pacman_intermission.wav")

    def setBackground(self):
        self.background = pygame.surface.Surface(SCREENSIZE).convert()
        self.background_flash = pygame.surface.Surface(SCREENSIZE).convert()
        self.background.fill(BLACK)

    def startGame(self):
        print("Start game")
        self.level.reset()
        levelmap = self.level.getLevel()
        self.maze.getMaze(levelmap["name"].split(".")[0])
        self.maze.constructMaze(self.background, self.background_flash,
                                levelmap["row"])
        self.nodes = NodeGroup(levelmap["name"])
        self.pellets = PelletGroup(levelmap["name"])
        self.pacman = Pacman(self.nodes, self.sheet)
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.pelletsEaten = 0
        self.fruit = None
        self.pause.force(True)
        self.text.showReady()
        self.text.updateLevel(self.level.level + 1)
        self.gameover = False
        self.maze.reset()
        self.flashBackground = False

    def startLevel(self):
        print("Start new level")
        levelmap = self.level.getLevel()
        self.setBackground()
        self.maze.getMaze(levelmap["name"].split(".")[0])
        self.maze.constructMaze(self.background, self.background_flash,
                                levelmap["row"])
        self.nodes = NodeGroup(levelmap["name"])
        self.pellets = PelletGroup(levelmap["name"])
        self.pacman.nodes = self.nodes
        self.pacman.reset()
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.pelletsEaten = 0
        self.fruit = None
        self.pause.force(True)
        self.text.updateLevel(self.level.level + 1)
        self.flashBackground = False
        self.maze.reset()

    def restartLevel(self):
        print("Restart current level")
        self.pacman.reset()
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.pause.force(True)
        self.fruit = None
        self.flashBackground = False
        self.maze.reset()

    def update(self):
        if not self.gameover:
            dt = self.clock.tick(30) / 1000.0
            if not self.pause.paused:
                self.pacman.update(dt)
                self.ghosts.update(dt, self.pacman)
                if self.fruit is not None:
                    self.fruit.update(dt)

                if self.pause.pauseType != None:
                    self.pause.settlePause(self)

                self.checkPelletEvents()
                self.checkGhostEvents()
                self.checkFruitEvents()

            else:
                if self.flashBackground:
                    self.maze.flash(dt)

                if self.pacman.animateDeath:
                    self.pacman.updateDeath(dt)

            self.pause.update(dt)
            self.pellets.update(dt)
            self.text.update(dt)
        self.checkEvents()
        self.text.updateScore(self.score)
        self.render()

    def checkEvents(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    if self.gameover:
                        self.startGame()
                    else:
                        self.pause.player()
                        if self.pause.paused:
                            pygame.mixer.music.pause()

                            self.text.showPause()
                        else:
                            self.text.hideMessages()
                            pygame.mixer.music.unpause()

    def checkPelletEvents(self):
        pellet = self.pacman.eatPellets(self.pellets.pelletList)
        if pellet:
            pygame.mixer.music.pause()
            pygame.mixer.Sound.play(self.eat_sound)
            pygame.mixer.music.unpause()
            self.pelletsEaten += 1
            self.score += pellet.points
            if (self.pelletsEaten == 70 or self.pelletsEaten == 140):
                if self.fruit is None:
                    levelmap = self.level.getLevel()
                    self.fruit = Fruit(self.nodes, self.sheet,
                                       levelmap["fruit"])
            self.pellets.pelletList.remove(pellet)
            if pellet.name == "powerpellet":
                self.ghosts.resetPoints()
                self.ghosts.freightMode()
            if self.pellets.isEmpty():
                self.pacman.visible = False
                self.ghosts.hide()
                self.pause.startTimer(3, "clear")
                self.flashBackground = True

    def checkGhostEvents(self):
        self.ghosts.release(self.pelletsEaten)
        ghost = self.pacman.eatGhost(self.ghosts)
        if ghost is not None:
            if ghost.mode.name == "FREIGHT":
                pygame.mixer.music.pause()
                pygame.mixer.Sound.play(self.eatghost_sound)
                pygame.mixer.music.unpause()
                self.ghosts.updatePoints()
                ghost.spawnMode(speed=2)
                self.pause.startTimer(1)
                self.pacman.visible = False
                ghost.visible = False

            elif ghost.mode.name != "SPAWN":
                self.pacman.loseLife()
                self.ghosts.hide()
                self.pause.startTimer(3, "die")

    def checkFruitEvents(self):
        if self.fruit is not None:
            if self.pacman.eatFruit(self.fruit):
                pygame.mixer.music.pause()
                pygame.mixer.Sound.play(self.eatfruit_sound)
                pygame.mixer.music.unpause()
                self.score += self.fruit.points
                self.text.createTemp(self.fruit.points, self.fruit.position)
                self.fruit = None

            elif self.fruit.destroy:
                self.fruit = None

    def resolveDeath(self):
        if self.pacman.lives == 0:
            self.gameover = True
            self.pacman.visible = False
            self.text.showGameOver()
            #pygame.mixer.music.pause()
            #pygame.mixer.Sound.play(self.death_sound)
            pygame.mixer.music.stop()

        else:
            pygame.mixer.music.pause()
            pygame.mixer.Sound.play(self.death_sound)
            pygame.mixer.music.unpause()
            self.restartLevel()
        self.pause.pauseType = None

    def resolveLevelClear(self):
        pygame.mixer.music.pause()
        self.level.nextLevel()
        self.startLevel()
        pygame.mixer.music.unpause()
        self.pause.pauseType = None

    def render(self):
        self.screen.blit(self.maze.background, (0, 0))
        #self.nodes.render(self.screen)
        self.pellets.render(self.screen)
        if self.fruit is not None:
            self.fruit.render(self.screen)
        self.pacman.render(self.screen)
        self.ghosts.render(self.screen)
        self.pacman.renderLives(self.screen)
        self.text.render(self.screen)
        pygame.display.update()
Exemple #11
0
class GameController(object):
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode(SCREENSIZE, 0, 32)
        self.background = None
        self.setBackground()
        self.clock = pygame.time.Clock()
        self.hiscore = 0
        self.hiscoreLabel = Text(str(self.hiscore).zfill(8), WHITE, 0, 16, 16)
        self.level = 1
        self.levelLabel = Text(str(self.level).zfill(2), WHITE, 368, 16, 16)
        self.sheet = Spritesheet()
        self.maze = Maze(self.sheet)
        self.trophies = FruitTrophy()
        self.startLabel = Text("START!", RED, 190, 320, 16)
        self.pauseLabel = Text("PAUSED!", RED, 180, 320, 16)
        self.started = False
        self.pausedByPlayer = False
        self.pauseTime = 0
        self.timer = 0
        self.nextLevelAfterPause = False
        self.startAfterPause = False
        self.restartAfterPause = False
        self.flash_background = False
        self.flash_rate = 0.2
        self.flashtime = 0
        self.show_white_background = False
        self.ghost_score = None
        self.fruit_score = None
        self.gameover = False

    def setBackground(self):
        self.background = pygame.surface.Surface(SCREENSIZE).convert()
        self.background_white = pygame.surface.Surface(SCREENSIZE).convert()
        self.background.fill(BLACK)

    def startGame(self):
        print("Restarting the game")
        self.maze.setup(self.level)
        self.nodes = NodeGroup(self.maze.filename + ".txt")
        self.pellets = PelletGroup(self.maze.filename + ".txt")
        self.pacman = Pacman(self.nodes, self.sheet)
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.paused = True
        self.fruit = None
        self.pelletsEaten = 0
        self.lifeIcons = LifeIcon(self.sheet)
        self.maze.stitchMaze(self.background, self.background_white)
        self.hiScoreTxtStatic = Text("HI SCORE", WHITE, 0, 0, 16)
        self.scoreTxtStatic = Text("SCORE", WHITE, 208, 0, 16)
        self.levelTxtStatic = Text("LEVEL", WHITE, 368, 0, 16)
        self.score = 0
        self.scoreLabel = Text(str(self.score).zfill(8), WHITE, 208, 16, 16)
        self.started = False
        self.pausedByPlayer = False
        self.pauseTime = 0
        self.timer = 0
        self.nextLevelAfterPause = False
        self.startAfterPause = False
        self.restartAfterPause = False
        self.flash_background = False
        self.flash_rate = 0.2
        self.flashtime = 0
        self.show_white_background = False
        self.gameover = False
        self.level = 1  #####

    def restartLevel(self):
        print("Restarting the level")
        self.pacman.reset()
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.paused = True
        self.started = False
        self.pausedByPlayer = False
        self.fruit = None
        self.pauseTime = 0
        self.timer = 0
        self.nextLevelAfterPause = False
        self.startAfterPause = False
        self.restartAfterPause = False
        self.gameover = False
        self.flash_background = False
        self.flash_rate = 0.2
        self.flashtime = 0
        self.show_white_background = False

    def nextLevel(self):
        self.setBackground()  ###
        self.level += 1
        self.maze.setup(self.level)
        self.nodes = NodeGroup(self.maze.filename + ".txt")
        self.pellets = PelletGroup(self.maze.filename + ".txt")
        self.pacman.updateNodes(self.nodes)
        self.pacman.reset()
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.paused = True
        self.started = False
        self.pausedByPlayer = False
        self.fruit = None
        self.pelletsEaten = 0
        self.lifeIcons = LifeIcon(self.sheet)
        self.maze.stitchMaze(self.background, self.background_white)
        self.pellets = PelletGroup(self.maze.filename + ".txt")
        self.levelLabel.updateText(str(self.level).zfill(2))
        self.pauseTime = 0
        self.timer = 0
        self.nextLevelAfterPause = False
        self.startAfterPause = False
        self.restartAfterPause = False
        self.gameover = False
        self.flash_background = False
        self.flash_rate = 0.2
        self.flashtime = 0
        self.show_white_background = False

    def update(self):
        dt = self.clock.tick(30) / 1000.0
        self.pellets.update(dt)
        if not self.paused:
            self.pacman.update(dt)
            self.ghosts.update(dt, self.pacman)
            if self.fruit is not None:
                self.fruit.update(dt)
        else:
            if not self.pacman.alive:
                print("death sequence")
                self.pacman.updateAnimation(dt)
        self.checkEvents()

        if self.pauseTime > 0:
            self.paused = True
            self.timer += dt
            if self.timer >= self.pauseTime:
                self.paused = False
                self.pauseTime = 0
                self.timer = 0
                self.ghost_score = None
                if self.nextLevelAfterPause:
                    self.nextLevel()
                if self.startAfterPause:
                    self.startGame()
                if self.restartAfterPause:
                    self.restartLevel()

        if self.flash_background:
            self.flashtime += dt
            if self.flashtime >= self.flash_rate:
                self.flashtime = 0
                self.show_white_background = not self.show_white_background

        if self.fruit_score is not None:
            self.fruit_score.update(dt)
            if self.fruit_score.hide:
                self.fruit_score = None

        self.render()

    def checkEvents(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    self.started = True
                    self.paused = not self.paused
                    self.pausedByPlayer = self.paused

        if not self.paused:
            self.checkPelletEvents()
            self.checkGhostEvents()
            self.checkFruitEvents()

    def checkPelletEvents(self):
        pellet = self.pacman.eatPellets(self.pellets.pelletList)
        if pellet:
            self.pelletsEaten += 1
            self.updateScores(pellet.points)
            self.ghosts.resetPoints()
            if (self.pelletsEaten == 70 or self.pelletsEaten == 140):
                if self.fruit is None:
                    self.fruit = Fruit(self.nodes, self.sheet, self.level)
            self.pellets.pelletList.remove(pellet)
            if pellet.name == "powerpellet":
                self.ghosts.freightMode()
            if self.pellets.isEmpty():
                self.pauseTime = 3
                self.nextLevelAfterPause = True
                self.flash_background = True

    def checkGhostEvents(self):
        self.ghosts.release(self.pelletsEaten)
        ghost = self.pacman.eatGhost(self.ghosts)
        if ghost is not None:
            if ghost.mode.name == "FREIGHT":
                self.pauseTime = 0.5
                self.ghost_score = Text(str(self.ghosts.points), WHITE,
                                        ghost.position.x, ghost.position.y, 8)
                ghost.spawnMode()
                self.updateScores(self.ghosts.points)
                self.ghosts.doublePoints()
            elif ghost.mode.name != "SPAWN":
                self.pacman.alive = False
                self.paused = True
                self.pauseTime = 2
                self.pacman.decreaseLives()
                self.gameover = self.pacman.lives == 0
                if self.gameover:
                    print("All of Pacmans lives are gone")
                    self.startAfterPause = True
                else:
                    print("Lost a life, but still going")
                    self.restartAfterPause = True

    def checkFruitEvents(self):
        if self.fruit is not None:
            if self.pacman.eatFruit(self.fruit):
                self.updateScores(self.fruit.points)
                self.trophies.add(self.fruit.name, self.fruit.collect())
                self.fruit_score = Text(str(self.fruit.points), WHITE,
                                        self.fruit.position.x,
                                        self.fruit.position.y, 8)
                self.fruit_score.lifespan = 1
                self.fruit = None
            else:
                if self.fruit.killme:
                    self.fruit = None

    def updateScores(self, value):
        self.score += value
        self.scoreLabel.updateText(str(self.score).zfill(8))
        if self.score > self.hiscore:
            self.hiscore = self.score
            self.hiscoreLabel.updateText(str(self.hiscore).zfill(8))

    def render(self):
        if self.show_white_background:
            self.screen.blit(self.background_white, (0, 0))
        else:
            self.screen.blit(self.background, (0, 0))

        self.nodes.render(self.screen)
        self.pellets.render(self.screen)
        if self.fruit is not None:
            self.fruit.render(self.screen)
        if not self.paused or not self.started:
            self.pacman.render(self.screen)
            self.ghosts.render(self.screen)
        self.lifeIcons.render(self.screen, self.pacman.lives - 1)
        self.hiScoreTxtStatic.render(self.screen)
        self.scoreTxtStatic.render(self.screen)
        self.levelTxtStatic.render(self.screen)
        self.scoreLabel.render(self.screen)
        self.hiscoreLabel.render(self.screen)
        self.levelLabel.render(self.screen)
        self.trophies.render(self.screen)

        if self.pausedByPlayer:
            self.pauseLabel.render(self.screen)
        if not self.started:
            self.startLabel.render(self.screen)

        if self.ghost_score is not None:
            self.ghost_score.render(self.screen)
        if self.fruit_score is not None:
            self.fruit_score.render(self.screen)

        if self.paused and not self.pacman.alive:
            self.pacman.render(self.screen)

        pygame.display.update()
Exemple #12
0
    def restart_level(self):

        self.paused = True
        self.pacman.reset()
        self.ghosts = GhostGroup(self.nodes, self.sheet)
Exemple #13
0
 def startGame(self):
     self.nodes = NodeGroup("maze.txt")
     self.pacman = Pacman(self.nodes)
     self.ghosts = GhostGroup(self.nodes)
     self.gameover = False
Exemple #14
0
class GameController(object):
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode(SCREENSIZE, 0, 32)
        self.background = None
        self.setBackground()
        self.clock = pygame.time.Clock()
        
    def setBackground(self):
        self.background = pygame.surface.Surface(SCREENSIZE).convert()
        self.background.fill(BLACK)

    def startGame(self):
        self.nodes = NodeGroup("maze.txt")
        self.pacman = Pacman(self.nodes)
        self.ghosts = GhostGroup(self.nodes)
        self.gameover = False

    
    def update(self):
        if not self.gameover:
            dt = self.clock.tick(30) / 1000.0
            self.pacman.update(dt)
            self.ghosts.update(dt, self.pacman)
        self.checkGhostEvents()
        self.checkEvents()
        self.render()

    def checkGhostEvents(self):
        ghost = self.pacman.eatGhost(self.ghosts)
        if ghost is not None:
            if ghost.mode.name == "FREIGHT":
                ghost.spawnMode(speed=2)
                self.pacman.visible = False
                ghost.visible = False
            elif ghost.mode.name == "CHASE" or ghost.mode.name == "SCATTER":
                #self.pacman.loseLife()
                exit()

    def checkEvents(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    if self.gameover:
                        self.startGame()

    def restartLevel(self):
        self.pacman.reset()
        self.ghosts = GhostGroup(self.nodes)

    #def resolveDeath(self):
        #if self.pacman.lives == 0:
            #self.gameover = True
        #else:
            #self.restartLevel()


    def render(self):
        self.screen.blit(self.background, (0, 0))
        self.nodes.render(self.screen)
        self.pacman.render(self.screen)
        self.ghosts.render(self.screen)
        #self.pacman.renderLives(self.screen)
        pygame.display.update()
Exemple #15
0
class GameController(object):
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode(SCREENSIZE, 0, 32)
        self.background = None
        self.level = 0
        self.setBackGround()
        self.clock = pygame.time.Clock()
        self.score = 0
        self.ghostScore = 200
        self.lives = 5
        self.idleTimer = 0
        self.displayedLevel = 0
        self.maxLevels = 2
        self.displayedFruits = []
        self.sheet = SpriteSheet()
        self.lifeIcons = Lives(self.sheet)
        self.maze = Maze(self.level, self.sheet)
        self.maze.fillMaze(self.background)
        self.allText = TextGroup()
        self.allText.add("hi_score_label", "HI SCORE", align="left")
        self.allText.add("score_label", "SCORE", align="center")
        self.allText.add("level_label", "LEVEL", align="right")
        self.allText.add("score", self.score, y=HEIGHT, align="center")
        self.allText.add("level",
                         self.displayedLevel,
                         y=2 * HEIGHT,
                         align="right")
        self.levelFlashTime = 0.3
        self.levelFlashTimer = 0
        self.drawBackgroundFlash = False
        self.flashLevel = False
        self.fruitScoreTimer = 0
        self.fruitEaten = False

    def setBackGround(self):
        self.background = pygame.surface.Surface(SCREENSIZE).convert()
        self.background.fill(BLACK)
        self.backgroundFlash = pygame.surface.Surface(SCREENSIZE).convert()
        self.backgroundFlash.fill(BLACK)

    def commonSetup(self):
        self.pacman = Pacman(self.nodes, self.level, self.sheet)
        self.ghosts = GhostGroup(self.nodes, self.level, self.sheet)
        self.paused = True
        self.fruit = None
        self.fruitTimer = 0
        self.pauseTimer = 0
        self.pauseTime = 5
        self.playerPaused = False
        self.startDelay = False
        self.restartDelay = False
        self.scoreAccumulator = 0
        self.maxLives = 5
        self.allText.add("start_label",
                         "BEGIN",
                         y=20 * HEIGHT,
                         align="center",
                         color=YELLOW)
        self.flashLevel = False
        self.drawBackgroundFlash = False
        self.levelFlashTimer = 0
        self.fruitScoreTimer = 0

    def startGame(self):
        self.setBackGround()
        self.maze = Maze(self.level, self.sheet)
        self.maze.fillMaze(self.background)
        self.mazeFlash = Maze(self.level, self.sheet, startcol=11)
        self.mazeFlash.fillMaze(self.backgroundFlash)

        self.nodes = NodeGroup(self.level)
        self.pellets = PelletGroup(self.level)
        self.commonSetup()

    def restartLevel(self):
        self.commonSetup()

    def update(self):
        dt = self.clock.tick(30) / 1000.0
        if not self.paused:
            self.pacman.update(dt)
            self.ghosts.update(dt, self.pacman)
            self.checkPelletEvents(dt)
            self.checkGhostEvents(dt)
            self.checkFruitEvents(dt)
            self.applyScore()
        else:
            if not self.playerPaused:
                if not self.pacman.alive:
                    self.pacman.update(dt)
                    if self.pacman.deathSequenceFinished:
                        if self.lives > 0:
                            self.restartLevel()
                        else:
                            self.allText.add("game_over_label",
                                             "GAME OVER",
                                             y=20 * HEIGHT,
                                             align="center",
                                             color=RED)

                else:
                    self.pauseTimer += dt
                    if self.pauseTimer >= self.pauseTime:
                        self.paused = False
                        self.allText.remove("ghost_score")
                        self.allText.remove("start_label")
                        self.pacman.draw = True
                        for ghost in self.ghosts:
                            ghost.draw = True
                        if self.startDelay == True:
                            self.startGame()
                        if self.restartDelay == True:
                            self.restartLevel()

        if self.flashLevel:
            self.levelFlashTimer += dt
            if self.levelFlashTimer >= self.levelFlashTime:
                self.levelFlashTimer = 0
                self.drawBackgroundFlash = not self.drawBackgroundFlash

        if self.fruitEaten:
            self.fruitScoreTimer += dt
            if self.fruitScoreTimer >= self.fruitScoreTime:
                self.allText.remove("fruit_score")
                self.fruitScoreTimer = 0
                self.fruitEaten = False

        self.checkEvents()
        self.render()

    def checkEvents(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            if event.type == KEYDOWN:
                if event.key == K_SPACE:
                    self.allText.remove("start_label")
                    self.allText.remove("fruit_score")
                    if self.paused:
                        self.playerPaused = False
                        self.allText.remove("paused_label")
                    else:
                        self.playerPaused = True
                        self.allText.add("paused_label",
                                         "PAUSED",
                                         y=20 * HEIGHT,
                                         align="center",
                                         color=GREEN)
                    self.paused = not self.paused

    def checkPelletEvents(self, dt):
        pellet = self.pacman.eatPellets(self.pellets.pelletList)
        if pellet:
            self.pellets.numEaten += 1
            if (self.pellets.numEaten == 70 or self.pellets.numEaten == 140):
                self.fruit = CollectedFruit(self.nodes, self.level,
                                            self.displayedLevel, self.sheet)
            self.idleTimer = 0
            self.scoreAccumulator += pellet.value
            self.pellets.pelletList.remove(pellet)
            if pellet.name == "powerpellet":
                self.pellets.powerPellets.remove(pellet)
                self.ghosts.setFreightMode()
                self.ghostScore = 200

            if (self.ghosts.anyInFreightOrSpawn()):
                self.pacman.boostSpeed()
            else:
                self.pacman.reduceSpeed()

            if self.pellets.isEmpty():
                self.paused = True
                self.pauseTime = 3
                self.pauseTimer = 0
                self.startDelay = True
                self.flashLevel = True
                self.increaseLevel()

        else:
            self.idleTimer += dt
            if (self.ghosts.anyInFreightOrSpawn()):
                self.pacman.boostSpeed()
            else:
                if self.idleTimer >= 0.5:
                    self.pacman.normalSpeed()

        for pellet in self.pellets.powerPellets:
            pellet.update(dt)

    def checkGhostEvents(self, dt):
        ghost = self.pacman.eatGhost(self.ghosts)
        if ghost is not None:
            if ghost.mode.name == "FREIGHT":
                self.allText.add("ghost_score",
                                 self.ghostScore,
                                 x=ghost.position.x,
                                 y=ghost.position.y,
                                 size=0.5)

                ghost.setRespawnMode()
                self.scoreAccumulator += self.ghostScore
                self.ghostScore *= 2
                self.paused = True
                self.pauseTime = 0.5
                self.pauseTimer = 0
                self.pacman.draw = False
                ghost.draw = False
            elif ghost.mode.name != "SPAWN":
                self.paused = True
                #self.pauseTime = 1
                self.pauseTimer = 0
                self.restartDelay = True
                self.lives -= 1
                if self.lives == 0:
                    self.lives = 5
                    self.startDelay = True
                self.pacman.alive = False
                self.ghosts.noDraw()
                #ghost.draw = False
                self.pacman.animate.setAnimation("death", 0)

        if self.pellets.numEaten >= 30 or self.idleTimer >= 10:
            self.ghosts.release("inky")
        if self.pellets.numEaten >= 60 or self.idleTimer >= 10:
            self.ghosts.release("clyde")

    def checkFruitEvents(self, dt):
        if self.fruit is not None:
            if self.pacman.eatFruit(self.fruit):
                self.allText.add("fruit_score",
                                 self.fruit.value,
                                 x=self.fruit.position.x,
                                 y=self.fruit.position.y,
                                 size=0.5)
                self.scoreAccumulator += self.fruit.value
                self.addDisplayedFruit()
                self.fruitTimer = 0
                self.fruit = None
                self.fruitScoreTime = 1
                self.fruitScoreTimer = 0
                self.fruitEaten = True
            else:
                self.fruitTimer += dt
                if self.fruitTimer >= 10:
                    self.fruitTimer = 0
                    self.fruit = None

    def applyScore(self):
        if self.scoreAccumulator > 0:
            newScore = self.score + self.scoreAccumulator
            if ((newScore % 10000 - self.score % 10000) < 0
                    or newScore - self.score >= 10000):
                if self.lives < self.maxLives:
                    self.lives += 1
            self.score += self.scoreAccumulator
            self.scoreAccumulator = 0
            self.allText.remove("score")
            self.score = newScore
            self.allText.add("score", self.score, y=HEIGHT, align="center")

    def addDisplayedFruit(self):
        fruitNames = [n.name for n in self.displayedFruits]
        if self.fruit.name not in fruitNames:
            fruit = DisplayedFruit(self.fruit)
            fruit.setPosition(len(self.displayedFruits))
            self.displayedFruits.append(fruit)

    def increaseLevel(self):
        self.level += 1
        self.displayedLevel += 1
        self.level %= self.maxLevels

    def render(self):

        if self.drawBackgroundFlash:
            self.screen.blit(self.backgroundFlash, (0, 0))
        else:
            self.screen.blit(self.background, (0, 0))

        #self.nodes.render(self.screen)
        self.pellets.render(self.screen)

        for fruit in self.displayedFruits:
            fruit.render(self.screen)

        if not self.playerPaused:
            if self.fruit is not None:
                self.fruit.render(self.screen)
            self.ghosts.render(self.screen)
            self.pacman.render(self.screen)

        self.lifeIcons.render(self.screen, self.lives - 1)
        self.allText.render(self.screen)

        pygame.display.update()
class Game:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode(SCREENSIZE, 0, 1000)
        self.background = None
        self.background_flash = None
        self.setBackground()
        self.clock = pygame.time.Clock()
        self.pelletsEaten = 0
        self.fruit = None

        self.sound = Sound(sound="sounds/pmanpellets.wav")
        self.sound.play()
        self.sound.pause_bg()

        # self.play_button, self.quit_button = None

        self.pause = Pauser(True)
        self.level = LevelController()
        self.text = TextGroup()
        self.score = 0
        self.gameover = False
        self.sheet = Spritesheet()
        self.maze = Maze(self.sheet)
        self.flashBackground = False

    def setBackground(self):
        self.background = pygame.surface.Surface(SCREENSIZE).convert()
        self.background_flash = pygame.surface.Surface(SCREENSIZE).convert()
        self.background.fill(BLACK)

    # def show_menu(self):
    #     self.play_button = Button(screen=self.screen, msg="Play", x=800, y=500)
    #     self.quit_button = Button(screen=self.screen, msg="Quit", x=800, y=700)

    def play(self):
        print("Start game")
        # game_state = ts.GameState.TITLE
        #
        # while True:
        #     if game_state is ts.GameState.TITLE:
        #         game_state = ts.title_screen(self.screen)
        #
        #     if game_state is ts.GameState.PlAY:

        self.level.reset()
        levelmap = self.level.getLevel()
        self.maze.getMaze(levelmap["name"].split(".")[0])
        self.maze.constructMaze(self.background, self.background_flash, levelmap["row"])
        self.nodes = NodeGroup(levelmap["name"])
        self.pellets = PelletGroup(levelmap["name"])
        self.pacman = Pacman(self.sound, self.nodes, self.sheet)
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.pelletsEaten = 0
        self.fruit = None
        self.pause.force(True)
        self.text.showReady()
        self.sound.intro()
        self.text.updateLevel(self.level.level + 1)
        self.gameover = False
        self.maze.reset()
        self.flashBackground = False

            # if game_state is ts.GameState.QUIT:
            #     exit()

    def startLevel(self):
        print("Start new level")
        levelmap = self.level.getLevel()
        self.setBackground()
        self.maze.getMaze(levelmap["name"].split(".")[0])
        self.maze.constructMaze(self.background, self.background_flash, levelmap["row"])
        self.nodes = NodeGroup(levelmap["name"])
        self.pellets = PelletGroup(levelmap["name"])
        self.pacman.nodes = self.nodes
        self.pacman.reset()
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.pelletsEaten = 0
        self.fruit = None
        self.pause.force(True)
        self.text.showReady()
        self.sound.intro()
        self.text.updateLevel(self.level.level + 1)
        self.flashBackground = False
        self.maze.reset()

    def restartLevel(self):
        print("Restart current level")
        self.pacman.reset()
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.pause.force(True)
        self.text.showReady()
        self.fruit = None
        self.flashBackground = False
        self.maze.reset()

    def update(self):
        if not self.gameover:
            dt = self.clock.tick(30) / 1000.0
            if not self.pause.paused:
                self.pacman.update(dt)
                self.ghosts.update(dt, self.pacman)
                if self.fruit is not None:
                    self.fruit.update(dt)

                if self.pause.pauseType != None:
                    self.pause.settlePause(self)

                self.checkPelletEvents()
                self.checkGhostEvents()
                self.checkFruitEvents()

            else:
                if self.flashBackground:
                    self.maze.flash(dt)

                if self.pacman.animateDeath:
                    self.pacman.updateDeath(dt)

            self.pause.update(dt)
            self.pellets.update(dt)
            self.text.update(dt)
        self.checkEvents()
        self.text.updateScore(self.score)
        self.render()

    def checkEvents(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    if self.gameover:
                        self.play()
                    else:
                        self.pause.player()
                        if self.pause.paused:
                            self.text.showPause()
                        else:
                            self.text.hideMessages()

    def checkPelletEvents(self):
        pellet = self.pacman.eatPellets(self.pellets.pelletList)
        if pellet:
            self.sound.eat_pellets()
            self.pelletsEaten += 1
            self.score += pellet.points
            if (self.pelletsEaten == 70 or self.pelletsEaten == 140):
                if self.fruit is None:
                    levelmap = self.level.getLevel()
                    self.fruit = Fruit(self.nodes, self.sheet, levelmap["fruit"])
            self.pellets.pelletList.remove(pellet)
            if pellet.name == "powerpellet":
                self.ghosts.resetPoints()
                self.ghosts.freightMode()
                self.sound.strong_pac()
            if self.pellets.isEmpty():
                self.pacman.visible = False
                self.ghosts.hide()
                self.pause.startTimer(3, "clear")
                self.flashBackground = True

    def checkGhostEvents(self):
        self.ghosts.release(self.pelletsEaten)
        ghost = self.pacman.eatGhost(self.ghosts)
        if ghost is not None:
            if ghost.mode.name == "FREIGHT":
                self.sound.eat_ghosts()
                self.score += ghost.points
                self.text.createTemp(ghost.points, ghost.position)
                self.ghosts.updatePoints()
                ghost.spawnMode(speed=2)
                self.pause.startTimer(1)
                self.pacman.visible = False
                ghost.visible = False

            elif ghost.mode.name != "SPAWN":
                self.pacman.loseLife()
                self.ghosts.hide()
                self.pause.startTimer(3, "die")

    def checkFruitEvents(self):
        if self.fruit is not None:
            if self.pacman.eatFruit(self.fruit):
                self.sound.eat_fruits()
                self.score += self.fruit.points
                self.text.createTemp(self.fruit.points, self.fruit.position)
                self.fruit = None

            elif self.fruit.destroy:
                self.fruit = None

    def resolveDeath(self):
        if self.pacman.lives == 0:
            self.gameover = True
            self.pacman.visible = False
            self.text.showGameOver()
        else:
            self.restartLevel()
        self.pause.pauseType = None

    def resolveLevelClear(self):
        self.level.nextLevel()
        self.startLevel()
        self.pause.pauseType = None

    def render(self):
        self.screen.blit(self.maze.background, (0, 0))
        # self.nodes.render(self.screen)
        self.pellets.render(self.screen)
        if self.fruit is not None:
            self.fruit.render(self.screen)
        self.pacman.render(self.screen)
        self.ghosts.render(self.screen)
        self.pacman.renderLives(self.screen)
        self.text.render(self.screen)
        pygame.display.update()
Exemple #17
0
 def restartLevel(self):
     self.pacman.reset()
     self.ghosts = GhostGroup(self.nodes)
Exemple #18
0
class GameController:
    """
    This the class that controls our basic game loop, what this method does
    is update what happens in game based on other events, and what just keeps
    game running until we end it
    """
    def __init__(self):
        pygame.init()
        self.nodes = None
        self.pacman = None
        self.ghosts = None
        self.game = None
        self.pellets_eaten = 0
        self.screen = pygame.display.set_mode(SCREENSIZE, 0, 32)
        self.background = None
        self.set_background()
        self.clock = pygame.time.Clock()

    def set_background(self):
        """
        We create a background and set it to the color BLACK that we defined in
        the constants.py file.
        """
        self.background = pygame.surface.Surface(SCREENSIZE).convert()
        self.background.fill(BLACK)

    def start_game(self):

        self.sheet = Spritesheet()
        self.nodes = NodeGroup("maze.txt")
        self.pellets = Pellets_Group("maze.txt")
        self.pacman = Pacman(self.nodes, self.sheet)
        self.ghosts = GhostGroup(self.nodes, self.sheet)
        self.life_icons = LifeIcon(self.sheet)
        self.paused = False
        self.maze = Maze(self.sheet)
        self.maze.get_maze("maze")
        self.maze.combine_maze(self.background)

    def update(self):
        """
        The update method is a method that we call once per frame of the game.
        It's basically our game loop
        """
        dt = self.clock.tick(30) / 1000.0
        if not self.paused:
            self.pacman.update(dt)
            self.ghosts.update(dt, self.pacman)
        self.check_updater()
        self.render()

    def check_ghost_collision(self):
        self.ghosts.escape(self.pellets_eaten)
        ghost = self.pacman.collide_ghost(self.ghosts.ghosts)
        if ghost is not None:
            if ghost.mode.name == "FEAR":
                ghost.respawn()
            elif ghost.mode.name != "SPAWN":
                if self.pacman.lives == 0:
                    self.start_game()
                else:
                    self.pacman.lives -= 1
                    self.restart_level()

    def check_updater(self):
        """
        This method checks for certain events.
        Right now it is just checking to see when we exit out of the game.
        :return:
        """
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    self.paused = not self.paused
        self.check_collision()
        self.check_ghost_collision()

    def render(self):
        """
        The render method is the method we'll use to draw the images to the screen.
        it uses the update method, it is consistently running until the
        window is closed, right now it just keeps drawing what we want on screen
        """

        self.screen.blit(self.background, (0, 0))
        #self.nodes.render(self.screen)
        self.pellets.render(self.screen)
        self.pacman.render(self.screen)
        self.ghosts.render(self.screen)
        self.life_icons.render(self.screen, self.pacman.lives - 1)
        pygame.display.update()

    def check_collision(self):
        """
        This method finds the pellet collison and it has collided, it will
        remove that pellet from the pellet list and then it will also update
        the score accordingly.

        """
        self.paclives = self.pacman.lives
        pellete = self.pacman.collide_pellets(self.pellets.pellets_list)
        if pellete:
            self.pellets.pellets_list.remove(pellete)
            # self.pacman.get_score(pellete.points)
            self.pellets_eaten += 1
            if pellete.name == "powerpellet":
                self.pellets_eaten += 1
                self.ghosts.engage_chase()
            if self.pellets.is_empty():
                self.start_game()
                self.pacman.lives = self.paclives
        else:
            pass

    def restart_level(self):

        self.paused = True
        self.pacman.reset()
        self.ghosts = GhostGroup(self.nodes, self.sheet)

    def get_score(self, points):
        """
        Updates the score with given points and return the final score.

        """
        self.pacman.score += points
        return self.pacman.score