《小猪快跑》小游戏
游戏代码# -*- coding: utf-8 -*-《小猪快跑》桌面版启动器用系统 WebView2(Edge) 内核加载游戏页面。import osimport sysimport webviewdef resource_path(name):base getattr(sys, _MEIPASS, None) or os.path.dirname(os.path.abspath(__file__))return os.path.join(base, name)def main():html resource_path(index.html)webview.create_window(小猪快跑 · 100关大冒险,html,width980, height640,min_size(900, 600),text_selectFalse,)# private_modeFalse 让 localStorage关卡进度/装扮/最高分持久保存webview.start(private_modeFalse, storage_pathos.path.join(os.environ.get(APPDATA, os.path.expanduser(~)), PigRunGame))if __name__ __main__:main()游戏音乐代码# -*- coding: utf-8 -*- 生成《小猪快跑》背景音乐 WAV 文件原创 chiptune《小猪波尔卡》 与游戏内 Web Audio 播放的是同一首曲子C大调、132bpm、8小节循环。 import math import wave import struct import random SR 44100 BPM 132 STEP 60 / BPM / 2 # 八分音符时长 NOTE_OFFSETS {C: 0, C#: 1, D: 2, D#: 3, E: 4, F: 5, F#: 6, G: 7, G#: 8, A: 9, A#: 10, B: 11} def freq(name): octv int(name[-1]) semi NOTE_OFFSETS[name[:-1]] return 440.0 * 2 ** ((octv - 4) * 12 semi - 9) / 4 MELODY [ E5,G5,C6,None,G5,None,E5,C5, A4,C5,E5,None,C5,None,A4,None, F5,A5,C6,A5,F5,A5,C6,A5, D5,G5,B5,G5,D5,G5,B5,G5, E5,G5,C6,None,B5,A5,G5,E5, A5,None,C6,B5,A5,G5,E5,D5, F5,G5,A5,None,C6,None,A5,G5, G5,A5,B5,None,D6,None,B5,G5, ] BASSROOT [C3,A2,F2,G2,C3,A2,F2,G2] random.seed(20260915) def osc_tri(p): # 三角波 return 2 * abs(2 * ((p % 1.0) - 0.5)) - 1 def osc_sq(p): # 方波 return 1.0 if (p % 1.0) 0.5 else -1.0 def osc_sin(p): return math.sin(2 * math.pi * p) def render(): total_steps len(MELODY) * 2 # 循环两遍 ≈ 29 秒 total int(total_steps * STEP * SR) SR // 4 buf [0.0] * total def add(start_t, samples, gain): i0 int(start_t * SR) for i, v in enumerate(samples): j i0 i if j total: buf[j] v * gain def note_wave(f, dur, kind, env.95): n int(dur * SR) out [] for i in range(n): p i / SR * f v osc_tri(p) if kind tri else osc_sq(p) e max(0.0, 1.0 - i / n * env) out.append(v * e) return out def oink(start_t): # 小猪哼哧快速下滑锯齿音 dur .2 n int(dur * SR) out [] for i in range(n): t i / SR f 700 * math.exp(-t * 9) 180 v osc_sin(f * t) e max(0.0, 1.0 - t / dur) out.append(v * e) add(start_t, out, .30) def kick(start_t): dur .15 n int(dur * SR) out [] for i in range(n): t i / SR f 110 * math.exp(-t * 22) 38 out.append(osc_sin(f * t) * max(0.0, 1 - t / dur)) add(start_t, out, .5) def snare(start_t): dur .09 n int(dur * SR) out [] for i in range(n): t i / SR out.append((random.random() * 2 - 1) * max(0.0, 1 - t / dur)) add(start_t, out, .18) def hat(start_t): dur .03 n int(dur * SR) out [] for i in range(n): t i / SR out.append((random.random() * 2 - 1) * max(0.0, 1 - t / dur)) add(start_t, out, .05) for step in range(total_steps): t step * STEP s step % 64 m MELODY[s] if m: add(t, note_wave(freq(m), STEP * .95, tri), .34) root freq(BASSROOT[s // 8]) bf root if s % 2 0 else root * 2 add(t, note_wave(bf, STEP * .85, sq), .13) if s % 8 in (0, 4): kick(t) if s % 8 in (2, 6): snare(t) hat(t) if s % 32 24: oink(t) # 轻限幅 淡出结尾 fade SR for i in range(total): v buf[i] v math.tanh(v * .9) if i total - fade: v * (total - i) / fade buf[i] v return buf def main(): data render() out 小猪快跑主题曲_小猪波尔卡.wav with wave.open(out, w) as w: w.setnchannels(1) w.setsampwidth(2) w.setframerate(SR) frames b.join(struct.pack(h, int(max(-1, min(1, v)) * 32767)) for v in data) w.writeframes(frames) print(OK -, out, f{len(data)/SR:.1f}s) if __name__ __main__: main()

相关新闻

PostgreSQL 使用 JOIN + GROUP BY + HAVING 查找拥有多条关联记录的数据行

PostgreSQL 使用 JOIN + GROUP BY + HAVING 查找拥有多条关联记录的数据行

文档教程知识库 【免费下载链接】til :memo: Today I Learned 项目地址: https://gitcode.com/gh_mirrors/ti/til 点击查看 免费下载 本篇技术指南讲解 PostgreSQL 中一个高频实战场景:在 one-to-many(一对多)表关联下&#xff0…

2026/10/13 17:56:15 阅读更多 →
从CC2530到ESP32-C6:Zigbee mesh组网实战与故障排查全攻略

从CC2530到ESP32-C6:Zigbee mesh组网实战与故障排查全攻略

上个月朋友喊我帮忙调一套温室大棚的无线采集方案,他手里堆了一堆 SPI 接口的 WiFi 模块,说要把几十个传感器节点组起来。我现场看了眼节点数量、电池供电方式和现场钢结构遮挡,直接劝他换成 Zigbee 组网方案。折腾了大半个月,从协…

2026/10/13 17:56:06 阅读更多 →
Spring AI 初体验:配好 yml 就能聊,ChatClient 四步链式调用

Spring AI 初体验:配好 yml 就能聊,ChatClient 四步链式调用

Spring AI 初体验:配好 yml 就能聊,ChatClient 四步链式调用作者:鱼宵 | Spring AI 实战精通营 第 1 篇上周有个同事在群里发了张截图:一个 Spring Boot 工程,代码里从头到尾没出现一个"模型"类…

2026/10/11 10:26:29 阅读更多 →

最新新闻

弗洛伊德解梦:噩梦为何也是潜意识的愿望满足?

弗洛伊德解梦:噩梦为何也是潜意识的愿望满足?

你有没有做过这种梦:明天就要交一份至关重要的方案,梦里你却发现自己连文件都找不到,或者更离谱,直接站在空无一人的考场里,试卷上的字全在飘。惊醒之后心跳半天才缓过来,第一反应往往是“这梦太丧了”。但…

2026/10/13 17:56:30 阅读更多 →
Codex 半年实战复盘:省 Token 技巧与高阶玩法全解析

Codex 半年实战复盘:省 Token 技巧与高阶玩法全解析

1. 半年迭代复盘:Codex 到底更新了哪些关键能力从去年底到现在,Codex 这个命令行编程智能体的更新节奏明显加快,几乎每隔两三周就会推一次有感知的变化。我自己的主力工作流已经全面切到 Codex 上,半年下来踩了不少坑,…

2026/10/13 17:56:30 阅读更多 →
t3code 深度解析:轻量级代码工具的设计思路与实操指南

t3code 深度解析:轻量级代码工具的设计思路与实操指南

1. 从“t3code”这个标题说起:它到底是什么,能解决什么问题第一次看到“t3code”这个标题,很多人会一头雾水。它不像“Python爬虫实战”那样直白,也不像“家庭咖啡烘焙指南”那样有明确场景。但恰恰是这种模糊性,给了我…

2026/10/13 17:56:30 阅读更多 →
Delphi老项目救星:KonopkaControls控件包安装与实战避坑指南

Delphi老项目救星:KonopkaControls控件包安装与实战避坑指南

简介:面向Delphi 13.1开发者的KonopkaControls 8.0.1控件包,是扩展VCL标准组件库的第三方界面控件集合,能有效补充原生控件在界面表现与交互能力上的不足,适合桌面应用开发及快速原型构建。压缩包共2000个文件,包含112…

2026/10/13 17:56:30 阅读更多 →
内容质量检查流水线:从错别字到失效链接的全面校验

内容质量检查流水线:从错别字到失效链接的全面校验

前阵子我在整理自己博客后台时,翻到一篇半年前阅读量还不错的旧文,发现里面躺着一个前期完全没注意到的错别字,还有一个早就失效的外部链接。那种感觉很难形容,就像精心布置的客厅里,墙角偏偏有一块没擦干净的污渍。也…

2026/10/13 17:56:30 阅读更多 →
Service层命名规范:从见名知意到代码可维护性

Service层命名规范:从见名知意到代码可维护性

接手一个业务系统,我最怕看到的不是复杂算法,而是那种一打开就让人头晕的 Service 实现类。2000 行起步,方法名字从 process 到 handle 再到 doSomething,翻遍整个类也猜不出某个方法是干嘛的。命名这种事,看起来不影响…

2026/10/13 17:55:28 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →