庙算兵推:使用Streamlit框架构建了一个智能作战推演系统。

news2025/4/18 19:54:49

这段代码是一个完整的军事模拟应用,使用Streamlit框架构建了一个智能作战推演系统。该系统包括了三维地图显示、作战单位管理、应急事件处理等功能。用户可以通过界面控制推演的开始和暂停,调整时间加速倍率,并查看实时的战斗情况和系统状态。

 

import streamlit as st
import pandas as pd
import numpy as np
import pydeck as pdk
from datetime import datetime, timedelta
import time
import threading
from PIL import Image

# 深度定制化配置
st.set_page_config(
    page_title="智能作战推演系统-战术版",
    layout="wide",
    initial_sidebar_state="collapsed",
    menu_items={
        'Get Help': 'https://example.com',
        'Report a bug': None,
        'About': "战术推演系统 v3.2 [机密]"
    }
)


# ----------------- 核心数据模型 -----------------
class TacticalUnit:
    def __init__(self, name, unit_type, position):
        self.name = name
        self.unit_type = unit_type
        self.position = position
        self.status = "active"
        self.last_update = datetime.now()

    def update_position(self, new_pos):
        self.position = [
            self.position[0] + np.random.uniform(-0.02, 0.02),
            self.position[1] + np.random.uniform(-0.02, 0.02)
        ]
        self.last_update = datetime.now()


class EmergencyEvent:
    EVENT_TYPES = ['火灾', '设备故障', '群众报警', '线路抢修']

    def __init__(self):
        self.event_id = f"EVENT-{int(time.time())}"
        self.event_type = np.choice(self.EVENT_TYPES)
        self.location = [116.3975 + np.random.uniform(-0.1, 0.1),
                         39.9085 + np.random.uniform(-0.1, 0.1)]
        self.status = "处置中"
        self.timestamp = datetime.now()


# ----------------- 全局状态初始化 -----------------
def init_session_state():
    required_states = {
        'sim_running': False,
        'speed_ratio': 100,
        'tactical_units': {
            '红方': [TacticalUnit(f"Fighter{i + 1}", "歼-20", [116.3 + i * 0.02, 39.9]) for i in range(6)],
            '蓝方': [TacticalUnit(f"Striker{i + 1}", "F-35", [116.5 + i * 0.02, 39.8]) for i in range(6)]
        },
        'emergency_events': [],
        'communication_status': {
            'ghost_attack': False,
            'last_incident': None
        },
        'system_status': {
            'radar_angle': 45,
            'missile_status': "待发",
            '3d_mode': True
        }
    }

    for key, val in required_states.items():
        if key not in st.session_state:
            st.session_state[key] = val


# ----------------- 三维可视化引擎 -----------------
def render_combat_map():
    unit_data = []
    # 生成红蓝双方单位数据
    for side in ['红方', '蓝方']:
        for unit in st.session_state.tactical_units[side]:
            unit_data.append({
                "position": unit.position,
                "name": unit.name,
                "color": [255, 0, 0] if side == '红方' else [0, 0, 255]
            })

    # 核心图层配置
    layers = [
        pdk.Layer(
            "ScatterplotLayer",
            id="combat-units",
            data=unit_data,
            get_position="position",
            get_fill_color="color",
            get_radius=500,
            pickable=True,
            opacity=0.8,
            stroked=True
        ),
        pdk.Layer(
            "TextLayer",
            id="unit-labels",
            data=unit_data,
            get_position="position",
            get_text="name",
            get_color=[255, 255, 255],
            get_size=16,
            get_angle=0,
            font_settings={"fontFamily": "Arial Black"}
        )
    ]

    # 应急事件图层
    if st.session_state.emergency_events:
        emergency_layer = pdk.Layer(
            "HeatmapLayer",
            data=[e.location for e in st.session_state.emergency_events],
            get_position="[lon, lat]",
            radius=10000,
            threshold=0.85,
            intensity=0.7,
            color_range=[
                [255, 255, 0, 150],
                [255, 165, 0, 200],
                [255, 0, 0, 255]
            ]
        )
        layers.append(emergency_layer)

    return pdk.Deck(
        layers=layers,
        initial_view_state=pdk.ViewState(
            latitude=39.9,
            longitude=116.4,
            zoom=9,
            pitch=60,
            bearing=0
        ),
        tooltip={"html": "<b>作战单位:</b> {name}"},
        map_style='mapbox://styles/mapbox/dark-v10'
    )


# ----------------- 界面组件 -----------------
def left_control_panel():
    with st.container():
        st.header("🛡️ 作战序列")
        for side in ['红方', '蓝方']:
            with st.expander(f"**{side} 作战单位**", expanded=True):
                df = pd.DataFrame([
                    {
                        "名称": unit.name,
                        "类型": unit.unit_type,
                        "状态": unit.status,
                        "最后更新": unit.last_update.strftime("%H:%M:%S")
                    } for unit in st.session_state.tactical_units[side]
                ])
                st.dataframe(
                    df,
                    use_container_width=True,
                    hide_index=True,
                    column_config={
                        "最后更新": st.column_config.DatetimeColumn(format="HH:mm:ss")
                    }
                )


def right_status_panel():
    with st.container():
        # 战术时钟
        st.markdown(f"""
            <div class="tactical-clock">
                <span>作战时间:</span>
                <span class="time-digital">
                    {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
                </span>
            </div>
        """, unsafe_allow_html=True)

        # 应急响应
        st.subheader("🚨 实时警情", divider="grey")
        if st.session_state.emergency_events:
            event = st.session_state.emergency_events[-1]
            cols = st.columns([1, 3])
            cols[0].image(Image.open("alert_icon.png"), width=60)
            cols[1].markdown(f"""
                **{event.event_type}** 事件\n
                🔥 等级:{np.random.randint(1, 5)}级\n
                📍 坐标:{event.location[0]:.4f}, {event.location[1]:.4f}
            """)

        # 通信状态
        st.subheader("📶 战场通信", divider="grey")
        comm_status = st.session_state.communication_status
        if comm_status['ghost_attack']:
            cols = st.columns([1, 4])
            cols[0].image(Image.open("ghost_icon.png"), width=40)
            cols[1].error("**Ghost协议攻击检测中!**")
        else:
            st.success("量子信道加密正常")

        # 系统参数
        st.subheader("⚙️ 战术参数", divider="grey")
        sys = st.session_state.system_status
        st.metric("雷达扫描角度", f"{sys['radar_angle']}°")
        st.metric("导弹发射状态", sys['missile_status'])
        st.toggle("3D战术视图", value=sys['3d_mode'])


# ----------------- 主界面布局 -----------------
def main_interface():
    st.title("智能作战推演系统")

    # 顶部控制栏
    with st.container(height=60):
        cols = st.columns([2, 3, 2, 2])
        selected_scenario = cols[0].selectbox("推演剧本", ["红蓝对抗", "城市防空", "海上拦截"])
        speed_ratio = cols[1].slider("时间加速", 1, 1000, 100)
        sim_button = cols[2].button("▶️ 启动推演" if not st.session_state.sim_running else "⏸️ 暂停推演")
        current_time = cols[3].metric("系统时间", datetime.now().strftime("%H:%M:%S"))

        if sim_button:
            st.session_state.sim_running = not st.session_state.sim_running
            st.session_state.speed_ratio = speed_ratio

    # 主战场布局
    col1, col2, col3 = st.columns([2.5, 6, 2.5])

    with col1:
        left_control_panel()

    with col2:
        deck = render_combat_map()
        st.pydeck_chart(deck)

        # 更新单位位置
        if st.session_state.sim_running:
            for side in ['红方', '蓝方']:
                for unit in st.session_state.tactical_units[side]:
                    unit.update_position(unit.position)

        # 底部状态栏
        with st.container(height=80):
            cols = st.columns(4)
            cols[0].metric("当前信道", "腾讯火山通道")
            cols[1].progress(0.85, text="通信质量")
            cols[2].code("Ghost防御协议: ACTIVE" if not st.session_state.communication_status[
                'ghost_attack'] else "DEFENSE BREACHED!")
            cols[3].button("🆘 应急响应协议")

    with col3:
        right_status_panel()


# ----------------- 样式定制 -----------------
st.markdown("""
<style>
    .stApp {
        background: #0a0a1a;
        color: #e0e0ff;
    }
    .deckgl-wrapper {
        border: 2px solid #303060 !important;
        border-radius: 8px;
        box-shadow: 0 0 15px #00ffff55;
    }
    .tactical-clock {
        background: #000033;
        padding: 12px;
        border-left: 4px solid #00a8ff;
        margin: 10px 0;
    }
    .time-digital {
        font-family: 'Courier New', monospace;
        color: #00ff00;
        font-size: 1.3em;
        text-shadow: 0 0 5px #00ff0077;
    }
    .st-emergency {
        border: 1px solid #ff4444;
        background: #ff000022;
        padding: 10px;
        border-radius: 5px;
    }
</style>
""", unsafe_allow_html=True)

# ----------------- 初始化执行 -----------------
if __name__ == "__main__":
    init_session_state()
    main_interface()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HDCP(四)

HDCP驱动开发实战深度解析 以下从协议栈架构、核心模块实现、安全设计到硬件集成&#xff0c;结合HDCP 2.x规范与主流硬件平台&#xff08;如ARM、FPGA&#xff09;特性&#xff0c;系统拆解驱动开发关键环节&#xff1a; 1. 协议栈架构与模块划分 驱动分层设计 硬件抽象层&…

Docker MySQL的主从同步 数据备份 数据同步 配置文件

创建主库 docker run \--namemysql_1 \-e MYSQL_ROOT_PASSWORD123456 \-p 3306:3306 \-v mysql_main_data:/var/lib/mysql \--restart unless-stopped \-d \mysql:8.0进入容器内部 docker exec -it mysql_1 bash查找配置文件 find / -name my.cnf复制出主机 docker cp mysql…

996引擎-疑难杂症:Ctrl + F9 编辑好的UI进入游戏查看却是歪的

Ctrl F9 编辑好UI后&#xff0c;进入游戏查看却是歪的。 检查Ctrl F10 是否有做过编辑。可以找到对应界面执行【清空】

JQuery初步学习

文章目录 一、前言二、概述2.1 介绍2.2 安装 三、语法3.1 文档就绪3.2 选择器 四、事件4.1 概述4.2 事件绑定/解绑4.3 一次性事件4.4 事件委托4.5 自定义事件 五、效果5.1 隐藏/显示5.2 淡入淡出5.3 滑动5.4 动画 六、链七、HTML7.1 内容/属性7.2 元素操作7.3 类属性7.4 样式属…

基于 Spring Boot 瑞吉外卖系统开发(三)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;三&#xff09; 分类列表 静态页面 实现功能所需要的接口 定义Mapper接口 Mapper public interface CategoryMapper extends BaseMapper<Category> {}定义Service接口 public interface CategoryService extends ISe…

winserver2022备份

安装备份&#xff0c;然后等待安装完成即可 然后可以在这里看到安装好的win server2022备份 一直下一步然后到这里 不要用本地文件夹备份 备份到远程服务器&#xff0c;远程服务器路径 然后确定备份即可 如何恢复呢&#xff1f; 点击右侧的恢复就可以了 打开任务计划程序 这…

GAT-GRAPH ATTENTION NETWORKS(论文笔记)

CCF等级&#xff1a;A 发布时间&#xff1a;2018年 代码位置 25年4月21日交 目录 一、简介 二、原理 1.注意力系数 2.归一化 3.特征组合与非线性变换 4.多头注意力 4.1特征拼接操作 4.2平均池化操作 三、实验性能 四、结论和未来工作 一、简介 图注意力网络&…

PDFBox/Itext5渲染生成pdf文档

目录 PDFBox最终效果实现代码 Itext5最终效果实现代码 PDFBox 使用PDFBox可以渲染生成pdf文档&#xff0c;并且自定义程度高&#xff0c;只是比较麻烦&#xff0c;pdf的内容位置都需要手动设置x&#xff08;横向&#xff09;和y&#xff08;纵向&#xff09;绝对位置&#xff…

PyTorch Tensor维度变换实战:view/squeeze/expand/repeat全解析

本文从图像数据处理、模型输入适配等实际场景出发&#xff0c;系统讲解PyTorch中view、squeeze、expand和repeat四大维度变换方法。通过代码演示对比不同方法的适用性&#xff0c;助您掌握数据维度调整的核心技巧。 一、基础维度操作方法 1. view&#xff1a;内存连续的形状重…

【NLP 面经 9、逐层分解Transformer】

目录 一、Transformer 整体结构 1.Tranformer的整体结构 2.Transformer的工作流程 二、Transformer的输入 1.单词 Embedding 2.位置 Embedding 计算公式&#xff1a; 三、Self-Attention 自注意力机制 1.Self-Attention 结构 ​编辑 2.Q、K、V的计算 代码实现 3.Self-Attenti…

这是一个文章标题

# Markdown 全语法示例手册本文档将全面演示 Markdown 的语法元素&#xff0c;包含 **标题**、**列表**、**代码块**、**表格**、**数学公式** 等 18 种核心功能。所有示例均附带实际应用场景说明。---## 一、基础文本格式### 1.1 标题层级 markdown # H1 (使用 #) ## H2 (使用…

xtrabackup备份

安装&#xff1a; https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/tarball/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz?_gl1*1ud2oby*_gcl_au*MTMyODM4NTk1NS4xNzM3MjUwNjQ2https://downloads.perc…

(51单片机)串口通讯(串口通讯教程)(串口接收发送教程)

前言&#xff1a; 今天有两个项目&#xff0c;分别为&#xff1a; 串口接收: 串口发送&#xff1a; 如上图将文件放在Keli5 中即可&#xff0c;然后烧录在单片机中就行了 烧录软件用的是STC-ISP&#xff0c;不知道怎么安装的可以去看江科大的视频&#xff1a; 【51单片机入门…

redis 延迟双删

Redis延迟双删是一种用于解决缓存与数据库数据一致性问题的策略&#xff0c;通常在高并发场景下使用。以下是其核心内容&#xff1a; 1. 问题背景 当更新数据库时&#xff0c;如果未及时删除或更新缓存&#xff0c;可能导致后续读请求仍从缓存中读取旧数据&#xff0c;造成数…

大语言模型中的幻觉现象深度解析

一、幻觉的定义及出现的原因 1. 基本定义 ​​幻觉(Hallucination)​​ 指大语言模型在自然语言处理过程中产生的与客观事实或既定输入相悖的响应&#xff0c;主要表现为信息失准与逻辑矛盾。 2. 幻觉类型与机制 2.1 事实性幻觉 ​​定义​​&#xff1a;生成内容与可验证…

详解如何从零用 Python复现类似 GPT-4o 的多模态模型

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

大模型训练关键两步

大模型的核心原理是基于深度学习&#xff0c;通过多层神经网络进行数据建模和特征提取。目前大部分的大模型采用的是Transformer架构&#xff0c;它采用了自注意力机制&#xff0c;能够处理长距离依赖关系&#xff0c;从而更好地捕捉文本的语义和上下文信息。大模型还结合了预训…

前端面试宝典---创建对象的配置

Object.create 对整个对象的多个属性值进行配置 创建对象 不可更改属性值 // 创建对象 不可更改属性值 let obj Object.create({}, {name: {value: lisi,writable: false,},age: {value: 20,writable: true,} })console.log(初始化obj, obj) obj.name wangwu console.log(…

【设计模式】创建型 -- 单例模式 (c++实现)

文章目录 单例模式使用场景c实现静态局部变量饿汉式&#xff08;线程安全&#xff09;懒汉式&#xff08;线程安全&#xff09;懒汉式&#xff08;线程安全&#xff09; 智能指针懒汉式(线程安全)智能指针call_once懒汉式(线程安全)智能指针call_onceCRTP 单例模式 单例模式是…

共享内存(与消息队列相似)

目录 共享内存概述 共享内存函数 &#xff08;1&#xff09;shmget函数 功能概述 函数原型 参数解释 返回值 示例 结果 &#xff08;2&#xff09;shmat函数 功能概述 函数原型 参数解释 返回值 &#xff08;3&#xff09;shmdt函数 功能概述 函数原型 参数解释…