我正在 pygame 中制作 Pong 游戏,但它还没有完成。代码中的变量、类和其他内容的名称是葡萄牙语,但我认为很容易知道它的作用。该代码使两个桨和一个球在击中游戏窗口的上限和下限时反弹。当它击中桨时,它也应该弹跳,但这并没有发生。它只是从窗户里出来,忽略了桨。我没有收到任何错误消息。
完整代码:
import pygame,sys,os
import random
from pygame.locals import *
pygame.init()
janela=pygame.display.set_mode((800, 500),0,32)
pygame.display.set_caption("Pong!")
superficie=pygame.display.get_surface()
clock=pygame.time.Clock()
fundoFicheiro=os.path.join("Imagens","fundo2.png")
fundoImagem=pygame.image.load(fundoFicheiro).convert()
fundoFinal=pygame.transform.smoothscale(fundoImagem,(superficie.get_width(),superficie.get_height()))
barraFicheiro=os.path.join("Imagens","barra.png")
barraImagem=pygame.image.load(barraFicheiro).convert_alpha()
bolaFicheiro=os.path.join("Imagens","bola.png")
bolaImagem=pygame.image.load(bolaFicheiro).convert_alpha()
def imprimirBarra(x,y):
janela.blit(barraImagem,(x,y))
class barra():
y=1
x=1
velocidade=1
def subir(self):
self.y-=self.velocidade
def descer(self):
self.y+=self.velocidade
def parar(self):
self.velocidade=0
def comecar(self):
self.velocidade=5
def check(self):
if self.y<20:
self.y=20
elif self.y>superficie.get_height()-barraImagem.get_height()-20:
self.y=superficie.get_height()-barraImagem.get_height()-20
barra1=barra()
barra1.x=5
barra1.y=superficie.get_height()/2-barraImagem.get_height()/2
barra2=barra()
barra2.x=superficie.get_width()-(barraImagem.get_width()+5)
barra2.y=superficie.get_height()/2-barraImagem.get_height()/2
def interface():
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if event.type==KEYDOWN:
if pygame.key.get_pressed()[K_UP]:
barra2.comecar()
barra2.check()
barra2.subir()
elif pygame.key.get_pressed()[K_DOWN]:
barra2.comecar()
barra2.check()
barra2.descer()
if pygame.key.get_pressed()[K_w]:
barra1.comecar()
barra1.check()
barra1.subir()
elif pygame.key.get_pressed()[K_s]:
barra1.comecar()
barra1.check()
barra1.descer()
if event.type==KEYUP:
if event.type==K_UP:
barra2.parar()
elif event.type==K_DOWN:
barra2.parar()
elif event.type==K_w:
barra1.parar()
elif event.type==K_s:
barra1.parar()
class bola():
y=1
x=1
velocidadeX=1
velocidadeY=1
mover="a"
ultimaPosX=1
ultimaPosY=1
pontuacao1=0
pontuacao2=0
def subirDireita(self):
self.x+=self.velocidadeX
self.y-=self.velocidadeY
def subirEsquerda(self):
self.x-=self.velocidadeX
self.y-=self.velocidadeY
def descerDireita(self):
self.x+=self.velocidadeX
self.y+=self.velocidadeY
def descerEsquerda(self):
self.x-=self.velocidadeX
self.y+=self.velocidadeY
def colisao(self):
lista1=range(barra1.y,barra1.y+barraImagem.get_height()+1)
lista2=range(barra2.y,barra2.y+barraImagem.get_height()+1)
if self.y<1 and self.x<self.ultimaPosX:
self.velocidadeY=random.uniform(self.velocidadeX-0.5,self.velocidadeX+3.1)
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="descerEsquerda"
elif self.y<1 and self.x>self.ultimaPosX:
self.velocidadeY=random.uniform(self.velocidadeX-0.5,self.velocidadeX+3.1)
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="descerDireita"
elif self.y>superficie.get_height()-bolaImagem.get_height()-1 and self.x>self.ultimaPosX:
self.velocidadeY=random.uniform(self.velocidadeX-0.5,self.velocidadeX+3.1)
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="subirDireita"
elif self.y>superficie.get_height()-bolaImagem.get_height()-1 and self.x<self.ultimaPosX:
self.velocidadeY=random.uniform(self.velocidadeX-0.8,self.velocidadeX+3.1)
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="subirEsquerda"
elif self.x<5+barraImagem.get_width()-1 and self.y>self.ultimaPosY and self.y in lista1:
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="descerDireita"
elif self.x<5+barraImagem.get_width()-1 and self.y<self.ultimaPosY and self.y in lista1:
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="subirDireita"
elif self.x>superficie.get_width()-5-barraImagem.get_width()-bolaImagem.get_width()-1 and self.y<self.ultimaPosY and self.y in lista2:
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="subirEsquerda"
elif self.x>superficie.get_width()-5-barraImagem.get_width()-bolaImagem.get_width()-1 and self.y>self.ultimaPosY and self.y in lista2:
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="descerEsquerda"
elif self.x<0-bolaImagem.get_width():
self.pontuacao1+=1
self.comecar()
elif self.x>superficie.get_width():
self.pontuacao2+=1
self.comecar()
def font1(self):
font=pygame.font.Font(None,100)
text=font.render(str(self.pontuacao1),1,(255,255,255))
textPos=text.get_rect(right=(superficie.get_width()/2+superficie.get_width()/4),y=(superficie.get_height()-superficie.get_height()+50))
janela.blit(text,textPos)
def font2(self):
font=pygame.font.Font(None,100)
text=font.render(str(self.pontuacao2),1,(255,255,255))
textPos=text.get_rect(left=(superficie.get_width()/2-superficie.get_width()/4),y=(superficie.get_height()-superficie.get_height()+50))
janela.blit(text,textPos)
def comecar(self):
self.velocidadeY=8
self.velocidadeX=5
bola1.x=superficie.get_width()/2-bolaImagem.get_width()/2
bola1.y=superficie.get_height()/2-bolaImagem.get_height()/2
aleatorio=random.randint(1,4)
self.ultimaPosX=superficie.get_width()/2-bolaImagem.get_width()/2
self.ultimaPosY=superficie.get_height()/2-bolaImagem.get_height()/2
if aleatorio==1:
self.mover="subirEsquerda"
elif aleatorio==2:
self.mover="subirDireita"
elif aleatorio==3:
self.mover="descerDireita"
elif aleatorio==4:
self.mover="descerEsquerda"
def continuar(self):
if self.mover=="subirEsquerda":
self.subirEsquerda()
elif self.mover=="subirDireita":
self.subirDireita()
elif self.mover=="descerDireita":
self.descerDireita()
elif self.mover=="descerEsquerda":
self.descerEsquerda()
bola1=bola()
bola1.comecar()
def imprimirBola(x,y):
janela.blit(bolaImagem,(x,y))
pygame.key.set_repeat(1)
while True:
clock.tick(60)
interface()
bola1.colisao()
bola1.continuar()
janela.blit(fundoFinal,(0,0))
imprimirBarra(barra1.x,barra1.y)
imprimirBarra(barra2.x,barra2.y)
imprimirBola(bola1.x,bola1.y)
bola1.font1()
bola1.font2()
pygame.display.update()
我认为问题出在哪里(在方法内部colisao()
,class bola()
它应该检查球是否击中桨):
elif self.x<5+barraImagem.get_width()-1 and self.y>self.ultimaPosY and self.y in lista1:
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="descerDireita"
elif self.x<5+barraImagem.get_width()-1 and self.y<self.ultimaPosY and self.y in lista1:
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="subirDireita"
elif self.x>superficie.get_width()-5-barraImagem.get_width()-bolaImagem.get_width()-1 and self.y<self.ultimaPosY and self.y in lista2:
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="subirEsquerda"
elif self.x>superficie.get_width()-5-barraImagem.get_width()-bolaImagem.get_width()-1 and self.y>self.ultimaPosY and self.y in lista2:
self.ultimaPosX=self.x
self.ultimaPosY=self.y
self.mover="descerEsquerda"