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,一经查实,立即删除!

相关文章

C++ 三种继承方式

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

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

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

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

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

C++ 向上转型

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

C++ 获取类型信息

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

C 数字排列组合

编辑程序让任意四个数字排列组合并且每一个排列组合的数字都不相同。 结果展示 完整代码 #include <stdio.h> //定义头文件 int main() {int i,j,k;printf("\n");for(i1;i<5;i){ //三重循环 for(j1;j<5;j){for(k1;k<5;k){ //确保 i j k 位置不同 i…

java 汇总_java基础汇总

1.关于Http和Hibernatet里面Session的区别HttpSessionHttpSession&#xff1a;是一个抽象接口&#xff0c;J2EE的Web程序在运行的时候&#xff0c;会给每一个新的访问者建立一个HttpSession&#xff0c;这个Session是用户身份的唯一标示&#xff0c;WEB 会话跟踪用的。【注:是容…

C 天数的计算

根据程序提示输入某年某月某日&#xff0c;判断这一天是这一年的第几天&#xff0c;并进行输出显示。 效果演示 完整代码 #include <stdio.h> int main() {int day,month,year,sum,leap;printf("\n请输入年、月、日&#xff0c;格式为&#xff1a;年,月,日&#…

java+filter加密_Javaweb之Filter案例练习-自动登录问题和MD5加密

自动登录问题和MD5加密前面已经完成了Filter的自动登录&#xff0c;但是有问题&#xff0c;我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截。这肯定不合适。我们本来访问/login.jsp&#xff0c;本来就是去登录&#xff0c;结果也进行了拦…

C 从小到大排序

将数字按从小到大的的顺序进行排序输出&#xff0c;根据提示输入相应的数字个数&#xff0c;每输入一个数字要进行换行然后输入下一个数字&#xff0c;当三个数字完全输入之后点击回车&#xff0c;程序会根据从大到小的顺序进行数字的排序输出。 效果演示 完整代码 #include…

java class文件常量池_JAVA程序员谈谈class文件结构中的常量池-class文件

常量的类型有12种CONSTANT_Utf8_info1字面量UTF-8编码的字符串CONSTANT_Integer_info3字面量整型字面量CONSTANT_Float_info4字面量浮点型字面量CONSTANT_Long_info5字面量长整型字面量CONSTANT_Double_info6字面量双精度浮点型字面量CONSTANT_Class_info7符号引用类或接口的符…

C 输出图案

在C语言中使用 * 号输出各种图案。 用 * 输出字母C 效果 完整代码 #include <stdio.h>int main() {printf("用 * 号输出字母 C\n");printf(" ****\n");printf("*\n");printf("*\n");printf(" ****\n");} 用 * 输出…

C 多数排序

使用C语言编写程序对多个数字进行排序输出的操作。 根据提示输入十个数字并按照从小到大的顺序进行输出显示。 效果 完整代码 #include<stdio.h> #define N 10 int main() {int i,j,a[N],temp;printf("请输入 10 个数字&#xff1a;\n");for(i0;i<N;i)s…

java httppost wsdl_Java使用HttpUrlConnection调用webService(wsdl)

首先需要下载工具https://pan.baidu.com/s/1XQ-VubxcPFoqwGm7wierHg下载成功后解压打开exe程序&#xff0c;在wsdl endpoint中输入你wsdl的地址&#xff0c;点击get&#xff0c;等待一小会后会跳到invoke标签下的界面点击某个方法&#xff0c;例如上图的login&#xff0c;可以看…

C 反向输出

使用C语言的递归方法对输入的字符进行反向输出。 效果 完整代码 #include <stdio.h>int main() {int i5;void palin(int n);printf("请输入5个字符\40:\40");palin(i);printf("\n"); } void palin(n) int n; {char next;if(n<1) {nextgetchar(…

C 数组逆序输出

编写程序对固定内容的数组进行逆序输出&#xff0c;第一个值和最后一个值的位置互换。 效果 完整代码 #include<stdio.h> #define N 10 int main() {int a[N]{10,100,20,43,54,15,6,77,82,91};int i,t;printf("原始数组是:\n");for(i0;i<N;i)printf(&quo…

C 论大小

比较两个数字的大小并进行判断输出。 效果 完整代码 #define LAG > #define SMA < #define EQ #include <stdio.h> int main() {int i,j;printf("请输入两个数字&#xff1a;\n");scanf("%d %d",&i,&j);if(i LAG j)printf("%…

网络第3天

基于UDP的TFTP文件传输 功能&#xff1a;下载、上传、退出 #include <myhead.h> #define IP "192.168.8.100" #define PORT 69 int download_file(int…

滑动加载怎么做 php,vue之UI框架如何实现滑动加载数据

在我们移动端还有一个很常用的组件&#xff0c;那就是滑动加载更多组件。平常我们看到的很多插件实现相当复杂就觉得这个组件很难&#xff0c;其实不是的&#xff01;&#xff01;这个组件其实可以很简单的就实现出来&#xff0c;而且体验也能非常的棒(当然我们没有实现下拉刷新…

EasyX的安装与使用详细教程

EasyX 是针对 C/C 的图形库&#xff0c;可以帮助使用C/C语言的程序员快速上手图形和游戏编程&#xff0c;可以用来做些简单的演示2d类游戏&#xff0c;没有cocos2d-x那样重量级&#xff0c;学习起来也比较简单。 安装 1 . 打开Easyx官网https://easyx.cn/下载 EasyX&#xff…