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()
到此這篇關於Python+Pygame編寫一個Pong遊戲的文章就介紹到這瞭,更多相關Python Pygame Pong遊戲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!