Python新手练手项目推荐:从命令行工具到简单游戏

周予安
周予安
发布时间:2026-11-15 | 3人浏览过
原创

面向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()

在终端中执行测试命令与对应的示例输出如下:

示例运行命令与输出
$ python todo.py add "完成Python控制台项目代码编写"
已添加任务 [#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,避免文件为空或损坏时导致程序崩溃。
Python新手练手项目推荐:从命令行工具到简单游戏
图 1:待办事项命令行工具的数据处理与文件读写流程

2. 拓展练习:批量文件重命名与整理脚本

在待办工具掌握了结构化数据读写后,下一个练习应关注操作系统底层交互。该脚本负责扫描目标文件夹,按指定模式(如创建时间、前缀序号或扩展名)批量重命名文件。

  • 涉及技能:pathlib.Path.glob() 遍历目录、datetime 模块格式化时间戳、os.rename() 或 Path.rename() 事务式改名。
  • 关键边界:在真正重命名之前,必须先打印出“预览映射清单”,让用户输入确认(y/n)再执行,防止误改系统关键文件。

二、从工具向游戏的进阶路径

命令行工具通常是“单次触发、顺序执行、保存退出”的线性流程,而游戏程序的核心区别在于引入了持续循环(Game Loop)与动态状态机。在进入具体游戏编写前,理解两者的能力过渡非常关键。

Python新手练手项目推荐:从命令行工具到简单游戏
图 2:Python 实践技能递进路线图

三、第二阶段:控制台简单游戏(掌握循环与状态管理)

游戏开发的本质是维护随时间演变的状态数据。所有的游戏逻辑都可以统一抽象为经典的“游戏主循环”(Game Loop):获取输入、更新状态、绘制输出,周而复始,直至触发终止条件。

Python新手练手项目推荐:从命令行工具到简单游戏
图 3:控制台游戏核心 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 到 100 之间,你共有 7 次机会。
第 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 基础、标准库调用及软件结构设计上的掌握程度:

Python新手练手项目推荐:从命令行工具到简单游戏
图 4:项目阶段能力对照与技能自查清单

五、新手实践中的关键避坑建议

  1. 避免过早引入庞大的第三方框架:不要在基础未扎实时直接上手大型 Web 框架(如 Django)或大型游戏引擎。先用纯标准库(argparse、json、random)写出可运行逻辑,理解程序本质后再迁移到外部库。
  2. 单次只添加一个功能:编写代码时,切忌一口气写上百行后再统一运行。正确的做法是:写完一个函数 -> 终端测试一个函数 -> 验证无误后再写下一个功能点。
  3. 重视错误输入的兜底处理:终端工具经常遇到非预期的字符输入,使用 try...except ValueError 或 str.isdigit() 进行保护,是区分新手代码与工业可用代码的重要标志。
相关专题:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表