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模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
Python中的闭包详细介绍和实例
Nov 21 Python
python使用nntp读取新闻组内容的方法
May 08 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
May 20 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
python类的实例化问题解决
Aug 31 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
Django执行源生mysql语句实现过程解析
Nov 12 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
Feb 25 Python
python解析照片拍摄时间进行图片整理
Jul 23 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
在IIS上安装PHP4.0正式版
2006/10/09 PHP
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
javascript demo 基本技巧
2009/12/18 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
详解vue3.0 diff算法的使用(超详细)
2020/07/01 Javascript
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python中元类用法实例
2014/10/10 Python
Python打印斐波拉契数列实例
2015/07/07 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
python 输出所有大小写字母的方法
2019/01/02 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
python tkinter控件布局项目实例
2019/11/04 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
巴西本土电商平台:Americanas
2020/06/21 全球购物
感恩母亲节演讲稿
2014/05/07 职场文书
2014年学前班工作总结
2014/12/08 职场文书
面试通知单大全
2015/04/20 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle