Meisterung der Kaktus-Automatisierung: 2D-Blasensortierung

Der Kaktusanbau ist einzigartig, da das Sortieren nach Größe bessere Belohnungen bringen kann. Dieser Leitfaden erklärt, wie man Bubble Sort anwendet.

Kaktus-Regeln (warum Sortieren zählt)

  • Größen sind 0–9. Mit `measure()` lesen.
  • Norden/Osten >=, Süden/Westen <= bedeutet sortiert.
  • Unsortiert braun, sortiert grün.
  • Eine sortierte Ernte greift auf das Quadrat über. Du bekommst n**2, nicht n.

Die Strategie

Im Gegensatz zu anderen Pflanzen reicht das bloße Ernten von Kakteen nicht aus. Wir müssen sie messen und tauschen.

  • Messen: Vergleiche aktuelle Kaktusgröße mit Nachbarn.
  • Tauschen: Wenn der aktuelle größer ist, tausche sie.
  • Wiederholen: Wiederhole dies über das Raster.
Cactus Sorting Visualization

Schritt-für-Schritt Code-Analyse

Step 1 Intelligente Navigation

Vor dem Sortieren benötigen wir Hilfsfunktionen.

python
def back(x=0,y=0):
    while x!=get_pos_x() or y!=get_pos_y():
        if(get_pos_x()<x):
            move(East)
        else:
            move(West)
        if(get_pos_y()<y):
            move(North)
        else:
            move(South)

def reverse(dir):
    if(dir == West): return East
    if(dir == East): return West
    if(dir == North): return South
    if(dir == South): return North

Step 2 Kern-Sortierlogik

Das ist das Gehirn des Codes. Es prüft horizontal und vertikal.

python
# ... inside the loop
current=measure()
neighbor=measure(dir)
down=measure(South)
up=measure(North)

# Swap Horizontal (水平交换)
if(x!=size-1 and neighbor!=None and dir==East and current>neighbor):
    swap(East)
    sorted=False # Mark as not fully sorted yet

# Swap Vertical (垂直交换)
if(y!=0 and down != None and current<down):
    swap(South)
    vsorted=False

Vollständiger Quellcode

Python
python
def back(x=0,y=0):
    while x!=get_pos_x() or y!=get_pos_y():
        if(get_pos_x()<x):
            move(East)
        else:
            move(West)
        if(get_pos_y()<y):
            move(North)
        else:
            move(South)

def plantCactus():
    if get_ground_type()==Grounds.Grassland:
        till()
    plant(Entities.Cactus)  

def reverse(dir):
    if(dir == West): return East
    if(dir == East): return West
    if(dir == North): return South
    if(dir == South): return North

def cactusProject(size=3):
    while True:
        dir=East
        vdir=North
        sorted=False
        vsorted=False
        
        # 1. Planting Phase
        for i in range(size):
            for j in range(size):
                plantCactus()
                if(j!=size-1):
                    move(dir)
            if(i!=size-1):
                move(vdir)
            dir=reverse(dir)
        vdir=reverse(vdir)
        
        # 2. Sorting Phase
        while not sorted or not vsorted:
            sorted=True
            vsorted=True
            for i in range(size):
                for j in range(size):
                    x=get_pos_x()
                    y=get_pos_y()
                    current=measure()
                    neighbor=measure(dir)
                    down=measure(South)
                    up=measure(North)
                    
                    # Logic to swap East/West
                    if(x!=size-1 and neighbor!=None and dir==East and current>neighbor):
                        swap(East)
                        sorted=False
                    if(x!=0 and neighbor!=None and dir==West and current<neighbor):
                        swap(West)
                        sorted=False
                        
                    # Logic to swap North/South
                    if(y!=0 and down != None and current<down):
                        swap(South)
                        vsorted=False
                    if(y!=size-1 and up != None and current>up):
                        swap(North)
                        vsorted=False
                        
                    if(j!=size-1):
                        move(dir)
                if(i!=size-1):
                    move(vdir)
                dir=reverse(dir)
        
        # 3. Harvesting Phase (Once sorted)
        back()
        harvest()
        
clear()
# Change '6' to your grid size
cactusProject(6)

Optimierungstipps

  • Stellen Sie sicher, dass der Parameter `size` mit der tatsächlichen Landgröße übereinstimmt.
  • Dieser Algorithmus könnte auf großen Rastern langsam sein.