资讯详情

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上,下一轮刷新将移动到新的地方。

这时,我们会发现飞机上下左右移动会超过屏幕显示,因为我们对移动没有限制。修改最后三行代码如下:

        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表示飞机的宽度和高度。

标签: x4me2接近传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司