当前位置: 首页 > article >正文

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

这段代码是一个完整的军事模拟应用,使用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 = nameself.unit_type = unit_typeself.position = positionself.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_statusif 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_statusst.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_runningst.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()

相关文章:

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

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

daz3d ERC Freeze to Morph Target 和 另存为 Morph Asset(s)

. ERC 冻结至变形目标 (ERC Freeze to Morph Target) 核心目标&#xff1a;将骨架的调整与自定义造型的滑块关联起来。 详细解释&#xff1a; 当你创建一个自定义造型&#xff08;Morph&#xff09;并调整了骨架&#xff08;Rigging&#xff09;以适应这个新造型后&#xff…...

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…...

MATLAB在哪些特定领域比Python更有优势?

文章目录 前言科学研究与工程计算数值计算信号处理控制系统设计 教育领域易于学习和上手教学资源丰富 快速原型开发集成开发环境便捷 前言 MATLAB 在以下特定领域比 Python 更具优势&#xff1a; 科学研究与工程计算 数值计算 高效矩阵运算&#xff1a;MATLAB 以矩阵为基本数…...

linux安装mysql常出现的问题

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum update yum install mysql-server 权限设置&#xff1a; chown -R mysql:mysql /var/lib/mysql/ 初始化 MySQL&#xff1a; mysqld --initiali…...

C++手撕单链表及逆序打印

在学习数据结构的过程中&#xff0c;链表是一个非常重要的基础数据结构。今天&#xff0c;我们将通过C手动实现一个单链表&#xff0c;并添加一个逆序打印的功能&#xff0c;帮助大家更好地理解链表的实现和操作。 一、链表简介 链表是一种线性数据结构&#xff0c;其中每个元…...

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 样式属…...

repo仓库文件清理

1. repo 仓库内文件清理 # 清理所有Git仓库中的项目 repo forall -c git clean -dfx # 重置所有Git 仓库中的项目 repo forall -c git reset --hard 解释&#xff1a; repo forall -c git clean -dfx&#xff1a; repo forall 是一个用于在所有项目中执行命令的工具。-c 后…...

使用Docker部署Java项目的完整指南

前言 Docker是一个轻量级的容器化平台&#xff0c;可将应用及其依赖打包成标准化单元&#xff0c;实现快速部署和环境隔离。本文以Spring Boot项目为例&#xff0c;演示如何通过Dockerfile部署Java应用。 准备工作 本地环境 安装Docker Desktop&#xff08;官网下载&#xff0…...

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

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

TCP,UDP协议和域名地址

1.TCP&#xff08;传输控制协议&#xff09;是面向连接&#xff0c;UDP&#xff08;用户数据报协议&#xff09;是无连接的 2.应用层&#xff1a;FTP,HTTP,SMTP,TELNET,DNS,TFTP 传输层;TCP,UDP 网际层&#xff1a;IP,ICMP,ARP,RARP 3.TCP21:20端口数据传输&#xff1b;21端…...

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平均池化操作 三、实验性能 四、结论和未来工作 一、简介 图注意力网络&…...

SpringBoot和微服务学习记录Day1

分布式架构 为了解决大量的用户请求&#xff0c;需要多台服务器&#xff0c;为处理某些请求将一些服务器划分为一个集群&#xff0c;通过一种技术来处理集群的请求 典型应用&#xff1a; nginx&#xff1a;Tomcat集群 Redis&#xff1a;哨兵模式 MySQL&#xff1a;mycat 微…...

PDFBox/Itext5渲染生成pdf文档

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

前端获取不到后端新加的字段 解决方案

前端获取不到后端新加的字段 解决方案 sql 返回的是 FileInfo 对象 private String lastUpdateTimeStr;// 自定义 setLastUpdateTime 方法&#xff0c;确保在设置 lastUpdateTime 时自动格式化为字符串public void setLastUpdateTime(LocalDateTime lastUpdateTime) {this.las…...

【Java学习】AI时代下如何学习Java语言开发

学习 Java 语言开发时&#xff0c;合理借助 AI 工具可以提升效率、深化理解&#xff0c;以下是具体的学习策略和方法&#xff1a; 一、利用 AI 辅助基础学习 1. 智能文档解读与语法解析 工具&#xff1a;ChatGPT、Bing Chat、Google Bard用法&#xff1a; 直接提问基础语法问…...

联想拯救者Y9000K重装Ubuntu系统

USB刻录Ubuntu&#xff0c;并插入电脑。 进入官网https://rufus.ie/downloads/&#xff0c;安装4.0p版本&#xff0c;对应Ubuntu 22.04版本进入官网https://www.releases.ubuntu.com/22.04/&#xff0c;下载Ubuntu 22.04的iso文件插入一个空USB。运行rufus.exe&#xff0c;选择…...

罗技K860键盘

罗技蓝牙键盘的顶部功能键F1-F12的原本功能 单击罗技键盘的功能键时&#xff0c;默认响应的是键盘上面显示的快进、调节音量等功能。改变回F1~F12原本功能&#xff0c;同时按下 fn和esc组合键...

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…...

【线程有哪些状态?这些状态如何相互转换?阻塞和等待的状态有什么区别?】

线程状态及其转换与区别 线程的生命周期包含多个状态&#xff0c;不同状态之间的转换由线程调度和同步机制决定。以下是线程状态的详细说明、转换关系及阻塞与等待的区别&#xff1a; 一、线程的六种基本状态&#xff08;以Java为例&#xff09; 状态描述NEW&#xff08;新建…...

netty中的ChannelPipeline详解

Netty中的ChannelPipeline是事件处理链的核心组件,负责将多个ChannelHandler组织成有序的责任链,实现网络事件(如数据读写、连接状态变化)的动态编排和传播。以下从核心机制、执行逻辑到应用场景进行详细解析: 1. 核心结构与组成 双向链表结构 组成单元:ChannelPipeline…...

Ubuntu 24.04 中文输入法安装

搜狗输入法&#xff0c;在Ubuntu 24.04上使用失败&#xff0c;安装教程如下 https://shurufa.sogou.com/linux/guide 出现问题的情况&#xff0c;是这个帖子里描述的&#xff1a; https://forum.ubuntu.org.cn/viewtopic.php?t493893 后面通过google拼音输入法解决了&#x…...

踩雷,前端一直卡在获取token中

问题&#xff1a;一直卡在var token SecureStorage.Default.GetAsync("auth_token").Result; public VideoService(){_httpClient new HttpClient();var token SecureStorage.Default.GetAsync("auth_token");} 这是一个典型的同步等待异步操作导致的死…...

这是一个文章标题

# 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单片机入门…...