Python自学第十九天——飞机大战项目实践(二)

作为新手自学Python的第十九天,技术低微,希望可以通过这种方式督促自己学习。

个人学习环境:python3.9,PyCharm 2021.3.2 (Community Edition)


利用python完成飞机大战是一个非常经典的练手项目,本次完成我方飞机的实现。


在昨天的基础上,我们今天完成生成我方飞机并实现控制移动。

# 导入pygame库
import pygame
# 导入pygame库中的一些常量
from pygame.locals import *
# 导入sys库中的exit函数
from sys import exit
​
def run_game():
    # 定义窗口的分辨率
    SCREEN_WIDTH = 480
    SCREEN_HEIGHT = 640
    
    ticks = 0
    # dict 字典
    offset = {pygame.K_LEFT: 0, pygame.K_RIGHT: 0, pygame.K_UP: 0, pygame.K_DOWN: 0}
​
    # 初始化游戏
    pygame.init()   # 初始化 pygame
    screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # 初始化窗口
    pygame.display.set_caption('飞机大战')  # 设置窗口标题
​
    # 载入背景图
    background = pygame.image.load('./image/background.png')
    
    # 载入飞机图片
    hero1 = pygame.image.load('./image/me1.png')
    hero2 = pygame.image.load('./image/me2.png')
    # 展示飞机的位置
    hero_pos = [200, 500]
    
    # 事件循环(main loop)
    while True:
        
        # 绘制背景
        screen.blit(background,(0, 0))
        
        # 绘制飞机
        if ticks % 50 < 25:
            screen.blit(hero1, hero_pos)
        else:
            screen.blit(hero2, hero_pos)
        ticks += 1
        
        # 更新屏幕
        pygame.display.update()
        
        # 处理游戏退出
        # 从消息队列中循环取
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
            # 控制方向
            if event.type == pygame.KEYDOWN: 
                if event.key in offset:
                    offset[event.key] = 3
            elif event.type == pygame.KEYUP:
                if event.key in offset:
                    offset[event.key] = 0
        offset_x = offset[pygame.K_RIGHT] - offset[pygame.K_LEFT]
        offset_y = offset[pygame.K_DOWN] - offset[pygame.K_UP]
        hero_pos = [hero_pos[0] + offset_x, hero_pos[1] + offset_y]
run_game()

注意:

  • ticks变量是用来计算次数的,在消息循环中,循环一次就自动累加一次,可以理解为每一个周期就是1 tick,我们可以利用周期数分隔开,达到不同的显示效果。我们读入了两张不同的玩家飞机图片,利用周期数实现每50个周期中,前25个周期显示hero1,后25个周期显示hero2,达到飞机动态显示的效果。

  • 利用hero_pos达到键盘控制飞机的效果。当event.type为按键事件时,再判断event.key是否属于上、下、左、右四个键位中的一个,在其相对应的方向上有一个偏移量,即完成判断的过程;方向键松开的时候该方向上的偏移量为0;最后将偏移量加到飞机的pos上,下一轮刷新时就会移动到新地方。

此时我们会发现,飞机上下左右的移动会超出屏幕显示,这是因为我们没有给移动加上限制。修改最后3行代码如下:

        hero_x = hero_pos[0] + offset[pygame.K_RIGHT] - offset[pygame.K_LEFT]
        hero_y = hero_pos[1] + offset[pygame.K_DOWN] - offset[pygame.K_UP]
        if hero_x < 0:
            hero_pos[0] = 0
        elif hero_x > SCREEN_WIDTH - 102:
            hero_pos[0] = SCREEN_WIDTH - 102
        else:
            hero_pos[0] = hero_x
​
        if y < 0:
            hero_pos[1] = 0
        elif hero_y > SCREEN_HEIGHT - 126:
            hero_pos[1] = SCREEN_HEIGHT - 126
        else:
            hero_pos[1] = hero_y

这段代码的主要作用就是判断边界,避免飞机飞出窗体。

  • 当x小于0时,程序使hero_pos[0]只能等于0,这样飞机就不能从左边“飞出去”;当x太大时,程序也只能使hero_pos[0]刚刚到达屏幕边缘,不能从右边“飞出去”。飞机的上下控制类似。

  • 程序中的102、126表示飞机的宽度和高度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,今我们来学习Python中的字典(Dictionary)。 字典是一种无序的、可变的数据类型,它以键值对(key-value)的形式存储数据,其中键(key)必须是唯一的,而值(value)可以是任意数据类型。字典用花括号{}表示,每个键值对之间用逗号隔开。 下面是一个简单的字典示例: ``` my_dict = {'name': '张三', 'age': 18, 'gender': '男'} ``` 这个字典中,'name'、'age'、'gender'就是键,而'张三'、18、'男'就是相应的值。 可以使用`dict()`函数来创建一个字典,也可以使用`{}`来创建一个空字典。 接下来,我们来看一些常用的字典操作。 1. 访问字典元素 可以通过键来访问字典中的元素,例如: ``` print(my_dict['name']) # 输出:张三 ``` 如果键不存在,则会抛出KeyError异常。 2. 修改字典元素 可以通过键来修改字典中的元素,例如: ``` my_dict['age'] = 20 print(my_dict) # 输出:{'name': '张三', 'age': 20, 'gender': '男'} ``` 3. 添加字典元素 可以通过键来添加字典中的元素,例如: ``` my_dict['address'] = '北京市' print(my_dict) # 输出:{'name': '张三', 'age': 20, 'gender': '男', 'address': '北京市'} ``` 4. 删除字典元素 可以通过键来删除字典中的元素,例如: ``` del my_dict['gender'] print(my_dict) # 输出:{'name': '张三', 'age': 20, 'address': '北京市'} ``` 5. 字典长度 可以使用`len()`函数来获取字典的长度,例如: ``` print(len(my_dict)) # 输出:3 ``` 6. 字典遍历 可以使用`items()`方法来遍历字典中的每一个键值对,例如: ``` for key, value in my_dict.items(): print(key, value) ``` 输出: ``` name 张三 age 20 address 北京市 ``` 通过上述操作,我们可以初步了解字典的基本用法。在实际应用中,字典是非常重要的数据类型,它可以用来存储和处理各种复杂的数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wei730050

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值