Python 小游戏①:猜数字
猜数字是几乎所有程序员写过的第一个小游戏:电脑随机想一个 1 到 100 之间的数,你猜,它只告诉你"大了"还是"小了"
手把手、分步骤,用 Python / C / C++ 从零做出能玩的小游戏,每个语言从简单到难:猜数字、贪吃蛇、扫雷、2048、井字棋……
猜数字是几乎所有程序员写过的第一个小游戏:电脑随机想一个 1 到 100 之间的数,你猜,它只告诉你"大了"还是"小了"
石头剪刀布(Paper-Scissors-Rock)规则人人皆知,但亲手用代码实现一遍,你会对"如何把现实规则翻译成程序
猜单词(Hangman)是经典的文字游戏:程序藏起一个单词,只显示字母个数,你一个个猜字母,猜对就亮出位置,猜错就少一次
井字棋(Tic-Tac-Toe)的棋盘只有 3×3,规则简单到一句话:谁先连成一线谁赢。但把它写成程序,你要处理输入校验
前四篇都在终端里玩文字游戏,这篇用 pygame 做经典贪吃蛇,首次接触"游戏主循环":每帧重复"处理输入 → 更新状态
学完 C 语言的基础语法,很多人会陷入"什么都会、却什么都不会做"的尴尬。破解方法只有一个:动手做小项目。本文的猜数字是
猜数字只能练"比较",这一篇我们做一个真正会随机出题的小游戏:数学速算问答。程序自动生成加减乘除四则运算,你口算作答、答
前两篇我们一直在"猜"和"算",这一篇开始有真正的空间感。文本迷宫把地图存进二维数组,玩家用 WASD 控制 @ 穿行,
2048 是近几年最成功的休闲小游戏:规则一句话讲完,实现却大有讲究。它的核心是"滑动 + 合并"算法:每次移动所有方块
本系列收官之作,挑战经典中的经典——贪吃蛇。蛇由一串坐标组成,吃到食物变长,撞墙或咬到自己就结束。控制台版本采用"每按一
猜数字是经典入门游戏:程序随机生成 1~100 的秘密数字,不断猜测,程序提示"太大"或"太小",直到猜中。本文用面向对
井字棋规则简单,却是练习"棋盘建模"和"AI 决策"的绝佳素材。你和电脑轮流落子,电脑带策略 AI——能赢就赢,赢不了就
扫雷是训练"数据结构思维"的好游戏:9×9 棋盘随机埋 10 颗雷,翻开格子,数字表示周围 8 格有几颗雷。本文用二维
Pong 是史上第一款商业电子游戏。在控制台里做 Pong 不需要图形库:用 ANSI 转义序列清屏重绘,用 termi
系列最后一篇:一个"剧情向"的文本 RPG,没有画面,全靠文字和想象力。玩家冒险、战斗、捡装备吃药水,把类、std::v
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 是当今最流行的编程语言之一:语法简洁、生态丰富,无论是写脚本、做数据分析、开发 Web 还是学习算法,它都
变量是程序存放数据的"盒子",数据类型则决定了盒子里能装什么、能做什么运算。Python 是动态类型语言,写起来很自由,
无论是爬虫清洗数据、日志分析还是命令行工具,字符串处理都是 Python 开发者的日常。Python 的 str 类型自
列表(list)和字典(dict)是 Python 中使用频率最高的两种容器:前者处理"有序的一串东西",后者处理"键到
程序的核心能力之一就是"根据条件做选择、按规则反复执行"。Python 用 if / elif / else 表达分支,
函数是组织代码的基本单元。会写 def 只是入门,真正拉开差距的是对参数机制和作用域规则的理解:默认参数、可变参数、关键
"不要重复造轮子"是 Python 社区的信条。标准库提供开箱即用的能力,几十万个第三方包通过 pip 一键安装。会用模
读写文件、遍历目录、批量重命名……这些"脏活累活"正是 Python 脚本的拿手好戏。本文围绕 open() 与 pat
程序出错不可怕,可怕的是直接崩溃。异常处理让程序"优雅地失败":该报错时报错,该兜底时兜底。配合调试技巧,你就能从"看到
JSON 和 CSV 是日常工作中最常见的两种数据格式:API 接口返回 JSON,表格数据导出 CSV。Python
日志分析、订单统计、定时任务……几乎每个程序都要跟日期时间打交道。Python 的 datetime 模块功能强大但细节
面向对象编程(OOP)把数据和操作数据的方法打包成"对象",让代码更贴近现实世界的建模方式。Python 的类机制灵活而
处理大数据时,最怕一次性把所有数据装进内存。迭代器与生成器就是 Python 的"懒加载"方案:按需产生数据,边算边用。
装饰器是 Python 最优雅也最"劝退"的特性之一:它能在不改动原函数代码的前提下,给函数附加日志、计时、缓存等能力。
现代应用几乎都离不开网络:调第三方 API、抓取公开数据、上传文件。Python 的 requests 库把 HTTP
爬虫(网络抓取)是 Python 最受欢迎的应用场景之一:把网页上的公开信息批量提取并保存为结构化数据。本文用一个真实例
程序跑起来容易,数据持久化才是关键。从零配置的 SQLite 到生产级的 MySQL,Python 的数据库接口高度统一
程序变慢时,第一反应往往是"让它同时干更多活"。Python 提供了线程、进程、协程三套并发方案,选对方案比写出代码更重
语法学了一堆,真正拉开差距的是"把想法做成作品"的能力。本文以一个命令行待办清单为例,带你走完选题、搭骨架、拆模块、加参
1972 年,Dennis Ritchie 在贝尔实验室创造了 C 语言。半个多世纪过去,它依然是操作系统、嵌入式设备和
程序本质上是对数据的加工。C 语言要求每个数据都有明确的类型——是整数、小数还是字符,决定了它占多少内存、能存多大范围。
运算符是 C 语言表达计算的"动词"。加减乘除、比较判断、逻辑与或、甚至直接操作二进制位——掌握了它们,你才能写出真正有
顺序执行的程序毫无威力,真正厉害的程序会判断和重复:成绩够不够及格、文件读没读完、任务要不要再来一次。本文带你掌握 C
处理 10 个成绩可以写 10 个变量,处理 10000 个呢?数组让"同一类型的批量数据"可以用一个名字管理。而 C
把一段逻辑写进函数,就能重复调用、按需组合,这是 C 程序组织代码的基本方式。而递归——函数调用自己——则是解决"同构子
指针是 C 语言最强大的特性,也是新手劝退率最高的知识点。其实它只做一件事:保存另一个变量的内存地址。把地址想成"门牌号
一个学生有姓名、年龄、成绩,一个点有 x、y 坐标——这些"一组相关数据"用几个独立变量管理会非常凌乱。结构体把它们打包
数组的长度在编译时就定死了,但程序运行时往往不知道要存多少数据。这时候就需要动态内存分配:运行时按需向系统申请内存,用完
程序跑完就消失的数据没有意义,把结果存进文件、从文件读入配置才是常态。C 用 FILE * 完成文件读写,流程永远是四步
C++ 诞生于 1983 年,是 C 语言"加上类"的产物,但远不止如此:它同时支持面向过程、面向对象和泛型编程,是操作
类是 C++ 面向对象编程的基石:它把数据和对数据的操作打包在一起,并通过访问控制保护内部状态。理解类与对象,就等于理解
继承让新类复用已有类的代码,多态让同一段代码对不同对象表现出不同行为。这两件事合在一起,是面向对象"开闭原则"(对扩展开
指针是 C 的招牌,引用是 C++ 对指针的"安全升级"。两者都能间接访问变量,但语义大不相同:指针是"存地址的变量",
裸指针 + new/delete 是 C++ 内存泄漏和悬垂指针的头号来源:C++11 引入的智能指针用 RAII 思想
std::vector 是 C++ 中最常用的容器:一块连续内存上的动态数组,支持 O(1) 随机访问和尾部插入,还能自
如果说 vector 是"有序的列表",那 map 就是"键值查找表",set 是"自动去重的集合"。它们内部用红黑树实
字符串处理是编程中最频繁的操作之一。C 的 char[] + strcpy/strlen 既啰嗦又容易越界;C++ 的
模板是 C++ 泛型编程的核心:写一份代码,让它适用于任意类型。STL 的 vector<int>、vect
2011 年发布的 C++11 被公认为"第二门语言":auto、lambda、智能指针、移动语义等特性彻底改变了写 C
JavaScript 是 Web 的"通用语言":浏览器里它驱动页面交互,Node.js 让它跑在服务器端。本文用最短的
处理数据是前端每天的工作,数组高阶方法就是那把"瑞士军刀"。学会 map、filter、reduce,几行声明式代码就能
闭包(Closure)是 JS 面试必考、实战必用的知识点,也是"一看就懂、一写就错"的典型。本文从作用域讲起,推导闭包
"JS 是单线程的,却能处理大量并发"--理解异步是进阶前端的第一道坎。本文从事件循环讲起,带你彻底搞懂 Promise
DOM(Document Object Model)把 HTML 文档变成一棵 JavaScript 可以操作的"对象树
交互是前端的灵魂,事件是交互的载体。理解"事件从哪来、往哪去、如何拦截",是写出健壮交互代码的分水岭。本文拆解事件传播的
Git 是每个程序员必须掌握的工具。本文不追求面面俱到,而是把日常开发中 出现频率最高 的命令整理成速查表,配合真实场景
很多新手用 Git 只背命令不记原理,遇到"提交了没有""怎么撤销不丢代码"就发懵。其实 Git 的一切操作都围绕三个区
分支是 Git 最强大的特性,但"能用分支"和"会用分支"是两回事。没有策略的仓库很快就会变成乱麻:功能分支长期不合并、
"merge 还是 rebase?"几乎是每个 Git 使用者都会纠结的问题。两者都能把分支的改动合到一起,但哲学完全不
正在改代码时突然来了个线上 bug,要立刻切分支修复——但手头的改动还没写完,不想提交又不敢丢。这时候 git stas
"又有人把调试代码提交上来了""提交信息乱写一气""CI 在合并前才发现格式错误"——根源都是质量检查全靠自觉。Git
数据结构是程序的骨架。本文用最直观的方式介绍三种基础结构--数组、链表、栈,重点对比它们的内存模型与时间复杂度。
排序是算法世界的地基:几乎所有面试、几乎所有数据处理都绕不开它。本文把最常考的三种排序——冒泡、快排、归并——一次性讲透
很多初学者觉得递归难,是因为试图"一步步跟踪"它的执行过程。正确姿势恰恰相反:递归要求你信任函数本身。本文帮你建立递归的
二分查找是面试中出现频率最高的算法之一:代码不到十行,却藏着无数边界陷阱。本文从最朴素的版本讲起,带你写出一份"一次通过
如果只能选一种数据结构陪你去面试,那一定是哈希表。它把"查找"从 O(n) 降到平均 O(1),代价只是多花一点内存。理
动态规划(Dynamic Programming,DP)是面试中区分度最高的算法题型,也是很多人的噩梦。其实它的核心只有
你在浏览器输入网址回车,背后发生了什么?答案就是 HTTP--Web 世界的通用语言。本文用 curl 实战拆解请求与响
传输层有两大主角:TCP 和 UDP。几乎所有互联网应用都建立在这两个协议之上——网页用 TCP,视频通话用 UDP。它
打开浏览器输入网址,几毫秒内页面就加载出来了。这背后有一个默默工作的系统——DNS(Domain Name System
前后端分离成为主流后,API 就是前后端之间的"合同"。设计得好,团队协作顺畅、调用方省心;设计得差,文档越写越长,谁用
聊天、行情推送、在线协作……这些功能都要求服务器主动推送数据,而传统 HTTP 是"一问一答"的。WebSocket 在
地址栏里那把"小锁"背后,是一套精密的密码学流程——TLS 握手。它让浏览器和服务器在公开网络上安全地协商出加密密钥,从
无论你是开发者、运维还是刚接触服务器的学生,Linux 命令都是绕不开的基本功。本文不追求面面俱到,而是把日常最高频的命
Vim 是 Linux 服务器上标配的文本编辑器,几乎每个程序员的第一次都是"进去就出不来了"。其实它没那么可怕:只要记
README、技术博客、接口文档、会议纪要……如今几乎所有技术写作都离不开 Markdown。它用极简的符号标记格式,让
正则表达式(Regex)是用一段"模式字符串"在文本中查找、提取、替换内容的技术。学会它,处理日志、校验输入、批量替换的
写代码只占开发时间的一小半,剩下的大半时间都在和 Bug 搏斗。调试不是"碰运气",而是一门有方法论的技术:先复现、再二
为什么别人的项目"在我电脑上跑不起来"?Docker 给出的答案是:把应用连同它的运行环境一起打包,走到哪里都是同一套环