Beispiel #1
0
def main():
    N = eval(input("Please enter the dimensions for your maze (Your maze will be N x N) "))
    myMaze = Maze(N)

    print("The Red Square is the start")
    print("The Yellow Square is the key")
    print("The Green Square is the end")
    print("The Blue Circles represent the path to the key")
    print("The Black Circles represent the path to the end")
    print("The top left Cell is (0,0), x increases as you move right and y increases as you move down")
    print("The top left Cell is (0,0), x increases as you move right and y increases as you move down")

    myMaze.generateMaze()
    myMaze.explore(myMaze.entrance[0],myMaze.entrance[1])
    #myMaze.printSolution()
    myMaze.Draw()

    myCharacter = Character(myMaze)
    print("You have " + str(len(myMaze.SolutionStack)-2) + " steps to reach the ending")
    print("You are the pink circle, you may use the arrow keys to move")
    gameLoop(myMaze,myCharacter)

    replay = input("Would you like to play again (Y/N)")
    if replay == "Y":
        myMaze.win.close()
        main()
    elif replay == "N":
        myMaze.win.close()
        quit()
    myMaze.win.close()
class GS_Tutorial4(RoboPy.GameState):
	def __init__(self, kernel, gsm):
		RoboPy.GameState.__init__(self, "Tutorial4", kernel, gsm)

		self.mMaze = None
		self.mMonster = None

		self.mOffset = (250, 150)

		# Other Stuff
		self.mHoverTile = (0, 0)

	def Initialize(self):
		self.mTutorialText = pygame.image.load(os.path.join("Data", "tutorialText4.bmp")).convert()
		self.mTutorialRect = self.mTutorialText.get_rect()

		# Build maze
		self.mMaze = Maze(self.mKernel)
		self.mMaze.SetOffset(self.mOffset)
		self.mMaze.Load(os.path.join("Data", "tutorial2.maze"))
		self.mMaze.BuildWalls()

		# Make Monster --- ahhh
		self.mMonster = Monster(self.mKernel)
		self.mMonster.SetOffset(self.mOffset)
		self.mMonster.SetPath(self.mMaze.Solve((0, 0)))
		self.mMonster.SetCage(self.mMaze.GetCage())

		self.mBackImage = pygame.image.load(os.path.join("Data", "back.bmp")).convert()
		self.mBackHover = pygame.image.load(os.path.join("Data", "back_hover.bmp")).convert()
		self.mBackButton = self.mBackImage
		self.mBackRect = self.mBackButton.get_rect()
		self.mBackRect.topleft = (20, 530)

		self.mNextImage = pygame.image.load(os.path.join("Data", "next.bmp")).convert()
		self.mNextHover = pygame.image.load(os.path.join("Data", "next_hover.bmp")).convert()
		self.mNextButton = self.mNextImage
		self.mNextRect = self.mNextButton.get_rect()
		self.mNextRect.topleft = (630, 530)

		return RoboPy.GameState.Initialize(self)

	def Destroy(self):
		return RoboPy.GameState.Destroy(self)

	def Pause(self):
		RoboPy.GameState.Pause(self)

		return RoboPy.GameState.Destroy(self) 

	def Unpause(self):
		return RoboPy.GameState.Unpause(self)

	def CalcScore(self):
		difficulty = self.mLevel * 10
		moves = self.mMoves

		if moves == 0: 
			moves = 1

		score = int(math.floor(difficulty * (100 * (1.0 / moves))))

		return score

	def HandleEvent(self, event):
		if event.type == QUIT:
			pygame.quit()
			sys.exit()

		elif event.type == MOUSEMOTION:
		 	self.mHoverTile = (int(math.floor((event.pos[1] - self.mOffset[1]) / 20)), int(math.floor((event.pos[0] - self.mOffset[0]) / 20)))

			if (self.mBackRect.collidepoint(event.pos)):
				self.mBackButton = self.mBackHover
			else:
				self.mBackButton = self.mBackImage

			if (self.mNextRect.collidepoint(event.pos)):
				self.mNextButton = self.mNextHover
			else:
				self.mNextButton = self.mNextImage
		elif event.type == MOUSEBUTTONDOWN:
			if (self.mBackRect.collidepoint(event.pos)):
				self.mGameStateManager.SwitchState("Tutorial3")
			elif (self.mNextRect.collidepoint(event.pos)):
				self.mGameStateManager.SwitchState("Tutorial5")
		elif event.type == KEYDOWN:
			if event.key == K_ESCAPE:
				self.mGameStateManager.SwitchState("MainMenu")

			if event.key == K_w:
				self.mMaze.MoveWall(self.mHoverTile, "N")
				self.mMonster.SetPath(self.mMaze.Solve(self.mMonster.CurrentTile()))

			elif event.key == K_s:
				self.mMaze.MoveWall(self.mHoverTile, "S")
				self.mMonster.SetPath(self.mMaze.Solve(self.mMonster.CurrentTile()))

		return RoboPy.GameState.HandleEvent(self, event)

	def Update(self, delta):
		self.mMonster.Update(delta)

		self.mKernel.DisplaySurface().fill(Colors.BLUE)

		self.mKernel.DisplaySurface().blit(self.mTutorialText, self.mTutorialRect)

		pygame.draw.rect(self.mKernel.DisplaySurface(), Colors.BLACK, pygame.Rect(self.mOffset[0] - 10, self.mOffset[1] - 10, 16 * 20, 8 * 20))

		self.mMaze.Draw(self.mHoverTile)
		self.mMonster.Draw()

		self.mKernel.DisplaySurface().blit(self.mNextButton, self.mNextRect)
		self.mKernel.DisplaySurface().blit(self.mBackButton, self.mBackRect)

		return RoboPy.GameState.Update(self, delta)
class GS_Game(RoboPy.GameState):
    def __init__(self, kernel, gsm):
        RoboPy.GameState.__init__(self, "Game", kernel, gsm)

        self.mMazeSize = (27, 39)
        self.mMaze = None
        self.mMonster = None

        # Scoring Stuff
        self.mScore = 0
        self.mLevel = 1
        self.mMoves = 0
        self.mMarkedScore = 0

        # Other Stuff
        self.mHoverTile = (0, 0)

        #images
        self.mScoreImage = None
        self.mMovesImage = None
        self.mLevelImage = None
        self.mScoreRect = None
        self.mMovesRect = None
        self.mLevelRect = None

        self.mFont = None

        self.mCountDown = 0

    def Initialize(self):
        # Build maze
        self.mMaze = Maze(self.mKernel)
        self.mMaze.SetOffset((10, 10))
        self.mMaze.Generate(self.mMazeSize)
        #maze.Load(os.path.join("Data", "tutorial1.maze"))
        self.mMaze.BuildWalls()

        # Make Monster --- ahhh
        self.mMonster = Monster(self.mKernel)
        self.mMonster.SetOffset((10, 10))
        self.mMonster.SetPath(self.mMaze.Solve((0, 0)))
        self.mMonster.SetCage(self.mMaze.GetCage())

        self.mScoreImage = pygame.image.load(
            os.path.join("Data", "scoreText.bmp")).convert()
        self.mScoreImage.set_colorkey((0, 144, 247))
        self.mScoreRect = self.mScoreImage.get_rect()
        self.mScoreRect.topleft = (150, 570)

        self.mLosses = 0

        self.mMovesImage = pygame.image.load(
            os.path.join("Data", "movesText.bmp")).convert()
        self.mMovesImage.set_colorkey((0, 144, 247))
        self.mMovesRect = self.mMovesImage.get_rect()
        self.mMovesRect.topleft = (350, 570)

        self.mLevelImage = pygame.image.load(
            os.path.join("Data", "levelText.bmp")).convert()
        self.mLevelImage.set_colorkey((0, 144, 247))
        self.mLevelRect = self.mLevelImage.get_rect()
        self.mLevelRect.topleft = (550, 570)

        self.mLevelCompleteImage = pygame.image.load(
            os.path.join("Data", "levelComplete.bmp")).convert()
        self.mLevelCompleteRect = self.mLevelCompleteImage.get_rect()
        self.mLevelCompleteRect.topleft = (220, 150)

        self.mGameOverImage = pygame.image.load(
            os.path.join("Data", "gameOver.bmp")).convert()
        self.mGameOverRect = self.mLevelCompleteImage.get_rect()
        self.mGameOverRect.topleft = (220, 150)

        self.mMutedImage = pygame.image.load(os.path.join(
            "Data", "mute.bmp")).convert()
        self.mUnmutedImage = pygame.image.load(
            os.path.join("Data", "unmute.bmp")).convert()
        self.mVolumeImage = self.mUnmutedImage
        self.mVolumeRect = self.mVolumeImage.get_rect()
        self.mVolumeRect.topleft = (10, 570)
        self.mVolumeState = 1

        self.mFont = pygame.font.SysFont('Arial', 18, True)

        return RoboPy.GameState.Initialize(self)

    def Destroy(self):
        return RoboPy.GameState.Destroy(self)

    def Pause(self):

        return RoboPy.GameState.Pause(self)

    def Unpause(self):

        return RoboPy.GameState.Unpause(self)

    def CalcScore(self):
        difficulty = self.mLevel * 10
        moves = self.mMoves

        if moves == 0:
            moves = 1

        score = int(math.floor(difficulty * (100 * (1.0 / moves))))

        return score

    def HandleEvent(self, event):
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == MOUSEMOTION:
            self.mHoverTile = (int(math.floor((event.pos[1] - 10) / 20)),
                               int(math.floor((event.pos[0] - 10) / 20)))

        elif event.type == MOUSEBUTTONDOWN:
            if (self.mVolumeRect.collidepoint(event.pos)):
                if (self.mVolumeState == 1):
                    self.mVolumeImage = self.mMutedImage
                    self.mVolumeState = 0
                    self.mMaze.Mute()
                else:
                    self.mVolumeImage = self.mUnmutedImage
                    self.mVolumeState = 1
                    self.mMaze.Unmute()

        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                self.mGameStateManager.SwitchState("MainMenu")
            if event.key == K_w:
                self.mMoves += self.mMaze.MoveWall(self.mHoverTile, "N")
                self.mMonster.SetPath(
                    self.mMaze.Solve(self.mMonster.CurrentTile()))

            elif event.key == K_s:
                self.mMoves += self.mMaze.MoveWall(self.mHoverTile, "S")
                self.mMonster.SetPath(
                    self.mMaze.Solve(self.mMonster.CurrentTile()))

            elif event.key == K_a:
                self.mMoves += self.mMaze.MoveWall(self.mHoverTile, "W")
                self.mMonster.SetPath(
                    self.mMaze.Solve(self.mMonster.CurrentTile()))

            elif event.key == K_d:
                self.mMoves += self.mMaze.MoveWall(self.mHoverTile, "E")
                self.mMonster.SetPath(
                    self.mMaze.Solve(self.mMonster.CurrentTile()))

            elif event.key == K_SPACE and self.mLosses >= 3:
                self.mGameStateManager.SwitchState("MainMenu")
                self.Destroy()

            elif event.key == K_SPACE and self.mMarkedScore == 1:
                self.mMarkedScore = 0
                self.mMoves = 0
                self.mLevel += 1
                self.mLosses = 0
                self.mMaze.Generate(self.mMazeSize)
                self.mMaze.BuildWalls()
                self.mMonster.Reset()
                self.mMonster.SetCage(self.mMaze.GetCage())
                self.mMonster.SetSpeed(self.mLevel)
                self.mMonster.SetPath(
                    self.mMaze.Solve(self.mMonster.CurrentTile()))

        return RoboPy.GameState.HandleEvent(self, event)

    def Update(self, delta):
        self.mMonster.Update(delta)

        #check score
        if self.mMonster.IsCaught() and self.mMarkedScore == 0:
            self.mScore = self.mScore + self.CalcScore()
            self.mMonster.SetPath([])
            self.mMarkedScore = 1

        self.mKernel.DisplaySurface().fill(Colors.BLACK)

        scoreSurf = self.mFont.render(str(self.mScore), True, (0, 0, 0))
        scoreRect = scoreSurf.get_rect()
        scoreRect.topleft = self.mScoreRect.topleft
        scoreRect.left = scoreRect.left + self.mScoreRect.width + 10

        if (self.mMonster.IsFinished()):
            self.mMarkedScore = 0
            self.mMoves = 0
            self.mLosses += 1

            if (self.mLosses <= 3):
                self.mScore = max(self.mScore - 100, 0)

            if (self.mLosses <= 2):
                self.mMaze.Generate(self.mMazeSize)
                self.mMaze.BuildWalls()
                self.mMonster.Reset()
                self.mMonster.SetCage(self.mMaze.GetCage())
                self.mMonster.SetPath(
                    self.mMaze.Solve(self.mMonster.CurrentTile()))

        if (self.mMarkedScore):
            self.mMaze.Draw((0, 0))
            pygame.draw.rect(self.mKernel.DisplaySurface(), (0, 0, 0),
                             pygame.Rect(210, 140, 360, 260))
            self.mKernel.DisplaySurface().blit(self.mLevelCompleteImage,
                                               self.mLevelCompleteRect)
            self.mKernel.DisplaySurface().blit(
                scoreSurf,
                pygame.Rect(380 - int(math.floor(scoreRect.width / 2)), 300,
                            scoreRect.width, scoreRect.height))
        elif (self.mLosses >= 3):
            self.mMaze.Draw((0, 0))
            self.mMonster.Draw()
            pygame.draw.rect(self.mKernel.DisplaySurface(), (0, 0, 0),
                             pygame.Rect(210, 140, 380, 280))
            self.mKernel.DisplaySurface().blit(self.mGameOverImage,
                                               self.mGameOverRect)
            self.mKernel.DisplaySurface().blit(
                scoreSurf,
                pygame.Rect(380 - int(math.floor(scoreRect.width / 2)), 300,
                            scoreRect.width, scoreRect.height))
        else:
            self.mMaze.Draw(self.mHoverTile)
            self.mMonster.Draw()

        pygame.draw.rect(self.mKernel.DisplaySurface(), Colors.BLUE,
                         pygame.Rect(0, 560, 800, 40))
        self.mKernel.DisplaySurface().blit(self.mScoreImage, self.mScoreRect)
        self.mKernel.DisplaySurface().blit(self.mMovesImage, self.mMovesRect)
        self.mKernel.DisplaySurface().blit(self.mLevelImage, self.mLevelRect)

        self.mKernel.DisplaySurface().blit(scoreSurf, scoreRect)

        moveSurf = self.mFont.render(str(self.mMoves), True, (0, 0, 0))
        moveRect = moveSurf.get_rect()
        moveRect.topleft = self.mMovesRect.topleft
        moveRect.left = moveRect.left + self.mMovesRect.width + 10
        self.mKernel.DisplaySurface().blit(moveSurf, moveRect)

        levelSurf = self.mFont.render(str(self.mLevel), True, (0, 0, 0))
        levelRect = levelSurf.get_rect()
        levelRect.topleft = self.mLevelRect.topleft
        levelRect.left = levelRect.left + self.mLevelRect.width + 10

        self.mKernel.DisplaySurface().blit(levelSurf, levelRect)
        self.mKernel.DisplaySurface().blit(self.mVolumeImage, self.mVolumeRect)

        return RoboPy.GameState.Update(self, delta)