低空经济新基建:一文读懂空中交通管理(UTM)
2026/4/12 16:02:29
日期:2023年5月24日
主题:🐍 Gaming(游戏开发)
下周预览:
Example Games(课堂演示各种Python游戏)
安装说明:
pipinstallpygame核心作用:
基本结构:
running=Truewhilerunning:# 1. 处理事件# 2. 更新游戏状态# 3. 绘制画面# 4. 刷新显示定义:
常见事件类型:
| 事件类型 | 说明 |
|---|---|
QUIT | 退出事件 |
ACTIVEEVENT | 窗口激活事件 |
KEYDOWN | 按键按下 |
KEYUP | 按键释放 |
MOUSEMOTION | 鼠标移动 |
MOUSEBUTTONUP | 鼠标按钮释放 |
MOUSEBUTTONDOWN | 鼠标按钮按下 |
JOYAXISMOTION | 游戏手柄轴移动 |
JOYBALLMOTION | 游戏手柄球移动 |
JOYHATMOTION | 游戏手柄帽移动 |
JOYBUTTONUP | 游戏手柄按钮释放 |
JOYBUTTONDOWN | 游戏手柄按钮按下 |
VIDEORESIZE | 视频窗口调整大小 |
VIDEOEXPOSE | 视频窗口曝光 |
USEREVENT | 用户自定义事件 |
访问事件:
foreventinpygame.event.get():# 处理事件事件对象示例:
<Event(768-KeyDown{'unicode':'','key':1073741906,'mod':0,'scancode':82,'window':None})><Event(769-KeyUp{'unicode':'','key':1073741906,'mod':0,'scancode':82,'window':None})>特点:
importpygame pygame.init()screen=pygame.display.set_mode((500,500))white=(255,255,255)blue=(0,0,255)running=Truewhilerunning:foreventinpygame.event.get():ifevent.type==pygame.QUIT:running=False# 用白色填充背景screen.fill(white)# 在中心绘制蓝色实心圆pygame.draw.circle(screen,blue,(250,250),75)# 更新显示pygame.display.update()# 或使用 pygame.display.flip()# 游戏结束时pygame.quit()importpygame pygame.init()screen=pygame.display.set_mode((500,500))white=(255,255,255)blue=(0,0,255)running=Truewhilerunning:foreventinpygame.event.get():ifevent.type==pygame.QUIT:running=Falsescreen.fill(white)pygame.draw.circle(screen,blue,(250,250),75)screen.fill(white): 填充背景色pygame.draw.circle(): 绘制圆形pygame.display.update()# 或 pygame.display.flip()运行代码:Let’s run this code
pygame.draw.rect(surface,color,rect)参数说明:
surface: 绘制表面(screen)color: 颜色元组rect: 矩形[left, top, width, height]示例:
# 绘制一个蛇的方块pygame.draw.rect(screen,blue,[100,100,10,10])ifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_LEFT:# 向左移动ifevent.key==pygame.K_RIGHT:# 向右移动ifevent.key==pygame.K_UP:# 向上移动ifevent.key==pygame.K_DOWN:# 向下移动按键常量:
pygame.K_LEFT: 左箭头pygame.K_RIGHT: 右箭头pygame.K_UP: 上箭头pygame.K_DOWN: 下箭头# 使用坐标元组列表表示蛇snake=[(100,100),(100,110),(100,120)]方法1:更新所有坐标(复杂)
问题:蛇头需要向下移动snake_size 但需要遍历整个列表更新所有过去的坐标 :(方法2:添加和删除(优雅)✓
步骤1: 在蛇头应该在的位置添加新方块 步骤2: 删除最后一个方块图示:
移动前: [█][█][█] ↓ 添加新头: [█][█][█][█] ↓ 删除尾部: [█][█][█] (新位置)时钟控制:
pygame.time.Clock().tick(15)作用:
帧率说明:
# 慢速游戏pygame.time.Clock().tick(10)# 10 FPS# 正常速度pygame.time.Clock().tick(15)# 15 FPS# 快速游戏pygame.time.Clock().tick(30)# 30 FPSimporttimeimportrandomimportpygame# 常量和变量white=(255,255,255)blue=(50,153,213)green=(0,255,0)dis_width=600dis_height=400block_size=10snake_length=15# 初始化pygame窗口pygame.init()screen=pygame.display.set_mode((dis_width,dis_height))pygame.display.set_caption('CS 41 PYTHON')definitialize_snake(len,start_left,start_top):initialize_snake=[]foriinrange(len):initialize_snake.append((start_left,start_top+(block_size*i)))returninitialize_snakedefdraw_snake(snake_coords):forx,yinsnake_coords:pygame.draw.rect(screen,blue,[x,y,block_size,block_size])defupdate_snake(x,y,snake):snake.append((x,y))iflen(snake)>snake_length:delsnake[0]returnsnake工作原理:
defgenerate_food(snake):whileTrue:food_x=random.randrange(0,dis_width,block_size)food_y=random.randrange(0,dis_height,block_size)if(food_x,food_y)notinsnake:returnfood_x,food_y重要细节:
random.randrange()生成随机坐标block_size确保食物在网格上defdraw_food(food_x,food_y):pygame.draw.rect(screen,green,[food_x,food_y,block_size,block_size])defcheck_collision(snake_head,food_x,food_y):ifsnake_head[0]==food_xandsnake_head[1]==food_y:returnTruereturnFalsedefgame():globalsnake_length# 使用全局变量running=Truex_change=0y_change=0x=dis_width/2y=dis_height/2snake=initialize_snake(snake_length,x,y)food_x,food_y=generate_food(snake)whilerunning:screen.fill(white)draw_snake(snake)draw_food(food_x,food_y)foreventinpygame.event.get():ifevent.type==pygame.QUIT:running=Falseifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_LEFT:x_change=-block_size y_change=0ifevent.key==pygame.K_RIGHT:x_change=block_size y_change=0ifevent.key==pygame.K_UP:x_change=0y_change=-block_sizeifevent.key==pygame.K_DOWN:x_change=0y_change=block_size x+=x_change y+=y_change snake=update_snake(x,y,snake)ifcheck_collision(snake[-1],food_x,food_y):snake_length+=1food_x,food_y=generate_food(snake)draw_snake(snake)pygame.time.Clock().tick(15)pygame.display.flip()pygame.quit()if__name__=="__main__":game()每帧执行步骤:
1. 清空屏幕(填充白色) 2. 绘制蛇和食物 3. 处理事件(键盘输入、退出) 4. 更新蛇的位置 5. 检查是否吃到食物 6. 如果吃到食物: - 增加蛇的长度 - 生成新食物 7. 重新绘制 8. 控制帧率(15 FPS) 9. 刷新显示任务:为贪吃蛇游戏添加食物功能
准备工作:
pip install pygame食物碰撞:
食物生成:
提示:
扩展功能(可选):
关键点:
# 1. 食物坐标必须是block_size的倍数food_x=random.randrange(0,dis_width,block_size)food_y=random.randrange(0,dis_height,block_size)# 2. 检测碰撞ifsnake_head==(food_x,food_y):snake_length+=1# 生成新食物# 3. 确保食物不在蛇身上while(food_x,food_y)insnake:# 重新生成游戏开发三要素:
1. 游戏循环(Game Loop) └─ 持续运行直到游戏结束 2. 事件处理(Event Handling) └─ 响应用户输入 3. 绘制更新(Draw & Update) └─ 显示游戏状态# 标准游戏循环模式pygame.init()screen=pygame.display.set_mode((width,height))clock=pygame.time.Clock()running=Truewhilerunning:# 1. 处理事件foreventinpygame.event.get():ifevent.type==pygame.QUIT:running=False# 其他事件处理# 2. 更新游戏逻辑# 更新位置、检测碰撞等# 3. 绘制screen.fill(background_color)# 绘制游戏元素# 4. 刷新和控制帧率pygame.display.flip()clock.tick(FPS)pygame.quit()初始化与窗口:
pygame.init()screen=pygame.display.set_mode((width,height))pygame.display.set_caption('Title')事件处理:
pygame.event.get()# 获取所有事件event.type# 事件类型event.key# 按键值绘制函数:
screen.fill(color)# 填充背景pygame.draw.circle(screen,color,(x,y),r)# 圆形pygame.draw.rect(screen,color,[x,y,w,h])# 矩形pygame.draw.line(screen,color,(x1,y1),(x2,y2))# 线条显示更新:
pygame.display.flip()# 刷新整个屏幕pygame.display.update()# 更新特定区域时间控制:
clock=pygame.time.Clock()clock.tick(FPS)# 控制帧率数据结构选择:
# 用列表存储蛇的所有方块snake=[(x1,y1),(x2,y2),(x3,y3)]# 蛇头:snake[-1]# 蛇尾:snake[0]移动算法:
# 添加新头snake.append((new_x,new_y))# 删除旧尾(如果没吃食物)ifnotate_food:delsnake[0]网格对齐:
# 确保所有坐标都是block_size的倍数x=random.randrange(0,width,block_size)y=random.randrange(0,height,block_size)基础扩展:
进阶扩展:
5. 多个食物
6. 特殊食物(加速/减速/双倍分数)
7. 障碍物
8. 暂停功能
9. 最高分记录
10. 音效和背景音乐
常见问题:
# 1. 窗口一闪而过# 解决:确保有游戏循环和事件处理# 2. 游戏太快/太慢# 解决:调整clock.tick()的参数# 3. 绘制不显示# 解决:确保调用了pygame.display.flip()# 4. 蛇移动不连续# 解决:确保坐标是block_size的倍数官方文档:
教程推荐:
游戏循环是核心:
事件驱动编程:
帧率控制重要:
数据结构选择:
模块化设计: