Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pygame函数似乎被忽略_Python_Function_Pygame - Fatal编程技术网

Python pygame函数似乎被忽略

Python pygame函数似乎被忽略,python,function,pygame,Python,Function,Pygame,我正在建立一个相对简单的程序来测试碰撞检测,目前一切正常,除了一件事,我正在尝试随机改变背景颜色,唯一的问题是它似乎完全跳过了执行此操作的功能 import pygame from pygame.locals import * import random, math, time, sys pygame.init() Surface = pygame.display.set_mode((800,600)) backgroundr = int(random.random()*255)+1 bac

我正在建立一个相对简单的程序来测试碰撞检测,目前一切正常,除了一件事,我正在尝试随机改变背景颜色,唯一的问题是它似乎完全跳过了执行此操作的功能

import pygame
from pygame.locals import *
import random, math, time, sys
pygame.init()

Surface = pygame.display.set_mode((800,600))

backgroundr = int(random.random()*255)+1
backgroundg = int(random.random()*255)+1
backgroundb = int(random.random()*255)+1

Circles = []
class Circle:
    def __init__(self):
        self.radius = int(random.random()*50) + 1
        self.x = random.randint(self.radius, 800-self.radius)
        self.y = random.randint(self.radius, 600-self.radius)
        self.speedx = 0.5*(random.random()+1.0)
        self.speedy = 0.5*(random.random()+1.0)
        self.r = int(random.random()*255)+1
        self.g = int(random.random()*255)+1
        self.b = int(random.random()*255)+1
##        self.mass = math.sqrt(self.radius)

for x in range(int(random.random()*30) + 1):
    Circles.append(Circle())

def CircleCollide(C1,C2):
    C1Speed = math.sqrt((C1.speedx**2)+(C1.speedy**2))
    XDiff = -(C1.x-C2.x)
    YDiff = -(C1.y-C2.y)
    if XDiff > 0:
        if YDiff > 0:
            Angle = math.degrees(math.atan(YDiff/XDiff))
            XSpeed = -C1Speed*math.cos(math.radians(Angle))
            YSpeed = -C1Speed*math.sin(math.radians(Angle))
        elif YDiff < 0:
            Angle = math.degrees(math.atan(YDiff/XDiff))
            XSpeed = -C1Speed*math.cos(math.radians(Angle))
            YSpeed = -C1Speed*math.sin(math.radians(Angle))
    elif XDiff < 0:
        if YDiff > 0:
            Angle = 180 + math.degrees(math.atan(YDiff/XDiff))
            XSpeed = -C1Speed*math.cos(math.radians(Angle))
            YSpeed = -C1Speed*math.sin(math.radians(Angle))
        elif YDiff < 0:
            Angle = -180 + math.degrees(math.atan(YDiff/XDiff))
            XSpeed = -C1Speed*math.cos(math.radians(Angle))
            YSpeed = -C1Speed*math.sin(math.radians(Angle))
    elif XDiff == 0:
        if YDiff > 0:
            Angle = -90
        else:
            Angle = 90
        XSpeed = C1Speed*math.cos(math.radians(Angle))
        YSpeed = C1Speed*math.sin(math.radians(Angle))
    elif YDiff == 0:
        if XDiff < 0:
            Angle = 0
        else:
            Angle = 180
        XSpeed = C1Speed*math.cos(math.radians(Angle))
        YSpeed = C1Speed*math.sin(math.radians(Angle))
    C1.speedx = XSpeed
    C1.speedy = YSpeed
    C1.r = int(random.random()*255)+1
    C1.g = int(random.random()*255)+1
    C1.b = int(random.random()*255)+1
    C2.r = int(random.random()*255)+1
    C2.g = int(random.random()*255)+1
    C2.b = int(random.random()*255)+1

def ColourCheck():
    checknumber = int(random.random()*50)+1
    if checknumber == 50:
        backgroundr = int(random.random()*255)+1
        backgroundg = int(random.random()*255)+1
        backgroundb = int(random.random()*255)+1

def Move():
    for Circle in Circles:
        Circle.x += Circle.speedx
        Circle.y += Circle.speedy
def CollisionDetect():
    for Circle in Circles:
        if Circle.x < Circle.radius or Circle.x > 800-Circle.radius:
            Circle.speedx *= -1
            Circle.r = int(random.random()*255)+1
            Circle.g = int(random.random()*255)+1
            Circle.b = int(random.random()*255)+1
        if Circle.y < Circle.radius or Circle.y > 600-Circle.radius:
            Circle.speedy *= -1
            Circle.r = int(random.random()*255)+1
            Circle.g = int(random.random()*255)+1
            Circle.b = int(random.random()*255)+1
    for Circle in Circles:
        for Circle2 in Circles:
            if Circle != Circle2:
                if math.sqrt(  ((Circle.x-Circle2.x)**2)  +  ((Circle.y-Circle2.y)**2)  ) <= (Circle.radius+Circle2.radius):
                    CircleCollide(Circle,Circle2)
def Draw():
    Surface.fill((backgroundr,backgroundg,backgroundb))
    for Circle in Circles:
        pygame.draw.circle(Surface,(Circle.r,Circle.g,Circle.b),(int(Circle.x),int(600-Circle.y)),Circle.radius)
    pygame.display.flip()

def GetInput():
    keystate = pygame.key.get_pressed()
    for event in pygame.event.get():
        if event.type == QUIT or keystate[K_ESCAPE]:
            pygame.quit(); sys.exit()

def main():
    while True:
        ColourCheck()
        GetInput()
        Move()
        CollisionDetect()
        Draw()
if __name__ == '__main__': main()
导入pygame
从pygame.locals导入*
导入随机、数学、时间、系统
pygame.init()
Surface=pygame.display.set_模式((800600))
backgroundr=int(random.random()*255)+1
backgroundg=int(random.random()*255)+1
背景B=int(random.random()*255)+1
圆圈=[]
班级圈子:
定义初始化(自):
self.radius=int(random.random()*50)+1
self.x=random.randint(self.radius,800 self.radius)
self.y=random.randint(self.radius,600 self.radius)
self.speedx=0.5*(random.random()+1.0)
self.speedy=0.5*(random.random()+1.0)
self.r=int(random.random()*255)+1
self.g=int(random.random()*255)+1
self.b=int(random.random()*255)+1
##self.mass=数学sqrt(self.radius)
对于范围内的x(int(random.random()*30)+1):
Circles.append(Circle())
def环状胶体(C1、C2):
C1速度=数学sqrt((C1.speedx**2)+(C1.speedy**2))
XDiff=-(C1.x-C2.x)
YDiff=-(C1.y-C2.y)
如果XDiff>0:
如果YDiff>0:
角度=数学角度(数学角度(YDiff/XDiff))
XSpeed=-C1Speed*math.cos(数学弧度(角度))
YSpeed=-C1Speed*math.sin(数学弧度(角度))
elif YDiff<0:
角度=数学角度(数学角度(YDiff/XDiff))
XSpeed=-C1Speed*math.cos(数学弧度(角度))
YSpeed=-C1Speed*math.sin(数学弧度(角度))
elif XDiff<0:
如果YDiff>0:
角度=180+数学角度(数学角度(YDiff/XDiff))
XSpeed=-C1Speed*math.cos(数学弧度(角度))
YSpeed=-C1Speed*math.sin(数学弧度(角度))
elif YDiff<0:
角度=-180+数学角度(数学角度(YDiff/XDiff))
XSpeed=-C1Speed*math.cos(数学弧度(角度))
YSpeed=-C1Speed*math.sin(数学弧度(角度))
elif XDiff==0:
如果YDiff>0:
角度=-90
其他:
角度=90
XSpeed=c1速度*math.cos(数学弧度(角度))
YSpeed=C1Speed*math.sin(数学弧度(角度))
elif YDiff==0:
如果XDiff<0:
角度=0
其他:
角度=180
XSpeed=c1速度*math.cos(数学弧度(角度))
YSpeed=C1Speed*math.sin(数学弧度(角度))
C1.speedx=X速度
C1.速度=Y速度
C1.r=int(random.random()*255)+1
C1.g=int(random.random()*255)+1
C1.b=int(random.random()*255)+1
C2.r=int(random.random()*255)+1
C2.g=int(random.random()*255)+1
C2.b=int(random.random()*255)+1
def COLORCHECK():
checknumber=int(random.random()*50)+1
如果checknumber==50:
backgroundr=int(random.random()*255)+1
backgroundg=int(random.random()*255)+1
背景B=int(random.random()*255)+1
def Move():
对于圆形中的圆形:
Circle.x+=Circle.speedx
圆.y+=圆.s
def CollisionDetect():
对于圆形中的圆形:
如果圆.x800-Circle.radius:
Circle.speedx*=-1
Circle.r=int(random.random()*255)+1
Circle.g=int(random.random()*255)+1
Circle.b=int(random.random()*255)+1
如果圆.y600-Circle.radius:
圆圈*=-1
Circle.r=int(random.random()*255)+1
Circle.g=int(random.random()*255)+1
Circle.b=int(random.random()*255)+1
对于圆形中的圆形:
对于圆圈中的圆圈2:
如果循环!=圆圈2:

如果math.sqrt(((Circle.x-Circle2.x)**2)+((Circle.y-Circle2.y)**2))我相信backgroundr、backgroundg和backgroundb是colorcheck()函数的局部变量

如果决定使用全局变量,请在文件顶部尝试以下操作:

global backgroundr;
global backgroundg;
global backgroundb;
backgroundr = int(random.random()*255)+1
backgroundg = int(random.random()*255)+1
backgroundb = int(random.random()*255)+1
在你的功能中:

def ColourCheck():
    global backgroundr;
    global backgroundg;
    global backgroundb;
    checknumber = int(random.random()*50)+1
    if checknumber == 50:
        backgroundr = int(random.random()*255)+1
        backgroundg = int(random.random()*255)+1
        backgroundb = int(random.random()*255)+1
Move()
CollisionDetect()
Draw()
都指的是
,但不要将其声明为全局。尝试在每个函数的开头添加一个
全局圆
行。另外,我建议将变量改为小写;在Python中,不仅初始cap通常表示一个类,而且实际上在
Circle
变量和
Circle
类之间生成(不重要的)冲突

例如:

circles = []

# ...

for x in range(int(random.random()*30) + 1):
    circles.append(Circle())

# ...

def Move():
    global circles

    for circle in circles:
        circle.x += circle.speedx
        circle.y += circle.speedy

# ...
编辑:

正如Nathan所指出的,您的
backgroundX
变量也需要在
ColorCheck()
Draw()
中声明为全局变量


你可以考虑将所有这些函数打包成<代码>游戏类(或一些这样的),以避免使用这么多全局变量。

哦,而且重新构建事物会更明智,所以这些根本不是全局变量。非常感谢:D,现在我只需要将其从1/50提高到一个稍微平滑的过渡:)实际上不需要在函数之外声明三个全局变量。@Dana,你可能是对的。无论如何,我都倾向于明确提醒自己,我将变量用作全局变量。这也让我更难思考是否真的应该使用全局变量……哦,我之所以用分号是因为当我使用全局变量时,我通常在一行上使用“global myvar;myvar=somevalue”。所以……习惯。:-)