前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【pygame系列 第四课 弹球游戏-下 】

【pygame系列 第四课 弹球游戏-下 】

作者头像
叶子陪你玩
发布2020-03-12 14:52:05
9880
发布2020-03-12 14:52:05
举报
本课任务在上一课基础上,实现下面几个任务。

第五步:窗体底部绘制一个挡板

第六步:用鼠标控制挡板左右移动

第七步:小球碰到挡板反弹,碰到底部结束

第八步:绘制游戏得分

第九步:绘制游戏结束界面文字

5.窗体底部绘制一个挡板

代码:

代码语言:javascript
复制
import pygame
import sys
import random
pygame.init()

size =width,height=400,300
screen = pygame.display.set_mode(size)
pygame.display.set_caption("弹球游戏")

# 背景白色
bg = (255,255,255)
# 球的颜色 红色
ball_color = (255,0,0)
# 球的大小 半径
ball_size = 20
# 球的初始位置 设置在窗口中心位置
pos_x,pos_y = width//2-ball_size,height//2-ball_size
# 设置球的 初始速度
speed_x=random.randint(1,5)
speed_y=random.randint(1,5)
# 设置挡板的 颜色 蓝色
board_color = (0,0,255)
# 设置挡板的 宽和高
board_width,board_height=50,10
# 设置挡板的初始位置
board_x,board_y = (width-board_width)//2,height-board_height
while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      sys.exit()
  
  screen.fill(bg)
  # 在窗口上绘制一个圆形 球
  pygame.draw.circle(screen,ball_color,[pos_x,pos_y],ball_size)
  # 在窗口上绘制一个挡板
  pygame.draw.rect(screen,board_color,[board_x,board_y,board_width,board_height])
  pygame.display.flip()
  # 等待 100ms 避免刷新太快
  pygame.time.wait(100)
  if pos_x <ball_size or pos_x > width-ball_size:
    speed_x = -speed_x
  if pos_y <ball_size or pos_y > height-ball_size:
    speed_y = -speed_y
  # 更改位置
  pos_x += speed_x
  pos_y += speed_

效果:

6.用鼠标控制挡板左右移动

代码:

代码语言:javascript
复制
import pygame
import sys
import random
pygame.init()

size =width,height=400,300
screen = pygame.display.set_mode(size)
pygame.display.set_caption("弹球游戏")

# 背景白色
bg = (255,255,255)
# 球的颜色 红色
ball_color = (255,0,0)
# 球的大小 半径
ball_size = 20
# 球的初始位置 设置在窗口中心位置
pos_x,pos_y = width//2-ball_size,height//2-ball_size
# 设置球的 初始速度
speed_x=random.randint(1,5)
speed_y=random.randint(1,5)
# 设置挡板的 颜色 蓝色
board_color = (0,0,255)
# 设置挡板的 宽和高
board_width,board_height=50,4
# 设置挡板的初始位置
board_x,board_y = (width-board_width)//2,height-board_height
while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      sys.exit()
    # 检测鼠标移动事件
    if event.type ==pygame.MOUSEMOTION:
      # 获取鼠标移动的位置
      mouse_x,mouse_y=pygame.mouse.get_pos()
      # 防止挡板出右边的边界
      if mouse_x>(width-board_width):
        mouse_x=width-board_width
      # 设置挡板的x坐标为鼠标位置,跟着鼠标移动
      board_x=mouse_x

  screen.fill(bg)
  # 在窗口上绘制一个圆形 球
  pygame.draw.circle(screen,ball_color,[pos_x,pos_y],ball_size)
  # 在窗口上绘制一个挡板
  pygame.draw.rect(screen,board_color,[board_x,board_y,board_width,board_height])
  pygame.display.flip()
  # 等待 100ms 避免刷新太快
  pygame.time.wait(100)
  if pos_x <ball_size or pos_x > width-ball_size:
    speed_x = -speed_x
  if pos_y <ball_size or pos_y > height-ball_size:
    speed_y = -speed_y
  # 更改位置
  pos_x += speed_x
  pos_y += speed_y

效果:

7.小球碰到挡板反弹,碰到底部结束

代码:

代码语言:javascript
复制
import pygame
import sys
import random
pygame.init()

size =width,height=400,300
screen = pygame.display.set_mode(size)
pygame.display.set_caption("弹球游戏")
# 背景白色
bg = (255,255,255)
# 球的颜色 红色
ball_color = (255,0,0)
# 球的大小 半径
ball_size = 20
# 球的初始位置 设置在窗口中心位置
pos_x,pos_y = width//2-ball_size,height//2-ball_size
# 设置球的 初始速度
speed_x=random.randint(1,5)
speed_y=random.randint(1,5)
# 设置挡板的 颜色 蓝色
board_color = (0,0,255)
# 设置挡板的 宽和高
board_width,board_height=50,4
# 设置挡板的初始位置
board_x,board_y = (width-board_width)//2,height-board_height
while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      sys.exit()
    # 检测鼠标移动事件
    if event.type ==pygame.MOUSEMOTION:
      # 获取鼠标移动的位置
      mouse_x,mouse_y=pygame.mouse.get_pos()
      # 防止挡板出右边的边界
      if mouse_x>(width-board_width):
        mouse_x=width-board_width
      # 设置挡板的x坐标为鼠标位置,跟着鼠标移动
      board_x=mouse_x

  screen.fill(bg)
  # 在窗口上绘制一个圆形 球
  pygame.draw.circle(screen,ball_color,[pos_x,pos_y],ball_size)
  # 在窗口上绘制一个挡板
  pygame.draw.rect(screen,board_color,[board_x,board_y,board_width,board_height])
  pygame.display.flip()
  # 等待 100ms 避免刷新太快
  pygame.time.wait(100)
  if pos_x <ball_size or pos_x > width-ball_size:
    speed_x = -speed_x
  if pos_y <ball_size:
    speed_y = -speed_y
  # 如果球已经进入到board厚度以下就要开始检测是否碰撞
  elif pos_y>=height-ball_size-board_height:
    # 如果球与board接触,就反弹
    if board_x <= pos_x <= board_x+50:
      speed_y=-speed_y
    # 如果球已经碰到窗体底部,则游戏结束
    elif pos_y>height-ball_size:
      # 退出游戏
      sys.exit
    # 更改位置
  pos_x += speed_x
  pos_y += speed_y

8.绘制游戏得分

代码:

代码语言:javascript
复制
import pygame
import sys
import random
pygame.init()

size =width,height=400,300
screen = pygame.display.set_mode(size)
pygame.display.set_caption("弹球游戏")
# 背景白色
bg = (255,255,255)
# 球的颜色 红色
ball_color = (255,0,0)
# 球的大小 半径
ball_size = 20
# 球的初始位置 设置在窗口中心位置
pos_x,pos_y = width//2-ball_size,height//2-ball_size
# 设置球的 初始速度
speed_x=random.randint(1,5)
speed_y=random.randint(1,5)
# 设置挡板的 颜色 蓝色
board_color = (0,0,255)
# 设置挡板的 宽和高
board_width,board_height=50,4
# 设置挡板的初始位置
board_x,board_y = (width-board_width)//2,height-board_height
# 字体设置
font=pygame.font.SysFont("Arial",24)
# 分数
score = 0
while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      sys.exit()
    # 检测鼠标移动事件
    if event.type ==pygame.MOUSEMOTION:
      # 获取鼠标移动的位置
      mouse_x,mouse_y=pygame.mouse.get_pos()
      # 防止挡板出右边的边界
      if mouse_x>(width-board_width):
        mouse_x=width-board_width
      # 设置挡板的x坐标为鼠标位置,跟着鼠标移动
      board_x=mouse_x

  screen.fill(bg)
  # 在窗口上绘制一个圆形 球
  pygame.draw.circle(screen,ball_color,[pos_x,pos_y],ball_size)
  # 在窗口上绘制一个挡板
  pygame.draw.rect(screen,board_color,[board_x,board_y,board_width,board_height])
  # 显示计分
  text = font.render("score:"+str(score), True, (255,0,0))
  screen.blit(text,(10,10))

  pygame.display.flip()
  # 等待 100ms 避免刷新太快
  pygame.time.wait(100)
  if pos_x <ball_size or pos_x > width-ball_size:
    speed_x = -speed_x
  if pos_y <ball_size:
    speed_y = -speed_y
  # 如果球已经进入到board厚度以下就要开始检测是否碰撞
  elif pos_y>=height-ball_size-board_height:
    # 如果球与board接触,就反弹
    if board_x <= pos_x <= board_x+50:
      score += 1
      speed_y=-speed_y
    # 如果球已经碰到窗体底部,则游戏结束
    else:
      # 退出游戏
      sys.exit()
  # 更改位置
  pos_x += speed_x
  pos_y += speed_y

效果:

9.绘制游戏结束界面文字和重新开始

代码:

代码语言:javascript
复制
import pygame
import sys
import random
pygame.init()
size =width,height=400,300
screen = pygame.display.set_mode(size)
pygame.display.set_caption("弹球游戏")
# 背景白色
bg = (255,255,255)
# 球的颜色 红色
ball_color = (255,0,0)
# 球的大小 半径
ball_size = 20
# 球的初始位置 设置在窗口中心位置
pos_x,pos_y = width//2-ball_size,height//2-ball_size
# 设置球的 初始速度
speed_x=random.randint(1,5)
speed_y=random.randint(1,5)
# 设置挡板的 颜色 蓝色
board_color = (0,0,255)
# 设置挡板的 宽和高
board_width,board_height=50,4
# 设置挡板的初始位置
board_x,board_y = (width-board_width)//2,height-board_height

# 字体设置
font=pygame.font.SysFont("Arial",24)
# 游戏结束字体设置
gameover_font=pygame.font.SysFont("Arial",48)
# 分数
score = 0
while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      sys.exit()
    # 检测鼠标移动事件
    if event.type ==pygame.MOUSEMOTION:
      # 获取鼠标移动的位置
      mouse_x,mouse_y=pygame.mouse.get_pos()
      # 防止挡板出右边的边界
      if mouse_x>(width-board_width):
        mouse_x=width-board_width
      # 设置挡板的x坐标为鼠标位置,跟着鼠标移动
      board_x=mouse_x

  screen.fill(bg)
  # 在窗口上绘制一个圆形 球
  pygame.draw.circle(screen,ball_color,[pos_x,pos_y],ball_size)
  # 在窗口上绘制一个挡板
  pygame.draw.rect(screen,board_color,[board_x,board_y,board_width,board_height])
  # 显示计分
  text = font.render("score:"+str(score), True, (255,0,0))
  screen.blit(text,(10,10))

  pygame.display.flip()
  # 等待 100ms 避免刷新太快
  pygame.time.wait(100)
  if pos_x <ball_size or pos_x > width-ball_size:
    speed_x = -speed_x
  if pos_y <ball_size:
    speed_y = -speed_y
  # 如果球已经进入到board厚度以下就要开始检测是否碰撞
  elif pos_y>=height-ball_size-board_height:
    # 如果球与board接触,就反弹
    if board_x <= pos_x <= board_x+50:
      score += 1
      speed_y=-speed_y
    # 如果球已经碰到窗体底部,则游戏结束
    else:
      # 设置结束文本
      gameover_text = gameover_font.render("Game Over", True, (255,0,0))
      gamecontinue_text =font.render("Enter space to continue",True,(0,255,0))
      # 获取结束surface 大小
      surface_x,surface_y=gameover_text.get_size()
      continue_x,continue_y=gamecontinue_text.get_size()
      while True:
        # 显示结束文本
        screen.blit(gameover_text,((width-surface_x)//2,(height-surface_y)//2))
        screen.blit(gamecontinue_text,((width-continue_x)//2,(height-continue_y)//2+40))
        # 如果触发结束事件,就结束游戏
        if len(pygame.event.get(pygame.QUIT)) >0:
          pygame.quit()
          sys.exit()
        KeyUpEvents = pygame.event.get(pygame.KEYUP)
        if KeyUpEvents:
          if KeyUpEvents[0].key == pygame.K_SPACE:
            pos_x,pos_y = width//2-ball_size,height//2-ball_size
            speed_x=random.randint(1,5)
            speed_y=random.randint(1,5)
            score = 0
            break
        pygame.display.flip()
        pygame.time.wait(500)
  # 更改位置
  pos_x += speed_x
  pos_y += speed_y

结果:

总结:

本文主要讲了如何用鼠标控制挡板移动,小球与挡板的一个相互碰撞处理,游戏得分以及游戏结束重新开始等功能。

pygame.MOUSEMOTION # 鼠标移动事件

mouse_x,mouse_y=pygame.mouse.get_pos() # 获取鼠标的位置

KeyUpEvents = pygame.event.get(pygame.KEYUP) # 获取按键事件

pygame.K_SPACE # 空格事件

font=pygame.font.SysFont("Arial",24) # 使用系统字体,和设置字体大小

text = font.render("score:"+str(score), True, (255,0,0)) # 将文字渲染成一个surface对象.

screen.blit(text,(10,10)) # 将surface字体对象渲染到窗体上

缺陷:

本游戏后面的逻辑看上去比较乱,难以一眼看上去很清晰,除了控制重新开始的方法不好外,还有就是面向过程的一个方式,当代码比较多时,一下很难看清楚代码逻辑。后面会用更好的方法重构本游戏,会用到标志变量和面向对象的方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 6.用鼠标控制挡板左右移动
  • 7.小球碰到挡板反弹,碰到底部结束
  • 9.绘制游戏结束界面文字和重新开始
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档