2011-01-11 11 views
0

Ich habe ein Problem, meine Star-Implementierung zu bekommen. Kannst du den Weg weisen? Vielen Dank.Problem mit Sterncode

#!/usr/bin/env python 

import sys, re, math 

grid = [] 
g = [] 
h = [] 

width = int(sys.argv[1]) 
height = int(sys.argv[2]) 

open = [] 
close = [] 

startpos = (0,0) #(height,width) 
endpos = (6,5) #(height,width) 

#Functions 

def findlowestcostinopen(): 
lowest = 9999 
lowestpair = [] 
for q in open: 
    sum = int(g[q[0]][q[1]])+int(h[q[0]][q[1]]) 
    #print sum,lowest 
    if sum<lowest: 
    lowestpair = q 
    lowest=sum 

return lowestpair 
# Init 

for q in range(height): 
temp = [] 
for w in range(width): 
    temp.append((0,0)) 
grid.append(temp) 

for q in range(height): 
temp = [] 
for w in range(width): 
    temp.append(0) 
g.append(temp) 

for q in range(height): 
temp = [] 
for w in range(width):  
    temp.append(0) 
h.append(temp) 



for q in range(height): 
for w in range(width): 
    h[q][w]=abs(endpos[0]-q)*10 + abs(endpos[1]-w)*10 

open.append(startpos) 
switch = True 
while switch and open: 
#Find the smallest cost 
lowestcost = findlowestcostinopen() 
print lowestcost,endpos 
if lowestcost == endpos: 
    switch = False 
    print 'found',lowestcost 


parentgcost=int(g[lowestcost[0]][lowestcost[1]])  
#print parentgcost 
#Check every directly connected node  
for q in range(-1,2):  
    for w in range(-1,2):  
    currentnode = ((lowestcost[0]+q),(lowestcost[1]+w)) 
    if q==0 and w==0: 
    '''''' 
    elif(currentnode[0]<0 or currentnode[0]>(height-1)): 
    '''Vertical out''' 
    elif(currentnode[1]<0 or currentnode[1]>(width-1)): 
    '''Horizontal out''' 
    elif(grid[currentnode[0]][currentnode[1]]=='wall'): 
    '''WALL''' 
    elif open.count((currentnode[0],currentnode[1]))>0: 

    '''''' 
    currentg = g[currentnode[0]][currentnode[1]]  

    if (q==0 and w==1) or (q==0 and w==-1) or (q==1 and w==0) or (q==-1 and w==0): 
    newsum = parentgcost+10 
    else: newsum = parentgcost+14 

    if newsum<currentg: 
    g[currentnode[0]][currentnode[1]]=newsum 

    grid[currentnode[0]][currentnode[1]]=lowestcost 

    elif close.count((currentnode[0],currentnode[1]))>0: 
    '''EXISTS IN CLOSE''' 
    else: 
    #Time to calculate g values 
    if q==0: 
    if w==-1 or w==1: 
     nodecost = parentgcost+10 
    elif q==1: 
    if w==0: 
     nodecost = parentgcost+10 
    else: 
     nodecost = parentgcost+14 
    elif q==-1: 
    if w==0: 
     nodecost = parentgcost+10 
    else: 
     nodecost = parentgcost+14 
    g[(currentnode[0])][(currentnode[1])]=nodecost 
    grid[(currentnode[0])][(currentnode[1])]=lowestcost 
    #print nodecost 

    open.append(currentnode) 
+0

Können Sie mir bitte, formatieren Sie bitte, dass Code richtig? Sonst wirst du keine Antwort bekommen. – hyperboreean

+0

Wie in "wählen Sie den Code-Text und klicken Sie auf die' {} 'Taste" – TryPyPy

+0

Sind Ihre IFS alle verschachtelt rechts? Sieht schrecklich aus. Niemand wird dir hier helfen, wenn du uns nicht helfen kannst. Auch (als Zeichen der Hilfe) ist das pythonische Paradigma für eine leere Anweisung nach einer 'if' oder 'else' Bedingung, die no-op 'pass' Anweisung zu verwenden, keine leere Zeichenfolge mit sechs Anführungszeichen! – Spacedman

Antwort

4

Einige Probleme:

  1. Sie tun dies für Kommentare:

    '''some text''' 
    

    Das ist in der Tat nicht ein Kommentar, sondern eine Zeichenfolge. Sie weisen es einfach nichts zu. stattdessen se ein Kommentar:

    # some text 
    
  2. Dieser Code ist sehr schwer zu lesen:

     if q==0: 
         if w==-1 or w==1: 
          nodecost = parentgcost+10 
         elif q==1: 
         if w==0: 
          nodecost = parentgcost+10 
         else: 
          nodecost = parentgcost+14 
         elif q==-1: 
         if w==0: 
          nodecost = parentgcost+10 
         else: 
          nodecost = parentgcost+14 
    

    Ändern Sie es an:

     if q==0 and (w==-1 or w==1): 
          nodecost = parentgcost+10 
         elif q==1 and w==0: 
          nodecost = parentgcost+10 
         elif q==1: 
          nodecost = parentgcost+14 
         elif q==-1 and w==0: 
          nodecost = parentgcost+10 
         elif q==-1: 
          nodecost = parentgcost+14 
    

    und beachten Sie, wie vier Leerzeichen einrücken werden verwendet, um nicht nur einer.

  3. Die Klammer hier nicht benötigt werden:

     g[(currentnode[0])][(currentnode[1])]=nodecost 
    

    Änderung

     g[currentnode[0]][currentnode[1]]=nodecost 
    
  4. Sie sind zu gern Indizierung. Es macht es auch schwer zu lesen.

     g[(currentnode[0])][(currentnode[1])]=nodecost 
    

    wäre besser als

     height, width = currentnode 
         g[height][width] = nodecost 
    

Nichts davon wird Ihr Problem zu beheben, da Sie nicht sagen, was das war oder auch, was der Code tun soll.