Python+Pygame編寫一個(gè)Pong游戲
前言
這次,我們要用Pygame寫一個(gè)Pong游戲
先看看效果:

需要的模塊:Pygame
在python文件同目錄下新建resources文件夾,在文件夾中新建Pong文件夾,文件夾中放入兩個(gè)音頻文件
代碼教學(xué)
導(dǎo)入需要的模塊
import pygame from pygame.locals import * import random import sys
定義常量
COUNTDOWN=USEREVENT+1 path="resources/Pong/"
定義Class類,初始化函數(shù)內(nèi)的代碼:
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函數(shù)
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函數(shù),用于屏幕顯示,進(jìn)入游戲時(shí)的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
開(kāi)始游戲后:
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)這里,為了可以顯示文字,我們自己寫一個(gè)print_text函數(shù),用于顯示文字
@staticmethod
def print_text(name,size,text,color):
font=pygame.font.SysFont(name,size)
image=font.render(text,True,color)
return image
定義一個(gè)move函數(shù),用于移動(dòng)小球和兩個(gè)玩家的“板”
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再定義一個(gè)函數(shù),用于檢查是否有玩家已經(jīng)到達(dá)賽點(diǎn)
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
定義用于進(jìn)入游戲主循環(huán)的函數(shù)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()
在類的外面,創(chuàng)建game對(duì)象,并進(jìn)入游戲主循環(huán)
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()到此這篇關(guān)于Python+Pygame編寫一個(gè)Pong游戲的文章就介紹到這了,更多相關(guān)Python Pygame Pong游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python利用3D引擎寫一個(gè)Pong游戲
- Python+Pygame實(shí)戰(zhàn)之俄羅斯方塊游戲的實(shí)現(xiàn)
- Python Pygame實(shí)戰(zhàn)之實(shí)現(xiàn)經(jīng)營(yíng)類游戲夢(mèng)想小鎮(zhèn)代碼版
- Python+Pygame實(shí)現(xiàn)接小彈珠游戲
- Python+Pygame實(shí)戰(zhàn)之詩(shī)詞填空游戲的實(shí)現(xiàn)
- Python+numpy實(shí)現(xiàn)一個(gè)蜘蛛紙牌游戲
- Python+Pygame實(shí)戰(zhàn)之文字劇情游戲的實(shí)現(xiàn)
- Python+Pygame實(shí)戰(zhàn)之炫舞小游戲的實(shí)現(xiàn)
- Python之freegames?零代碼的22個(gè)小游戲集合
相關(guān)文章
pytorch制作自己的LMDB數(shù)據(jù)操作示例
這篇文章主要介紹了pytorch制作自己的LMDB數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了pytorch使用lmdb的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-12-12
Python?Matplotlib繪制箱線圖boxplot()函數(shù)詳解
箱線圖一般用來(lái)展現(xiàn)數(shù)據(jù)的分布(如上下四分位值、中位數(shù)等),同時(shí)也可以用箱線圖來(lái)反映數(shù)據(jù)的異常情況,下面這篇文章主要給大家介紹了關(guān)于Python?Matplotlib繪制箱線圖boxplot()函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-07-07
vscode寫python時(shí)的代碼錯(cuò)誤提醒和自動(dòng)格式化的方法
這篇文章主要介紹了vscode寫python時(shí)的代碼錯(cuò)誤提醒和自動(dòng)格式化的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列詳解
這篇文章主要介紹了Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列,詳細(xì)分析了隊(duì)列的定義、功能與Python實(shí)現(xiàn)隊(duì)列的相關(guān)技巧,以及具體的用法,需要的朋友可以參考下2015-04-04
python實(shí)現(xiàn)自動(dòng)解數(shù)獨(dú)小程序
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)解數(shù)獨(dú)小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
教你如何將 Sublime 3 打造成 Python/Django IDE開(kāi)發(fā)利器
Sublime Text 是一款非常強(qiáng)大的文本編輯器, 下面我們介紹如何將 Sublime Text 3 打造成一款 Python/Django 開(kāi)發(fā)利器:2014-07-07
獲取python運(yùn)行輸出的數(shù)據(jù)并解析存為dataFrame實(shí)例
這篇文章主要介紹了獲取python運(yùn)行輸出的數(shù)據(jù)并解析存為dataFrame實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07

