Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 提高混沌博弈效率_Python_Python 3.x_Turtle Graphics - Fatal编程技术网

Python 提高混沌博弈效率

Python 提高混沌博弈效率,python,python-3.x,turtle-graphics,Python,Python 3.x,Turtle Graphics,我写这个脚本是为了使用海龟模块复制我在NumberFile频道上看到的混沌游戏。有大量的点被画出来,以使它在更大范围内工作良好。我认为大量的圆点是导致程序运行缓慢的原因,我想知道是否有人能帮我找到解决方法 我对任何类型的解决方案都持开放态度,只要控件保持不变,顶点的数量可以是3以上的任何数字 如果有人不知道混沌游戏是什么,那就是一个有任意数量顶点的多边形的游戏。首先,在多边形内放置一个点,随机选择一个顶点,并在刚才放置的点和随机选择的顶点之间绘制一个新点。您不断重复此过程,每次都将使用新绘制的点

我写这个脚本是为了使用海龟模块复制我在NumberFile频道上看到的混沌游戏。有大量的点被画出来,以使它在更大范围内工作良好。我认为大量的圆点是导致程序运行缓慢的原因,我想知道是否有人能帮我找到解决方法

我对任何类型的解决方案都持开放态度,只要控件保持不变,顶点的数量可以是3以上的任何数字

如果有人不知道混沌游戏是什么,那就是一个有任意数量顶点的多边形的游戏。首先,在多边形内放置一个点,随机选择一个顶点,并在刚才放置的点和随机选择的顶点之间绘制一个新点。您不断重复此过程,每次都将使用新绘制的点

在这个脚本中,我还包括了一个规则,确保它不会连续两次选择同一个顶点来形成具有3个以上顶点的漂亮分形。3个顶点实际上形成了Sierpinski三角形

以下是NumberFile视频的链接:

正如您可能知道的,我对Python和一般的编码有些陌生

完整代码:

import turtle as t
import tkinter as tk
from tkinter import ttk
from random import randint
wn = t.Screen()
wn.colormode(255)
t.pu();t.ht();t.speed(0)
plist = []

l = 0
val = 0

pb=ttk.Progressbar(orient="horizontal",length=wn.window_width(),mode="determinate")
pb.pack(side=tk.BOTTOM)
pb["value"]=0

def Clear():
    t.clear()
    plist = []
def Dot(x, y):
    t.goto(x, y)
    t.dot(5, (0, 0, 255))
    plist.append(t.pos())
def Run(x, y):
    wn.onscreenclick(None)
    wn.tracer(0, 0)
    l = len(plist)
    pb["maximum"]=l*1000
    xyc = randint(0, l-1)
    xyc_old = 0
    for _ in range(l*10):
        xyc = randint(0, l-1)
        for i in range(100):
            xyc = randint(0, l-1);
            if l >= 4:
                while xyc == xyc_old:
                    xyc = randint(0, l-1);
                xyc_old = xyc;
            t.goto((t.pos()[0]+plist[xyc][0])/2, (t.pos()[1]+plist[xyc][1])/2);     
            t.dot(2, (255, 0, 0));
            pb["value"]+=1;
            pb.update()
        wn.update()
    plist.clear()
    wn.onscreenclick(Dot, btn=1)
    wn.onscreenclick(Run, btn=3)  
wn.onscreenclick(Dot, btn=1)
wn.onscreenclick(Run, btn=3)
wn.onkey(Clear, "c")
wn.listen()
wn.mainloop()
我觉得我的编码风格和这里的很多人很不一样,但我希望这不是问题

谢谢大家!

我假设大量的点是导致程序开始的原因 跑慢一点后,我想知道是否有人可以帮助我 想出一个解决办法

令人惊讶的是,没有。这是你自己的工具(进度条)让你减速。点评:

pb.update()
看看会发生什么

我觉得我的编码风格和很多人有很大的不同 在这里,但我希望这不是一个问题

这是一个与糟糕的编码风格重叠的问题。例如,缺少空格、使用分号、代码中没有有效的ops等。我对您的代码进行了返工:

from turtle import Screen, Turtle
import tkinter as tk
from tkinter import ttk
from random import randrange

def clear():
    turtle.clear()
    plist.clear()

def dot(x, y):
    turtle.goto(x, y)
    turtle.dot(5, 'blue')
    plist.append(turtle.position())

def run(x, y):
    screen.onscreenclick(None, btn=1)
    screen.onscreenclick(None, btn=3)
    screen.onkey(None, 'c')

    length = len(plist)
    flag = length >= 4
    pb['maximum'] = length * 1000
    xyc_old = 0

    for _ in range(length * 100):
        for _ in range(10):
            xyc = randrange(length)

            if flag:
                while xyc == xyc_old:
                    xyc = randrange(length)
                xyc_old = xyc

            x, y = turtle.position()
            dx, dy = plist[xyc]
            turtle.goto((x + dx) / 2, (y + dy) / 2)
            turtle.dot(2)

        pb['value'] += 10
        pb.update()

    plist.clear()
    pb['value'] = 0

    screen.onscreenclick(dot, btn=1)
    screen.onscreenclick(run, btn=3)
    screen.onkey(clear, 'c')

plist = []

screen = Screen()
screen.tracer(False)

turtle = Turtle()
turtle.hideturtle()
turtle.setundobuffer(None)
turtle.color('red')
turtle.penup()

pb = ttk.Progressbar(orient='horizontal', length=screen.window_width(), mode='determinate')
pb.pack(side=tk.BOTTOM)
pb['value'] = 0

screen.onscreenclick(dot, btn=1)
screen.onscreenclick(run, btn=3)
screen.onkey(clear, 'c')
screen.listen()

screen.mainloop()
其他变化包括:

Clear()
中的
plist=[]
如果没有
全局plist
将无法工作。改用
plist.clear()

您还需要在
Run
期间禁用(并重新启用)
wn.onkey(清除“c”)
,否则用户可能会中断程序。您还需要单独禁用两个鼠标按钮


你真的想要
randrange()
,而不是
randint()

嗯,我在发布这个问题的那天刚刚添加了进度条。以前也有类似的性能问题,但不知何故,这似乎已经快得多了。我想知道是不是randrange在这里做了大部分工作?我相信这些分号是在我尝试使用exec()执行实际绘制图形的块时留下的。