package Ġmin es w eeper Ċ Ċ import Ġjava . util .* Ċ import Ġkotlin . system . exit Process ĊĊ Ċ const Ġval Ġfield Length Ġ= Ġ 9 Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġscanner Ġ= ĠScanner ( System .` in `) ĊĠĠĠ Ġvar Ġdid First Move Ġ= Ġfalse ĊĊĠĠĠ Ġprintln (" How Ġmany Ġmin es Ġdo Ġyou Ġwant Ġon Ġthe Ġfield ?") ĊĠĠĠ Ġval Ġmin es Count Ġ= Ġscanner . nextLine (). toInt () ĊĊĠĠĠ Ġvar Ġboard Of M ines Ġ= Ġgenerate Game ( min es Count ) ĊĠĠĠ Ġval Ġboard Ġ= Ġgenerate Empty Board ( field Length ) ĊĠĠĠ Ġprint Board ( board ) ĊĊĠĠĠ Ġprintln (" Set / delete Ġmin es Ġmarks Ġ( x Ġand Ġy Ġcoordinates ): ") ĊĠĠĠ Ġwhile Ġ( scanner . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Y Ġ= Ġscanner . nextInt () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġc X Ġ= Ġscanner . nextInt () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= Ġscanner . next () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" mine " Ġ-> Ġmark Cell ( board , Ġc X , Ġc Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" free " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mine ( board Of M ines , Ġc X , Ġc Y ) Ġ&& Ġ! did First Move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield To Skip Ġ= ĠPair ( c X , Ġc Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard Of M ines Ġ= Ġgenerate Game ( min es Count , Ġfield To Skip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexplode If Mine ( board , Ġboard Of M ines , Ġc X , Ġc Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun cover Cell ( board , Ġboard Of M ines , Ġc X , Ġc Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Board ( board ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdid First Move Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Game Status ( board , Ġboard Of M ines , Ġmin es Count ) ĊĠĠĠĠĠĠĠ Ġprintln (" Set / delete Ġmin es Ġmarks Ġ( x Ġand Ġy Ġcoordinates ): ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġgenerate Game ( min es Count : ĠInt , Ġfield To Skip : ĠPair < Int , ĠInt >? Ġ= Ġnull ): ĠArray < Array < String >> Ġ{ ĊĠĠĠ Ġvar Ġmin es Position Ġ= Ġcalculate M ines Position ( min es Count ) ĊĠĠĠ Ġwhile Ġ( field To Skip Ġ!= Ġnull Ġ&& Ġmin es Position . contains ( field To Skip )) Ġ{ ĊĠĠĠĠĠĠĠ Ġmin es Position Ġ= Ġcalculate M ines Position ( min es Count ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġboard Of M ines Ġ= Ġgenerate Board With M ines ( min es Position ) ĊĠĠĠ Ġupdate Board With Hints ( board Of M ines ) ĊĠĠĠ Ġreturn Ġboard Of M ines Ċ } Ċ Ċ fun Ġis Mine ( board Of M ines : ĠArray < Array < String >>, Ġc X : ĠInt , Ġc Y : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġboard Of M ines [ c X ][ c Y ] Ġ== Ġ" X " Ċ } Ċ Ċ fun Ġexplode If Mine ( board : ĠArray < Array < String >>, Ġboard Of M ines : ĠArray < Array < String >>, Ġc X : ĠInt , Ġc Y : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġis Mine Ġ= Ġboard Of M ines [ c X ][ c Y ] Ġ== Ġ" X " ĊĠĠĠ Ġif Ġ( is Mine ) Ġ{ ĊĠĠĠĠĠĠĠ Ġun cover M ines ( board , Ġboard Of M ines ) ĊĠĠĠĠĠĠĠ Ġprint Board ( board ) ĊĠĠĠĠĠĠĠ Ġprintln (" You Ġste pped Ġon Ġa Ġmine Ġand Ġfailed !") ĊĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġun cover M ines ( board : ĠArray < Array < String >>, Ġboard Of M ines : ĠArray < Array < String >>) Ġ{ ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfield Length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġfield Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Mine Ġ= Ġboard Of M ines [ i ][ j ] Ġ== Ġ" X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ i ][ j ] Ġ= Ġ" X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġun cover Cell ( board : ĠArray < Array < String >>, Ġboard Of M ines : ĠArray < Array < String >>, Ġc X : ĠInt , Ġc Y : ĠInt ) Ġ{ ĊĠĠĠ Ġfor Ġ( dI Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( d J Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext I Ġ= Ġc X Ġ+ Ġd I ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext J Ġ= Ġc Y Ġ+ Ġd J ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Within Bounds ( next I , Ġnext J )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbor Slot Ġ= Ġboard Of M ines [ next I ][ next J ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( neighbor Slot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"." Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ next I ][ next J ] Ġ= Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard Of M ines [ next I ][ next J ] Ġ= Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun cover Cell ( board , Ġboard Of M ines , Ġnext I , Ġnext J ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"*", Ġ" X ", Ġ"/" Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// No - Op ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Hints ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ next I ][ next J ] Ġ= Ġneighbor Slot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcheck Game Status ( board : ĠArray < Array < String >>, Ġboard Of M ines : ĠArray < Array < String >>, Ġmin es Count : ĠInt ) Ġ{ ĊĠĠĠ Ġvar Ġmark Count Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġmin es To Go Ġ= Ġmin es Count ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfield Length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġfield Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Mark Ġ= Ġboard [ i ][ j ] Ġ== Ġ"*" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Mine Ġ= Ġboard Of M ines [ i ][ j ] Ġ== Ġ" X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mark ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin es To Go -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( min es To Go Ġ== Ġ 0 Ġ&& Ġmark Count Ġ== Ġmin es Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Con grat ulations ! ĠYou Ġfound Ġall Ġmin es !") ĊĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmark Cell ( board : ĠArray < Array < String >>, Ġc X : ĠInt , Ġc Y : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġelement Ġ= Ġboard . get ( c X ). get ( c Y ) ĊĠĠĠ Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"." Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// " empty ", Ġlet 's Ġmark Ġit Ġand Ġprint Ġthe Ġboard ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ c X ][ c Y ] Ġ= Ġ"*" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Board ( board ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ" X " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Not Ġpossible ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ"*" Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ c X ][ c Y ] Ġ= Ġ"." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Board ( board ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" There Ġis Ġa Ġnumber Ġhere !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġprint Board ( board : ĠArray < Array < String >>) Ġ{ ĊĠĠĠ Ġvar Ġall Indices Ġ= Ġ"" ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. field Length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġall Indices Ġ+= Ġi ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln ( String . format (" Ġ| % ${ field Length } s | ", Ġall Indices )) ĊĠĠĠ Ġ// print Ġtable Ġseparator ĊĠĠĠ Ġprintln ("- |" Ġ+ Ġ"| ". pad Start ( field Length Ġ+ Ġ 1 , Ġ'- ')) ĊĠĠĠ Ġ// print Ġcontent ĊĠĠĠ Ġboard . forEach Indexed Ġ{ Ġindex , Ġrow Ġ-> ĊĠĠĠĠĠĠĠ Ġprint ("${ index Ġ+ Ġ 1 }| ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( slot Ġin Ġrow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint ( slot ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprint ("| ") ĊĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// print Ġtable Ġseparator ĊĠĠĠ Ġprintln ("- |" Ġ+ Ġ"| ". pad Start ( field Length Ġ+ Ġ 1 , Ġ'- ')) Ċ } Ċ Ċ fun Ġcalculate M ines Position ( min es Count : ĠInt ): ĠMutable Set < Pair < Int , ĠInt >> Ġ{ ĊĠĠĠ Ġval Ġrandom Ġ= ĠRandom () ĊĠĠĠ Ġval Ġmin es Ġ= Ġmutable Set Of < Pair < Int , ĠInt >>() ĊĊĠĠĠ Ġwhile Ġ( min es . size Ġ!= Ġmin es Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmin es . add ( Pair ( random . nextInt ( field Length ), Ġrandom . nextInt ( field Length ))) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmin es Ċ } Ċ Ċ fun Ġgenerate Board With M ines ( min es Position : ĠMutable Set < Pair < Int , ĠInt >> ): ĠArray < Array < String >> Ġ{ ĊĠĠĠ Ġval Ġboard Ġ= Ġgenerate Empty Board ( field Length ) ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfield Length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġfield Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( min es Position . contains ( Pair ( i , Ġj ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ i ][ j ] Ġ= Ġ" X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġboard Ċ } Ċ Ċ fun Ġgenerate Empty Board ( size : ĠInt ): ĠArray < Array < String >> Ġ{ ĊĠĠĠ Ġreturn ĠArray ( size ) Ġ{ ĊĠĠĠĠĠĠĠ ĠArray ( size ) Ġ{ Ġ"." Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġupdate Board With Hints ( board : ĠArray < Array < String >>) Ġ{ ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfield Length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġfield Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Slot Ġ= Ġboard [ i ][ j ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Slot Ġ!= Ġ" X ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( dI Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( d J Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext I Ġ= Ġi Ġ+ Ġd I ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext J Ġ= Ġj Ġ+ Ġd J ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Within Bounds ( next I , Ġnext J )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbor Slot Ġ= Ġboard [ next I ][ next J ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( neighbor Slot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"." Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ next I ][ next J ] Ġ= Ġ" 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" X " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ next I ][ next J ] Ġ= Ġ( neighbor Slot . toInt () Ġ+ Ġ 1 ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Remove Ġ' X ' Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ i ][ j ] Ġ= Ġ"." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġis Within Bounds ( i : ĠInt , Ġj : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( i Ġ< Ġ 0 Ġ|| Ġi Ġ>= Ġfield Length Ġ|| Ġj Ġ< Ġ 0 Ġ|| Ġj Ġ>= Ġfield Length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ