python中的pygame实现接球小游戏

作者:??牧子川???? 时间:2021-10-21 13:33:50 

一、介绍模块

最小开发框架:

基于python 的Pygame最小开发框架

1、Pygame和sys模块

import pygame #制作游戏时要使用的模块
import sys #python的标准库,对内部各功能模块进行初始化创建,系统模块

2、random模块

需要在屏幕上随机生成小球

from random import randint

详情请看此文章:python中的随机数 Random介绍

二、相关功能

1、窗口尺寸改变

可以调节游戏屏幕的大小

# 改变窗口尺寸
       elif event.type == pygame.VIDEORESIZE:
           size = w,h = event.w,event.h
           screen = pygame.display.set_mode(size,pygame.RESIZABLE)

pygame.VIDEORESIZE 这是窗口大小改变事件,事件发生后,返回event.size元组,包含新窗口的宽度和高度。 .size[0] 高度,也可以用event.w表示 .size[1] 宽度,也可以用event.h表示 返回参数仅在事件发生时有用

2、键盘控制挡板

# 键盘控制挡板
       elif event.type == pygame.KEYDOWN: #键盘按下事件检测
           if event.key == pygame.K_LEFT:  # 判断挡板是否左移
               if board_rect.left > 0 and board_rect.left <= w - 186:
                   board_rect.left -= board_x
               elif board_rect.left <= 0:  # 判断挡板左边的坐标是否小于0
                   board_rect.left = 0
                   board_rect.top -= board_y
           elif event.key == pygame.K_RIGHT:  # 判断挡板是否右移
               if board_rect.right >= 186 and board_rect.right < w:
                   board_rect.right += board_x
               elif board_rect.right >= w:  # 判断挡板右边的坐标是否大于屏幕的宽度                        board_rect.right = w
                   board_rect.bottom += board_y

3、鼠标控制

#鼠标控制挡板
       elif event.type == pygame.MOUSEMOTION:
           # 鼠标左键按下并跟随鼠标移动
           if event.buttons[0] == 1:
               if event.pos[0] >= 0 and event.pos[0] < w - 186:#判断鼠标的位置
                   board_rect.left = event.pos[0] #将鼠标的x坐标给Rect对象的左边
               elif event.pos[0] >= w - 186 and event.pos[0] <= w:
                   board_rect.left = w - 186
               # board_rect.top = h - 17 #档板位置在底部
       elif event.type == pygame.MOUSEBUTTONDOWN:  #鼠标按键按下
           # 将鼠标当前位置给挡板
           if event.button == 1:
               if event.pos[0] >= 0 and event.pos[0] < w - 186:#判断鼠标的位置
                   board_rect.left = event.pos[0] #将鼠标的x坐标给Rect对象的左边
               if event.pos[0] >= w - 186 and event.pos[0] <= w:
                   board_rect.left = w - 186
               # board_rect.top = h - 17

4、挡板接住小球并得分

# 下方挡板接到小球
   if ball_y >= h - 37 and (ball_x >= board_rect.left - 20 and ball_x <= board_rect.left + 206):
       move_y = - move_y  # y方向速度反向
       score += points  #得分
       count += 1   #次数增加1次
       if count == 5:  # 每满五次,难度和单次接球得分增加
           count = 0  # 接球得分的次数清零
           points += points
           # x方向速度增加
           if move_x > 0:
               move_x += 1
           else:
               move_x -= 1
           move_y -= 1

5、小球未接住小球

# 下方挡板未接到小球
   if ball_y > h - 27 and (ball_x < board_rect.left - 20 or ball_x > board_rect.left + 206):
       # 游戏结束
       ball_y = 200  #小球所在的位置
       break

6、小球移动

# 移动小球
   ball_x += move_x
   ball_y += move_y
   if ball_x <= 20 or ball_x >= w - 20:  # 碰到左右两侧墙壁
       move_x = - move_x  # x方向速度反向
   if ball_y <= 20:  # 碰到上方墙壁
       move_y = - move_y  # y方向速度反向

7、显示分数

my_score = font.render(str(score), False, (255, 255, 0))  # 创建文字对象(文字,是否平滑,文字颜色)
   screen.blit(my_score, (w - 100, 30))  # 将文字添加到窗口上

三、完整代码

import sys
from random import randint
import pygame

pygame.init() # 初始化

size = w, h = (600,500) # 屏幕显示的区域,高度和宽度
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
pygame.display.set_caption("接球游戏") # 屏幕的标题
fpsClock = pygame.time.Clock() # 帧速率 窗口刷新速度 越大运行越快

board = pygame.image.load(r"D:\pycharm\WorkTime(大二上)\挡板.jpg")
board_rect = board.get_rect() #对图片进行加框 利用surface生成rect

color = pygame.Color(255,255,255) # 屏幕(窗口)的颜色:白色
Green = pygame.Color('green') # 小球的颜色:绿色

# 随机生成小球的x、y坐标(整数,包括两端)
ball_x = randint(20,580)
ball_y = randint(20,200)

# 小球x、y坐标变化量
move_x = 1
move_y = 1

# 挡板x、y坐标变化量
board_x = 46
board_y = 0

score=0#得分
font=pygame.font.Font(r'D:\字库\书法和新增字库\微软雅黑.ttf',60) #设置字体(前者是字体路径)和字体大小
points=1 #一次接球的加分
count=0#接球得分的次数

# size1 = board.get_size() #获取图片大小
# print(size1)
while True:
   board_rect.top = h - 17
   for event in pygame.event.get(): # pygame.event.get() 从事件队列中取出事件,并从队列中删除该事件
       if event.type == pygame.QUIT:
           sys.exit()

# 改变窗口尺寸
       elif event.type == pygame.VIDEORESIZE:
           size = w,h = event.w,event.h
           screen = pygame.display.set_mode(size,pygame.RESIZABLE)

# 键盘控制挡板
       elif event.type == pygame.KEYDOWN:
           if event.key == pygame.K_LEFT:  # 挡板左移
               if board_rect.left > 0 and board_rect.left <= w - 186:
                   board_rect.left -= board_x
               elif board_rect.left <= 0:  # 判断挡板左边的坐标是否小于0
                   board_rect.left = 0
                   board_rect.top -= board_y
           elif event.key == pygame.K_RIGHT:  # 挡板右移
               if board_rect.right >= 186 and board_rect.right < w:
                   board_rect.right += board_x
               elif board_rect.right >= w:  # 判断挡板右边的坐标是否大于屏幕的宽度                        board_rect.right = w
                   board_rect.bottom += board_y

#鼠标控制挡板
       elif event.type == pygame.MOUSEMOTION:
           # 鼠标左键按下并跟随鼠标移动
           if event.buttons[0] == 1:
               if event.pos[0] >= 0 and event.pos[0] < w - 186:#判断鼠标的位置
                   board_rect.left = event.pos[0] #将鼠标的x坐标给Rect对象的左边
               elif event.pos[0] >= w - 186 and event.pos[0] <= w:
                   board_rect.left = w - 186
               # board_rect.top = h - 17 #档板位置在底部
       elif event.type == pygame.MOUSEBUTTONDOWN:  #鼠标按键按下
           # 将鼠标当前位置给挡板
           if event.button == 1:
               if event.pos[0] >= 0 and event.pos[0] < w - 186:#判断鼠标的位置
                   board_rect.left = event.pos[0] #将鼠标的x坐标给Rect对象的左边
               if event.pos[0] >= w - 186 and event.pos[0] <= w:
                   board_rect.left = w - 186
               # board_rect.top = h - 17

# 下方挡板接到小球
   if ball_y >= h - 37 and (ball_x >= board_rect.left - 20 and ball_x <= board_rect.left + 206):
       move_y = - move_y  # y方向速度反向
       score += points
       count += 1
       if count == 5:  # 每满五次,难度和单次接球得分增加
           count = 0  # 接球得分的次数清零
           points += points
           # x方向速度增加
           if move_x > 0:
               move_x += 1
           else:
               move_x -= 1
           move_y -= 1

# 下方挡板未接到小球
   if ball_y > h - 27 and (ball_x < board_rect.left - 20 or ball_x > board_rect.left + 206):
       # 游戏结束
       ball_y = 200
       break

# 移动小球
   ball_x += move_x
   ball_y += move_y
   if ball_x <= 20 or ball_x >= w - 20:  # 碰到左右两侧墙壁
       move_x = - move_x  # x方向速度反向
   if ball_y <= 20:  # 碰到上方墙壁
       move_y = - move_y  # y方向速度反向

fpsClock.tick(200)
   screen.fill(color)
   # 显示分数
   my_score = font.render(str(score), False, (255, 255, 0))  # 创建文字对象(文字,是否平滑,文字颜色)
   screen.blit(my_score, (w - 100, 30))  # 将文字添加到窗口上
   screen.blit(board,board_rect)  #将一个图像绘制在另一个图像上 把surface对象覆盖到移动后的rect对象
   pygame.draw.circle(screen, Green, (ball_x, ball_y), 20)  # 绘制小球
   pygame.display.update() # 对显示窗口进行更新,默认窗口全部重绘

来源:https://juejin.cn/post/7083024810321641509

标签:python,pygame,实现,接球,游戏
0
投稿

猜你喜欢

  • SQLServer2005触发器提示其他会话正在使用事务的上下文的解决方法

    2024-01-13 05:42:28
  • Pycharm2022最新版无法换源解决方法

    2023-02-09 20:51:55
  • Javascript Ajax异步读取RSS文档具体实现

    2024-05-09 10:36:56
  • JS出现404错误原理及解决方案

    2024-04-28 09:41:26
  • Python3.5运算符操作实例详解

    2021-06-09 11:41:17
  • Python实现删除文件中含“指定内容”的行示例

    2022-01-15 02:56:28
  • Python jieba分词添加自定义词和去除不需要长尾词的操作方法

    2023-05-05 11:20:35
  • Ubuntu下MySQL安装及配置远程登录教程

    2024-01-23 23:55:33
  • 实现WordPress主题侧边栏切换功能的PHP脚本详解

    2024-06-05 09:23:40
  • 微信小程序开发之点击按钮退出小程序的实现方法

    2024-05-03 15:04:05
  • Anaconda下Python中GDAL模块的下载与安装过程

    2022-08-30 04:49:54
  • MySql中如何使用 explain 查询 SQL 的执行计划

    2024-01-15 10:25:01
  • 基于Python实现微博抓取GUI程序

    2021-06-01 10:59:29
  • 解决ASP执行DB查询中的特殊字符问题

    2008-09-02 12:16:00
  • python备份文件的脚本

    2023-12-14 10:52:02
  • php自动注册登录验证机制实现代码

    2024-04-30 08:48:12
  • JavaScript函数节流和函数去抖知识点学习

    2024-06-07 15:59:54
  • python 实现判断ip连通性的方法总结

    2023-06-24 22:36:53
  • Python中DataFrame判断两列数据是否相等的方法

    2023-12-09 10:17:37
  • PyTorch和Keras计算模型参数的例子

    2023-04-16 10:32:46
  • asp之家 网络编程 m.aspxhome.com