package Ġio . github . ps he g ger . game dev experiments . algorithms . path finding Ċ Ċ import Ġio . github . ps he g ger . game dev experiments . algorithms . ma ze . Base M aze Generator Ċ Ċ /** Ċ Ġ* Ġ@ author Ġps he g ger @ gmail . com Ċ Ġ*/ Ċ abstract Ġclass ĠBase Path Finder ( val Ġm aze : ĠList < List < Base M aze Generator . FieldValue >>) Ġ{ ĊĠĠĠ Ġval Ġfinished : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ states . size Ġ> Ġ 2 Ġ&& Ġ_ states . all Ġ{ Ġit . state Ġ== ĠField State . FieldValue . Start Stop Ġ|| Ġit . state Ġ== ĠField State . FieldValue . Path Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġ_ states : ĠArrayList < Field State > Ġ= Ġarray ListOf () ĊĠĠĠ Ġval Ġstates : ĠList < Field State > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ states ĊĊĠĠĠ Ġprotected Ġval Ġstart : ĠCoordinate ĊĠĠĠ Ġprotected Ġval Ġstop : ĠCoordinate ĊĊĠĠĠ Ġabstract Ġfun Ġnext Step () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty Cells Ġ= Ġm aze . map Indexed Ġ{ Ġy , Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . map Indexed Ġ{ Ġx , Ġfield Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Value Ġ== ĠBase M aze Generator . FieldValue . Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. flatten (). filter NotNull () ĊĊĠĠĠĠĠĠĠ Ġstart Ġ= Ġempty Cells . first () ĊĠĠĠĠĠĠĠ Ġstop Ġ= Ġempty Cells . last () ĊĊĠĠĠĠĠĠĠ Ġ_ states . add ( Field State ( start . x , Ġstart . y , ĠField State . FieldValue . Start Stop )) ĊĠĠĠĠĠĠĠ Ġ_ states . add ( Field State ( stop . x , Ġstop . y , ĠField State . FieldValue . Start Stop )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Path () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Step () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġget Field ( c : ĠCoordinate ) Ġ= Ġm aze [ c . y ][ c . x ] ĊĠĠĠ Ġprotected Ġfun Ġremove State ( c : ĠCoordinate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġ_ states . first OrNull Ġ{ Ġit . x Ġ== Ġc . x Ġ&& Ġit . y Ġ== Ġc . y Ġ} ĊĊĠĠĠĠĠĠĠ Ġstate ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ states . remove ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġadd State ( c : ĠCoordinate , Ġstate : ĠField State . FieldValue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ states . add ( Field State ( c . x , Ġc . y , Ġstate )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġchange State ( c : ĠCoordinate , Ġstate : ĠField State . FieldValue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove State ( c ) ĊĠĠĠĠĠĠĠ Ġadd State ( c , Ġstate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠgetState ( c : ĠCoordinate ) Ġ= Ġ_ states . first OrNull Ġ{ Ġit . x Ġ== Ġc . x Ġ&& Ġit . y Ġ== Ġc . y Ġ} ?. state ĊĊĠĠĠ Ġdata Ġclass ĠField State ( val Ġx : ĠInt , Ġval Ġy : ĠInt , Ġval Ġstate : ĠField Value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠField Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStart Stop , ĠActive , ĠPath ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCoordinate ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalid : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġx Ġ>= Ġ 0 Ġ&& Ġy Ġ>= Ġ 0 Ġ&& Ġy Ġ< Ġm aze . size Ġ&& Ġx Ġ< Ġm aze [ y ]. size ĊĊĠĠĠĠĠĠĠ Ġval Ġpossible Dest inations : ĠList < Coordinate > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate ( x Ġ- Ġ 1 , Ġy ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate ( x Ġ+ Ġ 1 , Ġy ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate ( x , Ġy Ġ- Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate ( x , Ġy Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . valid Ġ&& Ġget Field ( it ) Ġ== ĠBase M aze Generator . FieldValue . Empty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other ?. java Class Ġ!= Ġjava Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġas ĠCoordinate ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ!= Ġother . x ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ!= Ġother . y ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }