python两人一碰_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()

运行结果如下:

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

时间: 2019-11-23

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

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

相关文章

fedora 安装Linux源码,如何在 Fedora 29/30 上安装 VS Code

Visual Studio Code 简称 VS Code 是微软开发的一款跨平台的源代码编辑器。 它具有内置的调试支持&#xff0c;嵌入式 Git 控件&#xff0c;语法突出显示&#xff0c;代码完成&#xff0c;代码重构和代码片段。Visual Studio Marketplace 提供了许多插件和扩展来扩展VS代码的功…

2016-1-31

按照我之前的计划&#xff0c;应该是今天晚上才到家呢&#xff0c;可是21号就已经来到了&#xff0c;在家已经整整10天了&#xff0c;22号放纵了一天&#xff0c;有一天和CY出去溜了&#xff0c;所以应该是整整8天的时间是可以利用的&#xff0c;然而&#xff0c;我发现效果并不…

三菱伺服驱动器说明书_张家港市HG-KN13J-S100三菱伺服控制器

张家港市HG-KN13J-S100三菱伺服控制器MR-J2S1该产品还有RS-232和RS-422串行通讯功能&#xff0c;通过安装有伺服设置软件的个人计算机就能进行参数设定&#xff0c;试运行&#xff0c;状态显示和增益调整等操作。2与MR-J2S系列配套的伺服电机编码器采用了分辨率为131072脉冲/转…

linux中shell编写数组排序,linux bash shell实现对数组快速排序(升序)

2011年12月19日&#xff0c;参考网上用C语言实现的快速排序&#xff0c;经过一番修改后&#xff0c;用shell(我的测试环境为centos5的bash-v3.x)实现了相同功能&#xff1a;对数组进行升序排序。注&#xff1a;如果代码框里的代码复制出来后显示异常&#xff0c;就麻烦下载附件…

python接口自动化测试框架实战从设计到开发_Python接口自动化测试框架实战 从设计到开发...

第1章 课程介绍(不要错过)本章主要讲解课程的详细安排、课程学习要求、课程面向用户等&#xff0c;让大家很直观的对课程有整体认知&#xff01;第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的http\https请求包、如何模拟请求数据、过滤规则及修改响应数据、如何…

搭建 局域网

配件&#xff1a;网络交换机tp-link TL-SF1016D 16口&#xff08;预备继续添加主机&#xff09;&#xff1b;vk-qf9700 USB网卡&#xff08;10元一个&#xff09;&#xff1b;非屏蔽5类双绞线&#xff1b;机器都是win7的主机&#xff08;三台分别是 8&#xff0c;9,10&#xff…

Linux 禁用msi模式,通过禁用MSI模式解决Win10磁盘占用100%的方法

许多win10系统用户会在电脑中安装ssd固态硬盘&#xff0c;而在使用过程中经常会出现卡顿的情况&#xff0c;检查之后发现磁盘占用率100%&#xff0c;这是怎么回事呢&#xff0c;那么其实我们可以通过禁用MSI模式来解决&#xff0c;接下来给大家讲解一下通过禁用MSI模式解决Win1…

oracle jdbc jar包_Oracle总结之plsql编程(基础七)

紧接基础六&#xff0c;对oracle角色和权限的管理之后&#xff0c;在接下来的几次总结中来就最近工作中用过的plsql编程方面的知识进行总结&#xff0c;和大家分享&#xff01;一、plsql块1、只包括执行部分的plsql块打开输出选项&#xff1a;set serveroutput on&#xff1b;b…

Visual Studio调试之断点基础篇

原文链接地址&#xff1a;http://www.cnblogs.com/killmyday/archive/2009/09/26/1574311.html 我曾经问过很多人&#xff0c;你一般是怎么调试你的程序的&#xff1f; F9, F5, F11, F…… 有很多书和文章都是介绍怎么使用Visual Studio编写WinForm啦,、ASP.NET之类的程序&…

无线 在linux叫什么地方,请问有知道atheros无线网卡Linux驱动官方下载地址是什么吗?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼楼上的没给出中文翻译&#xff0c;屮把它翻译下&#xff0c;以让中文用户读起来更友好些&#xff1a;1.Download board-2.bin and firmware-4.bin_WLAN.RM.2.0-00180-QCARMSWPZ-1下载---兵文件 board-2.bin 和 firmware-4.bin_WLAN…

python cv.imread_Python的OpenCV cv2.imread总是返回None而cvFeatDetector崩溃了python

我用python中的opencv弄湿了自己的脚&#xff0c;并且我认为开始加载图像是一个很好的开始。我在我的系统上构建了opencv&#xff0c;并且在目录tpl / opencv中有python绑定和opencv dll&#xff0c;这与我的项目相关。以下是一些演示问题的代码&#xff1a;from tpl.opencv im…

[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)

使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件&#xff0c;我们会创建一个名称以 Application_ 开头&#xff0c;以事件名称结尾的方法&#xff0c;比如 Application_BeginRequest。举个例子&#xff0c;就像 Application_Start 和 Application_End 方法&a…

micropython lcd触摸屏显示中文_基于Micropython的天气显示 进程帖

本帖最后由 michael_llh 于 2019-4-17 10:06 编辑更下项目的进程哈&#xff01;项目的思路很简单&#xff0c;就是从网上获取天气信息&#xff0c;然后进行显示&#xff01;很尽量把过程写清楚&#xff0c;方便大家的交流和学习。首先说明下使用的硬件信息&#xff1a;Micropyt…

linux用while循环输出1到10,Linux Shell系列教程之(十一)Shell while循环 | Linux大学...

摘要在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经对Shell 循环语句的for循环进行了介绍&#xff0c;本篇给大家介绍下Shell 中另一种循环语句&#xff1a;Shell while循环。在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经对…

存储过程优缺点总结

优点&#xff1a; 1、快速 a、当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时&#xff09;&#xff0c;可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作&#xff0c;如果用程序来完成&#xff0c;就变成了一条条的 SQ…

c语言作业重庆科技学院,C语言程序设计学生上机报告-NO3.doc

C语言程序设计学生上机报告-NO3.doc重庆科技学院 上机实验报告(上机操作类) 课程名称 C 语 言 程 序 设 计 实验项目 循环结构程序设计(一) 机房名称 I313 上机时间 2017 年 11 月 19 日 指导老师 焦晓军 上机成绩 学生姓名 曾云 学号 2015441907 专业班级 机电 15-3 一、上机操…

sqlserver 触发器 update_运维日记| SQL server 那点事——DML触发器

各位新朋友&#xff5e;记得先点蓝字关注我哦&#xff5e;11月19日&#xff0c;21点&#xff0c;小编正六指霸屏&#xff0c;决赛圈1V4&#xff0c;忽然&#xff0c;电话响了&#xff0c;这种感觉很熟悉&#xff0c;不错&#xff0c;上次差点推掉对面水晶的那一幕又上演了……作…

linux fb应用例子,Linux下利用framebuffer画点的程序小例子

Linux下利用framebuffer画点的程序小例子&#xff1a;/** ** Filename: framebuffer.c** Description: linux下利用framebuffer画点的程序小例子** Version: 1.0* Created: 2011年02月25日 10时33分29秒* Revision: none* Compiler: …

pb利用datawindow查询符合条件的数据并且过滤掉其他数据_数据质量监测

1 Overview1.1 数据质量在数据部门里&#xff0c;数据质量问题经常是被动发现&#xff0c;所以数据质量的问题是大多数公司数据部门都不得不面对的问题。数据质量校验的目标是监控数据管道中&#xff0c;生产者、处理阶段以及消费者的数据的正确性、一致性和及时性的一项系统工…

PadLeft函数

string num12num.PadLeft(4, 0); //结果为为 0012 看字符串长度是否满足4位,不满足则在字符串左边以"0"补足 转载于:https://www.cnblogs.com/shy1766IT/p/5184937.html