2014-02-16 146 views
-3

這讓我瘋狂,我正在製作一個電路仿真程序,每當我問一個關於它的問題它就會關閉。爲什麼這段代碼不能正常工作?

我真的需要幫助,但是我的問題在任何人都可以幫助我回答之前就會關閉。

反正,這裏是問題: 其實,我不知道問題是什麼,這個代碼有什麼問題,我不知道它是什麼?這一切看起來很好,我找不到任何錯誤,但它只是不工作。

在這個程序中,有電線和電源,當我在電線旁邊放置電源時,我希望它能夠通電,並且所有連接的電線也通電,但是這個程序顯示非常奇怪行爲以及除了我原以爲會做的事之外的所有事情。當連接到電源時,我想讓點亮,當沒有連接電源時關閉。當我放置電源時,它們會亮起來,但是當我放置更多導線時,它們全都被禁用,我似乎無法弄清楚爲什麼。

(暗紅色=供電黑色=不通電) 這是當我將一個導線的電源旁:

enter image description here

但後來我添加越來越:

enter image description here

這裏是代碼:

import pygame 
from pygame.locals import * 

pygame.init() 

screen=pygame.display.set_mode((640,480)) 
blocks=[] 
class PowerSource(object): 
    def __init__(self,pos): 
     self.posx=pos[0] 
     self.posy=pos[1] 
     self.rect=pygame.Rect(self.posx,self.posy,32,32) 
     self.powered=True 
    def update(self): 
     pygame.draw.rect(screen, (255,0,0), self.rect, 0) 
    def repos(self): 
     pass 
class Circuit(object): 
    def __init__(self,pos): 
     self.powered=False 
     self.posx=pos[0] 
     self.posy=pos[1] 
     self.rect=pygame.Rect(self.posx,self.posy,32,32) 
     self.topped=False 
     self.lefted=False 
     self.righted=False 
     self.bottomed=False 
    def update(self): 
     self.powered=False 
     if any(b.rect.collidepoint(self.rect.left,self.rect.top-5) for b in [b for b in blocks if b is not self]): 
      if b.powered==True: 
       self.powered=True 
     if any(b.rect.collidepoint(self.rect.left,self.rect.top+38) for b in [b for b in blocks if b is not self]): 
      if b.powered==True: 
       self.powered=True 
     if any(b.rect.collidepoint(self.rect.left-5,self.rect.top) for b in [b for b in blocks if b is not self]): 
      if b.powered==True: 
       self.powered=True 
     if any(b.rect.collidepoint(self.rect.right+5,self.rect.top) for b in [b for b in blocks if b is not self]): 
      if b.powered==True: 
       self.powered=True 
     if not self.powered: 
      pygame.draw.rect(screen, (0,0,0), self.rect, 0) 
     else: 
      pygame.draw.rect(screen, (200,0,0), self.rect, 0) 
while True: 
    place=1 
    screen.fill((255,255,255)) 
    mse=pygame.mouse.get_pos() 
    mse=((mse[0]/32)*32,(mse[1]/32)*32) 
    pressed=pygame.mouse.get_pressed() 
    if pressed==(1,0,0): 
     pressed='L' 
    elif pressed==(0,0,1): 
     pressed='R' 
    for b in blocks: 
     b.update() 
    pygame.draw.rect(screen, (255,0,0), (mse[0],mse[1],32,32), 2) 
    for e in pygame.event.get(): 
     if e.type==QUIT: 
      exit() 
    key=pygame.key.get_pressed() 
    if key[K_SPACE]: 
     for b in blocks: 
      if b.rect.collidepoint(mse): 
       place=0 
     if place==1: 
      blocks.append(PowerSource(mse)) 
    if pressed=='L': 
     for b in blocks: 
      if b.rect.collidepoint(mse): 
       place=0 
     if place==1: 
      blocks.append(Circuit(mse)) 

    elif pressed=='R': 
     for b in blocks: 
      if b.rect.collidepoint(mse): 
       blocks.remove(b) 
    pygame.display.flip() 

請幫助我!我非常失望。

+0

儘量做到儘可能具體。什麼是你正在得到確切的錯誤信息? –

+3

「除了我認爲會做的一切之外,做的一切事情」都是難以理解的。我們沒有什麼可繼續下去的。 – mhlester

+0

我問過這個問題的多個問題,我認爲人們會開始感到困惑。讓我去編輯它,請不要關閉它。 –

回答

2

這裏有幾個問題。首先是眼前的問題。

update,你認爲b是從哪裏來的?

 if b.powered==True: 

它不是從這些部件之一到來:

if any(b.rect.collidepoint(self.rect.left,self.rect.top-5) for b in [b for b in blocks if b is not self]): 
     ^             ^

它從這個名單理解的最後一次迭代來:

[b for b in blocks if b is not self] 

塊中的最後一個非我塊列表用於所有if b.powered == True測試。生成器表達式的循環變量在生成器表達式之外是不可用的,並且列表理解的循環變量僅在列表理解之外可用,這是由於出於性能原因做出的設計決定並在Python 3中被撤銷。

而不是試圖用bany外呼,把測試裏面:

if any(b.powered and b is not self and b.rect.collidepoint(self.rect.left,self.rect.top-5) for b in blocks): 

或因爲這是一個相當龐大的線,分成外在的循環,而不是一個any調用此。當你在它,你可以在列表中的4個any電話合併爲一個通:

for b in blocks: 
    if not b.powered: 
     continue 
    if b is self: 
     # You don't actually need this test. 
     continue 

    adjacent = False 
    if b.rect.collidepoint(self.rect.left,self.rect.top-5): 
     adjacent = True 
    if b.rect.collidepoint(...): 
     adjacent = True 
    # and the other two adjacency checks 
    ... 
    if adjacent: 
     self.powered = True 
     break 

現在,其他的問題。您的開機邏輯僅檢查相鄰的塊。這意味着,如果一個模塊與電源分開並連接,則模塊可能需要很多更新才能實現其接收功率。另外,如果一個模塊與電源斷開或電源被切斷,模塊可能永遠不會關閉,因爲無論何時看起來,它的所有鄰居都會上電。這將需要改變你的算法。我建議使用電源的flood fill來確定哪些模塊已上電。

+0

從現在開始,這使得更多的東西變得更加完美!謝謝!太多人已經倒下了這個問題。 –

+0

@SamTubb:老實說,在編輯它之前,這是一個非常糟糕的問題。如果您將編輯中的信息包含在原始版本中,您將得到更好的迴應。 – user2357112

+0

好吧,在我繼續之前的最後一個問題,我不明白爲什麼你測試'如果不是b.rect.collidepoint(self.rect.left,self.rect.top-5):'什麼測試塊沒有超過它實際上做? –

相關問題