Python游戏编程入门:6个经典小游戏带你掌握核心语法与项目实战

Python游戏编程入门:6个经典小游戏带你掌握核心语法与项目实战 1. 项目概述为什么选择用Python小游戏入门如果你刚接触Python或者学了一阵子语法觉得枯燥想找点乐子那你来对地方了。我见过太多初学者抱着厚厚的教材啃变量、循环、函数结果没几天热情就耗尽了。编程尤其是入门阶段最怕的就是失去“正反馈”。而游戏恰恰是最高效的正反馈生成器。你写的每一行代码都能立刻在屏幕上看到变化一个方块移动了一个角色跳起来了分数增加了……这种即时、可视的成就感是任何练习题都无法比拟的。这六个小游戏是我从带新手项目、教学实践中精挑细选出来的。它们覆盖了Python基础语法的核心应用场景但绝不是枯燥的语法演示。每一个游戏都像一个迷你的工程项目你需要思考逻辑、处理交互、调试bug。从“猜数字”的简单分支判断到“贪吃蛇”的列表与循环控制再到“飞机大战”的面向对象雏形难度是循序渐进的。更重要的是我提供了完整的、可运行的源码。你可以直接运行看效果然后像拆解乐高一样一行行去理解它为什么这样写再尝试修改颜色、速度、规则把它变成你自己的游戏。这个过程就是“边学边玩”的精髓——在解决问题的乐趣中不知不觉把语法刻进脑子里。2. 游戏设计与核心思路拆解2.1 游戏一猜数字——理解条件判断与循环这可能是世界上最简单的游戏也是理解程序“决策”逻辑的绝佳起点。计算机会随机生成一个1到100之间的数字玩家来猜计算机会提示“大了”或“小了”直到猜中为止。它的核心思路是建立一个“猜测-反馈-调整”的循环。程序流程是这样的首先用random.randint(1, 100)生成秘密数字。然后进入一个while True的无限循环。在循环体内通过input()获取玩家的输入并用int()转换为整数。接着使用if-elif-else进行条件判断如果猜的数大于秘密数字打印“大了”如果小于打印“小了”如果等于则打印祝贺信息并用break跳出循环。注意这里有一个初学者极易踩的坑——输入验证。玩家可能输入字母、符号或者超出范围的数字。一个健壮的程序必须处理这些异常。通常我们会用try...except ValueError来包裹转换整数的操作如果转换失败就提示玩家输入无效并让他重新输入而不是让程序直接崩溃。这个游戏虽然简单但它完美诠释了程序的三大基本结构顺序生成随机数、分支判断大小、循环持续猜测。你可以在此基础上扩展比如记录猜测次数、设置难度等级调整数字范围、或者让玩家和电脑角色互换。2.2 游戏二井字棋——掌握二维列表与函数封装井字棋也叫Tic-Tac-Toe是一个经典的两人对战游戏。在编程实现上它引入了“棋盘”这个二维数据结构是学习列表list和函数封装的理想案例。核心思路是用一个3x3的二维列表来表示棋盘每个元素初始可以是空格‘ ‘。玩家和电脑或另一个玩家轮流落子用‘X’和‘O’填充。每走一步程序需要做三件事1. 在棋盘上显示当前状态2. 接收玩家输入的行列坐标3. 判断落子位置是否合法且为空。之后最关键的一步是胜负判断。这需要检查所有可能连成一条线的情况三行、三列、两条对角线。任何一条线上的三个格子都是同一个玩家的棋子则该玩家获胜。实操心得胜负判断函数的编写是重点。一个清晰的写法是先准备一个包含所有获胜组合共8种的列表每个组合是三个坐标元组。然后遍历这个列表检查棋盘上这三个位置的值是否相同且不为空。这样写逻辑清晰易于理解和调试比写一堆独立的if语句要优雅得多。这个游戏可以深化为“人机对战”引入简单的AI比如让电脑优先占据中心、阻止玩家获胜、或者随机选择空位。这就会涉及到简单的算法思维。2.3 游戏三贪吃蛇——深入列表操作与循环控制贪吃蛇是许多人的编程启蒙游戏。它动态地展示了如何用列表来管理一个不断变化的序列蛇身以及如何通过循环来驱动游戏世界。其核心数据结构是“蛇”我们可以用一个列表来表示列表中的每个元素是一个表示坐标的元组(x, y)。列表的第一个元素是蛇头最后一个元素是蛇尾。游戏的核心循环游戏主循环每秒执行很多次比如10次即10 FPS。每次循环中1. 根据当前方向上、下、左、右计算蛇头的新坐标。2. 检查新坐标是否撞墙超出边界或者撞到自己新坐标是否已在蛇身列表中。如果是游戏结束。3. 检查新坐标是否与食物坐标重合。如果是得分增加并在随机位置生成新的食物注意此时蛇身变长但不需要删除蛇尾。4. 如果没吃到食物则需要在蛇头插入新坐标的同时删除列表末尾的蛇尾坐标以实现移动效果。5. 清屏并重新绘制整个游戏画面。避坑指南这里最大的一个坑是“蛇的移动”逻辑。初学者容易混淆“增长”和“移动”。正确的做法是无论是否吃到食物都先在列表头部插入新的蛇头坐标。区别在于如果吃到了食物就不删除蛇尾如果没吃到就删除蛇尾。这个顺序和逻辑必须非常清晰否则蛇的行为会变得诡异。实现这个游戏你会深刻理解列表的append()、insert()和pop()操作以及如何用while循环构建游戏引擎的基本框架。2.4 游戏四扫雷——学习二维网格与递归算法扫雷游戏引入了更复杂的二维网格状态管理和递归算法挑战性上了一个台阶。你需要管理两个棋盘一个是对玩家可见的“显示棋盘”另一个是存储地雷和数字的“真实棋盘”。游戏初始化时随机在真实棋盘中布置地雷。然后遍历所有非雷格子计算其周围8个格子中的地雷数量并记录在真实棋盘中。当玩家点击一个格子时如果它是雷游戏结束如果它是数字则显示该数字如果它是空白周围无雷则这里就是核心算法——递归展开。程序需要自动展开所有相邻的空白格子直到遇到数字边界为止。这个递归过程能让玩家一下子打开一大片安全区域是游戏体验的关键。技术细节递归函数reveal(x, y)的实现是关键。它首先检查坐标是否越界以及该位置是否已被处理过。然后将显示棋盘的对应位置设为真实棋盘的值数字或空白。如果真实棋盘的值是0空白则对周围8个方向递归调用reveal函数。这里必须注意设置递归的终止条件防止无限递归。实现扫雷是对你逻辑严密性和算法思维的一次很好锻炼。你还可以添加标记地雷、计时、难度选择等功能。2.5 游戏五2048——熟悉矩阵操作与状态合并逻辑2048是一个数字滑动合并游戏它本质上是对一个4x4矩阵进行操作。核心逻辑在于处理玩家的每一次滑动上、下、左、右。以向左滑动为例需要对每一行进行操作1.去除空格将行中所有非零数字向左紧凑排列。2.合并相同数字从左向右遍历如果当前数字和下一个数字相同则将当前数字乘以2下一个数字置零并将得分增加。3.再次去除空格合并后可能产生新的空格需要再次紧凑排列。其他方向的滑动原理相同只是操作的方向和顺序需要调整。实现技巧一个高效的实现方法是将四个方向的操作统一。你可以先定义一个处理单行或单列合并的函数。然后对于不同方向先将矩阵旋转或转置使其都能用“向左合并”这个统一的操作来处理处理完再转回去。这能极大减少重复代码是编程中“抽象”思维的体现。游戏结束的判断条件是棋盘被填满且任意相邻的两个格子都无法合并。你需要编写函数来检查是否满足这个条件。这个游戏能让你熟练掌握对二维列表矩阵的遍历、旋转和元素操作。2.6 游戏六简易飞机大战——初探面向对象与事件驱动飞机大战是一个更接近“真正游戏”的项目它自然地引入了面向对象编程OOP的思想。我们将游戏中的角色玩家飞机、敌机、子弹抽象为“类”。例如定义一个Plane类它有属性坐标x, y、图像、速度、生命值等。还有方法draw()用于在屏幕上绘制自己move()用于根据规则更新坐标shoot()用于发射子弹等。子弹和敌机也可以定义为类似的类。游戏主循环中会维护几个列表玩家子弹列表、敌机列表、敌机子弹列表。每一帧主循环做以下几件事1. 处理用户输入键盘事件控制玩家飞机移动和发射。2. 更新所有对象的状态调用它们的move()方法。3. 进行碰撞检测检查玩家子弹和敌机、玩家飞机和敌机子弹/敌机是否有坐标重叠。4. 删除被击中或飞出屏幕的对象。5. 随机生成新的敌机。6. 重新绘制所有对象。核心要点这个游戏的关键是理解“游戏循环”和“事件驱动”。所有动态效果都源于这个每秒运行几十次的循环。碰撞检测是游戏逻辑的核心通常使用简单的矩形碰撞判断两个对象的坐标矩形是否相交。使用面向对象的方式能让代码结构非常清晰新增一种敌机或子弹类型变得很容易只需定义一个新的类即可。通过这个游戏你将从面向过程的思维初步迈向面向对象的设计这是编程能力的一次重要升级。3. 环境准备与工具选择3.1 Python解释器与基础库工欲善其事必先利其器。要运行这些游戏你首先需要一个Python环境。我强烈推荐使用Python 3.8 或更高版本新版本有更好的性能和语法支持。去Python官网下载安装包安装时务必勾选“Add Python to PATH”这样就能在命令行中直接使用python命令了。安装后打开命令行Windows上是CMD或PowerShellMac/Linux上是Terminal输入python --version如果显示版本号说明安装成功。这些游戏主要依赖Python的标准库但为了更好的体验我们会用到两个额外的库Pygame用于制作“贪吃蛇”、“飞机大战”等有图形界面的游戏。它功能强大社区资源丰富是Python游戏开发的事实标准。Pygame Zero对于“飞机大战”这类更复杂的游戏Pygame Zero是一个更友好的选择。它在Pygame基础上做了封装隐藏了部分底层细节如游戏主循环让你更专注于游戏逻辑本身。安装它们非常简单只需在命令行中执行pip install pygame pip install pgzero # Pygame Zeropip是Python的包管理工具通常随Python一起安装。3.2 代码编辑器VS Code的配置一个好用的编辑器能极大提升编程效率和乐趣。Visual Studio Code (VS Code)是目前最受欢迎的选择之一它免费、轻量、插件生态极其丰富。首先去VS Code官网下载安装。安装完成后你需要做几件事来配置Python开发环境安装Python扩展在VS Code的扩展市场左侧边栏的方块图标中搜索“Python”安装由Microsoft发布的那个官方扩展。它提供了代码高亮、智能提示、调试、格式化等所有核心功能。选择解释器按CtrlShiftP打开命令面板输入“Python: Select Interpreter”选择你刚才安装的Python版本。这确保了VS Code使用正确的环境。安装代码格式化工具可选但推荐在VS Code的终端里运行pip install autopep8。然后在VS Code设置中搜索“Format On Save”并勾选。这样每次保存文件时代码会自动整理成规范的格式非常省心。现在你可以创建一个新的.py文件开始愉快地写代码了。VS Code会给你实时的语法错误提示和智能补全建议。3.3 项目管理与源码结构当你开始写多个游戏时良好的文件管理习惯很重要。我建议为这个“6个小游戏”项目单独创建一个文件夹比如叫做python_mini_games。在这个文件夹里为每个游戏创建一个子文件夹例如01_guess_number,02_tic_tac_toe等。每个游戏的源码文件.py和可能用到的图片、声音资源都放在对应的子文件夹里。这样做的好处是结构清晰互不干扰。你可以在每个游戏的文件夹里单独运行和测试。在VS Code中你可以直接打开整个python_mini_games文件夹作为工作区方便在多个文件间切换。4. 核心代码解析与实现要点4.1 猜数字游戏的健壮性实现下面是一个增强了输入验证和游戏体验的猜数字游戏代码框架import random def guess_number(): secret random.randint(1, 100) attempts 0 print(欢迎来到猜数字游戏我已经想好了一个1到100之间的整数。) while True: try: # 获取玩家输入并尝试转换为整数 guess input(f这是你的第{attempts 1}次尝试请输入你的猜测) guess_num int(guess) # 验证输入范围 if guess_num 1 or guess_num 100: print(提示请输入1到100之间的数字哦) continue attempts 1 # 核心判断逻辑 if guess_num secret: print(猜大了再试试看。) elif guess_num secret: print(猜小了再试试看。) else: print(f太棒了你猜对了数字就是 {secret}。) print(f你总共用了 {attempts} 次。) break # 猜对后跳出循环 except ValueError: # 处理非数字输入 print(输入无效请输入一个整数。) if __name__ __main__: guess_number()要点解析try...except ValueError这是处理用户输入错误的黄金标准。用户可能输入“abc”或直接回车int()函数会抛出ValueError异常。我们捕获它并给出友好提示程序不会崩溃。范围验证即使转换成功数字也可能不在1-100之间。我们添加了一个if判断来处理这种情况并使用continue跳过本次循环的剩余部分直接开始下一次猜测。计数与反馈attempts变量记录了尝试次数并在每次提示中显示增强了游戏的互动感和目标感鼓励用更少的次数猜中。4.2 井字棋的AI雏形与胜负判断一个完整的双人井字棋实现如下并附带了简单的电脑随机落子AIimport random def print_board(board): 打印当前棋盘状态 for row in board: print(|.join(row)) print(- * 5) def check_winner(board, player): 检查指定玩家是否获胜 # 检查三行 for row in board: if all([cell player for cell in row]): return True # 检查三列 for col in range(3): if all([board[row][col] player for row in range(3)]): return True # 检查两条对角线 if all([board[i][i] player for i in range(3)]) or \ all([board[i][2-i] player for i in range(3)]): return True return False def get_available_moves(board): 获取所有可落子的空位坐标 moves [] for i in range(3): for j in range(3): if board[i][j] : moves.append((i, j)) return moves def player_move(board): 处理玩家落子 while True: try: row int(input(请输入行号 (0, 1, 2): )) col int(input(请输入列号 (0, 1, 2): )) if board[row][col] : board[row][col] X break else: print(该位置已有棋子请重新选择。) except (ValueError, IndexError): print(输入无效请输入0, 1, 2之间的数字。) def computer_move(board): 简单的电脑AI随机选择空位落子 available get_available_moves(board) if available: row, col random.choice(available) board[row][col] O print(f电脑在({row}, {col})落子。) def main(): board [[ for _ in range(3)] for _ in range(3)] current_player X # 玩家先手 while True: print_board(board) if current_player X: player_move(board) else: computer_move(board) # 检查胜负 if check_winner(board, current_player): print_board(board) winner 玩家 if current_player X else 电脑 print(f恭喜 {winner} 获胜) break # 检查平局 if not get_available_moves(board): print_board(board) print(棋盘已满平局) break # 切换玩家 current_player O if current_player X else X if __name__ __main__: main()AI扩展思路这里的电脑AI只是随机落子。你可以尝试实现一个更聪明的AI例如优先策略如果中心空着先占中心否则占角。进攻策略检查自己是否有两个连着的棋子有则落子完成三连。防守策略检查对手是否有两个连着的棋子有则落子阻止。 实现这些策略你需要遍历所有空位模拟落子后调用check_winner函数来判断。这能让你深入理解游戏AI的基本原理。4.3 贪吃蛇的Pygame实现框架使用Pygame实现贪吃蛇涉及到初始化、游戏循环、事件处理和图形绘制。以下是核心框架import pygame import random import sys # 初始化 pygame.init() WIDTH, HEIGHT 600, 600 GRID_SIZE 20 GRID_WIDTH WIDTH // GRID_SIZE GRID_HEIGHT HEIGHT // GRID_SIZE screen pygame.display.set_mode((WIDTH, HEIGHT)) clock pygame.time.Clock() # 颜色定义 BLACK (0, 0, 0) WHITE (255, 255, 255) GREEN (0, 255, 0) RED (255, 0, 0) # 蛇的初始状态 snake [(GRID_WIDTH // 2, GRID_HEIGHT // 2)] snake_direction (1, 0) # 初始向右移动 # 食物的初始位置 food (random.randint(0, GRID_WIDTH-1), random.randint(0, GRID_HEIGHT-1)) def draw_grid(): 绘制网格背景 for x in range(0, WIDTH, GRID_SIZE): pygame.draw.line(screen, (50, 50, 50), (x, 0), (x, HEIGHT)) for y in range(0, HEIGHT, GRID_SIZE): pygame.draw.line(screen, (50, 50, 50), (0, y), (WIDTH, y)) def draw_snake(): 绘制蛇 for segment in snake: rect pygame.Rect(segment[0]*GRID_SIZE, segment[1]*GRID_SIZE, GRID_SIZE, GRID_SIZE) pygame.draw.rect(screen, GREEN, rect) pygame.draw.rect(screen, (0, 200, 0), rect, 1) # 边框 def draw_food(): 绘制食物 rect pygame.Rect(food[0]*GRID_SIZE, food[1]*GRID_SIZE, GRID_SIZE, GRID_SIZE) pygame.draw.rect(screen, RED, rect) def game_loop(): global snake, snake_direction, food running True while running: # 1. 处理事件 for event in pygame.event.get(): if event.type pygame.QUIT: running False elif event.type pygame.KEYDOWN: # 改变方向但不能直接反向 if event.key pygame.K_UP and snake_direction ! (0, 1): snake_direction (0, -1) elif event.key pygame.K_DOWN and snake_direction ! (0, -1): snake_direction (0, 1) elif event.key pygame.K_LEFT and snake_direction ! (1, 0): snake_direction (-1, 0) elif event.key pygame.K_RIGHT and snake_direction ! (-1, 0): snake_direction (1, 0) # 2. 更新游戏状态 # 计算新的蛇头位置 head_x, head_y snake[0] new_head (head_x snake_direction[0], head_y snake_direction[1]) # 检查碰撞撞墙或撞自己 if (new_head[0] 0 or new_head[0] GRID_WIDTH or new_head[1] 0 or new_head[1] GRID_HEIGHT or new_head in snake): print(游戏结束) running False break # 移动蛇头部插入新位置 snake.insert(0, new_head) # 检查是否吃到食物 if new_head food: # 生成新食物确保不在蛇身上 while True: food (random.randint(0, GRID_WIDTH-1), random.randint(0, GRID_HEIGHT-1)) if food not in snake: break else: # 没吃到食物删除蛇尾 snake.pop() # 3. 绘制画面 screen.fill(BLACK) draw_grid() draw_snake() draw_food() pygame.display.flip() # 4. 控制游戏速度 clock.tick(10) # 每秒10帧 pygame.quit() sys.exit() if __name__ __main__: game_loop()关键逻辑详解方向控制在KEYDOWN事件处理中我们不仅响应按键还加了限制条件例如当蛇向右(1,0)移动时不能立即按左键(-1,0)反向否则会直接撞到自己。这是游戏体验的重要细节。碰撞检测撞墙检测通过判断新蛇头坐标是否在网格范围内实现。撞自己检测通过判断新蛇头坐标是否已在snake列表中实现。食物生成生成新食物时使用while循环确保食物不会出现在蛇的身体上。游戏速度clock.tick(10)控制了游戏主循环每秒运行的次数帧率。数字越大蛇移动越快。5. 常见问题与调试技巧实录5.1 环境与依赖问题问题1运行代码时提示“ModuleNotFoundError: No module named ‘pygame’”。原因Pygame库没有安装或者安装在了错误的Python环境下。解决确认你正在使用的Python环境。在VS Code的终端或系统命令行中输入python -m pip --version查看pip关联的Python路径是否正确。重新安装pip install pygame。如果提示权限问题可以尝试pip install --user pygame。如果你使用了虚拟环境如venv, conda请确保在激活虚拟环境后再安装和运行。问题2Pygame窗口一闪而过或者打开后无法关闭。原因通常是游戏主循环的逻辑有问题比如缺少事件处理或循环退出条件。解决确保你的主循环中包含了pygame.event.get()来处理事件特别是pygame.QUIT事件用户点击窗口关闭按钮。检查循环退出条件。例如在贪吃蛇游戏中碰撞检测后如果游戏结束除了打印信息一定要设置running False来跳出主循环。在主循环结束后调用pygame.quit()和sys.exit()来正确关闭Pygame并退出程序。5.2 游戏逻辑与BUG排查问题3贪吃蛇移动时按反向键会直接死亡。原因没有对方向输入做合法性检查。比如蛇正在向右移动此时按左键蛇头会立刻向左移动一格与原来的第二节身体重合导致“撞到自己”的判断成立。解决在方向控制代码中加入禁止直接反向的逻辑。如上面代码所示用一个条件判断来阻止snake_direction被设置为当前方向的相反方向。问题4井字棋判断胜负的代码又长又乱容易出错。原因使用了大量独立的if语句来检查8种获胜情况。解决采用“获胜组合列表”法。预先定义一个包含所有获胜坐标三元组的列表。这样判断胜负的函数只需遍历这个列表检查当前棋盘上这三个位置是否被同一玩家占据。代码简洁且不易遗漏。WINNING_COMBOS [ # 行 [(0,0), (0,1), (0,2)], [(1,0), (1,1), (1,2)], [(2,0), (2,1), (2,2)], # 列 [(0,0), (1,0), (2,0)], [(0,1), (1,1), (2,1)], [(0,2), (1,2), (2,2)], # 对角线 [(0,0), (1,1), (2,2)], [(0,2), (1,1), (2,0)], ] def check_winner_elegant(board, player): for combo in WINNING_COMBOS: if all(board[r][c] player for r, c in combo): return True return False问题5扫雷游戏递归展开时程序卡死或报“递归深度超过最大限制”。原因递归函数没有正确的终止条件或者对已处理的格子没有做标记导致无限递归调用自身。解决在递归函数reveal(x, y)的开头首先检查坐标(x, y)是否越界以及该位置在“显示棋盘”上是否已经是已揭开状态非‘?’或‘*’。如果是则直接return。在递归调用周围8个邻居之前先更新当前格子的显示状态例如标记为已揭开。这样当递归调用回到这个格子时第一步检查就会阻止它再次被处理。5.3 性能与体验优化问题6游戏运行起来感觉卡顿不流畅。原因可能是每帧绘制的内容太多或者主循环中的某些操作如不必要的重复计算耗时过长。解决限制帧率使用clock.tick(FPS)来稳定帧率。对于贪吃蛇这类游戏10-15帧足够对于飞机大战可能需要30-60帧。优化绘制只绘制发生变化的部分。在Pygame中可以使用pygame.display.update()只更新指定的矩形区域而不是每次都pygame.display.flip()更新整个屏幕。但对于初学者的小游戏全屏更新通常问题不大。避免在循环中创建大量新对象例如在贪吃蛇的移动逻辑中使用list.insert()和list.pop()来修改现有的蛇身列表而不是每次都创建一个全新的列表。问题7想让游戏更好看比如添加图片和音效。解决图片使用pygame.image.load(‘path/to/image.png’).convert()或.convert_alpha()对于带透明度的PNG图片加载图片。然后在绘制函数中使用screen.blit(image, (x, y))将图片绘制到屏幕上。音效使用pygame.mixer.Sound(‘path/to/sound.wav’)加载音效。在需要播放的时候如吃到食物、发生碰撞调用sound.play()。注意加载资源如图片、声音的操作务必放在游戏主循环之前比如在初始化部分。如果在主循环中每帧都加载会严重拖慢游戏速度。6. 从模仿到创造你的扩展挑战当你成功运行并理解了这六个游戏后真正的学习才刚刚开始。模仿是第一步创造才是目的。这里有一些扩展思路可以帮你把项目变成自己的作品1. 增加功能与难度猜数字让电脑来猜玩家心中的数字你来实现这个二分查找算法。井字棋实现一个不输的AI使用极小化极大算法。贪吃蛇增加障碍物、多种类型的食物加速、减速、穿墙。扫雷添加计时器、排行榜、自定义地图大小和雷数。2048添加动画效果方块移动和合并的渐变或者保存最高分记录。飞机大战增加多种敌人类型移动模式不同、Boss战、武器升级系统。2. 改变主题与外观修改颜色、字体、图片素材让游戏拥有完全不同的视觉风格。比如把贪吃蛇变成“吃豆人”把飞机大战变成“星际大战”。3. 整合与创新尝试为所有游戏制作一个统一的图形化启动菜单用按钮来选择游戏。将某个游戏的逻辑移植到另一个框架下比如用Pygame Zero重写飞机大战体验不同的开发模式。4. 代码重构与优化回顾最初的代码看看哪些地方可以写得更好。比如将重复的代码提取成函数使用更合适的数据结构添加更多的注释和文档字符串。学习使用面向对象的方式重构“贪吃蛇”或“飞机大战”让代码结构更清晰更容易扩展。编程就像搭积木你现在已经拥有了六种基础形状的积木块。不要止步于按照图纸搭建试着用它们去创造属于你自己的城堡。每一次尝试修改、调试、最终让新功能运行起来的过程都是你编程能力实实在在的成长。遇到问题就回头看看代码查查文档或者搜索一下你遇到的问题99%都已经有人遇到过并解决了。这就是编程学习的路径——在玩中学在错中学。