Python 小游戏⑥:2048 终端版
继 C 版 2048 之后,用 Python 重新实现:二维列表、移动合并算法与随机生成新块。读完你就能徒手写出能跑能玩的 4x4 数字合并游戏,还能自己加计分和动画效果。
手把手、分步骤,用 Python / C / C++ / JavaScript 从零做出能玩的小游戏,每个语言从简单到难:猜数字、贪吃蛇、扫雷、2048、井字棋、俄罗斯方块……
继 C 版 2048 之后,用 Python 重新实现:二维列表、移动合并算法与随机生成新块。读完你就能徒手写出能跑能玩的 4x4 数字合并游戏,还能自己加计分和动画效果。
猜数字是几乎所有程序员写过的第一个小游戏:电脑随机想一个 1 到 100 之间的数,你猜,它只告诉你"大了"还是"小了"
猜单词(Hangman)是经典的文字游戏:程序藏起一个单词,只显示字母个数,你一个个猜字母,猜对就亮出位置,猜错就少一次
布雷、翻开、扩散、标记——扫雷的经典算法用 Python 逐行实现,控制台也能玩。从零搭建棋盘、数字计算与洪水填充,最后得到一个完整的 9x9 扫雷游戏。
石头剪刀布(Paper-Scissors-Rock)规则人人皆知,但亲手用代码实现一遍,你会对"如何把现实规则翻译成程序
前四篇都在终端里玩文字游戏,这篇用 pygame 做经典贪吃蛇,首次接触"游戏主循环":每帧重复"处理输入 → 更新状态
井字棋(Tic-Tac-Toe)的棋盘只有 3×3,规则简单到一句话:谁先连成一线谁赢。但把它写成程序,你要处理输入校验
随机出词、计时计速、正确率统计——用 Python 做一个锻炼打字的小工具。掌握时间测量与逐字符比对,输出 WPM 速度与正确率,还能扩展成闯关模式。
4×4 卡片翻牌配对,考验记忆力,练会翻牌状态机。
地鼠随机冒头,点击得分,30 秒倒计时,练定时器与随机事件。
回溯算法自动生成题目、CLI 填数实时校验,理解深度优先搜索。
方向键控机、空格发射、敌机不断下落,碰撞检测与三条命。
随机数、循环对战、胜负统计——C 语言版的石头剪刀布,练习 switch 与随机数生成。用纯标准库实现人机对战,顺带学会输入校验和查表判胜负。
用 C 实现打字测速:读取输入、计时、统计正确率,体验字符级输入处理的细节。从 fgets 读行到逐字符比对,纯标准库完成,Linux 和 Windows 都能编译运行。
2048 是近几年最成功的休闲小游戏:规则一句话讲完,实现却大有讲究。它的核心是"滑动 + 合并"算法:每次移动所有方块
学完 C 语言的基础语法,很多人会陷入"什么都会、却什么都不会做"的尴尬。破解方法只有一个:动手做小项目。本文的猜数字是
猜数字只能练"比较",这一篇我们做一个真正会随机出题的小游戏:数学速算问答。程序自动生成加减乘除四则运算,你口算作答、答
前两篇我们一直在"猜"和"算",这一篇开始有真正的空间感。文本迷宫把地图存进二维数组,玩家用 WASD 控制 @ 穿行,
本系列收官之作,挑战经典中的经典——贪吃蛇。蛇由一串坐标组成,吃到食物变长,撞墙或咬到自己就结束。控制台版本采用"每按一
逐字母猜词,猜错六次吊死小人,练字符数组与字符串处理。
4×4 卡片翻牌配对,输入编号翻牌,练二维数组与洗牌。
按键驱动的控制台俄罗斯方块:矩阵旋转、碰撞检测、消行。
字符画飞机大战:移动开火、敌机下落、碰撞得分,纯标准库。
猜数字是经典入门游戏:程序随机生成 1~100 的秘密数字,不断猜测,程序提示"太大"或"太小",直到猜中。本文用面向对
扫雷是训练"数据结构思维"的好游戏:9×9 棋盘随机埋 10 颗雷,翻开格子,数字表示周围 8 格有几颗雷。本文用二维
Pong 是史上第一款商业电子游戏。在控制台里做 Pong 不需要图形库:用 ANSI 转义序列清屏重绘,用 termi
系列最后一篇:一个"剧情向"的文本 RPG,没有画面,全靠文字和想象力。玩家冒险、战斗、捡装备吃药水,把类、std::v
井字棋规则简单,却是练习"棋盘建模"和"AI 决策"的绝佳素材。你和电脑轮流落子,电脑带策略 AI——能赢就赢,赢不了就
用 deque 写蛇身,Snake 类管移动,经典控制台小游戏。
类封装棋盘与分数,滑动合并四方向复用同一套逻辑。
Board 与方块用类组织,旋转消行逻辑完整可跑。
用 HTML + CSS + JS 做出第一个网页小游戏:输入、反馈、计次,感受浏览器即开即玩的乐趣。
翻牌配对考验记忆力:洗牌算法、翻转动画、计时计步,一个游戏学三样东西。
Canvas 绘制 + 键盘控制 + 游戏循环——网页版贪吃蛇,移动端还能触屏玩。
点击落子、判断胜负、再来一局——用 DOM 操作实现经典井字棋,顺便练练状态管理。
地鼠随机冒头,点击得分:setInterval 定时器、随机出现、得分与倒计时机制全实战。
DOM 网格实现滑动合并,方向键操控,浏览器即开即玩。
Canvas 小球反弹物理,挡板跟鼠标,三条命,游戏循环入门。
左键翻开、右键插旗、首次点击不踩雷,洪泛展开与计时。
回溯求解器生成题目,点格填数实时校验,一键看答案。
C++11/14/17/20/23、Python 3.9→3.13、JavaScript ES6+ 与 C 标准演进:每个版本带来了什么、怎么写、值不值得升级。
如果把 C++ 的发展史比作一条河流,C++11 就是河上最大的一座水坝。2011 年发布后,这门"上了年纪"的语言彻底
C++14 常被看作 C++11 的"补完版":它没有 C++11 那种翻天覆地的变化,却把上一版留下的别扭之处一一抹平
C++17 是继 C++11 之后最大的一次更新,一口气引入了十几个实用特性。它没有 C++20 那么"重",却精准地解
C++20 是 C++ 史上最大的一次版本更新,被很多人称为"又一个 C++11"。概念让模板约束第一次有了"名字",协
C++23 是"每三年一版"节奏下的最新标准,已由 ISO 正式发布。它没有 C++20 那样的大爆炸,但带来的都是实打
Python 3.9 于 2020 年 10 月发布,是 2.x 彻底退出历史舞台之后、3.x 快速迭代期里一个容易被低
2021 年 10 月发布的 Python 3.10,是近十年来"语法变化最大"的一个版本:PEP 634 引入了 C
2022 年 10 月发布的 Python 3.11,可能是历史上"最该升级"的一个版本。Faster CPython
2023 年 10 月发布的 Python 3.12,表面波澜不惊,实则两个改动直击日常:一是 PEP 701 彻底解开
2024 年 10 月发布的 Python 3.13,是 CPython 历史上最"激进"的版本:可选的无 GIL 构建
2015 年 6 月,ECMAScript 6(简称 ES6,官方名称 ES2015)正式发布,这是 JavaScrip
ES6 发布之后,TC39 委员会改为"每年一版"的节奏:每年 6 月定稿一个新版本,名字按年份编号,如 ES2017、
ES2021 到 ES2024,JavaScript 依然按部就班地"小步快跑"。这四年没有像 async/await
距离 C99 发布 12 年之后,ISO 终于在 2011 年推出了新一代 C 标准 C11(ISO/IEC 9899:
C 语言的标准演进以"慢"著称:C11 之后,ISO 在 2018 年发布了 C17(ISO/IEC 9899:2018
按编程语言与主题分类,每组从简单到难循序渐进,支持搜索。
程序变慢时,第一反应往往是"让它同时干更多活"。Python 提供了线程、进程、协程三套并发方案,选对方案比写出代码更重
程序的核心能力之一就是"根据条件做选择、按规则反复执行"。Python 用 if / elif / else 表达分支,
变量是程序存放数据的"盒子",数据类型则决定了盒子里能装什么、能做什么运算。Python 是动态类型语言,写起来很自由,
程序跑起来容易,数据持久化才是关键。从零配置的 SQLite 到生产级的 MySQL,Python 的数据库接口高度统一
日志分析、订单统计、定时任务……几乎每个程序都要跟日期时间打交道。Python 的 datetime 模块功能强大但细节
装饰器是 Python 最优雅也最"劝退"的特性之一:它能在不改动原函数代码的前提下,给函数附加日志、计时、缓存等能力。
程序出错不可怕,可怕的是直接崩溃。异常处理让程序"优雅地失败":该报错时报错,该兜底时兜底。配合调试技巧,你就能从"看到
读写文件、遍历目录、批量重命名……这些"脏活累活"正是 Python 脚本的拿手好戏。本文围绕 open() 与 pat
函数是组织代码的基本单元。会写 def 只是入门,真正拉开差距的是对参数机制和作用域规则的理解:默认参数、可变参数、关键
把函数当数据传来传去,代码更简洁也更抽象。本文实战 lambda、map/filter/reduce 与 functools 的偏函数、lru_cache。
处理大数据时,最怕一次性把所有数据装进内存。迭代器与生成器就是 Python 的"懒加载"方案:按需产生数据,边算边用。
JSON 和 CSV 是日常工作中最常见的两种数据格式:API 接口返回 JSON,表格数据导出 CSV。Python
列表(list)和字典(dict)是 Python 中使用频率最高的两种容器:前者处理"有序的一串东西",后者处理"键到
"不要重复造轮子"是 Python 社区的信条。标准库提供开箱即用的能力,几十万个第三方包通过 pip 一键安装。会用模
面向对象编程(OOP)把数据和操作数据的方法打包成"对象",让代码更贴近现实世界的建模方式。Python 的类机制灵活而
语法学了一堆,真正拉开差距的是"把想法做成作品"的能力。本文以一个命令行待办清单为例,带你走完选题、搭骨架、拆模块、加参
从匹配手机号到解析日志,正则表达式是文本处理的瑞士军刀。本文用 re 模块讲透常用模式与性能陷阱,带你写出能上生产环境的校验与提取代码。
爬虫(网络抓取)是 Python 最受欢迎的应用场景之一:把网页上的公开信息批量提取并保存为结构化数据。本文用一个真实例
Python 是当今最流行的编程语言之一:语法简洁、生态丰富,无论是写脚本、做数据分析、开发 Web 还是学习算法,它都
无论是爬虫清洗数据、日志分析还是命令行工具,字符串处理都是 Python 开发者的日常。Python 的 str 类型自
类型注解不是强制约束,而是给代码装上的"说明书"。本文讲清变量注解、函数签名注解与 typing 模块常用工具,让代码可读性翻倍。
写测试不是浪费时间,是为未来省时间。本文用 unittest 讲清断言、夹具与测试组织,再对比 pytest 的简洁写法。
每个项目一套独立环境,再也不怕依赖打架。本文对比 venv、pip、pip-tools 与 requirements.txt 的最佳实践。
现代应用几乎都离不开网络:调第三方 API、抓取公开数据、上传文件。Python 的 requests 库把 HTTP
处理 10 个成绩可以写 10 个变量,处理 10000 个呢?数组让"同一类型的批量数据"可以用一个名字管理。而 C
位运算让程序在二进制层面思考:用 &、|、^、<<、>> 实现标志位、快速乘除与奇偶判断。
顺序执行的程序毫无威力,真正厉害的程序会判断和重复:成绩够不够及格、文件读没读完、任务要不要再来一次。本文带你掌握 C
程序本质上是对数据的加工。C 语言要求每个数据都有明确的类型——是整数、小数还是字符,决定了它占多少内存、能存多大范围。
程序跑完就消失的数据没有意义,把结果存进文件、从文件读入配置才是常态。C 用 FILE * 完成文件读写,流程永远是四步
把一段逻辑写进函数,就能重复调用、按需组合,这是 C 程序组织代码的基本方式。而递归——函数调用自己——则是解决"同构子
1972 年,Dennis Ritchie 在贝尔实验室创造了 C 语言。半个多世纪过去,它依然是操作系统、嵌入式设备和
数组的短板是插入删除太慢,链表用指针把节点串起来解决这个问题。本文手写单链表与双向链表的增删改查。
数组的长度在编译时就定死了,但程序运行时往往不知道要存多少数据。这时候就需要动态内存分配:运行时按需向系统申请内存,用完
把大程序拆成多个 .c 和 .h 文件,是 C 工程化的第一步。本文讲清声明与定义、头文件卫士与编译链接流程。
运算符是 C 语言表达计算的"动词"。加减乘除、比较判断、逻辑与或、甚至直接操作二进制位——掌握了它们,你才能写出真正有
指针是 C 语言最强大的特性,也是新手劝退率最高的知识点。其实它只做一件事:保存另一个变量的内存地址。把地址想成"门牌号
#include、#define、条件编译、宏的陷阱与防御——预处理是 C 编译流程的第一站,搞懂它才能写出健壮代码。
冒泡、选择、插入、快排、归并——五种排序用 C 语言逐一实现并对比性能,理解交换与递归的本质。
一个学生有姓名、年龄、成绩,一个点有 x、y 坐标——这些"一组相关数据"用几个独立变量管理会非常凌乱。结构体把它们打包
类是 C++ 面向对象编程的基石:它把数据和对数据的操作打包在一起,并通过访问控制保护内部状态。理解类与对象,就等于理解
vector、deque、list、forward_list 各有擅长也各有短板。本文对比它们的插入删除复杂度、迭代器失效规则与适用场景,帮你告别容器选择困难。
异常让错误处理从"层层返回"变成"原地抛出"。本文讲清 try/catch 机制、异常的传播过程,以及 RAII 如何保证资源清理与异常安全。
ifstream、ofstream、fstream 让文件读写像 cout 一样自然。本文带你实战文本文件、CSV 数据与二进制文件的读写,并避开常见的状态判断陷阱。
C++ 诞生于 1983 年,是 C 语言"加上类"的产物,但远不止如此:它同时支持面向过程、面向对象和泛型编程,是操作
2011 年发布的 C++11 被公认为"第二门语言":auto、lambda、智能指针、移动语义等特性彻底改变了写 C
继承让新类复用已有类的代码,多态让同一段代码对不同对象表现出不同行为。这两件事合在一起,是面向对象"开闭原则"(对扩展开
为什么 vector 能用 [] 取值?运算符重载能让你的自定义类也拥有这种"语法特权"。本文用复数类讲透重载规则、成员与非成员函数的选择以及常见陷阱。
指针是 C 的招牌,引用是 C++ 对指针的"安全升级"。两者都能间接访问变量,但语义大不相同:指针是"存地址的变量",
裸指针 + new/delete 是 C++ 内存泄漏和悬垂指针的头号来源:C++11 引入的智能指针用 RAII 思想
STL 算法是泛型编程的精华:sort、find、for_each、transform 配合 lambda 表达式,让排序、查找、变换一行顶十行。本文用实战例子逐个讲透。
如果说 vector 是"有序的列表",那 map 就是"键值查找表",set 是"自动去重的集合"。它们内部用红黑树实
std::vector 是 C++ 中最常用的容器:一块连续内存上的动态数组,支持 O(1) 随机访问和尾部插入,还能自
字符串处理是编程中最频繁的操作之一。C 的 char[] + strcpy/strlen 既啰嗦又容易越界;C++ 的
模板是 C++ 泛型编程的核心:写一份代码,让它适用于任意类型。STL 的 vector
requestAnimationFrame、CSS 过渡与缓动函数——让页面动起来的三板斧,从滚动动画到拖拽效果。
处理数据是前端每天的工作,数组高阶方法就是那把"瑞士军刀"。学会 map、filter、reduce,几行声明式代码就能
"JS 是单线程的,却能处理大量并发"--理解异步是进阶前端的第一道坎。本文从事件循环讲起,带你彻底搞懂 Promise
JavaScript 是 Web 的"通用语言":浏览器里它驱动页面交互,Node.js 让它跑在服务器端。本文用最短的
闭包(Closure)是 JS 面试必考、实战必用的知识点,也是"一看就懂、一写就错"的典型。本文从作用域讲起,推导闭包
DOM(Document Object Model)把 HTML 文档变成一棵 JavaScript 可以操作的"对象树
交互是前端的灵魂,事件是交互的载体。理解"事件从哪来、往哪去、如何拦截",是写出健壮交互代码的分水岭。本文拆解事件传播的
从 XMLHttpRequest 到 fetch,浏览器发起 HTTP 请求的正确姿势。本文实战 GET/POST、错误处理与取消请求。
从正则校验到实时反馈,打造体验丝滑的表单。本文实现一个完整的注册表单校验案例。
对象是 JS 的心脏,原型链是它的血脉。本文从字面量到 class,彻底搞懂对象、原型与继承。
刷新页面数据不丢的秘密:localStorage、sessionStorage、Cookie 与 IndexedDB 的选择与实战。
分支是 Git 最强大的特性,但"能用分支"和"会用分支"是两回事。没有策略的仓库很快就会变成乱麻:功能分支长期不合并、
Git 是每个程序员必须掌握的工具。本文不追求面面俱到,而是把日常开发中 出现频率最高 的命令整理成速查表,配合真实场景
两个人改同一个文件必然有冲突。本文实战 Fork 工作流、解决冲突与 Code Review 流程。
"又有人把调试代码提交上来了""提交信息乱写一气""CI 在合并前才发现格式错误"——根源都是质量检查全靠自觉。Git
"merge 还是 rebase?"几乎是每个 Git 使用者都会纠结的问题。两者都能把分支的改动合到一起,但哲学完全不
clone、push、pull、fork 与 Pull Request——把本地仓库接到 GitHub 上,开启团队协作。
正在改代码时突然来了个线上 bug,要立刻切分支修复——但手头的改动还没写完,不想提交又不敢丢。这时候 git stas
一个仓库里嵌另一个仓库:submodule 的添加、更新与删除,以及 .gitignore 等实用技巧。
v1.0.0、v2.1.3 这些版本号是怎么打上去的?本文讲清轻量标签、附注标签与语义化版本。
改错了、提交错了、推送错了怎么办?reset、revert、checkout 三种后悔药,分场景讲清楚。
很多新手用 Git 只背命令不记原理,遇到"提交了没有""怎么撤销不丢代码"就发懵。其实 Git 的一切操作都围绕三个区
回溯算法是"走不通就回头"的深度优先搜索。本文从统一模板出发,逐步实现全排列、组合、子集三大入门题,再用 N 皇后展示如何剪枝,一套思路通吃所有回溯题。
二分查找是面试中出现频率最高的算法之一:代码不到十行,却藏着无数边界陷阱。本文从最朴素的版本讲起,带你写出一份"一次通过
动态规划(Dynamic Programming,DP)是面试中区分度最高的算法题型,也是很多人的噩梦。其实它的核心只有
贪心算法每一步都选当前最优,往往能得到全局最优。本文用找零钱、区间调度、跳跃游戏、分发饼干四个经典问题,讲清楚贪心的思考方式、适用边界,以及什么时候贪心会失效。
如果只能选一种数据结构陪你去面试,那一定是哈希表。它把"查找"从 O(n) 降到平均 O(1),代价只是多花一点内存。理
链表是面试高频考点。本文用 Python 手写链表节点,从零实现反转链表(迭代与递归两种写法),再用快慢指针解决找中点、判断环、找环入口三类经典问题,每个例子都能直接运行。
很多初学者觉得递归难,是因为试图"一步步跟踪"它的执行过程。正确姿势恰恰相反:递归要求你信任函数本身。本文帮你建立递归的
排序是算法世界的地基:几乎所有面试、几乎所有数据处理都绕不开它。本文把最常考的三种排序——冒泡、快排、归并——一次性讲透
栈和队列是最基础也最实用的两种线性结构。本文讲解它们的概念与 Python 实现,并用括号匹配、逆波兰表达式、单调栈、滑动窗口最大值四个实战例子,带你彻底吃透这两种结构。
二叉树是递归思想的最佳训练场。本文从节点定义讲起,覆盖前中后序递归与迭代遍历、层序遍历、由遍历序列重建二叉树,以及最大深度、对称性等高频题型,代码全部可直接运行。
数据结构是程序的骨架。本文用最直观的方式介绍三种基础结构--数组、链表、栈,重点对比它们的内存模型与时间复杂度。
你在浏览器输入网址回车,背后发生了什么?答案就是 HTTP--Web 世界的通用语言。本文用 curl 实战拆解请求与响
GET、POST、PUT、DELETE 有什么区别?200、301、404、500 背后是什么?一次讲透。
从 Session 到 Token,再到 JWT——现代 Web 认证的演进路线。手写一个 JWT 签发与校验流程。
强缓存、协商缓存、Cache-Control、ETag——浏览器缓存体系全解析,附调试技巧。
HTTP 是无状态的,网站怎么记住你是谁?Cookie 存客户端、Session 存服务端,本文讲清这对搭档。
为什么前端请求会被 CORS 拦下?同源策略、预检请求、跨域解决方案,一篇文章讲明白。
打开浏览器输入网址,几毫秒内页面就加载出来了。这背后有一个默默工作的系统——DNS(Domain Name System
前后端分离成为主流后,API 就是前后端之间的"合同"。设计得好,团队协作顺畅、调用方省心;设计得差,文档越写越长,谁用
传输层有两大主角:TCP 和 UDP。几乎所有互联网应用都建立在这两个协议之上——网页用 TCP,视频通话用 UDP。它
地址栏里那把"小锁"背后,是一套精密的密码学流程——TLS 握手。它让浏览器和服务器在公开网络上安全地协商出加密密钥,从
聊天、行情推送、在线协作……这些功能都要求服务器主动推送数据,而传统 HTTP 是"一问一答"的。WebSocket 在
正则表达式(Regex)是用一段"模式字符串"在文本中查找、提取、替换内容的技术。学会它,处理日志、校验输入、批量替换的
断点调试、网络面板、性能分析、移动端模拟——本文用真实场景串起 Chrome DevTools 的四大核心面板,帮你从"只会 console.log"进化到能独立定位和修复前端问题。
写代码只占开发时间的一小半,剩下的大半时间都在和 Bug 搏斗。调试不是"碰运气",而是一门有方法论的技术:先复现、再二
为什么别人的项目"在我电脑上跑不起来"?Docker 给出的答案是:把应用连同它的运行环境一起打包,走到哪里都是同一套环
无论你是开发者、运维还是刚接触服务器的学生,Linux 命令都是绕不开的基本功。本文不追求面面俱到,而是把日常最高频的命
README、技术博客、接口文档、会议纪要……如今几乎所有技术写作都离不开 Markdown。它用极简的符号标记格式,让
从零安装 Node.js、理解 npm 的依赖管理、读懂 package.json 和 scripts 脚本,最后亲手启动一个 HTTP 服务器——这是进入 JS 生态的第一课。
别名、补全、历史记录、自定义提示符、多标签分屏——本文把终端从"黑框框"变成效率神器,让你告别反复敲长命令的笨办法,真正爱上命令行。
Vim 是 Linux 服务器上标配的文本编辑器,几乎每个程序员的第一次都是"进去就出不来了"。其实它没那么可怕:只要记
快捷键、多光标、代码片段、调试器、插件——本文把 VS Code 从"编辑器"调教成完整开发环境,讲清每个技巧背后的使用场景,让你写代码的速度快一倍。
dir、cd、ipconfig、tasklist 是 Windows 用户的第一批终端命令。本文带你掌握文件导航、进程管理、网络诊断,再升级到 PowerShell 的管道与脚本。