Files
cultivation-world-simulator/create_map.py
2025-08-26 23:26:51 +08:00

581 lines
20 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from src.classes.tile import Map, TileType
from src.classes.essence import Essence, EssenceType
def create_cultivation_world_map() -> Map:
"""
创建修仙世界地图
尺寸: 70x50
西部大漠,南部雨林,北边冰原,最东部和最南部海洋
横向大河从大漠东部流向东南入海
北方纵向山脉
"""
game_map = Map(width=70, height=50)
# 创建基础地形
_create_base_terrain(game_map)
# 创建区域
_create_regions(game_map)
return game_map
def _create_base_terrain(game_map: Map):
"""创建基础地形"""
width, height = game_map.width, game_map.height
# 先创建默认平原
for x in range(width):
for y in range(height):
game_map.create_tile(x, y, TileType.PLAIN)
# 西部大漠 (x: 0-18)
for x in range(19):
for y in range(height):
game_map.tiles[(x, y)].type = TileType.DESERT
# 南部雨林 (y: 35-49)
for x in range(width):
for y in range(35, height):
if game_map.tiles[(x, y)].type != TileType.DESERT:
game_map.tiles[(x, y)].type = TileType.RAINFOREST
# 北边冰原 (y: 0-8)
for x in range(width):
for y in range(9):
if game_map.tiles[(x, y)].type != TileType.DESERT:
game_map.tiles[(x, y)].type = TileType.GLACIER
# 最东部海洋 (x: 65-69)
for x in range(65, width):
for y in range(height):
game_map.tiles[(x, y)].type = TileType.SEA
# 最南部海洋 (y: 46-49)
for x in range(width):
for y in range(46, height):
game_map.tiles[(x, y)].type = TileType.SEA
# 横向大河:从大漠东部(18, 25)流向东南入海,河流更宽
river_tiles = _calculate_wide_river_tiles()
for x, y in river_tiles:
if game_map.is_in_bounds(x, y):
game_map.tiles[(x, y)].type = TileType.WATER
# 北方纵向山脉 (x: 28-32, y: 5-20)
for x in range(28, 33):
for y in range(5, 21):
if game_map.tiles[(x, y)].type == TileType.PLAIN:
game_map.tiles[(x, y)].type = TileType.MOUNTAIN
# 添加其他地形类型
_add_other_terrains(game_map)
def _calculate_wide_river_tiles():
"""计算宽阔大河的所有水域tiles从(18, 25)流向东南到海洋宽度为3-4格"""
river_tiles = []
# 计算河流中心线
center_path = []
x, y = 18, 25
while x < 65 and y < 46:
center_path.append((x, y))
# 向东南流淌
if x < 40:
x += 1
if y < 35:
y += 1
else:
x += 2
y += 1
# 连接到海洋
while x < 68 and y < 48:
center_path.append((x, y))
x += 1
y += 1
# 根据中心线生成宽阔的河流
for i, (cx, cy) in enumerate(center_path):
# 河流宽度随位置变化:源头较窄,入海口较宽
width = 1 if i < len(center_path) // 3 else 2 if i < 2 * len(center_path) // 3 else 3
# 为每个中心点添加周围的水域
for dx in range(-width//2, width//2 + 1):
for dy in range(-width//2, width//2 + 1):
nx, ny = cx + dx, cy + dy
river_tiles.append((nx, ny))
return list(set(river_tiles)) # 去重
def _create_2x2_cities(game_map: Map):
"""创建2*2的城市区域"""
cities = [
{"name": "青云城", "base_x": 34, "base_y": 21, "description": "繁华都市的中心"},
{"name": "沙月城", "base_x": 14, "base_y": 19, "description": "沙漠绿洲中的贸易重镇"},
{"name": "翠林城", "base_x": 54, "base_y": 14, "description": "森林深处的修仙重镇"}
]
for city in cities:
base_x, base_y = city["base_x"], city["base_y"]
for dx in range(2):
for dy in range(2):
x, y = base_x + dx, base_y + dy
if game_map.is_in_bounds(x, y):
game_map.tiles[(x, y)].type = TileType.CITY
def _create_2x2_caves(game_map: Map):
"""创建2*2的洞穴区域"""
caves = [
{"name": "幽深洞府", "base_x": 35, "base_y": 5, "description": "冰原东部的神秘洞穴"},
{"name": "隐秘石窟", "base_x": 40, "base_y": 15, "description": "林海西部的古老石窟"}
]
for cave in caves:
base_x, base_y = cave["base_x"], cave["base_y"]
for dx in range(2):
for dy in range(2):
x, y = base_x + dx, base_y + dy
if game_map.is_in_bounds(x, y):
game_map.tiles[(x, y)].type = TileType.CAVE
def _create_2x2_ruins(game_map: Map):
"""创建2*2的遗迹区域"""
ruins = [
{"name": "古越遗迹", "base_x": 25, "base_y": 40, "description": "雨林深处的上古遗迹"},
{"name": "沧海遗迹", "base_x": 66, "base_y": 47, "description": "沉没在海中的远古文明遗迹"}
]
for ruin in ruins:
base_x, base_y = ruin["base_x"], ruin["base_y"]
for dx in range(2):
for dy in range(2):
x, y = base_x + dx, base_y + dy
if game_map.is_in_bounds(x, y):
game_map.tiles[(x, y)].type = TileType.RUINS
def _add_other_terrains(game_map: Map):
"""添加其他地形类型到合适位置"""
# 草原 (中部区域)
for x in range(20, 40):
for y in range(12, 25):
if game_map.tiles[(x, y)].type == TileType.PLAIN:
game_map.tiles[(x, y)].type = TileType.GRASSLAND
# 森林 (东中部区域)
for x in range(40, 60):
for y in range(10, 30):
if game_map.tiles[(x, y)].type == TileType.PLAIN:
game_map.tiles[(x, y)].type = TileType.FOREST
# 雪山 (北部山脉附近)
for x in range(25, 35):
for y in range(2, 8):
if game_map.tiles[(x, y)].type == TileType.GLACIER:
game_map.tiles[(x, y)].type = TileType.SNOW_MOUNTAIN
# 火山 (单独区域)
for x in range(52, 55):
for y in range(32, 35):
if game_map.tiles[(x, y)].type == TileType.PLAIN:
game_map.tiles[(x, y)].type = TileType.VOLCANO
# 创建2*2城市区域
_create_2x2_cities(game_map)
# 创建2*2洞穴区域
_create_2x2_caves(game_map)
# 创建2*2遗迹区域
_create_2x2_ruins(game_map)
# 农田 (城市附近,改为不与草原重叠的区域)
for x in range(33, 38):
for y in range(25, 30):
if game_map.tiles[(x, y)].type == TileType.PLAIN:
game_map.tiles[(x, y)].type = TileType.FARM
# 沼泽 (河流附近的低洼地区,避开雨林区域)
for x in range(42, 46):
for y in range(30, 34):
if game_map.tiles[(x, y)].type == TileType.PLAIN:
game_map.tiles[(x, y)].type = TileType.SWAMP
def _create_regions(game_map: Map):
"""创建区域并分配灵气"""
# 收集各地形的坐标
terrain_coords = {}
for x in range(game_map.width):
for y in range(game_map.height):
tile_type = game_map.tiles[(x, y)].type
if tile_type not in terrain_coords:
terrain_coords[tile_type] = []
terrain_coords[tile_type].append((x, y))
# 西域流沙 (大漠)
if TileType.DESERT in terrain_coords:
essence = Essence({
EssenceType.FIRE: 8,
EssenceType.EARTH: 7,
EssenceType.GOLD: 6,
EssenceType.WATER: 1,
EssenceType.WOOD: 2
})
game_map.create_region(
"西域流沙",
"茫茫大漠,黄沙漫天。此地火行灵气浓郁,土行次之,乃是修炼火系功法的绝佳之地。",
essence,
terrain_coords[TileType.DESERT]
)
# 南疆蛮荒 (雨林)
if TileType.RAINFOREST in terrain_coords:
essence = Essence({
EssenceType.WOOD: 9,
EssenceType.WATER: 6,
EssenceType.EARTH: 5,
EssenceType.FIRE: 3,
EssenceType.GOLD: 2
})
game_map.create_region(
"南疆蛮荒",
"古木参天,藤蔓缠绕。此地木行灵气极为浓郁,水行次之,是修炼木系功法和炼制灵药的宝地。",
essence,
terrain_coords[TileType.RAINFOREST]
)
# 极北冰原 (冰原)
if TileType.GLACIER in terrain_coords:
essence = Essence({
EssenceType.WATER: 8,
EssenceType.GOLD: 6,
EssenceType.EARTH: 4,
EssenceType.FIRE: 1,
EssenceType.WOOD: 3
})
game_map.create_region(
"极北冰原",
"千里冰封,万年不化。此地水行灵气充沛,金行次之,寒气逼人,唯有修炼寒冰功法者方可久居。",
essence,
terrain_coords[TileType.GLACIER]
)
# 无边碧海 (海洋)
if TileType.SEA in terrain_coords:
essence = Essence({
EssenceType.WATER: 10,
EssenceType.GOLD: 4,
EssenceType.WOOD: 3,
EssenceType.EARTH: 2,
EssenceType.FIRE: 1
})
game_map.create_region(
"无边碧海",
"浩瀚无垠,波涛汹涌。此地水行灵气达到极致,蕴含无穷玄机,是水系修士向往的圣地。",
essence,
terrain_coords[TileType.SEA]
)
# 天河奔流 (大河)
if TileType.WATER in terrain_coords:
essence = Essence({
EssenceType.WATER: 7,
EssenceType.WOOD: 5,
EssenceType.EARTH: 4,
EssenceType.GOLD: 3,
EssenceType.FIRE: 2
})
game_map.create_region(
"天河奔流",
"一江春水向东流,奔腾不息入东海。此河贯穿东西,水行灵气丰沛,滋养两岸万物生灵。",
essence,
terrain_coords[TileType.WATER]
)
# 青峰山脉 (山脉)
if TileType.MOUNTAIN in terrain_coords:
essence = Essence({
EssenceType.EARTH: 8,
EssenceType.GOLD: 7,
EssenceType.FIRE: 5,
EssenceType.WOOD: 3,
EssenceType.WATER: 2
})
game_map.create_region(
"青峰山脉",
"连绵起伏,直插云霄。此地土行灵气深厚,金行次之,乃是修炼土系功法和寻找天材地宝的胜地。",
essence,
terrain_coords[TileType.MOUNTAIN]
)
# 万丈雪峰 (雪山)
if TileType.SNOW_MOUNTAIN in terrain_coords:
essence = Essence({
EssenceType.WATER: 9,
EssenceType.GOLD: 8,
EssenceType.EARTH: 6,
EssenceType.FIRE: 1,
EssenceType.WOOD: 2
})
game_map.create_region(
"万丈雪峰",
"雪峰皑皑,寒风刺骨。此地水行与金行灵气并重,是修炼冰系神通和淬炼法宝的绝佳之地。",
essence,
terrain_coords[TileType.SNOW_MOUNTAIN]
)
# 碧野千里 (草原)
if TileType.GRASSLAND in terrain_coords:
essence = Essence({
EssenceType.WOOD: 6,
EssenceType.EARTH: 6,
EssenceType.WATER: 5,
EssenceType.GOLD: 3,
EssenceType.FIRE: 4
})
game_map.create_region(
"碧野千里",
"芳草萋萋,一望无际。此地木土并重,灵气平和,是修炼基础功法和放牧灵兽的理想之地。",
essence,
terrain_coords[TileType.GRASSLAND]
)
# 青云林海 (森林)
if TileType.FOREST in terrain_coords:
essence = Essence({
EssenceType.WOOD: 8,
EssenceType.WATER: 5,
EssenceType.EARTH: 4,
EssenceType.GOLD: 3,
EssenceType.FIRE: 3
})
game_map.create_region(
"青云林海",
"古树参天,绿意盎然。此地木行灵气浓郁,是修炼木系功法、采集灵草和驯服林间灵兽的宝地。",
essence,
terrain_coords[TileType.FOREST]
)
# 炎狱火山 (火山)
if TileType.VOLCANO in terrain_coords:
essence = Essence({
EssenceType.FIRE: 10,
EssenceType.EARTH: 7,
EssenceType.GOLD: 4,
EssenceType.WATER: 1,
EssenceType.WOOD: 1
})
game_map.create_region(
"炎狱火山",
"烈焰冲天,岩浆奔流。此地火行灵气达到极致,是修炼火系神通和锻造法宝的圣地,常人不可近。",
essence,
terrain_coords[TileType.VOLCANO]
)
# 为每个2*2城市、洞穴和遗迹创建独立区域
_create_city_regions(game_map)
_create_caves_regions(game_map)
_create_ruins_regions(game_map)
# 沃土良田 (农田)
if TileType.FARM in terrain_coords:
essence = Essence({
EssenceType.WOOD: 7,
EssenceType.EARTH: 7,
EssenceType.WATER: 6,
EssenceType.GOLD: 2,
EssenceType.FIRE: 3
})
game_map.create_region(
"沃土良田",
"土地肥沃,五谷丰登。此地木土并重,水行充沛,是种植灵药和培育灵植的理想之地。",
essence,
terrain_coords[TileType.FARM]
)
# 平原地带 (平原)
if TileType.PLAIN in terrain_coords:
essence = Essence({
EssenceType.EARTH: 5,
EssenceType.WOOD: 4,
EssenceType.WATER: 4,
EssenceType.GOLD: 3,
EssenceType.FIRE: 3
})
game_map.create_region(
"平原地带",
"地势平坦,灵气平和。此地五行均衡,是初学修炼者打基础和建立宗门的理想之地。",
essence,
terrain_coords[TileType.PLAIN]
)
# 迷雾沼泽 (沼泽)
if TileType.SWAMP in terrain_coords:
essence = Essence({
EssenceType.WATER: 7,
EssenceType.WOOD: 6,
EssenceType.EARTH: 5,
EssenceType.FIRE: 2,
EssenceType.GOLD: 3
})
game_map.create_region(
"迷雾沼泽",
"雾气缭绕,泥泞不堪。此地水木灵气浓郁,但瘴气丛生,是修炼毒功和寻找奇异灵草的危险之地。",
essence,
terrain_coords[TileType.SWAMP]
)
def _create_city_regions(game_map: Map):
"""为每个2*2城市创建独立区域"""
cities = [
{"name": "青云城", "base_x": 34, "base_y": 21, "description": "繁华都市,人烟稠密,商贾云集。此地金行灵气较为集中,是交易天材地宝、寻找机缘的重要场所。"},
{"name": "沙月城", "base_x": 14, "base_y": 19, "description": "沙漠绿洲中的贸易重镇,各路商队在此集结。金行灵气充沛,是修士补给和交流的重要据点。"},
{"name": "翠林城", "base_x": 54, "base_y": 14, "description": "森林深处的修仙重镇,木行灵气与金行灵气并重。众多修士在此栖居,是修炼和炼宝的理想之地。"}
]
for city in cities:
base_x, base_y = city["base_x"], city["base_y"]
city_coords = []
for dx in range(2):
for dy in range(2):
x, y = base_x + dx, base_y + dy
if game_map.is_in_bounds(x, y):
city_coords.append((x, y))
essence = Essence({
EssenceType.GOLD: 6,
EssenceType.EARTH: 5,
EssenceType.WOOD: 5,
EssenceType.WATER: 4,
EssenceType.FIRE: 4
})
game_map.create_region(
city["name"],
city["description"],
essence,
city_coords
)
def _create_caves_regions(game_map: Map):
"""为每个2*2洞穴创建独立区域"""
caves = [
{"name": "幽深洞府", "base_x": 35, "base_y": 5, "description": "冰原东部的神秘洞穴,深幽莫测,寒气逼人。此地水行与土行灵气并重,常有前辈留下的传承。"},
{"name": "隐秘石窟", "base_x": 40, "base_y": 15, "description": "林海西部的古老石窟,木行与土行灵气交融,机缘与危险并存。"}
]
for cave in caves:
base_x, base_y = cave["base_x"], cave["base_y"]
cave_coords = []
for dx in range(2):
for dy in range(2):
x, y = base_x + dx, base_y + dy
if game_map.is_in_bounds(x, y):
cave_coords.append((x, y))
# 根据洞穴位置调整灵气配置
if cave["name"] == "幽深洞府": # 冰原东部
essence = Essence({
EssenceType.WATER: 7,
EssenceType.EARTH: 6,
EssenceType.GOLD: 5,
EssenceType.FIRE: 2,
EssenceType.WOOD: 3
})
else: # 隐秘石窟,林海西部
essence = Essence({
EssenceType.WOOD: 7,
EssenceType.EARTH: 6,
EssenceType.WATER: 5,
EssenceType.GOLD: 4,
EssenceType.FIRE: 3
})
game_map.create_region(
cave["name"],
cave["description"],
essence,
cave_coords
)
def _create_ruins_regions(game_map: Map):
"""为每个2*2遗迹创建独立区域"""
ruins = [
{"name": "古越遗迹", "base_x": 25, "base_y": 40, "description": "雨林深处的上古遗迹,古藤缠绕,木行灵气与金行灵气交融。蕴藏古老功法与灵药配方。"},
{"name": "沧海遗迹", "base_x": 66, "base_y": 47, "description": "沉没在海中的远古文明遗迹,水行灵气浓郁,潮汐间偶有宝物现世。"}
]
for ruin in ruins:
base_x, base_y = ruin["base_x"], ruin["base_y"]
ruin_coords = []
for dx in range(2):
for dy in range(2):
x, y = base_x + dx, base_y + dy
if game_map.is_in_bounds(x, y):
ruin_coords.append((x, y))
# 根据遗迹位置调整灵气配置
if ruin["name"] == "古越遗迹": # 雨林深处
essence = Essence({
EssenceType.WOOD: 8,
EssenceType.GOLD: 6,
EssenceType.WATER: 5,
EssenceType.EARTH: 4,
EssenceType.FIRE: 3
})
else: # 沧海遗迹,海中
essence = Essence({
EssenceType.WATER: 9,
EssenceType.GOLD: 6,
EssenceType.EARTH: 3,
EssenceType.WOOD: 3,
EssenceType.FIRE: 2
})
game_map.create_region(
ruin["name"],
ruin["description"],
essence,
ruin_coords
)
if __name__ == "__main__":
# 创建地图
cultivation_map = create_cultivation_world_map()
print(f"修仙世界地图创建完成!尺寸: {cultivation_map.width}x{cultivation_map.height}")
# 统计各地形类型
terrain_count = {}
regions_count = {}
for x in range(cultivation_map.width):
for y in range(cultivation_map.height):
tile = cultivation_map.get_tile(x, y)
tile_type = tile.type.value
if tile_type not in terrain_count:
terrain_count[tile_type] = 0
terrain_count[tile_type] += 1
region = cultivation_map.get_region(x, y)
if region.name not in regions_count:
regions_count[region.name] = 0
regions_count[region.name] += 1
print("各地形类型分布:")
for terrain_type, count in terrain_count.items():
print(f" {terrain_type}: {count}个地块")
print("\n各区域分布:")
for region_name, count in regions_count.items():
print(f" {region_name}: {count}个地块")