python运用pygame库实现双人弹球小游戏


Posted in Python onNovember 25, 2019

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

因为是第一次用pygame写python小游戏并且只用了两三个小时,所以有些粗糙,部分方面有些bug,比如板子可以移动出屏幕外,游戏结束后的提示显示不全。

但是关键部分如小球的移动和基本功能等,还算比较完善。

代码如下:

运行环境为python 3.7,需要安装pygame库

import pygame,sys,time,random
from pygame.locals import *
# 定义颜色变量
redColour = pygame.Color(255,0,0)
blackColour = pygame.Color(0,0,0)
whiteColour = pygame.Color(255,255,255)
greyColour = pygame.Color(150,150,150)

# 定义gameOver函数
def gameOver(playSurface,board):
 gameOverFont = pygame.font.Font('C:\Windows\Fonts\consola.ttf',72)
 if board[0][1]==0:
  gameOverSurf = gameOverFont.render('board_2 win!', True, greyColour)
 if board[0][1]==460:
  gameOverSurf = gameOverFont.render('board_1 win!', True, greyColour)
 gameOverRect = gameOverSurf.get_rect()
 gameOverRect.midtop = (320, 10)
 playSurface.blit(gameOverSurf, gameOverRect)
 
 againFont = pygame.font.Font('C:\Windows\Fonts\consola.ttf',24)
 againSurf = gameOverFont.render('Do you want to try again? y/n', True, whiteColour)
 againRect=againSurf.get_rect()
 againRect.midtop=(20,100)
 playSurface.blit(againSurf, againRect)
 pygame.display.flip()
 time.sleep(3)
 for event in pygame.event.get():
  if event.key == ord("y"):
   main()
  if event.key==ord("n"):
   pygame.quit()
   sys.exit()
 pygame.quit()
 sys.exit()

# 定义main函数
def main():
 # 初始化pygame
 pygame.init()
 fpsClock = pygame.time.Clock()
 # 创建pygame显示层
 playSurface = pygame.display.set_mode((640,480))
 pygame.display.set_caption('ping pang ball')

 # 初始化变量
 #两块板子为5块正方形组成的矩形,小球为1块正方形,正方形大小为20x20
 board_1 = [[100,0],[120,0],[140,0],[160,0],[180,0]] 
 board_2 = [[100,460],[120,460],[140,460],[160,460],[180,460]]
 ball = [100,100]
 direction=3 #控制小球X轴的移动方向及速度 
 direction_x=0 #判断小球沿X轴正向还是反向移动 0反向 1正向,2没有速度
 direction_y=1 #控制小球Y轴的移动方向及速度 0反向,1正向
 # 检测例如按键等pygame事件
 while True:
  for event in pygame.event.get():
   if event.type == QUIT:
    pygame.quit()
    sys.exit()
   elif event.type == KEYDOWN:
    # 判断键盘事件控制板子移动
    if event.key == K_RIGHT:
     for i in board_1:
      i[0]+=20
    if event.key == K_LEFT:
     for i in board_1:
      i[0]-=20
    if event.key == ord("a"):
     for i in board_2:
      i[0]-=20
    if event.key == ord("d"):
     for i in board_2:
      i[0]+=20
    if event.key == K_ESCAPE:
     pygame.event.post(pygame.event.Event(QUIT))

  # 判断小球击中board_1的位置,范围为板子的左角到右角
  if ball[1] == board_1[0][1]+20 and board_1[0][0]-20<=ball[0]<=board_1[4][0]+20:
   direction_y=1 #若击中板子,则Y轴方向正向移动
   #判断小球击中板子左角的状态,如果小球击中板子左角并且移动方向为正向,则:
   if ball[0]==board_1[0][0]-20 and direction_x==1:
    direction=0 #设此刻方向改为0
   #如果小球击中板子左数第一块,则:
   if ball[0]==board_1[0][0]:
    direction=1 #设此刻方向改为1
   #如果小球击中板子左数第二块,则:
   if ball[0]==board_1[1][0]:
    direction=2 #设此刻方向改为2
   #如果小球击中板子正中间,则:
   if ball[0]==board_1[2][0]:
    direction=3 #设此刻方向改为3
   #如果小球击中板子左数第四块,则:
   if ball[0]==board_1[3][0]:
    direction=4 #设此刻方向改为4
   #如果小球击中板子左数第五块,则:
   if ball[0]==board_1[4][0]:
    direction=5 #设此刻方向改为5
   #如果小球击中板子右角并且移动方向为反向:
   if ball[0]==board_1[4][0]+20 and direction_x==0:
    direction=6 #设此刻方向改为6
   #如果小球击中板子两角但是没有速度,即竖直移动
   if direction_x==2 and (ball[0]==board_1[0][0]-20 or ball[0]==board_1[4][0]+20):
    direction_y=0 #设此刻Y轴方向改为0
  #判断小球击中board_2的位置,与击中board_1时相比只改变Y轴的方向,X轴不变 
  if ball[1]==board_2[0][1]-20 and board_2[0][0]-20<=ball[0]<=board_2[4][0]+20:
   direction_y=0
   if ball[0]==board_2[0][0]-20 and direction_x==1:
    direction=0
   if ball[0]==board_2[0][0]:
    direction=1
   if ball[0]==board_2[1][0]:
    direction=2
   if ball[0]==board_2[2][0]:
    direction=3
   if ball[0]==board_2[3][0]:
    direction=4
   if ball[0]==board_2[4][0]:
    direction=5
   if ball[0]==board_2[4][0]+20 and direction_x==0:
    direction=6
   if direction_x==2 and (ball[0]==board_2[0][0]-20 or ball[0]==board_2[4][0]+20):
    direction_y=1
  if ball[0]<=0:
   direction=4
  if ball[0]>=620:
   direction=2
  #设置小球Y轴的移动速度
  if direction_y==0: 
   ball[1]-=20
  if direction_y==1:
   ball[1]+=20
  #设置小球X轴的移动速度,X,Y轴速度的改变形成角度
  if direction==0:
   ball[0]-=40
   direction_x=0
  if direction==1:
   ball[0]-=40
   direction_x=0
  if direction==2:
   ball[0]-=20
   direction_x=0
  if direction==3:
   direction_x=2
  if direction==4:
   ball[0]+=20
   direction_x=1
  if direction==5:
   ball[0]+=40
   direction_x=1 
  if direction==6:
   ball[0]+=40
   direction_x=1


  # 绘制pygame显示层
  playSurface.fill(blackColour)
  pygame.draw.rect(playSurface,whiteColour,Rect(board_1[0],(100,20)))
  pygame.draw.rect(playSurface,whiteColour,Rect(board_2[0],(100,20)))
  pygame.draw.rect(playSurface,redColour,Rect(ball,(20,20)))
  # 刷新pygame显示层
  pygame.display.flip()
  # 判断胜利
  if ball[1]==board_1[0][1] and (ball[0]<board_1[0][0] or ball[0]>board_1[4][0]):
   gameOver(playSurface,board_1)
  if ball[1]==board_2[0][1] and (ball[0]<board_2[0][0] or ball[0]>board_2[4][0]):
   gameOver(playSurface,board_2)
  
  # 控制游戏速度
  fpsClock.tick(5)

if __name__ == "__main__":
 main()

运行结果如下:

python运用pygame库实现双人弹球小游戏

python运用pygame库实现双人弹球小游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用python获得时间的实例说明
Mar 25 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
Python3如何解决字符编码问题详解
Apr 23 Python
Python操作MySQL数据库的三种方法总结
Jan 30 Python
Python之批量创建文件的实例讲解
May 10 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
关于python导入模块import与常见的模块详解
Aug 28 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
python爬虫调度器用法及实例代码
Nov 30 Python
Python Process创建进程的2种方法详解
Jan 25 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
python数字图像处理之对比度与亮度调整示例
Jun 28 Python
python科学计算之scipy——optimize用法
Nov 25 #Python
基于python中__add__函数的用法
Nov 25 #Python
pygame库实现移动底座弹球小游戏
Apr 14 #Python
python科学计算之numpy——ufunc函数用法
Nov 25 #Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 #Python
Python解析json代码实例解析
Nov 25 #Python
python实现差分隐私Laplace机制详解
Nov 25 #Python
You might like
PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
2009/01/30 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
javascript表单验证大全
2015/08/12 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
为Python程序添加图形化界面的教程
2015/04/29 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
Python 处理数据的实例详解
2017/08/10 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
Python3的socket使用方法详解
2020/02/18 Python
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
德国足球商店:OUTFITTER
2019/05/06 全球购物
收银员岗位职责
2014/02/07 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
解除同居协议书
2015/01/29 职场文书
护士自我推荐信范文
2015/03/24 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
2015年成本会计工作总结
2015/10/14 职场文书