/*---------------------------------------------------------------------- File : hamster.c Contents: hamster control program Author : Bernd Eckardt History : - 03.03.1998 file created - 05.03.1998 Weglaengenberechnung ok - 12.03.1998 Wegberechnung rueck - 15.03.1998 Version 1.0 (Score: 1704) - 19.03.1998 Version 1.1 Erforschungsoptimierung (Score: 1744) - 11.04.1998 - 18.04.1998 Erweiterung: Gehe_hin2 - 10.05.1998 Erweiterung: maximale Schritte Version : 1.6 ----------------------------------------------------------------------*/ #include #include #include "hamster.h" /*---------------------------------------------------------------------- Functions ----------------------------------------------------------------------*/ int d ; int i; /*Variable gibt die aktuelle Position im Labyrinth bzw. Array an*/ int lab[16129]; /*Array speichert den Aufbau des Labyrinth*/ int weglaenge[16129];/*Array speichert Weglaenge jedes Punktes zum Ausgangspunkt*/ int open_ways[16129];/*Array speichert Zusatzinfos w„hrend der Erkundung des Labyrinth*/ int weglaengerueck[16129];/*Array speichert Weglaenge jedes Punktes zu einem beliebigen Punkt*/ int kornbelegung[16129];/*Array speichert Kornbelegung des Labyrinth*/ int laengster_hinweg;/*entferntester Punkt vom Ausgangspunkt*/ int laengster_rueckweg;/*entferntester Punkt von beliebigem Punkt*/ int schritte; /*Anzahl der Schritte bei Erkundung*/ int maxschritte=119; /*maximal erlaubte Anzahl von Schritten*/ void N(HAMSTER *hms){/*Unterprogramm bewegt den Hamster nach Norden*/ if (hms_dir(hms)==0)hms_turn(hms,1);/*falls erforderlich hier Korrektur der Blickrichtung*/ while (hms_dir(hms)!=1){ hms_turn(hms,-1); } if (hms_look(hms)!=2){/*falls keine Wand, wird Schritt ausgefuehrt*/ hms_move(hms); i=i-127; if(i==8064)hms_drop(hms,12);/*falls erreichtes Feld Ausgangsfeld ist Koerner ablegen*/ } } void O(HAMSTER *hms){/*wie Unterprogramm N*/ if (hms_dir(hms)==1)hms_turn(hms,-1); while (hms_dir(hms)!=0){ hms_turn(hms,1); } if (hms_look(hms)!=2){ hms_move(hms); i=i+1; if(i==8064)hms_drop(hms,12); } } void S(HAMSTER *hms){/*wie Unterprogramm N*/ if (hms_dir(hms)==2)hms_turn(hms,1); while (hms_dir(hms)!=3){ hms_turn(hms,-1); } if (hms_look(hms)!=2){ hms_move(hms); i=i+127; if(i==8064)hms_drop(hms,12); } } void W(HAMSTER *hms){/*wie Unterprogramm N*/ if (hms_dir(hms)==1)hms_turn(hms,1); while (hms_dir(hms)!=2){ hms_turn(hms,-1); } if (hms_look(hms)!=2){ hms_move(hms); i=i-1; if(i==8064)hms_drop(hms,12); } } void check_feld(int tz){/*Funktion bestimmt aus umliegenden bekannten Feldern das Uebergebene Feld */ if(lab[tz+1]!=0&&lab[tz+127]!=0&&lab[tz-1]!=0&&lab[tz-127]!=0&&tz>126&&tz<16002){ if(lab[tz+1]>3&&lab[tz+1]<8)lab[tz]=lab[tz]+2; if(lab[tz+1]>11)lab[tz]=lab[tz]+2; if(lab[tz+127]%2==1)lab[tz]=lab[tz]+8; if(lab[tz-1]==2||lab[tz-1]==3||lab[tz-1]==6||lab[tz-1]==7||lab[tz-1]==10||lab[tz-1]==11||lab[tz-1]==14||lab[tz-1]==15)lab[tz]=lab[tz]+4; if(lab[tz-127]>7)lab[tz]=lab[tz]+1; open_ways[tz]=5; } } void erforschen(HAMSTER *hms){ /*Je nach Blickrichtung und Gesehenem*/ int turn=0; /*erfolgt Feldkodierung im Lab-Array */ lab[i]=0; kornbelegung[i]=hms_corn(hms); /*Speicherung der Kornbelegung in extra Array*/ if(open_ways[i]==1)open_ways[i]=5; /*wenn Feld als gesehen markiert war, wird diese Markierung zurueck gesetzt*/ do{ if(hms_dir(hms)==0){ /*wenn Blickrichtung Osten*/ if (hms_look(hms)!=2){ /*wenn keine Wand im Osten*/ lab[i]=lab[i]+2; /*wird lab-Variable um 2 erhoeht(Norden=1,Sueden=8,Westen=4)*/ if(lab[i+1]==0){ /*wenn das zusehende Feld noch nicht erforscht ist*/ open_ways[i+1]=1; /*wird Feld als gesehen markiert*/ if(hms_look(hms)==1){ /*wenn das zusehende Feld mit Korn belegt ist*/ kornbelegung[i+1]=1; /*wird Kornbelegung auf 1 gesetzt*/ } } } } if(hms_dir(hms)==1){ /*Blickrichtung Norden,wie Osten nur mit Erhoehung um 1*/ if (hms_look(hms)!=2){ lab[i]=lab[i]+1; if(lab[i-127]==0){ open_ways[i-127]=1; if(hms_look(hms)==1){ kornbelegung[i-127]=1; } } } } if(hms_dir(hms)==2){ /*Blickrichtung Westen,wie Osten nur mit Erhoehung um 4*/ if (hms_look(hms)!=2){ lab[i]=lab[i]+4; if(lab[i-1]==0){ open_ways[i-1]=1; if(hms_look(hms)==1){ kornbelegung[i-1]=1; } } } } if(hms_dir(hms)==3){ /*Blickrichtung Sueden,wie Osten nur mit Erhoehung um 8*/ if (hms_look(hms)!=2){ lab[i]=lab[i]+8; if(lab[i+127]==0){ open_ways[i+127]=1; if(hms_look(hms)==1){ kornbelegung[i+127]=1; } } } } hms_turn(hms,1); /*Žndern der Blickrichtung*/ turn++; } while(turn!=4); /*Ende nach dreimaligem Drehen*/ } /*====== W E G L A E N G E N B E R E C H N U N G Anfang ========*/ void weglaenge_berechnen(int wl, int *weg_array ) { /*Unterprogramm berechnet vom uebergebenen Punkt zu allen */ int k,x,y; /*Punkten des Labyrinth die Weglaenge */ for (x=0;x!=16128;++x){ /*Array wird zurueck gesetzt*/ weg_array[x]=0; } y=1; weg_array[wl]=y; /*Weglaenge des uebergebenen Punktes wird 1 gesetzt*/ k=0; while(k==0){ /*Laufvariable wird 0 wenn alle moeglichen Wege berechnet wurden*/ k=1; for(x=0;x!=16128;x++){ /*Schleife durchsucht Array, bei finden eines Wertes der gleich der aktuellen Schrittweite y ist,*/ if(weg_array[x]==y){ /*werden alle noch nicht berechneten Nachbarfelder mit y+1 gesetzt*/ k=0; switch(lab[x]){ /*Auswahl je nach Eintrag im abgespeicherten Labyrinth*/ case 1: /* Wegl„nge bei N-Teil*/ if(weg_array[x-127]==0){ weg_array[x-127]=y+1; } break; case 2: /* Wegl„nge bei O-Teil*/ if(weg_array[x+1]==0){ weg_array[x+1]=y+1; } break; case 4: /* Wegl„nge bei W-Teil*/ if(weg_array[x-1]==0){ weg_array[x-1]=y+1; } break; case 8: /* Wegl„nge bei S-Teil*/ if(weg_array[x+127]==0){ weg_array[x+127]=y+1; } break; case 3: /* Wegl„nge bei NO-Teil*/ if(weg_array[x-127]==0){ weg_array[x-127]=y+1; } if(weg_array[x+1]==0){ weg_array[x+1]=y+1; } break; case 5: /* Wegl„nge bei NW-Teil*/ if(weg_array[x-127]==0){ weg_array[x-127]=y+1; } if(weg_array[x-1]==0){ weg_array[x-1]=y+1; } break; case 12: /* Wegl„nge bei SW-Teil*/ if(weg_array[x+127]==0){ weg_array[x+127]=y+1; } if(weg_array[x-1]==0){ weg_array[x-1]=y+1; } break; case 10: /* Wegl„nge bei SO-Teil*/ if(weg_array[x+127]==0){ weg_array[x+127]=y+1; } if(weg_array[x+1]==0){ weg_array[x+1]=y+1; } break; case 9: /* Wegl„nge bei SN-Teil*/ if(weg_array[x+127]==0){ weg_array[x+127]=y+1; } if(weg_array[x-127]==0){ weg_array[x-127]=y+1; } break; case 6: /* Wegl„nge bei WO-Teil*/ if(weg_array[x-1]==0){ weg_array[x-1]=y+1; } if(weg_array[x+1]==0){ weg_array[x+1]=y+1; } break; case 7: /* Wegl„nge bei WNO-Teil*/ if(weg_array[x-1]==0){ weg_array[x-1]=y+1; } if(weg_array[x+1]==0){ weg_array[x+1]=y+1; } if(weg_array[x-127]==0){ weg_array[x-127]=y+1; } break; case 14: /* Wegl„nge bei WSO-Teil*/ if(weg_array[x-1]==0){ weg_array[x-1]=y+1; } if(weg_array[x+1]==0){ weg_array[x+1]=y+1; } if(weg_array[x+127]==0){ weg_array[x+127]=y+1; } break; case 13: /* Wegl„nge bei SWN-Teil*/ if(weg_array[x-1]==0){ weg_array[x-1]=y+1; } if(weg_array[x+127]==0){ weg_array[x+127]=y+1; } if(weg_array[x-127]==0){ weg_array[x-127]=y+1; } break; case 11: /* Wegl„nge bei SON-Teil*/ if(weg_array[x+1]==0){ weg_array[x+1]=y+1; } if(weg_array[x+127]==0){ weg_array[x+127]=y+1; } if(weg_array[x-127]==0){ weg_array[x-127]=y+1; } break; case 15: /* Wegl„nge bei SWNO-Teil*/ if(weg_array[x+1]==0){ weg_array[x+1]=y+1; } if(weg_array[x-1]==0){ weg_array[x-1]=y+1; } if(weg_array[x+127]==0){ weg_array[x+127]=y+1; } if(weg_array[x-127]==0){ weg_array[x-127]=y+1; } break; } } } y++; /*Schrittweite wird erhoeht*/ } } /*====== W E G L A E N G E N B E R E C H N U N G Ende ========*/ void labi(HAMSTER *hms){ /*Unterprogramm uebernimmt Organisation bei der Labyrintherforschung*/ if(schritte==maxschritte){ /*Ist maximale Schrittweite erreicht, wird eine Weglaengenberechnung*/ weglaenge_berechnen(8064,weglaenge); /*durchgefuehrt und Schrittweite eventuell korrigiert*/ schritte=weglaenge[i]; if(weglaenge[i]==maxschritte){ erforschen(hms); /*open_ways[i]=5;*/ return; } } if(kornbelegung[i]!=0&&i!=8064){ /*wenn auf Punkt Koerner liegen nimm sie*/ hms_take(hms,12); kornbelegung[i]=hms_corn(hms); } if(lab[i]==15||lab[i]==7||lab[i]==11||lab[i]==13||lab[i]==14){ /*wenn an Kreuzungspunkt: bisher gesammelte Koerner ablegen*/ hms_drop(hms,12); kornbelegung[i]=hms_corn(hms); } switch(lab[i]) /*je nach abgespeichertem Labyrinth*/ { case 0: /*wenn Feld noch nicht erforscht */ erforschen(hms); /*erforsche Feld*/ weglaenge[i]=schritte; /*Weglaenge bis dahin ergibt sich aus Schritte*/ schritte++; /*Schritte erh÷hen*/ if(lab[i]!=0)labi(hms); /*wenn Feld Ausgang besitzt:*/ break; /*wieder sich selbst aufrufen und Feld behandeln*/ case 1: /*wenn Feld nur Ausgang nach Norden */ if(lab[i-127]==0){ /*wenn Feld im Norden noch nicht erforscht(nur bei Ausgangsfeld!)*/ N(hms); /*gehe nach Norden*/ labi(hms); /*wieder sich selbst aufrufen und Feld behandeln*/ } break; case 2: /*wenn Feld nur Ausgang nach Osten */ if(lab[i+1]==0){ /*wie Norden*/ O(hms); labi(hms); } break; case 4: /*wenn Feld nur Ausgang nach Westen */ if(lab[i-1]==0){ /*wie Norden*/ W(hms); labi(hms); } break; case 8: /*wenn Feld nur Ausgang nach Sden */ if(lab[i+127]==0){ /*wie Norden*/ S(hms); labi(hms); } break; case 3: /*wenn Feld nur Ausgang nach NO */ open_ways[i]=2; /*wenn Feld Ausgangsfeld merken das noch zweite M÷glichkeit zur Erforschung besteht*/ if (lab[i-127]==0){ /*wenn Feld im Norden noch nicht erforscht*/ check_feld(i-127); /*teste ob Berechnung des Feldes m÷glich*/ if(open_ways[i-127]==1){ /*wenn nicht gehe nach Norden*/ N(hms); labi(hms); } break; } if (lab[i+1]==0){ /*wenn Feld im Osten noch nicht erforscht*/ check_feld(i+1); /*teste ob Berechnung des Feldes m÷glich*/ if(open_ways[i+1]==1){; /*wenn nicht gehe nach Osten*/ O(hms); labi(hms); } } break; case 10: /*wenn Feld nur Ausgang nach OS */ open_ways[i]=2; /*wie bei NO*/ if (lab[i+127]==0){ check_feld(i+127); if(open_ways[i+127]==1){ S(hms); labi(hms); } break; } if (lab[i+1]==0){ check_feld(i+1); if(open_ways[i+1]==1){ O(hms); labi(hms); } } break; case 12: /*wenn Feld nur Ausgang nach SW */ open_ways[i]=2; /*wie bei NO*/ if (lab[i+127]==0){ check_feld(i+127); if(open_ways[i+127]==1){ S(hms); labi(hms); } break; } if (lab[i-1]==0){ check_feld(i-1); if(open_ways[i-1]==1){ W(hms); labi(hms); } } break; case 5: /*wenn Feld nur Ausgang nach WN */ open_ways[i]=2; /*wie bei NO*/ if (lab[i-127]==0){ check_feld(i-127); if(open_ways[i-127]==1){ N(hms); labi(hms); } break; } if (lab[i-1]==0){ check_feld(i-1); if(open_ways[i-1]==1){ W(hms); labi(hms); } } break; case 9: /*wenn Feld nur Ausgang nach SN */ open_ways[i]=2; /*wie bei NO*/ if (lab[i-127]==0){ check_feld(i-127); if(open_ways[i-127]==1){ N(hms); labi(hms); } break; } if (lab[i+127]==0){ check_feld(i+127); if(open_ways[i+127]==1){ S(hms); labi(hms); } } break; case 6: /*wenn Feld nur Ausgang nach WO */ open_ways[i]=2; /*wie bei NO*/ if (lab[i-1]==0){ check_feld(i-1); if(open_ways[i-1]==1){ W(hms); labi(hms);break; } } if (lab[i+1]==0){ check_feld(i+1); if(open_ways[i+1]==1){ O(hms); labi(hms); } } break; case 11: /*wenn Feld nur Ausgang nach NOS */ open_ways[i]=2; /*wie bei NO*/ if(lab[i-127]==0){ check_feld(i-127); if(open_ways[i-127]==1){ N(hms); labi(hms); } break; } if(lab[i+1]==0){ check_feld(i+1); if(open_ways[i+1]==1){ O(hms); labi(hms); } break; } if(lab[i+127]==0){ check_feld(i+127); if(open_ways[i+127]==1){ S(hms); labi(hms); } break; } break; case 14: /*wenn Feld nur Ausgang nach OSW */ open_ways[i]=2; /*wie bei NO*/ if(lab[i+1]==0){ check_feld(i+1); if(open_ways[i+1]==1){ O(hms); labi(hms); } break; } if(lab[i+127]==0){ check_feld(i+127); if(open_ways[i+127]==1){ S(hms); labi(hms); } break; } if(lab[i-1]==0){ check_feld(i-1); if(open_ways[i-1]==1){ W(hms); labi(hms); } break; } break; case 13: /*wenn Feld nur Ausgang nach SWN */ open_ways[i]=2; /*wie bei NO*/ if(lab[i+127]==0){ check_feld(i+127); S(hms); labi(hms); break; } if(lab[i-1]==0){ check_feld(i-1); if(open_ways[i-1]==1){ W(hms); labi(hms); } break; } if(lab[i-127]==0){ check_feld(i-127); if(open_ways[i-127]==1){ N(hms); labi(hms); } break; } break; case 7: /*wenn Feld nur Ausgang nach WNO */ open_ways[i]=2; /*wie bei NO*/ if(lab[i-1]==0){ check_feld(i-1); if(open_ways[i-1]==1){ W(hms); labi(hms); } break; } if(lab[i-127]==0){ check_feld(i-127); if(open_ways[i-127]==1){ N(hms); labi(hms); } break; } if(lab[i+1]==0){ check_feld(i+1); if(open_ways[i+1]==1){ O(hms); labi(hms); } break; } break; case 15: /*wenn Feld nur Ausgang nach NOSW */ open_ways[i]=2; /*wie bei NO*/ if(lab[i-127]==0){ check_feld(i-127); if(open_ways[i-127]==1){ N(hms); labi(hms); } break; } if(lab[i+1]==0){ check_feld(i+1); if(open_ways[i+1]==1){ O(hms); labi(hms); } break; } if(lab[i+127]==0){ check_feld(i+127); if(open_ways[i+127]==1){ S(hms); labi(hms); } break; } if(lab[i-1]==0){ check_feld(i-1); if(open_ways[i-1]==1){ W(hms); labi(hms); } break; } break; } } void gehe_hin(HAMSTER *hms){ /*Unterprogramm bewegt denn Hamster mittels lab-Array und */ while(weglaengerueck[i]!=1){ /*der Weglaenge zu einem bestimmten Punkt genau zu diesem*/ if(weglaengerueck[i]-weglaengerueck[i-127]==1&&lab[i]%2==1){ /*in dem immer zu dem Nachbarfeld gegangen */ N(hms); /*wird, welches eine geringere Weglaenge besitzt*/ } if(weglaengerueck[i]-weglaengerueck[i+127]==1&&lab[i]>7){ S(hms); } if(lab[i]==4||lab[i]==5||lab[i]==6||lab[i]==7||lab[i]==12||lab[i]==13||lab[i]==14||lab[i]==15){ if(weglaengerueck[i]-weglaengerueck[i-1]==1){ W(hms); } } if(lab[i]==2||lab[i]==3||lab[i]==6||lab[i]==7||lab[i]==10||lab[i]==11||lab[i]==14||lab[i]==15){ if(weglaengerueck[i]-weglaengerueck[i+1]==1){ O(hms); } } if(lab[i]==0)erforschen(hms); /*falls ein Feld noch nicht erforscht ist, dies nachholen*/ } } void gehe_zurueck(HAMSTER *hms){ /*wie gehe hin, jedoch immer zum Ausgangsfeld*/ while(weglaenge[i]!=1){ if(weglaenge[i]-weglaenge[i-127]==1&&lab[i]%2==1){ N(hms); } if(weglaenge[i]-weglaenge[i+127]==1&&lab[i]>7){ S(hms); } if(lab[i]==4||lab[i]==5||lab[i]==6||lab[i]==7||lab[i]==12||lab[i]==13||lab[i]==14||lab[i]==15){ if(weglaenge[i]-weglaenge[i-1]==1){ W(hms); } } if(lab[i]==2||lab[i]==3||lab[i]==6||lab[i]==7||lab[i]==10||lab[i]==11||lab[i]==14||lab[i]==15){ if(weglaenge[i]-weglaenge[i+1]==1){ O(hms); } } if(lab[i]==0)erforschen(hms); } } void gehe_hin2(HAMSTER *hms){ /*wie gehe hin, jedoch werden hier*/ while(weglaengerueck[i]!=1){ if(kornbelegung[i]!=0&&i!=8064){ /*Koerner mit eingesammelt*/ hms_take(hms,12); kornbelegung[i]=hms_corn(hms); } if(lab[i]==15){ /*und an Kreuzungen abgelegt*/ hms_drop(hms,12); kornbelegung[i]=hms_corn(hms); } if(weglaengerueck[i]-weglaengerueck[i-127]==1&&lab[i]%2==1){ N(hms); } if(kornbelegung[i]!=0&&i!=8064){ hms_take(hms,12); kornbelegung[i]=hms_corn(hms); } if(lab[i]==15){ hms_drop(hms,12); kornbelegung[i]=hms_corn(hms); } if(weglaengerueck[i]-weglaengerueck[i+127]==1&&lab[i]>7){ S(hms); } if(kornbelegung[i]!=0&&i!=8064){ hms_take(hms,12); kornbelegung[i]=hms_corn(hms); } if(lab[i]==15){ hms_drop(hms,12); kornbelegung[i]=hms_corn(hms); } if(lab[i]==4||lab[i]==5||lab[i]==6||lab[i]==7||lab[i]==12||lab[i]==13||lab[i]==14||lab[i]==15){ if(weglaengerueck[i]-weglaengerueck[i-1]==1){ W(hms); } } if(kornbelegung[i]!=0&&i!=8064){ hms_take(hms,12); kornbelegung[i]=hms_corn(hms); } if(lab[i]==15){ hms_drop(hms,12); kornbelegung[i]=hms_corn(hms); } if(lab[i]==2||lab[i]==3||lab[i]==6||lab[i]==7||lab[i]==10||lab[i]==11||lab[i]==14||lab[i]==15){ if(weglaengerueck[i]-weglaengerueck[i+1]==1){ O(hms); } } if(lab[i]==0)erforschen(hms); } if(lab[i]==15||lab[i]==7||lab[i]==11||lab[i]==13||lab[i]==14){ hms_drop(hms,12); kornbelegung[i]=hms_corn(hms); } } void hms_ctrl (HAMSTER *hms){ int y,t,tz,c=2; for (i=0;i!=16128;++i) /* Initialisierung des Arrays fr Zusatzinfos*/ { open_ways[i]=5; } i=8064; /* Initialisierung der Hamster-Ausgangsposition im Labyrinth-Array*/ weglaenge[i]=1; do{ schritte=weglaenge[i]; labi(hms); /*erforsche laut Unterprogramm*/ if(hms_load(hms)==12){ /*wenn danach 12 Koerner gesammelt gehe zum Ausgangspunkt*/ weglaenge_berechnen(8064,weglaenge); gehe_zurueck(hms); } if(c==2){ /*solange c=2 ist Labyrinth noch nicht folstaendig erforscht*/ weglaenge_berechnen(i,weglaengerueck); laengster_hinweg=0; for (t=0;t!=16128;t++){ if(weglaengerueck[t]>laengster_hinweg){ laengster_hinweg=weglaengerueck[t]; /*Entferntester Punkt relativ zum Standort wird ermittelt*/ y=t; } } c=0; for (tz=0;tz!=16128;tz++){ /*Schleife berechnet einzelne Felder um die bereits alles erforscht ist */ if(open_ways[tz]==1){ check_feld(tz); } } for (tz=0;tz!=16128;tz++){ /*Schleife berechnet bzw. ermittelt Kreuzungspunkte deren Erforschung sich bereits eruebrigt hat */ if(open_ways[tz]==2&&weglaenge[tz]<=maxschritte){ if(lab[tz]==15&&lab[tz+1]!=0&&lab[tz+127]!=0&&lab[tz-1]!=0&&lab[tz-127]!=0){ open_ways[tz]=5; } if(lab[tz]==14&&lab[tz+1]!=0&&lab[tz+127]!=0&&lab[tz-1]!=0){ open_ways[tz]=5; } if(lab[tz]==13&&lab[tz+127]!=0&&lab[tz-1]!=0&&lab[tz-127]!=0){ open_ways[tz]=5; } if(lab[tz]==11&&lab[tz+1]!=0&&lab[tz+127]!=0&&lab[tz-127]!=0){ open_ways[tz]=5; } if(lab[tz]==7&&lab[tz+1]!=0&&lab[tz-1]!=0&&lab[tz-127]!=0){ open_ways[tz]=5; } if(lab[tz]==3&&lab[tz+1]!=0&&lab[tz-127]!=0){ open_ways[tz]=5; } if(lab[tz]==5&&lab[tz-1]!=0&&lab[tz-127]!=0){ open_ways[tz]=5; } if(lab[tz]==6&&lab[tz+1]!=0&&lab[tz-1]!=0){ open_ways[tz]=5; } if(lab[tz]==9&&lab[tz+127]!=0&&lab[tz-127]!=0){ open_ways[tz]=5; } if(lab[tz]==10&&lab[tz+127]!=0&&lab[tz+1]!=0){ open_ways[tz]=5; } if(lab[tz]==12&&lab[tz-1]!=0&&lab[tz+127]!=0){ open_ways[tz]=5; } if(open_ways[tz]==2){ /*der naechste Punkt der noch zu erforschen ist bleibt uebrig*/ if(weglaengerueck[tz]=laengster_rueckweg){ laengster_rueckweg=weglaengerueck[tz]; y=tz; } } for(tz=0;tz!=16128;tz++){ if(kornbelegung[tz]!=0){ /*Schleife findet naechsten Punkt zum aktuellen Punkt der mit Koernern belegt ist*/ if(weglaengerueck[tz]<=weglaengerueck[y]&&lab[tz]!=0)y=tz; c=1; } } if (c==1){ weglaenge_berechnen(y,weglaengerueck); /*berechnet Weg zum anvisierten Punkt*/ gehe_hin(hms); hms_take(hms,12); kornbelegung[i]=hms_corn(hms); } else c=1; if(hms_load(hms)==12){ c=1; } } gehe_zurueck(hms); laengster_hinweg=0; for (t=0;t!=16128;t++){ /*Schleife findet entferntesten Punkt zum Ausgangspunkt */ if(weglaenge[t]>laengster_hinweg&&weglaenge[t]<=maxschritte)laengster_hinweg=weglaenge[t]; } while(laengster_hinweg!=1){/*Schleife sammelt alle Koerner beginnend mit den am weitesten entfernten */ for(t=0;t!=16128;t++){ if(weglaenge[t]==laengster_hinweg&&kornbelegung[t]!=0&&lab[t]!=0){ /*Wenn Feld belegt und erforscht*/ weglaenge_berechnen(t,weglaengerueck); /*Weg berechnen*/ while(kornbelegung[t]!=0){ /*solange hingehen bis Feld leer*/ gehe_hin(hms); hms_take(hms,12); kornbelegung[t]=hms_corn(hms); if(hms_load(hms)==12){ /*wenn Hamster voll, gehe zum Ausgangspunkt*/ gehe_zurueck(hms); } else{ /*sonst suche in Umgebung */ c=0; while(c==0){/*Schleife sammelt Koerner in aktueller Umgebung bis Hamster voll*/ laengster_rueckweg=2; for (tz=0;tz!=16128;tz++){ if(weglaengerueck[tz]>=laengster_rueckweg){ laengster_rueckweg=weglaengerueck[tz]; y=tz; } } for(tz=0;tz!=16128;tz++){ if(kornbelegung[tz]!=0&&lab[tz]!=0){ if(weglaengerueck[tz]<=weglaengerueck[y])y=tz; c=1; } } if (c==1){ weglaenge_berechnen(y,weglaengerueck); gehe_hin(hms); hms_take(hms,12); kornbelegung[i]=hms_corn(hms); } else c=1; if(hms_load(hms)==12){ c=1; } } gehe_zurueck(hms); } } gehe_zurueck(hms); } } laengster_hinweg--; /*verkleinert Suchkreis nach Koernern*/ } gehe_zurueck(hms); hms_drop(hms,12); }