Python+Pygame编写一个Pong游戏
作者:Leleprogrammer 发布时间:2023-08-04 15:58:31
标签:Python,Pygame,Pong,游戏
前言
这次,我们要用Pygame写一个Pong游戏
先看看效果:
需要的模块:Pygame
在python文件同目录下新建resources文件夹,在文件夹中新建Pong文件夹,文件夹中放入两个音频文件
代码教学
导入需要的模块
import pygame
from pygame.locals import *
import random
import sys
定义常量
COUNTDOWN=USEREVENT+1
path="resources/Pong/"
定义Class类,初始化函数内的代码:
pygame.init()
self.screen=pygame.display.set_mode((750,800))
pygame.display.set_caption("Pong")
self.mode="welcome"
self.ball=None
self.xspeed=0
self.yspeed=0
self.r=0
self.p1=None
self.p2=None
self.p1y=0
self.p2y=0
self.boardWidth=0
self.boardHeight=0
self.countdown=0
self.p1score=0
self.p2score=0
self.ballr=None
self.min=2
self.max=7
self.win=11
self.matchpoint=0
self.boardSpeed=self.max
self.ding=pygame.mixer.Sound(path+"ding.mp3")
self.bo=pygame.mixer.Sound(path+"bo.mp3")
定义listen函数
def listen(self):
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
elif event.type==KEYDOWN:
if event.key==K_k and self.mode=="welcome":
self.mode="playing"
self.ball=[750/2,800/2]
self.r=10
self.p1y=100
self.p2y=100
self.boardWidth=10
self.boardHeight=100
self.countdown=5
self.p1score=0
self.p2score=0
self.ballr=Rect(100,100,1,1)
pygame.time.set_timer(COUNTDOWN,1000)
elif event.type==COUNTDOWN:
self.countdown-=1
if self.countdown==0:
self.countdown=0
pygame.time.set_timer(COUNTDOWN,0)
self.xspeed=random.randint(self.min,self.max) if random.randint(0,1)==0 else random.randint(-self.max,-self.min)
self.yspeed=random.randint(self.min,self.max) if random.randint(0,1)==0 else random.randint(-self.max,-self.min)
else:
self.ding.play()
定义draw函数,用于屏幕显示,进入游戏时的ui:
if self.mode=="welcome":
self.screen.fill((0,0,0))
ts=[
"Welcome to Pong",
"This game needs 2 players",
"Press K to start"
]
y=100
for t in ts:
to=self.print_text("simhei",35,t,(255,255,255))
self.screen.blit(to,(100,y))
y+=40
开始游戏后:
elif self.mode=="playing":
self.screen.fill((0,0,0))
self.p1=pygame.draw.rect(self.screen,(255,255,255),(0,self.p1y,self.boardWidth,self.boardHeight))
self.p2=pygame.draw.rect(self.screen,(255,255,255),(750-self.boardWidth,self.p2y,self.boardWidth,self.boardHeight))
to=self.print_text("simhei",20,"Press WS to move",(255,255,255))
to2=self.print_text("simhei",20,"Press ↑↓ to move",(255,255,255))
tor=to.get_rect()
tor2=to2.get_rect()
d=10
tor.bottomleft=d,800-d
tor2.bottomright=750-d,800-d
self.screen.blit(to,tor)
self.screen.blit(to2,tor2)
to=self.print_text("simhei",20,"Match Point!",(255,255,255))
if self.matchpoint==1:
self.screen.blit(to,(10,10))
elif self.matchpoint==2:
tor=to.get_rect()
tor.topright=750-10,10
self.screen.blit(to,tor)
elif self.matchpoint==11:
pygame.time.set_timer(COUNTDOWN,0)
to=self.print_text("simhei",20,"Win!",(255,255,255))
self.screen.blit(to,(10,10))
to=self.print_text("simhei",20,"Lose!",(255,255,255))
tor=to.get_rect()
tor.topright=750-10,10
self.screen.blit(to,tor)
elif self.matchpoint==22:
pygame.time.set_timer(COUNTDOWN,0)
to=self.print_text("simhei",20,"Lose!",(255,255,255))
self.screen.blit(to,(10,10))
to=self.print_text("simhei",20,"Win!",(255,255,255))
tor=to.get_rect()
tor.topright=750-10,10
self.screen.blit(to,tor)
if not (self.matchpoint==11 or self.matchpoint==22):
self.move()
if not self.countdown:
pygame.draw.line(self.screen,(255,255,255),(750/2,0),(750/2,800),5)
else:
to=self.print_text("simhei",72,str(self.countdown),(255,255,255))
tor=to.get_rect()
tor.midtop=750/2,50
self.screen.blit(to,tor)
to=self.print_text("simhei",150,str(self.p1score),(255,255,255))
to2=self.print_text("simhei",150,str(self.p2score),(255,255,255))
tor=to.get_rect()
tor2=to2.get_rect()
tor.midtop=750/2/2,50
tor2.midtop=750/2+750/2/2,50
self.screen.blit(to,tor)
self.screen.blit(to2,tor2)
self.ballr=pygame.draw.circle(self.screen,(255,255,255),tuple(self.ball),self.r)
这里,为了可以显示文字,我们自己写一个print_text函数,用于显示文字
@staticmethod
def print_text(name,size,text,color):
font=pygame.font.SysFont(name,size)
image=font.render(text,True,color)
return image
定义一个move函数,用于移动小球和两个玩家的“板”
def move(self):
if (not self.countdown) and (not (self.ballr.colliderect(self.p1) or self.ballr.colliderect(self.p2))):
self.ball[0]+=self.xspeed
self.ball[1]+=self.yspeed
if self.ball[0]-self.r<=0:
self.p2score+=1
self.countdown=3
self.ballr=Rect(100,100,1,1)
self.ball=[750/2,800/2]
pygame.time.set_timer(COUNTDOWN,1000)
if self.ball[0]+self.r>=750:
self.p1score+=1
self.countdown=3
self.ballr=Rect(100,100,1,1)
self.ball=[750/2,800/2]
pygame.time.set_timer(COUNTDOWN,1000)
if self.ball[1]-self.r<=0 or self.ball[1]+self.r>=800:
self.yspeed=-self.yspeed
if self.yspeed<0:
self.yspeed=random.randint(-self.max,-self.min)
else:
self.yspeed=random.randint(self.min,self.max)
self.bo.play()
elif self.ballr.colliderect(self.p1) or self.ballr.colliderect(self.p2):
self.xspeed=-self.xspeed
if self.xspeed<0:
self.xspeed=random.randint(-self.max,-self.min)
else:
self.xspeed=random.randint(self.min,self.max)
self.bo.play()
self.ball[0]+=self.xspeed*2
key=pygame.key.get_pressed()
if key[K_w]:
self.p1y-=self.boardSpeed
if key[K_s]:
self.p1y+=self.boardSpeed
if key[K_UP]:
self.p2y-=self.boardSpeed
if key[K_DOWN]:
self.p2y+=self.boardSpeed
if self.p1y<=0:
self.p1y=0
if self.p2y<=0:
self.p2y=0
if self.p1y+self.boardHeight>=800:
self.p1y=800-self.boardHeight
if self.p2y+self.boardHeight>=800:
self.p2y=800-self.boardHeight
再定义一个函数,用于检查是否有玩家已经到达赛点
def checkMatchPoint(self):
self.matchpoint=0
if self.p1score==self.win:
self.matchpoint=11
if self.p2score==self.win:
self.matchpoint=22
if self.p1score+1==self.win:
self.matchpoint=1
if self.p2score+1==self.win:
self.matchpoint=2
if self.p1score+1==self.win and self.p2score+1==self.win:
self.win+=1
定义用于进入游戏主循环的函数run
def run(self):
clock=pygame.time.Clock()
while True:
clock.tick(60)
self.listen()
if not (self.matchpoint==11 or self.matchpoint==22):
self.checkMatchPoint()
self.draw()
pygame.display.update()
在类的外面,创建game对象,并进入游戏主循环
game=Game()
game.run()
最终代码
import pygame
from pygame.locals import *
import random
import sys
COUNTDOWN=USEREVENT+1
path="resources/Pong/"
class Game:
def __init__(self):
pygame.init()
self.screen=pygame.display.set_mode((750,800))
pygame.display.set_caption("Pong")
self.mode="welcome"
self.ball=None
self.xspeed=0
self.yspeed=0
self.r=0
self.p1=None
self.p2=None
self.p1y=0
self.p2y=0
self.boardWidth=0
self.boardHeight=0
self.countdown=0
self.p1score=0
self.p2score=0
self.ballr=None
self.min=2
self.max=7
self.win=11
self.matchpoint=0
self.boardSpeed=self.max
self.ding=pygame.mixer.Sound(path+"ding.mp3")
self.bo=pygame.mixer.Sound(path+"bo.mp3")
def listen(self):
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
elif event.type==KEYDOWN:
if event.key==K_k and self.mode=="welcome":
self.mode="playing"
self.ball=[750/2,800/2]
self.r=10
self.p1y=100
self.p2y=100
self.boardWidth=10
self.boardHeight=100
self.countdown=5
self.p1score=0
self.p2score=0
self.ballr=Rect(100,100,1,1)
pygame.time.set_timer(COUNTDOWN,1000)
elif event.type==COUNTDOWN:
self.countdown-=1
if self.countdown==0:
self.countdown=0
pygame.time.set_timer(COUNTDOWN,0)
self.xspeed=random.randint(self.min,self.max) if random.randint(0,1)==0 else random.randint(-self.max,-self.min)
self.yspeed=random.randint(self.min,self.max) if random.randint(0,1)==0 else random.randint(-self.max,-self.min)
else:
self.ding.play()
def draw(self):
if self.mode=="welcome":
self.screen.fill((0,0,0))
ts=[
"Welcome to Pong",
"This game needs 2 players",
"Press K to start"
]
y=100
for t in ts:
to=self.print_text("simhei",35,t,(255,255,255))
self.screen.blit(to,(100,y))
y+=40
elif self.mode=="playing":
self.screen.fill((0,0,0))
self.p1=pygame.draw.rect(self.screen,(255,255,255),(0,self.p1y,self.boardWidth,self.boardHeight))
self.p2=pygame.draw.rect(self.screen,(255,255,255),(750-self.boardWidth,self.p2y,self.boardWidth,self.boardHeight))
to=self.print_text("simhei",20,"Press WS to move",(255,255,255))
to2=self.print_text("simhei",20,"Press ↑↓ to move",(255,255,255))
tor=to.get_rect()
tor2=to2.get_rect()
d=10
tor.bottomleft=d,800-d
tor2.bottomright=750-d,800-d
self.screen.blit(to,tor)
self.screen.blit(to2,tor2)
to=self.print_text("simhei",20,"Match Point!",(255,255,255))
if self.matchpoint==1:
self.screen.blit(to,(10,10))
elif self.matchpoint==2:
tor=to.get_rect()
tor.topright=750-10,10
self.screen.blit(to,tor)
elif self.matchpoint==11:
pygame.time.set_timer(COUNTDOWN,0)
to=self.print_text("simhei",20,"Win!",(255,255,255))
self.screen.blit(to,(10,10))
to=self.print_text("simhei",20,"Lose!",(255,255,255))
tor=to.get_rect()
tor.topright=750-10,10
self.screen.blit(to,tor)
elif self.matchpoint==22:
pygame.time.set_timer(COUNTDOWN,0)
to=self.print_text("simhei",20,"Lose!",(255,255,255))
self.screen.blit(to,(10,10))
to=self.print_text("simhei",20,"Win!",(255,255,255))
tor=to.get_rect()
tor.topright=750-10,10
self.screen.blit(to,tor)
if not (self.matchpoint==11 or self.matchpoint==22):
self.move()
if not self.countdown:
pygame.draw.line(self.screen,(255,255,255),(750/2,0),(750/2,800),5)
else:
to=self.print_text("simhei",72,str(self.countdown),(255,255,255))
tor=to.get_rect()
tor.midtop=750/2,50
self.screen.blit(to,tor)
to=self.print_text("simhei",150,str(self.p1score),(255,255,255))
to2=self.print_text("simhei",150,str(self.p2score),(255,255,255))
tor=to.get_rect()
tor2=to2.get_rect()
tor.midtop=750/2/2,50
tor2.midtop=750/2+750/2/2,50
self.screen.blit(to,tor)
self.screen.blit(to2,tor2)
self.ballr=pygame.draw.circle(self.screen,(255,255,255),tuple(self.ball),self.r)
@staticmethod
def print_text(name,size,text,color):
font=pygame.font.SysFont(name,size)
image=font.render(text,True,color)
return image
def move(self):
if (not self.countdown) and (not (self.ballr.colliderect(self.p1) or self.ballr.colliderect(self.p2))):
self.ball[0]+=self.xspeed
self.ball[1]+=self.yspeed
if self.ball[0]-self.r<=0:
self.p2score+=1
self.countdown=3
self.ballr=Rect(100,100,1,1)
self.ball=[750/2,800/2]
pygame.time.set_timer(COUNTDOWN,1000)
if self.ball[0]+self.r>=750:
self.p1score+=1
self.countdown=3
self.ballr=Rect(100,100,1,1)
self.ball=[750/2,800/2]
pygame.time.set_timer(COUNTDOWN,1000)
if self.ball[1]-self.r<=0 or self.ball[1]+self.r>=800:
self.yspeed=-self.yspeed
if self.yspeed<0:
self.yspeed=random.randint(-self.max,-self.min)
else:
self.yspeed=random.randint(self.min,self.max)
self.bo.play()
elif self.ballr.colliderect(self.p1) or self.ballr.colliderect(self.p2):
self.xspeed=-self.xspeed
if self.xspeed<0:
self.xspeed=random.randint(-self.max,-self.min)
else:
self.xspeed=random.randint(self.min,self.max)
self.bo.play()
self.ball[0]+=self.xspeed*2
key=pygame.key.get_pressed()
if key[K_w]:
self.p1y-=self.boardSpeed
if key[K_s]:
self.p1y+=self.boardSpeed
if key[K_UP]:
self.p2y-=self.boardSpeed
if key[K_DOWN]:
self.p2y+=self.boardSpeed
if self.p1y<=0:
self.p1y=0
if self.p2y<=0:
self.p2y=0
if self.p1y+self.boardHeight>=800:
self.p1y=800-self.boardHeight
if self.p2y+self.boardHeight>=800:
self.p2y=800-self.boardHeight
def checkMatchPoint(self):
self.matchpoint=0
if self.p1score==self.win:
self.matchpoint=11
if self.p2score==self.win:
self.matchpoint=22
if self.p1score+1==self.win:
self.matchpoint=1
if self.p2score+1==self.win:
self.matchpoint=2
if self.p1score+1==self.win and self.p2score+1==self.win:
self.win+=1
def run(self):
clock=pygame.time.Clock()
while True:
clock.tick(60)
self.listen()
if not (self.matchpoint==11 or self.matchpoint==22):
self.checkMatchPoint()
self.draw()
pygame.display.update()
game=Game()
game.run()
来源:https://blog.csdn.net/leleprogrammer/article/details/124227987
0
投稿
猜你喜欢
- 大家知道,在js里encodeURIComponent 方法是一个比较常用的编码方法,但因工作需要,在asp里需用到此方法,查了好多资料,没
- 前言在 Go 单元测试这个系列的第二部分 数据库的Mock测试 中我们介绍了用 go-sqlmock 给数据库的 CRUD 操作做Mock
- 欢欢喜喜辞旧岁 🐰🐰🐰辞旧迎新之际,来 AI Studio 一起 #欢喜迎兔年# !分享不同新年风俗,共享一段快乐时光!🐰🐰🐰p>下面
- 第一种情况是返回的游标是某个具体的表或视图的数据,如:SQL-Code:CREATE OR REPLACE P
- JavaScript 中的并没有提供像 VBScript 里的 DateAdd 方法用于日
- 上节我们介绍了表连接,更确切的说是inner joins內连接. 內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包
- ASCII码键盘ASCII 码键盘ASCII 码键盘ASCII 码键盘27ESC32SPACE33!34"35#36$37%38&
- PHP Too few arguments to function的解决过去自定义函数的时候如果参数不足,则会抛出一个警告,但是在7.1开始
- 人们很容易忽视图像img标签的alt属性。然而,它的重要性也无法体现出来,它是有利于网页的accessibility and&nb
- 1.由于数据库设计问题造成SQL数据库新增数据时超时症状:Microsoft OLE DB Provider for SQL Server
- 简单计数器代码如下所示:<% Set fs = CreateObject("Scri
- Access 连接字符串 strConnect = “Provider=Microsoft.Jet.OLEDB.4.0;
- write2vin 的 PPT原文路宛兮写的简介:本文解释了以下问题: 1.什么是用户体验? 2.谁发明了这个术语?他想表达什么意思? 3.
- 本文试图从iPhone的角度结合一些iPhone平台项目的设计经验提炼出iPhone平台的一些优秀设计思路,以供大家在做移动互联网设备设计时
- 在DBA的日常工作中,经常需要重装或在新机器上安装Oracle,但每次安装所浪费的时间、精力以及失败的挫折都在考验着DBA的承受能力,本文着
- 一、Python中的对象Python中一切皆是对象。————Guido van Rossum(1989)这句话只要你学过python,你就很
- 异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求。请确保已启动 ASP.NET St
- EF Core 是一个ORM(对象关系映射),它使 .NET 开发人员可以使用 .NET对象操作数据库,避免了像ADO.NET访问数据库的代
- 可以使用 Application 对象在给定的应用程序的所有用户之间共享信息。基于 ASP 的应用程序同所有的 .asp 文件一样在一个虚拟
- 七夕节简介每年农历七月初七这一天是我国汉族的传统节日七夕节。因为此日活动的主要参与者是少女,而节日活动的内容又是以乞巧为主,故而人们称这天为