python的pygame库使用方法_[宜配屋]听图阁

使用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[4][0]):

gameOver(playSurface,board_1)

if ball[1]==board_2[0][1] and (ball[0]board_2[4][0]):

gameOver(playSurface,board_2)

# 控制游戏速度

fpsClock.tick(5)

if __name__ == "__main__":

main()

运行结果如下:

9652c144149abedfa70620db90fe2a0f.png

08f62cf692d137edd0b85ca5a270d0cb.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 删除用户权限

MySQL 数据库中可以使用 REVOKE 语句删除一个用户的权限&#xff0c;此用户不会被删除。 语法格式有两种形式&#xff0c;如下所示&#xff1a; 1 第一种&#xff1a; REVOKE <权限类型> [ ( <列名> ) ] [ , <权限类型> [ ( <列名> ) ] ]… ON <对…

java jdbc 多数据源_Jdbctemplate多数据源配置方法详解

1.数据源配置spring:# jdbctemplate 连接多数据源配置db1:datasource:jdbcurl: jdbc:mysql://127.0.0.1:3306/cloud-main1?useUnicodetrue&characterEncodingutf8&useSSLfalse&allowMultiQueriestrueusername: rootpassword: 123456driver-class-name: com.mysql.…

java 语法 泛型_java-解密泛型语法

我正在阅读一个问题,下面给出了方法的签名public static List super E> doIt(List nums)我无法解码语法.我对仿制药很陌生,无法理解这部分.第一部分< E扩展了CharSequence>都告诉E应该是什么作为参数和返回类型.但我确实看到列表了吗&#xff1f;超级E&gt ;,这定义…

MySQL 数据库恢复

数据库恢复是指以备份为基础&#xff0c;与备份相对应的系统维护和管理操作。 系统进行恢复操作时&#xff0c;先执行一些系统安全性的检查&#xff0c;包括检查所要恢复的数据库是否存在、数据库是否变化及数据库文件是否兼容等&#xff0c;然后根据所采用的数据库备份类型采…

java位逻辑运算符_详述:Java逻辑运算符与位运算

Java中逻辑运算符总共有分为三种“ ”&#xff0c;“ll”&#xff0c;“!”运算符、此为逻辑运算符&#xff0c;只有当给定的两个条件都为真时&#xff0c;返回结果为true&#xff0c;否则都为false&#xff01;、此为逻辑非运算符&#xff0c;用来反转操作的true或者false&…

C++ 三种继承方式

C继承的一般语法为&#xff1a; class 派生类名:&#xff3b;继承方式&#xff3d; 基类名{派生类新增加的成员 };继承方式限定了基类成员在派生类中的访问权限&#xff0c;包括 public&#xff08;公有的&#xff09;、private&#xff08;私有的&#xff09;和 protected&am…

mapdb java_MapDB使用入门

背景MapDB官网&#xff1a;http://www.mapdb.org官方翻译之后的话&#xff1a;MapDB基于堆外存储、磁盘存储提供了Java的Maps、Sets、Lists、Queues等功能。它混合了Java集合框架和数据库引擎。它是基于Apache许可的免费的、开源的。个人觉得&#xff1a;MapDB是一个轻量级的本…

C++继承时名字的遮蔽

如果派生类中的成员&#xff08;包括成员变量和成员函数&#xff09;和基类中的成员重名&#xff0c;那么就会遮蔽从基类继承过来的成员。所谓遮蔽&#xff0c;就是在派生类中使用该成员&#xff08;包括在定义派生类时使用&#xff0c;也包括通过派生类对象访问该成员&#xf…

java项目 异常如何解决_Java项目中常见的异常处理

发生异常的情况有很多&#xff0c;其中包括以下几大类&#xff1a;1. 空指针异常&#xff1b;2. 用户输入异常&#xff1b;3. 多层异常捕获&#xff1b;想要知道Java是如何处理异常的&#xff0c;就需要掌握以下这三种异常的处理&#xff1a;1.检查性异常&#xff1a;最具代表的…

C++ 基类和派生类的构造函数

在设计派生类时&#xff0c;对继承过来的成员变量的初始化工作也要由派生类的构造函数完成&#xff0c;但是大部分基类都有 private 属性的成员变量&#xff0c;它们在派生类中无法访问&#xff0c;更不能使用派生类的构造函数来初始化。 解决办法&#xff1a;在派生类的构造函…

java i/o 流详解_java I/O流详解

概况I/O流主要分为二大类别&#xff1a;字符流和字节流。字节流(基本流)1、字节输入流 类名&#xff1a;FileInputStream 特点&#xff1a;读(对文件进行读取操作) 父类&#xff1a;InputStream2、字节输出流 类名&#xff1a;FileOutputStream 特点&#xff1a;写…

C++ 基类和派生类的析构函数

和构造函数类似&#xff0c;析构函数也不能被继承。与构造函数不同的是&#xff0c;在派生类的析构函数中不用显式地调用基类的析构函数&#xff0c;因为每个类只有一个析构函数&#xff0c;编译器知道如何选择&#xff0c;无需程序员干涉。 另外析构函数的执行顺序和构造函数…

素描java字母_进行Java基本GUI设计需要用到的包是

【单选题】下列各类计算机程序语言中,不属于高级程序设计语言的是【填空题】以下程序从名为 filea.dat 的文本文件中逐个读入字符并显示在屏幕上。请填空。 #include main() { FILE *fp; char ch; fp fopen( 【3】 ); ch fgetc(fp); while (!feof(fp)) { putchar(ch); chfget…

C++ 多继承

派生类都只有一个基类&#xff0c;称为单继承&#xff08;Single Inheritance&#xff09;。除此之外&#xff0c;C也支持多继承&#xff08;Multiple Inheritance&#xff09;&#xff0c;即一个派生类可以有两个或多个基类。 多继承的语法也很简单&#xff0c;将多个基类用逗…

C++ 向上转型

在 C 中经常会发生数据类型的转换&#xff0c;例如将 int 类型的数据赋值给 float 类型的变量时&#xff0c;编译器会先把 int 类型的数据转换为 float 类型再赋值&#xff1b;反过来&#xff0c;float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换…

java拆分任意五位数_五位数拆分出各位 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...

5、输入一个五位数&#xff0c;输出一个反转的五位数输入-》12345 输出-》54321//这是五位数字拆分方法。System.out.println("请输入五位数的数字&#xff1a;"); // 比如&#xff1a;12345int g1num%10;int g2num/10%10;int g3num/100%10;int g4num/1000%10;int g…

C++ 纯虚函数和抽象类

C中&#xff0c;可以将虚函数声明为纯虚函数&#xff0c;语法格式为&#xff1a; virtual 返回值类型 函数名 (函数参数) 0;纯虚函数没有函数体&#xff0c;只有函数声明&#xff0c;在虚函数声明的结尾加上0&#xff0c;表明此函数为纯虚函数。 最后的0并不表示函数返回值为…

python中保留两位小数的编写程序_P081 保留两位小数

所属年份&#xff1a;2011.3;2011.9请编一个函数 float fun(double h)&#xff0c;该函数的功能是&#xff1a;使变量h中的值保留两位小数&#xff0c;并对第三位进行四舍五入(规定h中的值为正数)。例如&#xff0c;若h 值为1234.567&#xff0c;则函数返回1234.570000&#xf…

C++ 获取类型信息

typeid 运算符用来获取一个表达式的类型信息。类型信息对于编程语言非常重要&#xff0c;它描述了数据的各种属性&#xff1a; 对于基本类型&#xff08;int、float 等C内置类型&#xff09;的数据&#xff0c;类型信息所包含的内容比较简单&#xff0c;主要是指数据的类型。对…

java 8 lambda 申明_2019-02-03——Java8 Lambda

一.认识LambdaLambda表达式专门针对只有一个方法的接口(即函数式接口)lambda表达式的基本格式为(x,y...)—>{表达式...};(1)可选类型声明&#xff1a;不需要声明参数类型&#xff0c;编译器可以统一识别参数值。(2)可选的参数圆括号&#xff1a;一个参数无需定义圆括号&…