/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 - 2 0 2 1 , Ċ Ġ* ĠThis Ġlibrary Ġclass Ġwas Ġcreated Ġby Ġ 0 xFC 9 6 3 F 1 8 DC 2 1 Ġ/ ĠSh ots 2 4 3 Ċ Ġ* ĠIt Ġis Ġpart Ġof Ġan Ġextension Ġlibrary Ġfor Ġthe Ġgame ĠNull po Min o Ġ( copyright Ġ 2 0 2 1 - 2 0 2 1 ) Ċ Ġ* Ċ Ġ* ĠKotlin Ġconverted Ġand Ġmodified Ġby ĠV en om = N hel v Ċ Ġ* Ċ Ġ* ĠHer ew ith Ġshall Ġthe Ġterm Ġ" Library ĠCreator " Ġbe Ġgiven Ġto Ġ 0 xFC 9 6 3 F 1 8 DC 2 1 . Ċ Ġ* ĠHer ew ith Ġshall Ġthe Ġterm Ġ" Game ĠCreator " Ġbe Ġgiven Ġto Ġthe Ġoriginal Ġcreator Ġof ĠNull po Min o , ĠNull Non ame . Ċ Ġ* Ċ Ġ* ĠTHIS ĠLIB R ARY ĠAND ĠMODE ĠPACK ĠW AS ĠNOT ĠMA DE ĠIN ĠASS OCI ATION ĠWITH ĠTHE ĠGAME ĠCRE ATOR . Ċ Ġ* Ċ Ġ* ĠRepository : Ġhttps :// github . com / Sh ots 2 4 3 / Mode P ile Ċ Ġ* Ċ Ġ* ĠWhen Ġusing Ġthis Ġlibrary Ġin Ġa Ġmode Ġ/ Ġlibrary Ġpack Ġof Ġyour Ġown , Ġthe Ġfollowing Ċ Ġ* Ġconditions Ġmust Ġbe Ġsatisfied : Ċ Ġ* ĠĠĠĠ Ġ- ĠThis Ġlicense Ġmust Ġremain Ġvisible Ġat Ġthe Ġtop Ġof Ġthe Ġdocument , Ġun modified . Ċ Ġ* ĠĠĠĠ Ġ- ĠYou Ġare Ġallowed Ġto Ġuse Ġthis Ġlibrary Ġfor Ġany Ġmod ding Ġpurpose . Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ- ĠIf Ġthis Ġis Ġthe Ġcase , Ġthe ĠLibrary ĠCreator Ġmust Ġbe Ġcredit ed Ġsomewhere . Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠSource Ġcomments Ġonly Ġare Ġfine , Ġbut Ġin Ġa ĠREADME Ġis Ġrecommended . Ċ Ġ* ĠĠĠĠ Ġ- ĠMod ification Ġof Ġthis Ġlibrary Ġis Ġallowed , Ġbut Ġonly Ġin Ġthe Ġcondition Ġthat Ġa Ċ Ġ* ĠĠĠĠĠĠ Ġpull Ġrequest Ġis Ġmade Ġto Ġmerge Ġthe Ġchanges Ġto Ġthe Ġrepository . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠOWNER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġz er ox fc . null po . custom . modes . objects . min es w eeper Ċ Ċ import Ġkotlin . random . Random Ċ Ċ class ĠGame Grid Ġ@ Jvm Over loads Ġconstructor ( val Ġlength : Int Ġ= Ġ 1 0 , Ġval Ġheight : Int Ġ= Ġ 1 0 , Ġmine Percent : Float Ġ= Ġ 0 . 1 f , Ċ ĉ rand seed : Long Ġ= Ġ 0 ) Ġ{ Ċ ĉ val Ġsquares : Int Ġget () Ġ= Ġlength * height Ċ ĉ val Ġmin es : Int Ġ= Ġ( mine Percent / 1 0 0 f * squares ). toInt () Ċ ĉ private Ġval Ġrandom izer : Random Ġ= ĠRandom ( rand seed ) Ċ ĉ var Ġcontents : Array < Array < Grid Space >> Ġ= ĠArray ( height ) Ġ{ Array ( length ) Ġ{ Grid Space ( false )}} ĊĊ ĉ fun Ġgenerate M ines ( exclude X : Int , Ġexclude Y : Int ) Ġ{ Ċĉ ĉ var Ġi Ġ= Ġ 0 Ċĉ ĉ while ( i < min es ) Ġ{ Ċĉĉ ĉ var ĠTest X : Int Ċĉĉ ĉ var ĠTest Y : Int Ċĉĉ ĉ var ĠRoll Count Ġ= Ġ 0 Ċĉĉ ĉ do Ġ{ Ċĉĉĉ ĉ Test X Ġ= Ġrandom izer . nextInt ( length ) Ċĉĉĉ ĉ Test Y Ġ= Ġrandom izer . nextInt ( height ) Ċĉĉĉ ĉ Roll Count ++ Ċĉĉ ĉ } Ġwhile ( get Sur rounding M ines ( Test X , ĠTest Y ) >= 3 && Roll Count < 6 ) Ċĉĉ ĉ if (! contents [ Test Y ][ Test X ]. is Mine && !( Test Y == exclude Y && Test X == exclude X )) Ġ{ Ċĉĉĉ ĉ contents [ Test Y ][ Test X ]. is Mine Ġ= Ġtrue Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ i -- Ċĉĉ ĉ } Ċĉĉ ĉ i ++ Ċĉ ĉ } Ċĉ ĉ for ( y Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ Ċĉĉ ĉ for ( x Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ Ċĉĉĉ ĉ if (! contents [ y ][ x ]. is Mine ) Ġ{ Ċĉĉĉĉ ĉ contents [ y ][ x ]. sur rounding M ines Ġ= Ġget Sur rounding M ines ( x , Ġy ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġget Sur rounding M ines ( x : Int , Ġy : Int ): Int Ġ{ Ċĉ ĉ var Ġmine Ġ= Ġ 0 Ċĉ ĉ val Ġtest Locations Ġ= ĠarrayOf ( int ArrayOf (- 1 , Ġ- 1 ), Ġint ArrayOf ( 0 , Ġ- 1 ), Ġint ArrayOf ( 1 , Ġ- 1 ), Ġint ArrayOf (- 1 , Ġ 0 ), Ġint ArrayOf ( 1 , Ġ 0 ), Ċĉĉ ĉ int ArrayOf (- 1 , Ġ 1 ), Ġint ArrayOf ( 0 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 )) Ċĉ ĉ for ( loc Ġin Ġtest Locations ) Ġ{ Ċĉĉ ĉ val Ġpx Ġ= Ġx + loc [ 0 ] Ċĉĉ ĉ val Ġpy Ġ= Ġy + loc [ 1 ] Ċĉĉ ĉ if ( px < 0 || px >= length ) Ġcontinue Ċĉĉ ĉ if ( py < 0 || py >= height ) Ġcontinue Ċĉĉ ĉ if ( contents [ py ][ px ]. is Mine ) Ġmine ++ Ċĉ ĉ } Ċĉ ĉ return Ġmine Ċ ĉ } ĊĊ ĉ fun Ġget Sur rounding Flags ( x : Int , Ġy : Int ): Int Ġ{ Ċĉ ĉ var Ġflag Ġ= Ġ 0 Ċĉ ĉ val Ġtest Locations Ġ= ĠarrayOf ( int ArrayOf (- 1 , Ġ- 1 ), Ġint ArrayOf ( 0 , Ġ- 1 ), Ġint ArrayOf ( 1 , Ġ- 1 ), Ġint ArrayOf (- 1 , Ġ 0 ), Ġint ArrayOf ( 1 , Ġ 0 ), Ċĉĉ ĉ int ArrayOf (- 1 , Ġ 1 ), Ġint ArrayOf ( 0 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 )) Ċĉ ĉ for ( loc Ġin Ġtest Locations ) Ġ{ Ċĉĉ ĉ val Ġpx Ġ= Ġx + loc [ 0 ] Ċĉĉ ĉ val Ġpy Ġ= Ġy + loc [ 1 ] Ċĉĉ ĉ if ( px < 0 || px >= length ) Ġcontinue Ċĉĉ ĉ if ( py < 0 || py >= height ) Ġcontinue Ċĉĉ ĉ if ( contents [ py ][ px ]. flag ged ) Ġflag ++ Ċĉ ĉ } Ċĉ ĉ return Ġflag Ċ ĉ } ĊĊ ĉ fun Ġget Sur rounding Cover ed ( x : Int , Ġy : Int ): Int Ġ{ Ċĉ ĉ var Ġflag Ġ= Ġ 0 Ċĉ ĉ val Ġtest Locations Ġ= ĠarrayOf ( int ArrayOf (- 1 , Ġ- 1 ), Ġint ArrayOf ( 0 , Ġ- 1 ), Ġint ArrayOf ( 1 , Ġ- 1 ), Ġint ArrayOf (- 1 , Ġ 0 ), Ġint ArrayOf ( 1 , Ġ 0 ), Ċĉĉ ĉ int ArrayOf (- 1 , Ġ 1 ), Ġint ArrayOf ( 0 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 )) Ċĉ ĉ for ( loc Ġin Ġtest Locations ) Ġ{ Ċĉĉ ĉ val Ġpx Ġ= Ġx + loc [ 0 ] Ċĉĉ ĉ val Ġpy Ġ= Ġy + loc [ 1 ] Ċĉĉ ĉ if ( px < 0 || px >= length ) Ġcontinue Ċĉĉ ĉ if ( py < 0 || py >= height ) Ġcontinue Ċĉĉ ĉ if (! contents [ py ][ px ]. un covered ) Ġflag ++ Ċĉ ĉ } Ċĉ ĉ return Ġflag Ċ ĉ } ĊĊ ĉ fun Ġun cover All M ines () Ġ{ Ċĉ ĉ for ( y Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ Ċĉĉ ĉ for ( x Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ Ċĉĉĉ ĉ if ( contents [ y ][ x ]. is Mine ) Ġ{ Ċĉĉĉĉ ĉ contents [ y ][ x ]. un covered Ġ= Ġtrue Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġun cover Non M ines () Ġ{ Ċĉ ĉ for ( y Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ Ċĉĉ ĉ for ( x Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ Ċĉĉĉ ĉ if (! contents [ y ][ x ]. is Mine ) Ġ{ Ċĉĉĉĉ ĉ contents [ y ][ x ]. un covered Ġ= Ġtrue Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġflag All Cover ed () Ġ{ Ċĉ ĉ for ( y Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ Ċĉĉ ĉ for ( x Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ Ċĉĉĉ ĉ if (! contents [ y ][ x ]. un covered ) Ġ{ Ċĉĉĉĉ ĉ contents [ y ][ x ]. flag ged Ġ= Ġtrue Ċĉĉĉĉ ĉ contents [ y ][ x ]. question Ġ= Ġfalse Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġun cover At ( x : Int , Ġy : Int ): State Ġ{ Ċĉ ĉ if (! contents [ y ][ x ]. flag ged && ! contents [ y ][ x ]. un covered && ! contents [ y ][ x ]. question ) Ġ{ Ċĉĉ ĉ contents [ y ][ x ]. un covered Ġ= Ġtrue ĊĊĉĉ ĉ return Ġif ( contents [ y ][ x ]. is Mine ) Ġ{ Ċĉĉĉ ĉ State . M INE Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ if ( contents [ y ][ x ]. sur rounding M ines == 0 ) Ġ{ Ċĉĉĉĉ ĉ val Ġtest Locations Ġ= ĠarrayOf ( int ArrayOf (- 1 , Ġ- 1 ), Ġint ArrayOf ( 0 , Ġ- 1 ), Ġint ArrayOf ( 1 , Ġ- 1 ), Ġint ArrayOf (- 1 , Ġ 0 ), Ċĉĉĉĉĉ ĉ int ArrayOf ( 1 , Ġ 0 ), Ġint ArrayOf (- 1 , Ġ 1 ), Ġint ArrayOf ( 0 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 )) Ċĉĉĉĉ ĉ for ( loc Ġin Ġtest Locations ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġpx Ġ= Ġx + loc [ 0 ] Ċĉĉĉĉĉ ĉ val Ġpy Ġ= Ġy + loc [ 1 ] Ċĉĉĉĉĉ ĉ if ( px < 0 || px >= length ) Ġcontinue Ċĉĉĉĉĉ ĉ if ( py < 0 || py >= height ) Ġcontinue Ċĉĉĉĉĉ ĉ if (! contents [ py ][ px ]. un covered ) Ġun cover At ( px , Ġpy ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ State . SAFE Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return ĠState . AL READY _ OPEN Ċ ĉ } ĊĊ ĉ fun Ġcycle State ( x : Int , Ġy : Int ): Boolean Ġ{ Ċĉ ĉ if (! contents [ y ][ x ]. un covered ) Ġ{ Ċĉĉ ĉ if (! contents [ y ][ x ]. flag ged && ! contents [ y ][ x ]. question ) Ġ{ Ċĉĉĉ ĉ contents [ y ][ x ]. flag ged Ġ= Ġtrue Ċĉĉĉ ĉ contents [ y ][ x ]. question Ġ= Ġfalse Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ } Ġelse Ġif ( contents [ y ][ x ]. flag ged && ! contents [ y ][ x ]. question ) Ġ{ Ċĉĉĉ ĉ contents [ y ][ x ]. flag ged Ġ= Ġfalse Ċĉĉĉ ĉ contents [ y ][ x ]. question Ġ= Ġtrue Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ } Ġelse Ġif (! contents [ y ][ x ]. flag ged && contents [ y ][ x ]. question ) Ġ{ Ċĉĉĉ ĉ contents [ y ][ x ]. flag ged Ġ= Ġfalse Ċĉĉĉ ĉ contents [ y ][ x ]. question Ġ= Ġfalse Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĊ ĉ fun Ġget Square At ( x : Int , Ġy : Int ): Grid Space Ġ= Ġcontents [ y ][ x ] ĊĊ ĉ val Ġcovered S quares : Int Ġget () Ġ= Ġcontents . sum Of Ġ{ it Ġ-> Ġit . count Ġ{! it . un covered }} Ċ ĉ val Ġflag ged S quares : Int Ġget () Ġ= Ġcontents . sum Of Ġ{ it Ġ-> Ġit . count Ġ{ it . flag ged }} ĊĊ ĉ enum Ġclass ĠState Ġ{ Ċĉ ĉ SAFE , ĠM INE , ĠAL READY _ OPEN Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ ĊĊĉ ĉ const Ġval ĠSTATE _ SAFE Ġ= Ġ 0 Ċĉ ĉ const Ġval ĠSTATE _ M INE Ġ= Ġ 1 Ċĉ ĉ const Ġval ĠSTATE _ AL READY _ OPEN Ġ= Ġ 2 Ċ ĉ } Ċ Ċ }