赞
踩
名字:阿玥的小东东
学习:python、C/C++
目录
今天制作一个大家肯定都玩过的游戏:飞机大战
游戏玩法:玩家操控一架飞机,开始时处于窗口的中下方位置
玩家飞机位置会随鼠标位置移动。
单击鼠标可让玩家飞机发射子弹。
屏幕上方不断出现敌方飞机并向下移动。
如果玩家的子弹打到敌方飞机,则敌方飞机被清除
不是内部或外部命令,也不是可运行的程序 或批处理文件。
(没有在安装解释器时勾选add to path)
再刷新窗口时,也要不断获取用户的操作信息,如果我们想要获取可以使用evnet
获取所有的窗口事件(事件就是用户做出的操作)
当前方法的返回值是一个列表,内部获取了所有的窗口事件(用户的点击,鼠标移动,关闭按钮的点击等)
我们可以根据不同的事件做出不同的反馈例如QUIT 可以退出程序
- # 创建窗口
- window = pygame.display.set_mode((512, 768))
-
- # 为了让窗口不会立即关闭,而是等待我们的操作,需要循环刷新窗口
- while True:
- # 刷新窗口内容的命令
- pygame.display.update()
-
- # print(pygame.event.get())
- for event in pygame.event.get():
- if event.type == pygame.locals.QUIT:
- exit('退出游戏')
你自己去找去!!
# TODO: 抽取常量和变量
# 思考: 变量是统一管理更为方便还是分散管理方便?? 统一管理
# 在代码中出现的数字有没有单位,比如 apples = 5 此时显示的是重量还是个数??? 不清楚
# 为了增加代码的可读性,尽量减少程序中出现的魔法数字,可以将魔法数字提取出来作为常量出现.
# 在编程中,一般不可以被修改的变量叫做常量,Python中本身是没有常量的,所以我们使用标识符大写来备注常量
# 但是这个常量可以被修改,只是提醒协同人员或调用模块的人这个是一个常量而已
- # 导入pygame模块
- import pygame
- import pygame.locals
-
-
- # 抽取常量
- WINDOW_WIDTH = 512 # 窗口宽度
- WINDOW_HEIGHT = 768 # 窗口高度
-
- # 创建全局变量
- background_x = 0
- background_y = 0
-
- # 创建窗口
- # window = pygame.display.set_mode((512, 768))
- window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
-
- # # 加载背景图片
- # background_img = pygame.image.load('res/img_bg_level_2.jpg')
- # # 将图片添加到窗口中
- # window.blit(background_img, (0, 0))
-
- # TODO: 抽取函数
- # 函数一般就是一个特定的功能,完整的功能保存到函数中进行调用即可
-
- # 移动背景图片
- def move_background():
-
- global background_y
- global background_x
-
- # 加载背景图片(自己照照片)
- background_img = pygame.image.load('res/img_bg_level_2.jpg')
-
- # 让背景图片进行移动
- window.blit(background_img, (background_x, background_y))
- # 添加辅助背景
- window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
- # 循环移动
- if background_y >= WINDOW_HEIGHT:
- background_y = 0
- else:
- background_y += 1
-
- # 获取窗口事件
- def get_window_event():
- """获取所有的窗口事件,并且进行处理"""
- # 获取关闭窗口事件
- for event in pygame.event.get():
- if event.type == pygame.locals.QUIT:
- exit('退出游戏')
-
-
- while True:
- # # 让背景图片进行移动
- # window.blit(background_img, (background_x, background_y))
- # # 添加辅助背景
- # window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
- # # 循环移动
- # if background_y >= WINDOW_HEIGHT:
- # background_y = 0
- # else:
- # background_y += 1
- # TODO: 调用移动背景的方法
- move_background()
-
- # 刷新窗口内容的命令
- pygame.display.update()
- # 获取关闭窗口事件
- # for event in pygame.event.get():
- # if event.type == pygame.locals.QUIT:
- # exit('退出游戏')
- # TODO: 调用获取事件的方法
- get_window_event()

# 移动敌机
# 为了让敌机有一个俯冲的效果,所以让敌机移动速度大于背景图片的移动速度
# enemy_y += 2
# 当敌机移动到屏幕之外我们就不需要再去显示他了,为了让敌机变量复用
# 当敌机超出屏幕范围时,将敌机恢复原位(如果我们想让敌机有一个进入到屏幕的效果,
# 我们需要将敌机的初始位置设置到屏幕外边,此时初始位置左边y值应该为负的敌机的高度)
- # 导入pygame模块
- import random
-
- import pygame
- import pygame.locals
-
- # 抽取常量
- WINDOW_WIDTH = 512 # 窗口宽度
- WINDOW_HEIGHT = 768 # 窗口高度
-
- ENEMY_WIDTH = 100 # 敌机宽度
- ENEMY_HEIGHT = 68 # 敌机高度
-
- # 创建全局变量
- background_x = 0
- background_y = 0
-
-
-
- # 创建窗口
- window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
-
-
- # TODO: 初始化敌机的函数
- def init_enemy_list():
- global enemy_list
- # 循环多少次就有多少架敌机
- for i in range(5):
- enemy_list.append(
- {'x': random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH),
- 'y': -ENEMY_HEIGHT,
- 'speed': random.randint(2, 4)
- }
- )
-
-
- # 移动背景图片
- def move_background():
- """可以滚动显示背景图片"""
- # 如果想要在函数体内部修改全局变量的值,需要声明全局变量才可以
- global background_y
- global background_x
-
- # 加载背景图片
- background_img = pygame.image.load('res/img_bg_level_2.jpg')
- # 让背景图片进行移动
- window.blit(background_img, (background_x, background_y))
- # 添加辅助背景
- window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
- # 循环移动
- if background_y >= WINDOW_HEIGHT:
- background_y = 0
- else:
- background_y += 1
-
-
- # 添加并移动敌机
- # TODO: 将每一架敌机数据组成的字典传递进来
- # TODO: 将所有的敌机的x,y,speed 用字典中的数据进行替换
- def move_enemy(enemy_dict):
- """添加敌机并且移动敌机的函数"""
- # 声明全局变量
- # global enemy_x
- # global enemy_y
- # global enemy_speed
- # 加载敌机图片
- # TODO: 随机加载飞机图片
- # 如果想要随机加载敌机图片,就对敌机的路径进行随机从plane1- plane7
- # 课下感兴趣的同学自己完成
- enemy_img = pygame.image.load('res/img-plane_1.png')
- # 在窗口上显示敌机
- window.blit(enemy_img, (enemy_dict['x'], enemy_dict['y']))
-
- if enemy_dict['y'] >= WINDOW_HEIGHT:
- enemy_dict['y'] = -ENEMY_HEIGHT
- # 每次进入屏幕时都会重置x的值
- enemy_dict['x'] = random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH)
- # 每次重新进入屏幕时,重置速度值
- enemy_dict['speed'] = random.randint(2, 4)
- else:
- enemy_dict['y'] += enemy_dict['speed']
- # 思考如果每次敌机都从一个位置出现未免太过死板游戏过于简单,所以要将敌机出现的位置x坐标设置为随机值
-
-
- # 获取窗口事件
- def get_window_event():
- """获取所有的窗口事件,并且进行处理"""
- for event in pygame.event.get():
- # 获取关闭窗口事件
- if event.type == pygame.locals.QUIT:
- exit('退出游戏')
-
-
- if __name__ == '__main__':
- # TODO: 调用函数初始化敌机数据
- init_enemy_list()
- while True:
- # 调用移动背景的方法
- move_background()
- # TODO: 如果想要添加多架敌机,要么在函数中进行循环,要么执行多次添加一架敌机的方法,我们选择后者
- for enemy in enemy_list:
- move_enemy(enemy)
- # 刷新窗口内容的命令
- pygame.display.update()
- # 调用获取事件的方法
- get_window_event()

Python从入门到精通
参与方式:点赞+关注+评论:人生苦短,我用Python!(否则无效)
截止时间:6月16日晚上20:00
《Python从入门到精通(微课精编版)》使用通俗易懂的语言、丰富的案例,详细介绍了Python语言的编程知识和应用技巧。全书共24章,内容包括Python开发环境、变量和数据类型、表达式、程序结构、序列、字典和集合、字符串、正则表达式、函数、类、模块、异常处理和程序调试、进程和线程、文件操作、数据库操作、图形界面编程、网络编程、Web编程、网络爬虫、数据处理等,还详细介绍了多个综合实战项目。其中,第24章为扩展项目在线开发,是一章纯线上内容。全书结构完整,知识点与示例相结合,并配有案例实战,可操作性强,示例源代码大都给出详细注释,读者可轻松学习,快速上手。本书采用O2O教学模式,线下与线上协同,以纸质内容为基础,同时拓展更多超值的线上内容,读者使用手机微信扫一扫即可快速阅读,拓展知识,开阔视野,获取超额实战体验。
在本章中,我们学习了Python中用来开发游戏的 pygame模块,了解了2D游戏的常见代码逻辑并演示了如何开发一个“飞机大战”游戏。在此游戏中,我们用到了之前学习过的知识,如条件判断、循环、列表、函数、模块、面向对象等,也学习了 pygame 开发时的主循环、事件响应等写法可以说是对Python基础知识的一次综合运用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。