All pastes #521893 Raw Edit

kpl stuff

public text v1 · immutable
#521893 ·published 2007-05-30 09:14 UTC
rendered paste body
Program MazeGame

	Structure Cell
		North	As Bool
		South	As Bool
		East	As Bool
		West	As Bool
		Index	As Int 
		Visited As Bool
	End Structure 
	
	Define MazeColumns As Int = 25
	Define MazeRows As Int = 25
	Define CellSize As Int = 25   
	
	Define PlayerX As Int = 1
	Define PlayerY As Int = 1
	
	Define PlayerLastX As Int = 1
	Define PlayerLastY As Int = 1
	
	Define LastRandomValue As Int 
	
	Define Maze As Cell[ MazeColumns * MazeRows ]
	
	Function GetRandomNeighbor( CurrentCellIndex As Int ) As Int
	
		Define Row As Int = (CurrentCellIndex - 1) / MazeColumns + 1
		Define Column As Int = (CurrentCellIndex - 1) - ( ( Row - 1 ) * MazeColumns ) + 1
		
		Define I As Int
		Define Neighbor As Int = Random( 1, 4 )
		
		For I = 1 To 4
		
			Select Neighbor
			
				Case 1
					If Column > 1 Then 
						If Not Maze[ CurrentCellIndex - 1 ].Visited Then
							Return CurrentCellIndex - 1
						End If
					End If
				End Case 
			
				Case 2 
					If Column < MazeColumns Then 
						If Not Maze[ CurrentCellIndex + 1 ].Visited Then
							Return CurrentCellIndex + 1
						End If
					End If 
				End Case 

				Case 3
					If Row > 1 Then 
						If Not Maze[ CurrentCellIndex - MazeColumns ].Visited Then 
							Return CurrentCellIndex - MazeColumns
						End If 
					End If 
				End Case 
				
				Case 4 
					If Row < MazeRows Then 
						If Not Maze[ CurrentCellIndex + MazeColumns ].Visited Then 
							Return CurrentCellIndex + MazeColumns
						End If 
					End If 
				End Case
				
			End Select
			
			If Neighbor = 4 Then 
				Neighbor = 1
			Else
				Neighbor = Neighbor + 1 
			End If
			
		Next
		
		// Didn't find any neighbors that are not yet visited, so return -1
		Return -1
	
	End Function
	
	Method RemoveWallBetween( Index1 As Int, Index2 As Int )
	
		Define Cell1 As Cell = Maze[ Index1 ]
		Define Cell2 As Cell = Maze[ Index2 ]
		
		Define y1 As Int = Cell1.Index / MazeColumns + 1
		Define x1 As Int = Cell1.Index - ( ( y1 - 1 ) * MazeColumns ) + 1
		
		Define y2 As Int = Cell2.Index / MazeColumns + 1
		Define x2 As Int = Cell2.Index - ( ( y2 - 1 ) * MazeColumns ) + 1
		
		// Do not even try to remove a wall if the cells are not direct neighbors
		If Abs( y1 - y2 ) + Abs( x1 - x2 ) <> 1 Then
			Return
		End If 
		
		// See if one cell is directly above the other
		If Abs( y1 - y2 ) = 1 Then
		
			If y1 < y2 Then
				Cell1.South = False
				Cell2.North = False
			Else
				Cell1.North = False
				Cell2.South = False
			End If 
			
		End If 
		
		// See if one cell is directly beside the other
		If Abs( x1 - x2 ) = 1 Then
		
			If x1 < x2 Then
				Cell1.East = False
				Cell2.West = False
			Else
				Cell1.West = False
				Cell2.East = False
			End If
			
		End If
		
		Cell1.Visited = True
		Cell2.Visited = True
		
	End Method 
	
	Method DrawCell( TheCell As Cell ) 

		Define Row As Int = TheCell.Index / MazeColumns + 1
		Define Column As Int = TheCell.Index - ( ( Row - 1 ) * MazeColumns ) + 1
		
		Define x As Int = Column * CellSize - CellSize / 2
		Define y As Int = Row * CellSize - CellSize / 2
		
		If TheCell.North Then
			DrawLine( x, y, x + CellSize, y )
		End If
		
		If TheCell.South Then
			DrawLine( x, y + CellSize, x + CellSize, y + CellSize )
		End If 
		
		If TheCell.East Then
			DrawLine( x + CellSize, y, x + CellSize, y + CellSize )
		End If
		
		If TheCell.West Then
			DrawLine( x, y, x, y + CellSize )
		End If 
		
	End Method
	
	Method DrawMaze()
	
		Clear( white )
		Color( darkblue )
		PenWidth( 2 )
		
		Define I As Int 
		For I = 1 To MazeRows * MazeColumns 
			DrawCell( Maze[ I ] )
		Next 
		
		RefreshScreen()
		
	End Method 
	
	Method InitializeCells()
	
		Define i As Int 
		Define Total As Int = MazeColumns * MazeRows 
		
		For i = 1 To Total 

			Maze[ i ].North = True
			Maze[ i ].South = True
			Maze[ i ].East = True
			Maze[ i ].West = True
			Maze[ i ].Visited = False
			
			Maze[ i ].Index = i - 1
			
		Next 
		
	End Method 
	
	Method GenerateMaze()
	
		InitializeCells()
		
		Define TotalCells As Int = ArrayLength( Maze )
		
		Define CurrentCell As Int = Random( 1, TotalCells )
		Define VisitedCells As Int = 1
		
		Define Neighbor As Int 
		
		Define Stack As Int[ TotalCells ]
		Define StackPointer As Int = 0
		
		While VisitedCells < TotalCells
		
			Neighbor = GetRandomNeighbor( CurrentCell )
			
			If Neighbor <> -1 Then
				
				RemoveWallBetween( CurrentCell, Neighbor )
				
				VisitedCells = VisitedCells + 1
			
				// Push CurrentCell onto the stack
				StackPointer = StackPointer + 1
				Stack[ StackPointer ] = CurrentCell 
				
				CurrentCell = Neighbor
				
			Else
			
				// Pop CurrentCell from the stack
				CurrentCell = Stack[ StackPointer ]
				StackPointer = StackPointer - 1 
				
			End If
		
		End While
		
	End Method
	
	Method ShowPlayer()
	
		PlayerX = 1
		PlayerY = 1
		
		PlayerLastX = 1
		PlayerLastY = 1
	
		MoveSpriteToPoint( "Player", PlayerX * CellSize - CellSize / 3, PlayerY * CellSize - CellSize / 3 )
		ShowSprite( "Player" )
	
		Define Timeline As Int[ GetSpriteFrameCount( "player" ) ]
		
		Define i As Int
		For i = 1 To ArrayLength( Timeline )
			Timeline[ i ] = 250
		Next
		
		SetSpriteAnimationTimeline( "Player", True, Timeline )
		
	End Method
	
	Method ShowEnd()
	
		MoveSpriteToPoint( "End", CellSize * MazeColumns - GetSpriteWidth( "End" ) / 2, CellSize * MazeRows - GetSpriteHeight( "End" ) / 2 )
		ShowSprite( "End" )
		
	End Method
	
	Method HandleKeys()
	
		Define CellIndex As Int = ( PlayerY - 1 ) * MazeColumns + ( PlayerX - 1 ) + 1
		Define CurrentCell As Cell = Maze[ CellIndex ]

		Define CurrentKey As String = GetKey()
	
		If CurrentKey = "up" And PlayerY > 1 Then
			If Not CurrentCell.North Then
				PlayerY = PlayerY - 1 
			End If
		End If 
	
		If CurrentKey = "down" And PlayerY < MazeRows Then
			If Not CurrentCell.South Then
				PlayerY = PlayerY + 1 
			End If
		End If 
	
		If CurrentKey = "left" And PlayerX > 1 Then
			If Not CurrentCell.West Then
				PlayerX = PlayerX - 1
			End If 
		End If 
	
		If CurrentKey = "right" And PlayerX < MazeColumns Then
			If Not CurrentCell.East Then
				PlayerX = PlayerX + 1 
			End If
		End If 

		If PlayerLastX <> PlayerX Or PlayerLastY <> PlayerY Then
		
			DrawLine( PlayerLastX * CellSize, PlayerLastY * CellSize, PlayerX * CellSize, PlayerY * CellSize )
			MoveSpriteToPoint( "Player", PlayerX * CellSize - CellSize / 3, PlayerY * CellSize - CellSize / 3 )
			
			PlayerLastX = PlayerX
			PlayerLastY = PlayerY
			
		End If
	
	End Method
	
	Method ResetMaze()
	
		GenerateMaze()
		DrawMaze()

		ShowPlayer()
		ShowEnd()
		
		PenWidth( 3 )
		Color( Yellow )
		
	End Method
		
	Method Main()

		SetDeviceCoordinates()

		LoadSprite( "Player", "lol.gif" )
		ScaleSprite( "Player", .95 )

		LoadSprite( "End", "block.gif" )
		ScaleSprite( "End", 0.65 )
		
		CellSize = GetSpriteWidth( "Player" ) * 1.25
		
		SetScreenSize( MazeColumns * CellSize + CellSize, MazeRows * CellSize + CellSize )
		Status( "Use the arrow keys to move the player through the maze" )
		
		ResetMaze()
		
		While True
		
			HandleKeys()
			RefreshScreen()
			
			If SpritesIntersect( "Player", "End" ) Then
				PlaySound( "tada" )
				Delay( 3000 )
				ResetMaze()
			End If
			
		End While

	End Method

End Program