python中的pygame实现接球小游戏
作者:??牧子川???? 发布时间:2021-10-21 13:33:50
标签:python,pygame,实现,接球,游戏
一、介绍模块
最小开发框架:
基于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实现的数据结构与算法之快速排序。分享给大家供大家参考。具体分析如下:一、概述快速排序(quick sort)是一种
- 本地路径的创建在做下载操作时,我们一般先把文件下载到本地指定的路径下,然后再做其他使用。为了防止程序出现异常,我们通常需要先判断本地是否存在
- 前言: 经过前面文章学习,我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select、
- 长期以来我就有对几年来交互设计的心得进行总结整理的想法。回到中国来亲身体会到不少同行,主要是交互设计师和视觉设计师对于交互设计的困惑,以及其
- 前言最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析。现在我准备尝试着结合Python来模拟
- 前言:我们在日常生活中,都离不开时间和日期。不仅我们的汉字都有大量描述时间日期的词语如斗转星移、分秒必争、只针朝夕、转眼之间等。同样,在我们
- 开发客户端客户是持有TPCoins并从网络上的其他供应商处交换商品/服务的客户,包括他自己的.我们应该为此目的定义 Client&
- 今天我们来学习,如何使用有趣的自定义标记来布局页面。有的朋友可能有这样的疑问,自己随便定义的标记浏览器怎么能正确的认识呢?这里我们就要用到文
- 在开始之前先说一点,DOM是非常容易理解的,但是大家说的太官方,让人很是难于理解,我们就用非常简单的语言翻译一遍。加深对DOM的理解,从而对
- PyQuery库就是python中的一个解析库。作用十分强大,使用上也是相当的灵活,能够实现初始化字符串、初始化 HTML 文件、初始化请求
- 阅读上一篇:浏览器中的内存泄露 4.内存泄露的解决方案显式类型转换 首先说说最容易处理的情况 对于类型转换造成的错误,我们可以通过显式类型转
- 10月15日,Adobe公司正式面向全球公布了第10个版本的Flash播放器,这一版本播放器的昵称是大家已经所熟知的“宇宙”。这是一款增加了
- 导入CSV文件导入数据的步骤 ①打开xxx.csv文件②首先读取文件头③然后读取剩余头④当发生错误时抛出异常读取完所有内容后,打印文件头和剩
- 本文实例讲述了python实现简单的计时器功能函数。分享给大家供大家参考。具体如下:此函数通过python实现了一个简单的计时器动能:
- pandas.DataFrame为每一列保存一个数据类型dtype。要仅提取(选择)特定数据类型为dtype的列,请使用pandas.Dat
- 本文记录了RHEL7.5下mysql 8.0.11安装教程,具体内容如下首先去mysql官网下载mysql-8.0.11-el7-x86_6
- 我们使用编辑器的时候,想要在其中添加一个Django项目,这样就能在里面做一些想要的操作。有些人还没有对Django进行安装,这里直接用命令
- 加载垃圾邮件数据集spambase.csv(数据集基本信息:样本数: 4601,特征数量: 57, 类别:1 为垃圾邮件,0 为
- 一切从一个糟糕的浏览器开始,它完全不支持 XHTML。什么是 MIME Type? 为什么这么说呢?首先,我们要了解浏览器是如何处理内容的。
- 网页开发人员常常希望能够了解并掌握多种语言,结果是,学习一门语言的所有内容是棘手的,但是却很容易发现你并没有完全利用那些比较特殊却很有用的标