好的,我们继续来制作我们的弹球游戏!昨天我们已经完成了最基本的窗口和最基本的小球,那今天我们就来加入负责与玩家交互的球拍!

首先,我们先来构思一下球拍的基本功能及作用。球拍,顾名思义,就是负责反弹小球的平台,它也负责与玩家的交互功能。如何交互呢?下面有这几种方法:

1,方向键控制。

2,鼠标坐标控制。

以上方法各有利弊,但是我认为使用鼠标控制比较人性。所以我们首先面对初学者比较轻松的鼠标控制。

pygame中的获取坐标比较简单,我们只需要参考第1篇中的“退出键检测”即可。但是在此之前,我们需要绘制出一个球拍。

我们新建一个文件,输入这些代码便可以生成一个长方形:

import pygamepygame.init()
screen=pygame.display.set_mode([640,480])
screen.fill([0,0,0])
pygame.draw.rect(screen,[255,255,255],[250,150,300,200],0)
pygame.display.update()
running=True
while running:for event in pygame.event.get():if event.type==pygame.QUIT:running=Falsepygame.quit()

很眼熟,对吧?

没错,它就是在基本结构上加入了一个填充的矩形。我们可以通过更改第6行的坐标来让矩形出现在我们希望它出现的位置。

那这些坐标怎么看呢?其实很简单。它的格式是这样的:

pygame.draw.rect(窗口名, 颜色, (矩形的左上x坐标, 矩形的左上y坐标, 矩形沿左上x坐标的长度也就是矩形的长, 矩形沿左上x坐标的宽度也就是矩形的宽))

这样一来,我们只需要输入正确的四个角的坐标,便可以让矩形出现在相应的地方,代码如下:

import pygamepygame.init()
screen=pygame.display.set_mode([800,600])
screen.fill([0,0,0])
pygame.draw.rect(screen,[255,255,255],[300,550,200,25],0)
pygame.display.update()
running=True
while running:for event in pygame.event.get():if event.type==pygame.QUIT:running=Falsepygame.quit()

运行后,我们就可以发现一个静止的球拍啦!

但是这个球拍是静止不动的,无法与玩家进行交互,所以我们必须在循环内反复更新它的位置。

由于pygame不需要定义其他三个角的坐标,所以我们只需要让它不断更新左上角的坐标即可。代码如下:

鼠标操作:

首先我们需要获取到鼠标的x坐标,并将其映射在其中。代码如下:

screen.fill(BLACK)
screen.blit(pic, (picx, picy))
paddlex = pygame.mouse.get_pos()[0]
paddlex -= paddlew / 2
pygame.draw.rect(screen, WHITE, (paddlex, paddley, paddlew, paddleh))

当它嵌套在循环中则是:

import pygamepygame.init()
screen=pygame.display.set_mode([800,600])
pygame.display.set_caption("python弹球游戏")
keepGoing=True
pic=pygame.image.load("ball.png")
colorkey=pic.get_at((0,0))
pic.set_colorkey(colorkey)
picx = 0
picy = 0
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
timer = pygame.time.Clock()
speedx = 5
speedy = 5
paddlew = 200
paddleh = 25
paddlex = 300
paddley = 550
picw = 100
pich = 40
font=pygame.font.SysFont("None",24)
while keepGoing:for event in pygame.event.get():if event.type==pygame.QUIT:keepGoing=Falsepicx+=speedxpicy+=speedyif picx<=0 or picx+pic.get_width()>=800:speedx= -speedxif picy<=0:speedy= -speedyif picy>=550:speedy= -speedyscreen.fill(BLACK)screen.blit(pic, (picx, picy))paddlex = pygame.mouse.get_pos()[0]paddlex -= paddlew / 2pygame.draw.rect(screen, WHITE, (paddlex, paddley, paddlew, paddleh))pygame.display.update()timer.tick(60)
font_addr = pygame.font.get_default_font()
font = pygame.font.Font(font_addr, 36)
pygame.quit()

我们还可以继续提高代码利用率,代码如下:

import pygamepygame.init()
width=800
height=600
screen=pygame.display.set_mode([width,height])
pygame.display.set_caption("python弹球游戏")
keepGoing=True
pic=pygame.image.load("ball.png")
colorkey=pic.get_at((0,0))
pic.set_colorkey(colorkey)
picx = 0
picy = 0
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
timer = pygame.time.Clock()
speedx = 5
speedy = 5
paddlew = 200
paddleh = 25
paddlex = 300
paddley = 550
picw = 100
pich = 40
xend=width-50
yend=height-50#这两行的减50为判定提供时间
ticks=60#帧率
font=pygame.font.SysFont("None",24)
while keepGoing:for event in pygame.event.get():if event.type==pygame.QUIT:keepGoing=Falsepicx+=speedxpicy+=speedyif picx<=0 or picx+pic.get_width()>=xend:speedx= -speedxif picy<=0:speedy= -speedyif picy>=yend:speedy= -speedyscreen.fill(BLACK)screen.blit(pic, (picx, picy))paddlex = pygame.mouse.get_pos()[0]paddlex -= paddlew / 2pygame.draw.rect(screen, WHITE, (paddlex, paddley, paddlew, paddleh))pygame.display.update()timer.tick(ticks)
pygame.quit()

是不是简洁许多?但是我们发现了一个问题,那就是虽然我们已经制作出了球拍,但是却无法拍球。这是因为我们还没有加入球拍与球接触的判定。我们可以通过检测是否与球拍在同一平面与是否超出球拍的左上x坐标来省去复杂的触碰判定。代码如下:

if picy + pich >= paddley and picy + pich <= paddley + paddleh and speedy > 0:if picx + picw / 2 >= paddlex and picx + picw / 2 <= paddlex + paddlew:speedy = -speedy

这段代码可以以最直接的方法来判定是否超过以上两点坐标。同时可以在接触瞬间立马反弹,这样不仅游戏对玩家的反馈感极强,对新手也特别友好。

好了,弹球游戏完结。我们下次再见,拜拜!

彩蛋

嘻嘻,你们不会觉得我就会这么糊弄过去吧?我将会在下期彩蛋篇中一一解决我们的游戏bug!让我们一起期待吧!

python项目之弹球小游戏 3相关推荐

  1. python小游戏编程实例-Python实现的弹球小游戏示例

    本文实例讲述了Python实现的弹球小游戏.分享给大家供大家参考,具体如下: 弹球 1. Ball 类 draw负责移动Ball 碰撞检测,反弹,Ball检测Paddle 2.Paddle类 draw ...

  2. 【Python项目】乒乓球小游戏

    文章目录 零.序章 一.游戏主程序 二.球类 三.球拍类 四.计分板类 五.效果展示 零.序章 这是一个使用Python写的打乒乓游戏. 可以练习一些面向对象的知识. 实现的功能有: 球的发球.碰撞检 ...

  3. 60行python代码实现弹球小游戏(含源码)

    弹球效果预览 解析代码 弹球 Ball 类 draw负责移动Ball 碰撞检测,反弹,Ball检测Paddle 2.Paddle类 draw负责移动Paddle 碰撞检测,确定能不能继续 监听键盘事件 ...

  4. python弹球小游戏程序设计_Python写的弹球小游戏

    原标题:Python写的弹球小游戏 Python 的功能强大应用广泛,从爬虫到 Web 开发,从科学计算到人工智能,都能见到它的身影.当然,Python 还可以编写游戏代码,虽然不是主流,但却十分有趣 ...

  5. python弹球小游戏程序_Python实现弹球小游戏

    本文主要给大家分享一个实战项目,通过python代码写一款我们儿时大多数人玩过的游戏---小弹球游戏.只不过当时,我们是在游戏机上玩,现在我们通过运行代码来玩,看看大家是否有不一样的体验,是否可以重温 ...

  6. python弹球小游戏程序_Python基于Tkinter模块实现的弹球小游戏

    本文实例讲述了Python基于Tkinter模块实现的弹球小游戏.分享给大家供大家参考,具体如下: #!usr/bin/python #-*- coding:utf-8 -*- from Tkinte ...

  7. python两人一碰_python运用pygame库实现双人弹球小游戏

    使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球. 因为是第一次用pygam ...

  8. python画圆形螺旋线_Python写的弹球小游戏

    Python 的功能强大应用广泛,从爬虫到 Web 开发,从科学计算到人工智能,都能见到它的身影.当然,Python 还可以编写游戏代码,虽然不是主流,但却十分有趣,既能提升代码能力,又能自娱自乐.敲 ...

  9. PYTHON pygame库实战——实现双人弹球小游戏

    PYTHON pygame实战--运用pygame库实现双人弹球小游戏 使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截 ...

最新文章

  1. list对象_list对象,容量自适应的数组式容器
  2. 如何避免在Excel VBA中使用选择
  3. eclipse中代码没错但项目名称有个小红X
  4. 广东省计算机大赛设计什么时候,2017年广东省大学生计算机设计大赛
  5. 世界五星级大厨经典菜品集
  6. 固态硬盘怎么看出厂日期_固态到底怎么选?雷克沙NM610和西部数据SN500固态硬盘实测对比...
  7. python多核cpu_Python中的多核CPU共享数据之协程详解
  8. 用fast rcnn绘制loss曲线遇到的问题
  9. ubuntu防火墙关闭命令-转
  10. 零基础学python图文版-给伸手党的福利:Python 新手入门引导
  11. scala if 语句缩写_Scala If-Else语句示例教程
  12. GRE Tunnel实现企业网中的***
  13. 淘宝生成器在线制作,淘宝全屏代码装修店招导航教程
  14. linux系统安装SAI吗,求救~~~把linux安装到C盘了
  15. matlab data数据类型,MATLAB - 数据类型
  16. php unpack 原理,unpack
  17. 2020-10-20 Ant Design Vue 关闭国际化设置默认语言为中文的
  18. 您知道Linux下C语言编程的一些注意事项吗_教育中国
  19. 使用docsify+markdown+vditor构建gitlab pages文档库
  20. 林业调查规划设计单位资质办理认定

热门文章

  1. 手把手教你申请到美国itunes免费账号,解决Please contact itunes support to complete this transaction的问题
  2. 【随笔】关于学习FML的缘由。
  3. 银河麒麟高级服务器操作系统V10SP1 - ISO镜像定制 + KickStart自动化安装
  4. java按空格分字符串,两种用空格分隔的java字符串的方式
  5. Linux中线程和进程的区别
  6. html中像素是什么,[html5]html5中的viewport和px是什么(腾讯)
  7. 建筑公司劳务费用,材料费用缺少票怎么解决
  8. 数据开发如何巧妙解决业务问题
  9. 我国农村人均收入增长将连续三年超GDP增长幅度
  10. 威纶通触摸屏和LEADFIX变频器485通讯