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
開始游戲后:
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-12Python?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-07vscode寫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-05Python實(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-04python實(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開發(fā)利器
Sublime Text 是一款非常強(qiáng)大的文本編輯器, 下面我們介紹如何將 Sublime Text 3 打造成一款 Python/Django 開發(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