Python新手练手项目推荐:从命令行工具到简单游戏
面向Python新手的阶梯式项目实践指南,从基础命令行脚本到可交互的控制台小游戏,提供完整的练习步骤与关键代码实现。
掌握了 Python 的变量、循环、函数与基础语法后,许多初学者会面临“语法都懂,但面对空白文件不知从何下手”的困境。走出停滞期的有效途径,是挑选输入输出明确、逻辑层次清晰的小项目,从无界面的纯命令行工具逐步过渡到具有状态循环与事件判断的控制台小游戏。本文按照逻辑复杂度递增的顺序,拆解两类核心项目群的开发步骤、架构原理与代码实现,帮助读者建立连贯的编程思维。
一、第一阶段:命令行工具(掌握参数解析与数据持久化)
命令行工具(CLI, Command Line Interface)是新手验证逻辑的理想载体。它排除了图形界面(GUI)中繁琐的布局与事件绑定,使开发者能够专注于数据流向、条件判断以及本地文件交互。
1. 核心推荐:命令行待办事项管理器(To-Do List CLI)
该项目解决的问题是:通过终端指令对待办任务进行增、删、查、改(CRUD),并将任务状态存储到本地 JSON 文件中,保证程序关闭后数据不丢失。
- 准备环境:Python 3.8+,仅使用标准库中的
argparse、json和pathlib。 - 关键设计:将数据抽象为字典列表,每个任务包含唯一编号
id、描述task及完成状态done。
以下是完成该工具的完整代码示例:
import argparse
import json
from pathlib import Path
DATA_FILE = Path("todos.json")
def load_tasks():
if not DATA_FILE.exists():
return []
try:
with open(DATA_FILE, "r", encoding="utf-8") as f:
return json.load(f)
except json.JSONDecodeError:
return []
def save_tasks(tasks):
with open(DATA_FILE, "w", encoding="utf-8") as f:
json.dump(tasks, f, ensure_ascii=False, indent=2)
def add_task(title):
tasks = load_tasks()
new_id = (tasks[-1]["id"] + 1) if tasks else 1
tasks.append({"id": new_id, "title": title, "done": False})
save_tasks(tasks)
print(f"已添加任务 [#{new_id}]: {title}")
def list_tasks():
tasks = load_tasks()
if not tasks:
print("当前没有任何待办任务。")
return
for item in tasks:
status = "[x]" if item["done"] else "[ ]"
print(f"{status} #{item['id']} - {item['title']}")
def complete_task(task_id):
tasks = load_tasks()
for item in tasks:
if item["id"] == task_id:
item["done"] = True
save_tasks(tasks)
print(f"任务 #{task_id} 已标记为完成。")
return
print(f"未找到编号为 #{task_id} 的任务。")
def main():
parser = argparse.ArgumentParser(description="轻量命令行待办工具")
subparsers = parser.add_subparsers(dest="command")
# add 命令
parser_add = subparsers.add_parser("add", help="添加新任务")
parser_add.add_argument("title", type=str, help="任务描述")
# list 命令
subparsers.add_parser("list", help="查看所有任务")
# done 命令
parser_done = subparsers.add_parser("done", help="标记完成任务")
parser_done.add_argument("id", type=int, help="任务编号")
args = parser.parse_args()
if args.command == "add":
add_task(args.title)
elif args.command == "list":
list_tasks()
elif args.command == "done":
complete_task(args.id)
else:
parser.print_help()
if __name__ == "__main__":
main()
在终端中执行测试命令与对应的示例输出如下:
已添加任务 [#1]: 完成Python控制台项目代码编写
$ python todo.py list
[ ] #1 - 完成Python控制台项目代码编写
$ python todo.py done 1
任务 #1 已标记为完成。
$ python todo.py list
[x] #1 - 完成Python控制台项目代码编写
todos.json 时,必须使用 pathlib.Path.exists() 验证文件是否存在;解析 JSON 时捕获 JSONDecodeError,避免文件为空或损坏时导致程序崩溃。
2. 拓展练习:批量文件重命名与整理脚本
在待办工具掌握了结构化数据读写后,下一个练习应关注操作系统底层交互。该脚本负责扫描目标文件夹,按指定模式(如创建时间、前缀序号或扩展名)批量重命名文件。
- 涉及技能:
pathlib.Path.glob()遍历目录、datetime模块格式化时间戳、os.rename()或Path.rename()事务式改名。 - 关键边界:在真正重命名之前,必须先打印出“预览映射清单”,让用户输入确认(y/n)再执行,防止误改系统关键文件。
二、从工具向游戏的进阶路径
命令行工具通常是“单次触发、顺序执行、保存退出”的线性流程,而游戏程序的核心区别在于引入了持续循环(Game Loop)与动态状态机。在进入具体游戏编写前,理解两者的能力过渡非常关键。
三、第二阶段:控制台简单游戏(掌握循环与状态管理)
游戏开发的本质是维护随时间演变的状态数据。所有的游戏逻辑都可以统一抽象为经典的“游戏主循环”(Game Loop):获取输入、更新状态、绘制输出,周而复始,直至触发终止条件。
1. 核心推荐:智能猜数字游戏(带动态难度与历史统计)
传统的猜数字往往过于简陋,适合练手的版本应该加入输入有效性过滤、二分法猜测建议以及局数与胜率统计持久化。
完整可执行代码如下:
import random
import time
def play_round():
target = random.randint(1, 100)
low, high = 1, 100
attempts = 0
max_attempts = 7
print("\n[新对局开始] 目标数字在 1 到 100 之间,你共有 7 次机会。")
while attempts < max_attempts:
user_input = input(f"第 {attempts + 1} 次猜测 (当前有效区间 {low}-{high}),输入 q 退出: ").strip()
if user_input.lower() == "q":
print("本局已提前认输。")
return False, attempts
if not user_input.isdigit():
print("请输入纯正整数!本次不扣除猜测次数。")
continue
val = int(user_input)
if val < 1 or val > 100:
print("超出 1-100 范围,请重新输入。")
continue
attempts += 1
if val == target:
print(f"恭喜猜中!正确答案就是 {target},共消耗 {attempts} 次尝试。")
return True, attempts
elif val < target:
print("太小了!")
low = max(low, val + 1)
else:
print("太大了!")
high = min(high, val - 1)
print(f"很遗憾,次数用尽!正确答案是: {target}")
return False, attempts
def main():
total_games = 0
wins = 0
while True:
won, tries = play_round()
total_games += 1
if won:
wins += 1
print(f"当前战绩:总场次 {total_games},获胜 {wins} 场,胜率: {(wins / total_games) * 100:.1f}%")
again = input("是否继续下一局?(y/n): ").strip().lower()
if again != "y":
print("游戏结束,感谢游玩!")
break
if __name__ == "__main__":
main()
第 1 次猜测 (当前有效区间 1-100),输入 q 退出: 50
太小了!
第 2 次猜测 (当前有效区间 51-100),输入 q 退出: 75
太大了!
第 3 次猜测 (当前有效区间 51-74),输入 q 退出: 62
恭喜猜中!正确答案就是 62,共消耗 3 次尝试。
当前战绩:总场次 1,获胜 1 场,胜率: 100.0%
2. 进阶推荐:文字地牢战斗模拟器(OOP 面向对象练手)
如果说猜数字锻炼了 while 与条件分支,那么文字 RPG 则是掌握面向对象编程(OOP)的最佳试验场。
- 设计基类
Entity:封装name、hp、max_hp、atk属性,以及take_damage()和is_alive()方法。 - 派生子类
Player与Monster:玩家具备技能选择(普通攻击、重击、回血药水),怪物由简单规则驱动(如生命值低于 20% 时概率狂暴)。 - 回合制决策逻辑:按速度或固定轮换顺序执行行动,实时打印双方血量条。
四、实践自查与技能对照
完成上述项目后,可以通过下表检验自己在 Python 基础、标准库调用及软件结构设计上的掌握程度:
五、新手实践中的关键避坑建议
- 避免过早引入庞大的第三方框架:不要在基础未扎实时直接上手大型 Web 框架(如 Django)或大型游戏引擎。先用纯标准库(
argparse、json、random)写出可运行逻辑,理解程序本质后再迁移到外部库。 - 单次只添加一个功能:编写代码时,切忌一口气写上百行后再统一运行。正确的做法是:写完一个函数 -> 终端测试一个函数 -> 验证无误后再写下一个功能点。
- 重视错误输入的兜底处理:终端工具经常遇到非预期的字符输入,使用
try...except ValueError或str.isdigit()进行保护,是区分新手代码与工业可用代码的重要标志。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









