16 - python 仿写飞翔的小鸟,附带源码

在写飞翔的小鸟游戏前,要用到pygame这个模块。pygame是一个利用SDL库(全名Simple DirectMedia Layer)写就的游戏库。可以用pip3 install pygame命令来安装pygame。也可在pycharm中安装
pycharm安装方式:File -->setting
pygame模块的

安装完成后就可以使用pygame模块进行游戏的编写

需导入的模块
import pygame  # pygame模块
import sys  # sys模块
import random  # 随机数模块

首先实现将游戏窗口画出来,将背景加载到游戏窗口中

# 第一步:实现游戏窗口
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 400
# 初始化操作
pygame.display.init()
# 创建窗口
window = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 设置菜单栏上的游戏名称
pygame.display.set_caption('会飞的小超人')
# 加载背景图
beijing = pygame.image.load('img/beijing.jpg').convert_alpha()
beijing = pygame.transform.scale(beijing, (800, 600))
while True:
    pygame.init()
    # 添加背景
    window.blit(beijing, (0, 0))

第二步、加载小鸟图片(这里为了有趣,我用了超人代替)

# 加载图片
bird = pygame.image.load('img/bird.png')
# 位置
top = (SCREEN_HEIGHT - 50)/2
bird_rect = bird.get_rect(left=150, top=top)
while True:
    pygame.init()
    # 加载小鸟
    window.blit(bird, bird_rect)
     # 让程序每10毫秒执行一次
    pygame.time.wait(10)
    pygame.display.update()

第三步:
1、完成时间的处理,点击关闭按钮事件,按键事件
2、实现小鸟移动,上升,下降

while True:
    pygame.init()
    # 为窗口填充颜色
    window.blit(beijing, (0, 0))
    # 加载小鸟
    window.blit(bird, bird_rect)
    # v1.2 小鸟的移动处理
    bird_speed += 0.2
    bird_rect = bird_rect.move(0,bird_speed)
     # 新增事件处理
    event_list = pygame.event.get()
    for e in event_list:
      if e.type == pygame.QUIT:
          print('退出程序')
          sys.exit()
      # 事件类型 按键按下事件
      elif e.type == pygame.KEYDOWN:
          # 点击的按键为 空格 的触发
          if e.key == pygame.K_SPACE:
              print('按下空格键')
              bird_speed = -6

第四步:
实现障碍物的加载和移动

# 存储所有柱子的列表
pillar_list = []

 # v1.3 每间隔3秒,生成一次障碍物
 # 获取当前的系统时间
  end_time = pygame.time.get_ticks()
  if end_time - start_time >= 3000:
      print('生成一次障碍物')
      start_time = end_time
      x = 500
      y = 0
      width = 50
      height = random.randint(30, 150)
      # 障碍物的矩形区域
      pillar_rect_top = pygame.rect.Rect(x,y,width,height)
      # 将生成的障碍物存储到列表中
      pillar_list.append(pillar_rect_top)
  #v1.3 将所有障碍物加载出来
  for p in pillar_list:
      window.fill(COLOR_GREEN,p)

  # v1.3 所有障碍物的移动
  for p in pillar_list:
      if p.x > 0:
          p.x -= 1
      else:
          pillar_list.remove(p)
          print(f'删除一个障碍物,剩余障碍物{len(pillar_list)}')

第五步:处理小鸟的死亡

 # 处理小鸟的死亡
 for p in pillar_list:
       if p.colliderect(bird_rect):
           is_over = True
   if bird_rect.y > SCREEN_HEIGHT - bird_rect.height or bird_rect.y < 0:
       is_over = True
 # 小鸟死亡事件
  if is_over and e.key == pygame.K_SPACE:
	 # 小鸟回到初始位置
	   bird_rect = bird.get_rect(left=150, top=top)
	   # 速度清空
	   bird_speed = 1
	   # 分数清空
	   score = 0
	   # 障碍物清空
	   pillar_list.clear()
	   # is_over 状态改变
	   is_over = False

第六步,统计分数,处理结束画面

 #  得分计算:
 for p in pillar_list:
        if p.x < bird_rect.x and p.y > bird_rect.y:
            score += 1
    if score > height_score(FILE_NAME):
        score_w = open(FILE_NAME, 'w', encoding='utf-8')
        score_w.write(str(score))
        score_w.close()
    else:
        pass
 

#  处理结束画面
# 设置字体
font = pygame.font.SysFont("arial", 30) 
font1 = pygame.font.SysFont("arial", 20)
# 设置显示内容和颜色
fail_text = font.render('GAME OVER !', True, COLOR_RED)
score_text = font.render(f'SCORE:{score}', True, COLOR_RED)
score_text1 = font1.render(f'SCORE:{score}', True, COLOR_RED)
height_text = font1.render(f'HIGH_SCORE: {height_score(FILE_NAME)}', True, COLOR_RED)
# 设置显示位置
text_width, text_height = 200, 100
score_width, score_height = 200, 100
score_text1_width, score_text1_height = 100, 50
fail_rect = pygame.Rect((SCREEN_WIDTH - text_width) / 2,
                        (SCREEN_HEIGHT - text_height) / 2 - 30,
                        text_width, text_height)
score_rect = pygame.Rect((SCREEN_WIDTH - text_width) / 2 + 25,
                        (SCREEN_HEIGHT - text_height) / 2,
                        score_width, score_height)
time_score_rect = pygame.Rect(0, 0, score_text1_width, score_text1_height)
# 显示当前成绩,和 最高分
window.blit(score_text1, time_score_rect)
window.blit(height_text, (SCREEN_WIDTH / 2, 0))

第七步: 数据持久化,将最高分存入文件,每次游戏开始读取

# 记录分数功能
def height_score(FILE_NAME):
    if os.path.exists(FILE_NAME):
        f = open(FILE_NAME, 'r', encoding='utf-8')
        # 最高分从文件中读取
        height_score1 = f.read()
        if len(height_score1) > 0:
            height_score = int(height_score1)
        else:
            f = open(FILE_NAME, 'w', encoding='utf-8')
            height_score = 0
        f.close()
    else:
        f = open(FILE_NAME, 'w', encoding='utf-8')
        height_score = 0
    return height_score

最终效果:
游戏效果图
源码:百度盘: 飞翔的小鸟:https://pan.baidu.com/s/1AB7sioRIQu63vJydxFZqqw 提取码:hrwl

这篇飞翔的小鸟没有用到面向对象编程,针对面向过程实现(主要我学习的内容还没有学到面向对象),继续奋斗,加油!!!

  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值