Python 代码在没有函数的情况下工作,不会';你不能使用函数吗?
我正在努力为我的A级期末项目学习PyGame,我从Atari Breakout开始。我把它放在一个球在桨上来回反弹的舞台上。但是代码非常不整洁,所以我想把它放到函数中 代码在没有功能的情况下工作:Python 代码在没有函数的情况下工作,不会';你不能使用函数吗?,python,pygame,Python,Pygame,我正在努力为我的A级期末项目学习PyGame,我从Atari Breakout开始。我把它放在一个球在桨上来回反弹的舞台上。但是代码非常不整洁,所以我想把它放到函数中 代码在没有功能的情况下工作: import pygame, sys from pygame.locals import * pygame.init() DISPLAYSURF = pygame.display.set_mode((1280, 720)) pygame.display.set_caption('Breakout')
import pygame, sys
from pygame.locals import *
pygame.init()
DISPLAYSURF = pygame.display.set_mode((1280, 720))
pygame.display.set_caption('Breakout')
padX = 310
padY = 680
dotX = 150
dotY = 150
dotMX = -1
dotMY = -1
loss = False
while loss != True:
DISPLAYSURF.fill(pygame.Color(0,0,0))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEMOTION:
padX = event.pos[0]-75
if padX < 3:
padX = 3
elif padX > 1127:
padX = 1127
pygame.draw.rect(DISPLAYSURF, pygame.Color(0, 0, 255),(padX, padY, 150, 30))
dotX += dotMX
dotY += dotMY
if dotY >= 720 - 30:
loss = True
#hor colis
if dotX <= 0 + 20:
if dotMX == 1:
dotMX = -1
else:
dotMX = 1
elif dotX >= 1280 - 20:
if dotMX == 1:
dotMX = -1
else:
dotMX = 1
#vert colis
if dotY <= 0 - 20:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
elif dotY >= 720 - 20:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
#pad colis
if dotX >= padX and dotX <= padX + 150 and dotY == 665:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
pygame.draw.circle(DISPLAYSURF, pygame.Color(255,0,0), (dotX, dotY), 20)
pygame.display.update()
import pygame,sys
从pygame.locals导入*
pygame.init()
DISPLAYSURF=pygame.display.set_模式((1280720))
pygame.display.set_标题('Breakout'))
padX=310
帕迪=680
dotX=150
多蒂=150
dotMX=-1
dotMY=-1
损失=错误
当失去时!=正确:
DISPLAYSURF.fill(pygame.Color(0,0,0))
对于pygame.event.get()中的事件:
如果event.type==退出:
pygame.quit()
sys.exit()
elif event.type==pygame.MOUSEMOTION:
padX=事件位置[0]-75
如果padX<3:
padX=3
elif padX>1127:
padX=1127
pygame.draw.rect(DISPLAYSURF,pygame.Color(0,0255),(padX,padY,150,30))
dotX+=dotMX
多蒂+=多蒂
如果dotY>=720-30:
损失=真实
#霍科利斯
如果dotX=1280-20:
如果dotMX==1:
dotMX=-1
其他:
dotMX=1
#腹绞痛
如果dotY=720-20:
如果dotMY==1:
dotMY=-1
其他:
dotMY=1
#结肠垫
如果dotX>=padX和dotX,我可以看到cede的第二个块存在两个问题。第一个与格式有关。你有台词,比如
if dotY >= 720 - 30
lives -= 1
这将不允许您编译代码,因为它会受到不正确缩进的影响。
第二个问题是,您正在将一些变量传递给函数,在函数内部修改它们,但并没有返回它们
函数参数是名称。调用函数时,Python会将这些参数绑定到您传递的任何对象(通过调用方作用域中的名称)。
对象可以是可变的(如列表)或不可变的(如Python中的整数、字符串)
由于dotX、dotY、dotMX、todMY、padX、padY、lifes都是整数,您不能修改它们而产生副作用,它们需要从函数返回。
我建议创建一个类或使用一些数据结构来传递和返回所有必要的参数
为了快速检查,您可以通过在函数末尾添加returnstatemet来修改colis
函数,如
return (dotX, dotY, dotMX, dotMY, padX, padY, lives)
将调用更改为main
函数中的函数,如下所示
dotX, dotY, dotMX, dotMY, padX, padY, lives = colis(dotX, dotY, dotMX, dotMY, padX, padY, lives)
在你明白了这一点之后,你可以开始进一步的重构,因为我的更新并不像它们应该的那样优雅和干净 您正在将内容传递给函数(colis
),在函数内部重新定义它们,但这些更改不会反映在函数外部(Python就是这样工作的)
最简单的更改是返回在colis
中更改的三个变量,并将这些更改传播到main
:
def colis(dotX, dotY, dotMX, dotMY, padX, padY, lives):
...
pygame.draw.circle(DISPLAYSURF, pygame.Color(255,0,0), (dotX, dotY), 20)
return dotMX, dotMY, lives # This line
及
一种“更好”的方法(可能是将来)可能是为那些可以传递给colis
函数的参数(例如Dot
,Pad
)定义并实例化类对象
(完整代码)
import pygame,sys
从pygame.locals导入*
DISPLAYSURF=pygame.display.set_模式((1280720))
padX=310
帕迪=680
dotX=150
多蒂=150
dotMX=-1
dotMY=-1
寿命=5
def main(padX、padY、dotX、dotY、dotMX、dotMY、lives):
pygame.init()
pygame.display.set_标题('Breakout'))
有生之年!=0:
DISPLAYSURF.fill(pygame.Color(0,0,0))
对于pygame.event.get()中的事件:
如果event.type==退出:
pygame.quit()
sys.exit()
elif event.type==pygame.MOUSEMOTION:
padX=事件位置[0]-75
如果padX<3:
padX=3
elif padX>1127:
padX=1127
pygame.draw.rect(DISPLAYSURF,pygame.Color(0,0255),(padX,padY,150,30))
dotX+=dotMX
多蒂+=多蒂
dotMX,dotMY,lifes=colis(dotX,dotY,dotMX,dotMY,padX,padY,lifes)#这一行
pygame.display.update()
def colis(dotX,dotY,dotMX,dotMY,padX,padY,lifes):
如果dotY>=720-30:
寿命-=1
#霍科利斯
如果dotX=1280-20:
如果dotMX==1:
dotMX=-1
其他:
dotMX=1
#腹绞痛
如果dotY=720-20:
如果dotMY==1:
dotMY=-1
其他:
dotMY=1
#结肠垫
如果dotX>=padX且dotX正常,那么这里有一个简单的代码修复程序,您没有正确使用全局变量:
import pygame
import sys
from pygame.locals import *
DISPLAYSURF = pygame.display.set_mode((1280, 720))
padX = 310
padY = 680
dotX = 150
dotY = 150
dotMX = -1
dotMY = -1
lives = 5
def main():
global padX, padY, dotX, dotY, dotMX, dotMY, lives
pygame.init()
pygame.display.set_caption('Breakout')
while lives != 0:
DISPLAYSURF.fill(pygame.Color(0, 0, 0))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEMOTION:
padX = event.pos[0] - 75
if padX < 3:
padX = 3
elif padX > 1127:
padX = 1127
pygame.draw.rect(DISPLAYSURF, pygame.Color(
0, 0, 255), (padX, padY, 150, 30))
dotX += dotMX
dotY += dotMY
colis()
pygame.display.update()
def colis():
global padX, padY, dotX, dotY, dotMX, dotMY, lives
if dotY >= 720 - 30:
lives -= 1
# hor colis
if dotX <= 0 + 20:
if dotMX == 1:
dotMX = -1
else:
dotMX = 1
elif dotX >= 1280 - 20:
if dotMX == 1:
dotMX = -1
else:
dotMX = 1
# vert colis
if dotY <= 0 - 20:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
elif dotY >= 720 - 20:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
# pad colis
if dotX >= padX and dotX <= padX + 150 and dotY == 665:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
pygame.draw.circle(DISPLAYSURF, pygame.Color(255, 0, 0), (dotX, dotY), 20)
if __name__ == "__main__":
main()
导入pygame
导入系统
从pygame.locals导入*
DISPLAYSURF=pygame.display.set_模式((1280720))
padX=310
帕迪=680
dotX=150
多蒂=150
dotMX=-1
dotMY=-1
寿命=5
def main():
全局padX,padY,dotX,dotY,dotMX,dotMY,lives
pygame.init()
pygame.display.set_标题('Breakout'))
有生之年!=0:
DISPLAYSURF.fill(pygame.Color(0,0,0))
对于pygame.event.get()中的事件:
如果event.type==退出:
pygame.quit()
sys.exit()
elif event.type==pygame.MOUSEMOTION:
padX=事件位置[0]-75
如果padX<3:
padX=3
elif padX>1127:
padX=1127
pygame.draw.rect(DISPLAYSURF,pygame.Color(
0,0,255),(padX,padY,150,30))
dotX+=dotMX
多蒂+=多蒂
科利斯()
pygame.display.update()
def colis():
全局padX,padY,dotX,dotY,dotMX,dotMY,lives
如果dotY>=720-30:
寿命-=1
#霍科利斯
如果dotX=1280-20:
如果dotMX==1:
dotMX=-1
其他:
dotMX=1
#腹绞痛
如果dotY=720-20:
如果dotMY==1:
dotMY=-1
其他:
dotMY=1
#结肠垫
如果dotX>=padX和dotX,您是否得到任何错误?还是它的ju
def main(padX, padY, dotX, dotY, dotMX, dotMY, lives):
...
dotX += dotMX
dotY += dotMY
dotMX, dotMY, lives = colis(dotX, dotY, dotMX, dotMY, padX, padY, lives) # This line
pygame.display.update()
import pygame, sys
from pygame.locals import *
DISPLAYSURF = pygame.display.set_mode((1280, 720))
padX = 310
padY = 680
dotX = 150
dotY = 150
dotMX = -1
dotMY = -1
lives = 5
def main(padX, padY, dotX, dotY, dotMX, dotMY, lives):
pygame.init()
pygame.display.set_caption('Breakout')
while lives != 0:
DISPLAYSURF.fill(pygame.Color(0,0,0))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEMOTION:
padX = event.pos[0]-75
if padX < 3:
padX = 3
elif padX > 1127:
padX = 1127
pygame.draw.rect(DISPLAYSURF, pygame.Color(0, 0, 255),(padX, padY, 150, 30))
dotX += dotMX
dotY += dotMY
dotMX, dotMY, lives = colis(dotX, dotY, dotMX, dotMY, padX, padY, lives) # This line
pygame.display.update()
def colis(dotX, dotY, dotMX, dotMY, padX, padY, lives):
if dotY >= 720 - 30:
lives -= 1
#hor colis
if dotX <= 0 + 20:
if dotMX == 1:
dotMX = -1
else:
dotMX = 1
elif dotX >= 1280 - 20:
if dotMX == 1:
dotMX = -1
else:
dotMX = 1
#vert colis
if dotY <= 0 - 20:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
elif dotY >= 720 - 20:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
#pad colis
if dotX >= padX and dotX <= padX + 150 and dotY == 665:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
pygame.draw.circle(DISPLAYSURF, pygame.Color(255,0,0), (dotX, dotY), 20)
return dotMX, dotMY, lives # This line
main(padX, padY, dotX, dotY, dotMX, dotMY, lives)
import pygame
import sys
from pygame.locals import *
DISPLAYSURF = pygame.display.set_mode((1280, 720))
padX = 310
padY = 680
dotX = 150
dotY = 150
dotMX = -1
dotMY = -1
lives = 5
def main():
global padX, padY, dotX, dotY, dotMX, dotMY, lives
pygame.init()
pygame.display.set_caption('Breakout')
while lives != 0:
DISPLAYSURF.fill(pygame.Color(0, 0, 0))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEMOTION:
padX = event.pos[0] - 75
if padX < 3:
padX = 3
elif padX > 1127:
padX = 1127
pygame.draw.rect(DISPLAYSURF, pygame.Color(
0, 0, 255), (padX, padY, 150, 30))
dotX += dotMX
dotY += dotMY
colis()
pygame.display.update()
def colis():
global padX, padY, dotX, dotY, dotMX, dotMY, lives
if dotY >= 720 - 30:
lives -= 1
# hor colis
if dotX <= 0 + 20:
if dotMX == 1:
dotMX = -1
else:
dotMX = 1
elif dotX >= 1280 - 20:
if dotMX == 1:
dotMX = -1
else:
dotMX = 1
# vert colis
if dotY <= 0 - 20:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
elif dotY >= 720 - 20:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
# pad colis
if dotX >= padX and dotX <= padX + 150 and dotY == 665:
if dotMY == 1:
dotMY = -1
else:
dotMY = 1
pygame.draw.circle(DISPLAYSURF, pygame.Color(255, 0, 0), (dotX, dotY), 20)
if __name__ == "__main__":
main()
import pygame
import sys
from pygame.locals import *
class Game():
def __init__(self):
self.pad_x = 310
self.pad_y = 680
self.dot_x = 150
self.dot_y = 150
self.dot_mx = -1
self.dot_my = -1
self.lives = 5
def run(self):
self.display = pygame.display.set_mode((1280, 720))
pygame.init()
pygame.display.set_caption('Breakout')
while self.lives != 0:
self.display.fill(pygame.Color(0, 0, 0))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEMOTION:
self.pad_x = event.pos[0] - 75
if self.pad_x < 3:
self.pad_x = 3
elif self.pad_x > 1127:
self.pad_x = 1127
pygame.draw.rect(self.display, pygame.Color(
0, 0, 255), (self.pad_x, self.pad_y, 150, 30))
self.dot_x += self.dot_mx
self.dot_y += self.dot_my
self.colis()
pygame.display.update()
def colis(self):
if self.dot_y >= 720 - 30:
self.lives -= 1
# hor colis
if self.dot_x <= 0 + 20:
if self.dot_mx == 1:
self.dot_mx = -1
else:
self.dot_mx = 1
elif self.dot_x >= 1280 - 20:
if self.dot_mx == 1:
self.dot_mx = -1
else:
self.dot_mx = 1
# vert colis
if self.dot_y <= 0 - 20:
if self.dot_my == 1:
self.dot_my = -1
else:
self.dot_my = 1
elif self.dot_y >= 720 - 20:
if self.dot_my == 1:
self.dot_my = -1
else:
self.dot_my = 1
# pad colis
if self.dot_x >= self.pad_x and self.dot_x <= self.pad_x + 150 and self.dot_y == 665:
if self.dot_my == 1:
self.dot_my = -1
else:
self.dot_my = 1
pygame.draw.circle(self.display, pygame.Color(
255, 0, 0), (self.dot_x, self.dot_y), 20)
if __name__ == "__main__":
Game().run()