2016-04-20 8 views
0

Ich weiß, gibt es eine Reihe von anderen Beiträge zu diesem Thema, aber ich nehme einen etwas anderen Ansatz.Eine effiziente merge-Funktion für das Spiel 2048 in Python

def merge(line): 
    """ 
    Function that merges a single row or column in 2048. 
    """ 
    #remove all non zeros 
    no_zeros = [ num for num in line if num != 0 ] 

    #make a pair of all adjacent numbers 
    pairs = zip(no_zeros[:-1] , no_zeros[1:]) 
    #create a boolean value for each pair depending whether elements are equal 
    is_pair = map(lambda (x,y): x == y , pairs) 

    merged = [] 
    count = 0 
    last = False #if elements in the last pair are euqal this is true 
    #merging algo 
    for i,pair in enumerate(is_pair): 
     if last == False and pair == True : 
      merged.append(pairs[i][0]*2) 
      last = True #As this is a valid pair the next pair will not need to be 
         #checked as the first number is the last number from this pair 
     # The following two statements allows the pair to be checked it's 
     # numbers have not been checked in any previous pair 
     if last == True: 
      count += 1 
     if count == 2: 
      last = False 
      count = 0 

    return merged 

print merge([2, 0, 2, 4, 0]) 
print 'should return [4, 4, 0, 0]' 
print '-------------------------------' 
print merge([0, 0, 2, 2]) 
print 'should return [4, 0, 0, 0]' 
print '-------------------------------' 
print merge([2, 2, 0, 0]) 
print 'should return [4, 0, 0, 0]' 
print 'to merge [2, 2, 2, 2, 2]' 
print '-------------------------------' 
print merge([2, 2, 2, 2, 2]) 
print 'should return [4, 4, 2, 0, 0]' 
print '-------------------------------' 
print merge([8, 16, 16, 8]) 
print 'should return [8, 32, 8, 0]' 

Bis jetzt fasst mein Code alle Paare zusammen. Wenn eine Zahl jedoch kein Paar hat, muss dies auch in die "Zusammengeführte Liste" geändert werden. Ich kann nicht für das Leben von mir herausfinden, wie man das in einer vereinfachten Weise tut, andere, die jeder Zahl einen einzigartigen Stempel geben, dann, wenn dieser Stempel nicht vereinigt worden ist, wird es zu "vereinigt" hinzugefügt. Ich habe versucht, dies zu implementieren, und es wurde sehr verworren.

Jede Hilfe wäre

Irgendwelche Vorschläge wäre willkommen

EDIT

ich mein Problem mit 2 zusätzlichen Erklärungen gelöst haben:

# This allows 'un-paired' numbers to be added to 'merged' 
if not last and not pair: 
    merged.append(pairs[i][0]) 
# The above doesn't take into account the last digit, if 'pairs' has len=1 which is solved by: 
if i == len(is_pair)-1 and i>1 and (last or not pair) : 
    merged.append(pairs[i][1]) 
+1

Beachten Sie, dass Aussagen wie 'letzte == Falsch und Paar == true' von' nicht zuletzt und pair' ersetzt werden sollte, nur so, dass Sie nicht die Augen von anderen Programmierern verletzt :) – Julien

+0

Meine allgemeine Antwort auf Ihre Frage wäre: Wenn Ihr Ansatz zu kompliziert ist, ändern Sie vielleicht Ihren Ansatz. Es gibt (fast?) Immer einen Weg, um (jeden?) Ansatz zu arbeiten, aber es gibt nicht unbedingt eine elegante Lösung für jeden Ansatz. – Julien

Antwort

1

In Ihrem speziellen Fall scheint es mir, dass, wenn last und pairFalse sind, können Sie das erste Element des curre hinzufügen kein Paar. Dafür müssten Sie über pairs (anstatt is_pair) eine Schleife durchlaufen und dann überprüfen, ob das aktuelle Paar tatsächlich ein Paar ist. Etwas wie:

for pair in pairs: 
    if not last_is_pair: 
     is_pair = pair[0] == pair[1] 
     if is_pair: 
      merged.append(pair[0]*2) 
     else: 
      merged.append(pair[0]) 
     last_is_pair = is_pair 
Verwandte Themen