Python 代码在没有函数的情况下工作,不会';你不能使用函数吗?

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')

我正在努力为我的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')
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()