From 02708b44c9c8f49e5132d25fb018b15ab440fc46 Mon Sep 17 00:00:00 2001 From: n0x-io Date: Mon, 2 Dec 2019 15:17:57 +0100 Subject: [PATCH] Initial Commit for Version 1.0 --- Field.class | Bin 0 -> 362 bytes Field.ham | 11 ++ Field.java | 10 ++ FindGrain$Field.class | Bin 0 -> 502 bytes FindGrain$SearchGrain.class | Bin 0 -> 2966 bytes FindGrain.class | Bin 0 -> 1205 bytes FindGrain.ham | 22 ++++ FindGrain.java | 22 ++++ FindGrain.ter | 15 +++ Search.class | Bin 0 -> 4138 bytes Search.ham | 206 ++++++++++++++++++++++++++++++++++++ Search.java | 206 ++++++++++++++++++++++++++++++++++++ 12 files changed, 492 insertions(+) create mode 100644 Field.class create mode 100644 Field.ham create mode 100644 Field.java create mode 100644 FindGrain$Field.class create mode 100644 FindGrain$SearchGrain.class create mode 100644 FindGrain.class create mode 100644 FindGrain.ham create mode 100644 FindGrain.java create mode 100644 FindGrain.ter create mode 100644 Search.class create mode 100644 Search.ham create mode 100644 Search.java diff --git a/Field.class b/Field.class new file mode 100644 index 0000000000000000000000000000000000000000..42bc9e871f5f71d7e22db013be785a9cf4a7183a GIT binary patch literal 362 zcmXYsPfNo<5XIl*PuIrS)cPMi=&kL+UIoRAP$(2VC=7_yPP- z;>+q~X6Mb$@6CMwe0~AAz)^${J52=Gt;3$ezQTc^k(K#sUI=6)@T>BT(u=N4u@tEB z(3*UDN$JWKc6lubyQ5KWA_#8EsSzY&TbSF`JT=vWPID@qahd6SqAOe1|6;IwwhKXY zU#_am3~l`}a_sY&e$_EHaTsF*DnJX|Ix`t}^1HnW&Uit{vwUzh zD88hgcDaejWg#@CzQyVh9{&PK{{zxLS;Oleui?K_^3Y=J5D20ILYhRi7!xX|e`9Dn SC;`q+*h!qBM}uuv9y-5`sW)-} literal 0 HcmV?d00001 diff --git a/Field.ham b/Field.ham new file mode 100644 index 0000000..e93ac83 --- /dev/null +++ b/Field.ham @@ -0,0 +1,11 @@ +/*class*/// Dient zum Halten von Informationen über Spielfelder. +public class Field{ + public int column; + public int row; + public Field parent; + + public Field(int column, int row){ + this.row = row; + this.column = column; + } +} \ No newline at end of file diff --git a/Field.java b/Field.java new file mode 100644 index 0000000..0e942c6 --- /dev/null +++ b/Field.java @@ -0,0 +1,10 @@ +import de.hamster.debugger.model.Territorium;import de.hamster.debugger.model.Territory;import de.hamster.model.HamsterException;import de.hamster.model.HamsterInitialisierungsException;import de.hamster.model.HamsterNichtInitialisiertException;import de.hamster.model.KachelLeerException;import de.hamster.model.MauerDaException;import de.hamster.model.MaulLeerException;import de.hamster.model.MouthEmptyException;import de.hamster.model.WallInFrontException;import de.hamster.model.TileEmptyException;import de.hamster.debugger.model.Hamster;public class Field{ + public int column; + public int row; + public Field parent; + + public Field(int column, int row){ + this.row = row; + this.column = column; + } +} \ No newline at end of file diff --git a/FindGrain$Field.class b/FindGrain$Field.class new file mode 100644 index 0000000000000000000000000000000000000000..76b3189aa55758d66d67aa1c2f444f1b95bc1bf1 GIT binary patch literal 502 zcmYjN!A`H_yK;D zakdyVo1L9`JMX>S`TG9&1aN_74jJs{k;Q?^4ppd|XqY%+U@x>i+OG`RWG>^@IYVL4 zm%;QV;xf1-_(}#cxn^+M|8URij2MhwI28<~fegfO`7{>M10VZ@R0iRM`y(DnRsVv9 zGGNH`rSPW=wig5<>iIm51;OP%^;X(J-ue4*8BIiAD$U~NRc8zS%o(hqh?CnePD~uz z$fIDx#)%CRmW>=Ndf0}tmZVQ8YS-t%ta~?Jh)Keb+cYug?al~InoyQzr$bX(lxa#1 za2(}AH4TicwkQ^uJ@+~1KIfdfH~#$L z8h~~9EQCcE4r4KPg)xHNqV5UfDeM*LX_1~0X`cooj1YE-GAhGZm_u9!Q^S5aoRA?I zMkOpUI3R})ij)$oaXFrrAtS>fSvxF}U5Gvpwl*?QwH7pGcT?`*sxJK`W6qa(SCJ&G)nEya&9C$Fw6>*2crmxUyTp44xP}*l!&20w~*0 zZnqn`B=3}Uf^gtzse2rFkfF3`C6c3=JaZiy%iFfIu3?9U=a?e~&|{nCz_bxB)mTD} zm$;TaC0CoyrEhFMAq8I0d9eC^R^dTzj+s4{a9L5Ph~<)Zaxq|LbG?~tPQwWu4`Q{B zHR#gtyp9*}qK+kK)bNsylXzLjQZ(s!MWkjlDX6(m>F8LFb{(r^cm!QK9tD$KS#ay# zN5?5ac~yorcuhweT6LVp>pEIQ+JaskZ{STGZ;8pFMlK^cDx6oa@IPCVAZ|6K zElK+wZpWMX4=Uw}|UE;_TsCuk%YtTi?P8SF_e}7L%Xw zV$|2-J`km5jDzohN9k;`aWB>KTqKR`fO(WCYTB7*Ox zylHP@0Xq@z#zMZpi}@EQgHLLfl26LjnOUsP%+hjZ7MnA(QlVglBd?@Ai?*m&RY^B+ zPvhDetmXI+wddidC9o#CY!XWJ3VhM4@J~YJ6qrPilQxO6=#L1ETtRpehRis)e{xEj=B zRtfU_0y10PL;jV>Dv^8ro&F7VgbQ9om%po?QrSf`)zx3ctaFGI{MOYwzG~IZ34~7h zm5IB*%{z;rC_XCJB?dqL^x!K~&T$SSiSTA~N!UCRSjP<3VLy0NnX5Gj-hrwpw-HhrZy^xm$E}{i^;T08;(}y< z_V7OmT1xAt5`uySCw$&`j^(7Bru#A?+$1CA{A#8!XISJZJa7(IMDkA|a-F|L%K9>A zo8#R6)@xna9fk@zIWW{O<^E!f&;PJlymcmgKdeOux&N2Q)0wP^lrN(Buvxj?(`J zMsC4(3!&c;xW!uX$^XSm%3P*I`e#D>36=fJNQfHe*l-mKKgYaQ|8$oWcUZN9qKTEd z&$ClY?cAMdJ9VGvo?W2S&fS@|b56xQyI`rEyCZh3-!fE}?<2Vx*v#%MG1nfAm*_VV(LP|h50m+}fV@%#fKjYLDSt_yW#c z0s@H(5(n=53(dtiH*v3seV8s{3NsF7i^$@<6&I|i zSWzut&bn&_%ongwK;1#Z!9@p`1jcShI!f;fWGmHmf!u?huLSltBdyj3Nn4p`vKlu18Trs1ph zAP8tAEEqQ)ZoxLaZ#oPvG+Rp2A~M-ZWoKhmz8Y3_aM{5XfnuvSFdelVS$6w&2-IK7 z*V4rS9CUFN*Z6^3_gLtml14TH^g@FPwn zl5y0Jlo{y2vv{EToiLW9Q!Z8>M*5A4`iou=bn9MQb=iKEdVSvHZKz0l?5Xh*6)Hph z`0J+8)FkHlD)CycIFv5uQm+b(?{rS!fbCr)mO5xWX}?sRRA6e?$o`ttQ_~BKOa#ii zBK|*Af&6d{xI}?UIZW+Kq-u<(jX?cBLfm65Z`EQihJVA=vlD$PG#X{9F8!BTY{WlZwb@uBbuW~jMulqH@T z)Pg!c_W|Pl(0zz # + # ###### + # + # #### # + ## # # + # ## # + #### # + ## # # +## # # + ###### #* +0 +1 +0 diff --git a/Search.class b/Search.class new file mode 100644 index 0000000000000000000000000000000000000000..4771391558c576877426a5234c62eecb9ce8ec5e GIT binary patch literal 4138 zcma)8dvFwY9slg@-d*mpAwVFICxnu4xd1UOR(S-0w1G&HBB8u$mCfC9S#r5c_wK^O zKCDGbDYfE*mQ*N>mQ+hyP;#NIGU|*vcB+5*moqy0pQHac<2a)g8b9CNy-T3+adZ27 zexIN3WB0ue-?;(clXxeLRY--A#&8HL@rbN!S!IIAh7mwYHaQtaWH>CtkuZm&G8~iP z3o<+^!((AI;BgtA5V|jlfG1`6k_=A;aa`svhp-4Igy3meofOVzFw|9XFG$+uY;z3Q7)IW-`7reOQ6gRoHf&T@Vv zXXZ==3%d^)BSvd3Yb9GZ+qQAE+sb4~7wWSTDI=S+NmD-?%?3~8MiK`{tc;a4;|jw4 zU8&uLjj~@sV1t#ivKtjNMg9+0ns?LW4tl4cyxU5dy}6-&)81wDCwVfzI~_BUyA9it zy?3Z(2doTT?(Q=UJ2pUL6vC#7QUz+HnI;gORD6e#<#{O5TtuS$u#p^;_Pd)iLX z_=tBYTp>ZuK}|tfU)G2X_87yS(s>z2nK184Z?z4J%({nx$D&vi5zE=Ox1V#+HqBns zN(}U;b2crmyxp6l!>&g`yhKC9v@J(nn-@oBgMYn16-t>$vYrBM*zvH8I=#f$k*1o4 zS-Gc!Ct`vLGwbTAFCs9jPJ(+-L1{nXu(O@%T#6C*#dx&hzw%9MV=$=8VRxcKJBD5@WwI(o28$9_DdV;3IOaZ%1*k=u`BjgB#VTgP`q!K=7L`yCu~ zjN_7y*F^a}LKTzMA(8Q2d{4*gBI7dN(D5eLFv|b4OXxU=geZGU#}!d_RfcwaU&jw{ zO~-_6^J3Jb4A=2CYu80Z!Cc4bq>)OrKG1*2jIp%lPvg+V;27C71JwAR&DdqywnZW< zH^kazY&NHk83W0krZr%)dRVD!Tyu-(eZxjFD;I%5mgap1!=18*$f_D~26v&C)iX?5 zFGZ_mtYZwPN;yK*)$FG6OfrhJP00~1m}I#jDk)*}@?5B7hxn*#(&Gk!aG8s-<`BJnG}_-Dr`XqcT|e|=o;G-?nkF* zkeICSE)>l}=Tml>8y_}t3_I*gsHVXYr@MrnI0aj=%@g7Z1%1e4&XuBofWy!h{)) zqN%?2e{uK}5Z+O^=$r{G%1mo08iGDWtv*c|f^vlSx z!->vbyok@RczhBJFLpb*mV|Tfq`V}C4G8HsaeoktZXp;%K)H#9LG=9#9Us7V_dnqG zk&v$sj;uDNjk6@nN#an^!MEaibsS{GdF6j57jBAtDB~TBGFb@*8B%MqV ziVU*I;V4G%D30JsJci?V98cp32hb>G)bmBPo8W1baETL=?HVs{g3WuYw#YX2mo+s^ipm9JtKM*Nb|5*XXmcCSbEwye`?N71lK zts*LS2^vd(ffB8KeCjXGW}P-Z^~Y7yN!G-21wHW5jxe5~_ovvbo@Em|jiq=Fjd-4A ze5RN%R95t=4WFei{DvaM!|bU(N?74|s#4B!e9pn4;Hi7JmL^NW%z^qL$`qywom>?1 z-1|Ib@WX>Lr6+Hra}wcdw%tYhm?~^O%iXDQ5=|4Rm~OppPdv*e`+{Su+Y_rjTYd5+ z<4Jv=QYAVa>ISvFmg4+l1aM;=SLzrV>T0iJ#RXJ2I&143J=Mn*#i`KW9rv+Le^sNg zncUX queue = new ArrayList(); + private ArrayList visited = new ArrayList(); + boolean bInVisited = false; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Public Methoden und Konstruktoren + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + // Konstruktor -> zu bewegenden Hamster erforderlich + public Search(Hamster h){ + sh = h; + } + + // Initialisiern und ermitteln der Start- und Zielposition + public boolean init(){ + // Startfeld kann immer gefunden werden + getStart(); + // Wenn kein oder mehrere Körner gefunden wurden, sollte ein Fehler ausgegeben werden; + return getGrainField(); + } + + // Pfad ermitteln + public Field findPath(){ + return searchPathToGrain(); + } + + // Pfad laufen und Korn aufnehmen + public boolean walkPathGetKorn(Field goalField){ + walkByPath(getPath(goalField)); + + if(sh.kornDa()){ + sh.nimm(); + return true; + } + return false; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Ermitteln des Weges mit Breitensuche + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + private Field searchPathToGrain(){ + // ersten Knoten/Hamster in queue stellen + queue.add(start); + // Solange queue nicht leer, Schleife durchlaufen + while(queue.size() > 0){ + // Aktuelles Feld nehmen und aus queue entfernen + Field currField = queue.get(0); + queue.remove(0); + // Feld auf Liste der besuchten Felder setzten + visited.add(currField); + + // Wenn Ziel gefunden Fled zurückgeben + if(currField.column == goal.column && currField.row == goal.row){ + return currField; + } + + // Freie Nachbarfelder ermitteln. + ArrayList freeNeighbours = getFreeNeighbours(currField); + for(int i = 0; i path){ + // Aktuelle Hamsterpositions + Field curHamsterPos = start; + // Alle Felder des Pfades durchgehen und ablaufen + for(Field nextField : path){ + // Links-Rechts-Bewegung + switch(nextField.column - curHamsterPos.column){ + case 1: // nach rechts gehen + moveHamster(Hamster.OST); + break; + case -1: // nach links gehen + moveHamster(Hamster.WEST); + break; + } + + // Hoch-Runter-Bewegung + switch(nextField.row - curHamsterPos.row){ + case 1: // nach oben gehen + moveHamster(Hamster.SUED); + break; + case -1: // nach unten gehen + moveHamster(Hamster.NORD); + break; + } + + // Hamsterposition aktualisieren + curHamsterPos = nextField; + } + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Hilfsmethoden + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + // Pfad anhand der Paren-Child beziehung aus einem Feld aufbauen. + private ArrayList getPath(Field f){ + boolean bStartFound = false; + ArrayList path = new ArrayList(); + Field cf = f; + while(!bStartFound){ + path.add(0,cf); + if(cf.parent == null) + bStartFound = true; + else + cf = cf.parent; + } + return path; + } + + // Feld ermittlen, auf dem der Hamster aktuell sitzt + private void getStart(){ + start = new Field(sh.getSpalte(), sh.getReihe()); + } + + // Feld ermitteln, auf dem das Korn liegt + private boolean getGrainField(){ + int grainCounter = 0; + //Ermitteln, auf welchem Feld das Korn liegt + for(int col=0; col < fieldCol; col++){ // Spalten durchgehen + for(int row=0; row < fieldRow; row++){ // Reihe durchgehen + if(Territorium.getAnzahlKoerner(row,col) > 0 ){ + goal = new Field(col,row); // Zielkoordinate setzen und Schleife abbrechen + grainCounter++; + } + } + } + if(grainCounter == 1){ + return true; + } + return false; + } + + // Rotiert den Hamster in eine definierte Blickrichtung und bewegt ihn einen schritt vor. + private void moveHamster(int blickrichtung){ + boolean moved = false; + while(!moved){ + if(sh.getBlickrichtung() == blickrichtung){ + sh.vor(); + moved = true; + } + else { + sh.linksUm(); + } + } + } + + // Freie Nachbarfelder für Field cf ermitteln + private ArrayList getFreeNeighbours(Field cf){ + ArrayList neigbours = new ArrayList(); + // Feld oben prüfen + if(!Territorium.mauerDa(cf.row-1, cf.column)){ + neigbours.add(new Field(cf.column, cf.row-1)); + } + // Feld rechts prüfen) + if(!Territorium.mauerDa(cf.row, cf.column+1)){ + neigbours.add(new Field(cf.column+1, cf.row)); + } + // Feld unten prüfen) + if(!Territorium.mauerDa(cf.row+1, cf.column)){ + neigbours.add(new Field(cf.column, cf.row+1)); + } + // Feld links prüfen + if(!Territorium.mauerDa(cf.row, cf.column-1)){ + neigbours.add(new Field(cf.column-1, cf.row)); + } + return neigbours; + } +} diff --git a/Search.java b/Search.java new file mode 100644 index 0000000..20c4b7a --- /dev/null +++ b/Search.java @@ -0,0 +1,206 @@ +import java.util.ArrayList; + +import de.hamster.debugger.model.Territorium;import de.hamster.debugger.model.Territory;import de.hamster.model.HamsterException;import de.hamster.model.HamsterInitialisierungsException;import de.hamster.model.HamsterNichtInitialisiertException;import de.hamster.model.KachelLeerException;import de.hamster.model.MauerDaException;import de.hamster.model.MaulLeerException;import de.hamster.model.MouthEmptyException;import de.hamster.model.WallInFrontException;import de.hamster.model.TileEmptyException;import de.hamster.debugger.model.Hamster;public class Search{ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Eigenschaften / Protperties + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + private Hamster sh; + // Spielfeldgröße + private int fieldRow = Territorium.getAnzahlReihen(); + private int fieldCol = Territorium.getAnzahlSpalten(); + // Start- und Ziel-Feld + private Field goal; + private Field start; + // Arrays zum halten von Informationen. + private ArrayList queue = new ArrayList(); + private ArrayList visited = new ArrayList(); + boolean bInVisited = false; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Public Methoden und Konstruktoren + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + // Konstruktor -> zu bewegenden Hamster erforderlich + public Search(Hamster h){ + sh = h; + } + + // Initialisiern und ermitteln der Start- und Zielposition + public boolean init(){ + // Startfeld kann immer gefunden werden + getStart(); + // Wenn kein oder mehrere Körner gefunden wurden, sollte ein Fehler ausgegeben werden; + return getGrainField(); + } + + // Pfad ermitteln + public Field findPath(){ + return searchPathToGrain(); + } + + // Pfad laufen und Korn aufnehmen + public boolean walkPathGetKorn(Field goalField){ + walkByPath(getPath(goalField)); + + if(sh.kornDa()){ + sh.nimm(); + return true; + } + return false; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Ermitteln des Weges mit Breitensuche + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + private Field searchPathToGrain(){ + // ersten Knoten/Hamster in queue stellen + queue.add(start); + // Solange queue nicht leer, Schleife durchlaufen + while(queue.size() > 0){ + // Aktuelles Feld nehmen und aus queue entfernen + Field currField = queue.get(0); + queue.remove(0); + // Feld auf Liste der besuchten Felder setzten + visited.add(currField); + + // Wenn Ziel gefunden Fled zurückgeben + if(currField.column == goal.column && currField.row == goal.row){ + return currField; + } + + // Freie Nachbarfelder ermitteln. + ArrayList freeNeighbours = getFreeNeighbours(currField); + for(int i = 0; i path){ + // Aktuelle Hamsterpositions + Field curHamsterPos = start; + // Alle Felder des Pfades durchgehen und ablaufen + for(Field nextField : path){ + // Links-Rechts-Bewegung + switch(nextField.column - curHamsterPos.column){ + case 1: // nach rechts gehen + moveHamster(Hamster.OST); + break; + case -1: // nach links gehen + moveHamster(Hamster.WEST); + break; + } + + // Hoch-Runter-Bewegung + switch(nextField.row - curHamsterPos.row){ + case 1: // nach oben gehen + moveHamster(Hamster.SUED); + break; + case -1: // nach unten gehen + moveHamster(Hamster.NORD); + break; + } + + // Hamsterposition aktualisieren + curHamsterPos = nextField; + } + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Hilfsmethoden + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + // Pfad anhand der Paren-Child beziehung aus einem Feld aufbauen. + private ArrayList getPath(Field f){ + boolean bStartFound = false; + ArrayList path = new ArrayList(); + Field cf = f; + while(!bStartFound){ + path.add(0,cf); + if(cf.parent == null) + bStartFound = true; + else + cf = cf.parent; + } + return path; + } + + // Feld ermittlen, auf dem der Hamster aktuell sitzt + private void getStart(){ + start = new Field(sh.getSpalte(), sh.getReihe()); + } + + // Feld ermitteln, auf dem das Korn liegt + private boolean getGrainField(){ + int grainCounter = 0; + //Ermitteln, auf welchem Feld das Korn liegt + for(int col=0; col < fieldCol; col++){ // Spalten durchgehen + for(int row=0; row < fieldRow; row++){ // Reihe durchgehen + if(Territorium.getAnzahlKoerner(row,col) > 0 ){ + goal = new Field(col,row); // Zielkoordinate setzen und Schleife abbrechen + grainCounter++; + } + } + } + if(grainCounter == 1){ + return true; + } + return false; + } + + // Rotiert den Hamster in eine definierte Blickrichtung und bewegt ihn einen schritt vor. + private void moveHamster(int blickrichtung){ + boolean moved = false; + while(!moved){ + if(sh.getBlickrichtung() == blickrichtung){ + sh.vor(); + moved = true; + } + else { + sh.linksUm(); + } + } + } + + // Freie Nachbarfelder für Field cf ermitteln + private ArrayList getFreeNeighbours(Field cf){ + ArrayList neigbours = new ArrayList(); + // Feld oben prüfen + if(!Territorium.mauerDa(cf.row-1, cf.column)){ + neigbours.add(new Field(cf.column, cf.row-1)); + } + // Feld rechts prüfen) + if(!Territorium.mauerDa(cf.row, cf.column+1)){ + neigbours.add(new Field(cf.column+1, cf.row)); + } + // Feld unten prüfen) + if(!Territorium.mauerDa(cf.row+1, cf.column)){ + neigbours.add(new Field(cf.column, cf.row+1)); + } + // Feld links prüfen + if(!Territorium.mauerDa(cf.row, cf.column-1)){ + neigbours.add(new Field(cf.column-1, cf.row)); + } + return neigbours; + } +}