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随机生成手机号、数字的方法详解
Jul 21 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
Python numpy 点数组去重的实例
Apr 18 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
pytorch实现seq2seq时对loss进行mask的方式
Feb 18 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
Python中的__init__作用是什么
Jun 09 Python
Python轻量级web框架bottle使用方法解析
Jun 13 Python
python 实现Requests发送带cookies的请求
Feb 08 Python
Python利用capstone实现反汇编
Apr 06 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
ZF等常用php框架中存在的问题
2008/01/10 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
php socket通信简单实现
2016/11/18 PHP
js对象数组按属性快速排序
2011/01/31 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
网页中返回顶部代码(多种方法)另附注释说明
2013/04/24 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
Django组件content-type使用方法详解
2019/07/19 Python
python基础教程之while循环
2019/08/14 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
成品库仓管员岗位职责
2014/04/06 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers