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])
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
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