Implements basic map generation
Adds a simple map generation system. The generator creates a path from the bottom row to the top row, with random horizontal movements and a configurable probability of moving up. The map is then printed to the console for debugging and visualization.
This commit is contained in:
parent
02b3be35b0
commit
bf09402bc5
3 changed files with 170 additions and 0 deletions
158
utility/MapGenerator.gd
Normal file
158
utility/MapGenerator.gd
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
extends Node
|
||||
class_name MapGenerator
|
||||
|
||||
# Map constants
|
||||
const GRID_WIDTH = 4
|
||||
const GRID_HEIGHT = 4
|
||||
const EMPTY = 0
|
||||
const PATH = 1
|
||||
const START = 2
|
||||
const FINISH = 4
|
||||
const UP_CELL = 3
|
||||
|
||||
# Map generation parameters
|
||||
var up_probability_base = 0.1 # Base probability to move up
|
||||
var up_probability_increase = 0.2 # How much the probability increases each time we stay on the same row
|
||||
|
||||
# The map grid
|
||||
var map = []
|
||||
|
||||
func generate_map():
|
||||
# Initialize map with empty cells
|
||||
map = []
|
||||
for y in range(GRID_HEIGHT):
|
||||
var row = []
|
||||
for x in range(GRID_WIDTH):
|
||||
row.append(EMPTY)
|
||||
map.append(row)
|
||||
|
||||
# Pick a starting location in the bottom row
|
||||
var current_x = randi() % GRID_WIDTH
|
||||
var current_y = GRID_HEIGHT - 1
|
||||
|
||||
# Mark as start
|
||||
map[current_y][current_x] = START
|
||||
|
||||
# Track visited cells to avoid loops
|
||||
var visited = {}
|
||||
visited[Vector2(current_x, current_y)] = true
|
||||
|
||||
# Path generation
|
||||
var final_position = generate_path(current_x, current_y, visited)
|
||||
|
||||
# Set finish cell in top row and connect path to it
|
||||
connect_to_finish(final_position.x, final_position.y, visited)
|
||||
|
||||
# Generate path from start to top row, return final position
|
||||
func generate_path(current_x, current_y, visited):
|
||||
var up_probability = up_probability_base
|
||||
|
||||
while current_y > 0: # Continue until we reach the top row
|
||||
# Try to move left or right until we can't proceed further
|
||||
var can_move_horizontal = true
|
||||
|
||||
while can_move_horizontal:
|
||||
# Decide whether to try moving up
|
||||
if randf() < up_probability:
|
||||
# We'll try moving up
|
||||
break
|
||||
|
||||
# Increase probability for next time
|
||||
up_probability += up_probability_increase
|
||||
|
||||
# Choose direction randomly (left or right)
|
||||
var direction = 1 if randf() > 0.5 else -1
|
||||
var new_x = current_x + direction
|
||||
|
||||
# Check if we can move in that direction
|
||||
if new_x >= 0 and new_x < GRID_WIDTH and not Vector2(new_x, current_y) in visited:
|
||||
current_x = new_x
|
||||
map[current_y][current_x] = PATH
|
||||
visited[Vector2(current_x, current_y)] = true
|
||||
else:
|
||||
# Try the other direction
|
||||
direction = -direction
|
||||
new_x = current_x + direction
|
||||
|
||||
if new_x >= 0 and new_x < GRID_WIDTH and not Vector2(new_x, current_y) in visited:
|
||||
current_x = new_x
|
||||
map[current_y][current_x] = PATH
|
||||
visited[Vector2(current_x, current_y)] = true
|
||||
else:
|
||||
# Can't move horizontally anymore
|
||||
can_move_horizontal = false
|
||||
|
||||
# Mark current cell as an UP_CELL before moving up
|
||||
map[current_y][current_x] = UP_CELL
|
||||
|
||||
# Move up
|
||||
current_y -= 1
|
||||
map[current_y][current_x] = PATH
|
||||
visited[Vector2(current_x, current_y)] = true
|
||||
|
||||
# Reset up probability since we've moved up
|
||||
up_probability = up_probability_base
|
||||
|
||||
# Return the final position (on the top row)
|
||||
return Vector2(current_x, current_y)
|
||||
|
||||
# Connect the path to a finish point in the top row
|
||||
func connect_to_finish(current_x, current_y, visited):
|
||||
# Choose a finish position
|
||||
var finish_x = randi() % GRID_WIDTH
|
||||
|
||||
# If we randomly picked the current position, we're done
|
||||
if finish_x == current_x:
|
||||
map[current_y][current_x] = FINISH
|
||||
return
|
||||
|
||||
# Otherwise, create a path to the finish
|
||||
var direction = 1 if finish_x > current_x else -1
|
||||
|
||||
# Move horizontally toward the finish position
|
||||
while current_x != finish_x:
|
||||
current_x += direction
|
||||
|
||||
# If we've already visited this cell, we have a loop - break and place finish here
|
||||
if Vector2(current_x, current_y) in visited:
|
||||
break
|
||||
|
||||
map[current_y][current_x] = PATH
|
||||
visited[Vector2(current_x, current_y)] = true
|
||||
|
||||
# Place finish at the final position
|
||||
map[current_y][current_x] = FINISH
|
||||
|
||||
func print_map():
|
||||
print("Generated Map:")
|
||||
print("- Legend: 0=Empty, 1=Path, 2=Start, 4=Finish, 3=MoveUp")
|
||||
print("")
|
||||
|
||||
var visual_map = ""
|
||||
|
||||
for y in range(GRID_HEIGHT):
|
||||
var row_str = ""
|
||||
for x in range(GRID_WIDTH):
|
||||
var cell_value = map[y][x]
|
||||
match cell_value:
|
||||
EMPTY: row_str += "[ ] "
|
||||
PATH: row_str += "[•] "
|
||||
START: row_str += "[S] "
|
||||
FINISH: row_str += "[F] "
|
||||
UP_CELL: row_str += "[↑] "
|
||||
visual_map += row_str + "\n"
|
||||
|
||||
print(visual_map)
|
||||
|
||||
# Also print as numerical grid
|
||||
visual_map = ""
|
||||
for y in range(GRID_HEIGHT):
|
||||
var row_str = ""
|
||||
for x in range(GRID_WIDTH):
|
||||
row_str += str(map[y][x]) + " "
|
||||
visual_map += row_str + "\n"
|
||||
|
||||
print(visual_map)
|
||||
|
||||
func get_map():
|
||||
return map
|
||||
Loading…
Add table
Add a link
Reference in a new issue