webspace / app.py
ewebspace's picture
Update app.py
54aee5d verified
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import plotly.graph_objects as go
import random
import time
# Генератор процедурной вселенной
class UniverseGenerator:
def __init__(self):
self.galaxy_map = {}
self.planet_types = ['Lava', 'Ocean', 'Desert', 'Ice', 'Jungle', 'Toxic', 'Radioactive']
self.star_classes = ['O', 'B', 'A', 'F', 'G', 'K', 'M']
self.resources = ['Titanium', 'Quartz', 'Hydrogen', 'Neutronium', 'Exotic Matter']
def generate_system(self, seed):
random.seed(seed)
system = {
'name': f"{random.choice(self.star_classes)}-{random.randint(1000,9999)}",
'planets': [],
'position': (random.uniform(-100,100), random.uniform(-100,100), random.uniform(-100,100))
}
num_planets = random.randint(3, 8)
for i in range(num_planets):
planet_type = random.choice(self.planet_types)
planet = {
'name': f"{system['name']}-{chr(97+i)}",
'type': planet_type,
'resources': random.sample(self.resources, random.randint(1, 3)),
'fauna': random.randint(0, 15),
'flora': random.randint(0, 15),
'temperature': random.uniform(-200, 500),
'gravity': random.uniform(0.2, 2.5),
'size': random.uniform(0.5, 2.0)
}
system['planets'].append(planet)
return system
def generate_galaxy(self, num_systems=100):
for i in range(num_systems):
self.galaxy_map[f"System-{i}"] = self.generate_system(i)
return self.galaxy_map
# Игровой движок
class WebspaceEngine:
def __init__(self):
self.universe = UniverseGenerator()
self.galaxy = self.universe.generate_galaxy()
self.player = {
'position': (0, 0, 0),
'current_system': 'System-0',
'resources': {'Titanium': 10, 'Quartz': 5},
'ship': 'Explorer-class',
'credits': 1000
}
self.discovered_systems = ['System-0']
def travel_to_system(self, system_name):
if system_name in self.galaxy:
self.player['current_system'] = system_name
if system_name not in self.discovered_systems:
self.discovered_systems.append(system_name)
return self.galaxy[system_name]
return None
def scan_planet(self, planet_index):
system = self.galaxy[self.player['current_system']]
if 0 <= planet_index < len(system['planets']):
return system['planets'][planet_index]
return None
def mine_resources(self, planet_index, resource):
planet = self.scan_planet(planet_index)
if planet and resource in planet['resources']:
amount = random.randint(1, 5)
self.player['resources'][resource] = self.player['resources'].get(resource, 0) + amount
return f"Mined {amount} units of {resource}"
return "Resource not found"
# Графические функции
def create_galaxy_map(discovered_systems, galaxy_map):
fig = go.Figure()
for sys_name in discovered_systems:
system = galaxy_map[sys_name]
x, y, z = system['position']
# Звезда
fig.add_trace(go.Scatter3d(
x=[x], y=[y], z=[z],
mode='markers',
marker=dict(size=8, color='yellow'),
name=sys_name
))
# Планеты
for planet in system['planets']:
px = x + random.uniform(-3, 3)
py = y + random.uniform(-3, 3)
pz = z + random.uniform(-3, 3)
colors = {
'Lava': 'red',
'Ocean': 'blue',
'Desert': 'orange',
'Ice': 'lightblue',
'Jungle': 'green',
'Toxic': 'purple',
'Radioactive': 'greenyellow'
}
fig.add_trace(go.Scatter3d(
x=[px], y=[py], z=[pz],
mode='markers',
marker=dict(size=4, color=colors.get(planet['type'], 'gray')),
name=planet['name']
))
fig.update_layout(
scene=dict(
xaxis=dict(title='X'),
yaxis=dict(title='Y'),
zaxis=dict(title='Z')
),
margin=dict(l=0, r=0, b=0, t=0),
height=500
)
return fig
def create_planet_surface(planet_type):
size = 100
terrain = np.zeros((size, size))
# Генерация процедурного ландшафта
for i in range(size):
for j in range(size):
terrain[i][j] = (
np.sin(i/5) +
np.cos(j/7) +
np.sin(np.sqrt((i - size/2)**2 + (j - size/2)**2)/3)
)
# Цветовые схемы для разных планет
colormaps = {
'Lava': ['black', 'darkred', 'red', 'orange'],
'Ocean': ['darkblue', 'blue', 'cyan', 'white'],
'Desert': ['saddlebrown', 'sandybrown', 'wheat', 'white'],
'Ice': ['darkblue', 'lightblue', 'cyan', 'white'],
'Jungle': ['darkgreen', 'green', 'lightgreen', 'yellow'],
'Toxic': ['darkgreen', 'purple', 'fuchsia', 'pink'],
'Radioactive': ['darkgreen', 'green', 'greenyellow', 'yellow']
}
cmap = LinearSegmentedColormap.from_list("custom", colormaps.get(planet_type, ['gray']), N=256)
fig, ax = plt.subplots(figsize=(8, 8))
ax.imshow(terrain, cmap=cmap)
ax.axis('off')
plt.tight_layout()
return fig
# Инициализация движка
engine = WebspaceEngine()
# Gradio интерфейс
with gr.Blocks(title="Webspace Network") as demo:
gr.Markdown("# 🚀 Webspace Network")
gr.Markdown("### Cosmic Exploration Simulator (No Man's Sky inspired)")
with gr.Row():
with gr.Column(scale=1):
current_system = gr.Textbox(label="Current System", value=engine.player['current_system'])
system_info = gr.JSON(label="System Data")
planet_index = gr.Slider(0, 7, step=1, label="Planet Index")
scan_btn = gr.Button("🛰️ Scan Planet")
planet_info = gr.JSON(label="Planet Data")
resource_select = gr.Dropdown(engine.universe.resources, label="Resource to Mine")
mine_btn = gr.Button("⛏️ Mine Resource")
mine_result = gr.Textbox(label="Mining Result")
travel_target = gr.Dropdown(list(engine.galaxy.keys()), label="Select System")
travel_btn = gr.Button("🌌 Hyperjump")
player_resources = gr.JSON(label="Your Resources", value=engine.player['resources'])
with gr.Column(scale=2):
galaxy_map = gr.Plot(label="Galaxy Map")
planet_view = gr.Plot(label="Planet Surface")
# Обновление карты галактики
def update_galaxy_map():
return create_galaxy_map(engine.discovered_systems, engine.galaxy)
# Обновление информации о системе
def update_system_info():
system = engine.galaxy[engine.player['current_system']]
return {
"Name": system['name'],
"Position": [round(x, 2) for x in system['position']],
"Planets": len(system['planets'])
}
# Сканирование планеты
def scan_planet(idx):
planet = engine.scan_planet(int(idx))
if planet:
fig = create_planet_surface(planet['type'])
return planet, fig
return {}, None
# Добыча ресурсов
def mine_resource(resource, idx):
result = engine.mine_resources(int(idx), resource)
return result, engine.player['resources']
# Путешествие между системами
def travel_to_system(system):
engine.travel_to_system(system)
return {
"current_system": system,
"system_info": update_system_info(),
"galaxy_map": update_galaxy_map()
}
# Привязка событий
demo.load(
fn=update_galaxy_map,
outputs=galaxy_map
)
demo.load(
fn=update_system_info,
outputs=system_info
)
scan_btn.click(
fn=scan_planet,
inputs=planet_index,
outputs=[planet_info, planet_view]
)
mine_btn.click(
fn=mine_resource,
inputs=[resource_select, planet_index],
outputs=[mine_result, player_resources]
)
travel_btn.click(
fn=travel_to_system,
inputs=travel_target,
outputs=[current_system, system_info, galaxy_map]
)
current_system.change(
fn=update_system_info,
outputs=system_info
)
# Запуск приложения
if __name__ == "__main__":
demo.launch()