Skip to content
Kerplo-llohllPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

贪吃蛇

用 Python 标准库写的贪吃蛇,界面是 tkinter,不需要安装任何第三方库。

运行

cd text/snake
python snake.py

操作

按键 作用
↑ ↓ ← → 或 W A S D 转向
空格 暂停 / 继续;游戏结束后重开
R 重开一局
Esc 退出

规则

  • 吃到红色食物得 1 分,蛇身变长一节。
  • 每得 1 分,移动速度略微加快(140ms/步 起步,最快 55ms/步)。
  • 撞墙或撞到自己即结束。
  • 不能 180 度掉头。连按两个方向键时,每步只消费一次转向,避免"先按上再按下"把自己撞死。
  • 最高分存在 highscore.txt,下次启动自动读取。

文件

文件 内容
game.py 核心逻辑(纯 Python,不依赖界面库)
snake.py tkinter 界面与入口
test_game.py 无界面测试
build_exe.ps1 打包脚本
vendor_pyinstaller.py 不走 pip 安装 PyInstaller(见下文)
dist\贪吃蛇\ 可运行的程序文件夹(主产物)
dist\贪吃蛇.zip 上面那个文件夹的压缩包,10.7 MB,方便拷走
_vendor\ 构建依赖,可删(删了下次打包会自动重新下载)

逻辑和界面是分开的,game.py 可以脱离界面单独测试和复用。

打包成 exe

cd text\snake
powershell -NoProfile -ExecutionPolicy Bypass -File .\build_exe.ps1

产出在 dist\:

产物 大小 说明
dist\贪吃蛇\贪吃蛇.exe 28 MB / 956 文件 主产物,双击就玩
dist\贪吃蛇.zip 10.7 MB 上面那个文件夹的压缩包,拷给别人用这个

用法:把 贪吃蛇.zip 解压到任意目录,双击里面的 贪吃蛇.exe。 整个文件夹要一起拷贝,只拷 exe 是跑不起来的。

为什么默认不用单文件(--onefile)

单文件看起来更方便,但它每次启动都要先把自身解包到 %TEMP%。一旦系统 临时目录不可写、被安全软件拦截或路径异常,就会弹出:

Could not create temporary directory!

然后完全无法启动——而且窗口模式下没有任何控制台输出,很难排查。文件 夹形态(--onedir)不依赖 %TEMP%,实测稳定,所以作为默认。

确实需要单文件可以加开关,但要留意上面的风险:

.\build_exe.ps1 -OneFile     # 产出 dist\贪吃蛇.exe
.\build_exe.ps1 -NoZip       # 不生成 zip

关于 PyInstaller 的安装

PyInstaller 装在项目内的 _vendor\,不污染系统 Python。这里没有用 pip: 本机的 pip 在解包阶段会稳定报 Errno 13 Permission denied(读自己刚写的 .whl.metadata 都被拒),换临时目录、加重试都没用。所以 vendor_pyinstaller.py 改成直接从 PyPI 取 wheel、在内存里用 zipfile 解开写盘,全程不产生临时文件:

python vendor_pyinstaller.py            # 装到本目录的 _vendor\
python vendor_pyinstaller.py --target D:\deps

build_exe.ps1 发现 _vendor 缺失时会自动调用它。你若在正常环境里, 用 pip install pyinstaller 也一样。

存档位置

打包后的 highscore.txt 写在 exe 所在目录,删掉它等于清零最高分。 若 exe 放在不可写目录(如 Program Files),会自动回退到 %APPDATA%\Snake\。源码运行时则写在 snake.py 旁边。

重新打包

改完代码后直接再跑一次 build_exe.ps1,--noconfirm --clean 会覆盖旧产物。 build\、*.spec、_tmp\ 都是中间文件,可以删。

测试

cd text/snake
python test_game.py

29 个用例覆盖:初始状态、移动、吃食物变长、通关、撞墙、撞自己、 "走进尾巴允许"、掉头被拒、快速连按不反向、暂停冻结、重开、加速曲线; 最后有一个界面冒烟测试——它会真的建一个窗口、跑几个 tick、重绘并关闭 (无图形环境时自动跳过)。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages