package Ġcom . knowledge spike . game of life ĊĊ Ċ import Ġandroidx . compose . desktop . Local App Window Ċ import Ġandroidx . compose . desktop . Window Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . border Ċ import Ġandroidx . compose . foundation . click able Ċ import Ġandroidx . compose . foundation . layout .* Ċ import Ġandroidx . compose . material . Button Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . unit . Int Offset Ċ import Ġandroidx . compose . ui . unit . Int Size Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġjava . time . LocalDateTime Ċ import Ġkotlin . random . Random Ċ Ċ val ĠBO X _ SIZE Ġ= Ġ 1 0 Ċ val ĠBUTTON _ COLUMN _ WIDTH Ġ= Ġ 2 0 0 ĊĊ Ċ fun Ġmain () Ġ= ĠWindow Ġ{ ĊĠĠĠ Ġvar Ġwindow Size Ġby Ġremember Ġ{ Ġmutable State Of ( Int Size . Zero ) Ġ} ĊĠĠĠ Ġvar Ġgrid Dimensions Ġby Ġremember Ġ{ Ġmutable State Of ( Pair ( Dimension ( 0 ), ĠDimension ( 0 ))) Ġ} ĊĠĠĠ Ġvar Ġwindow Location Ġby Ġremember Ġ{ Ġmutable State Of ( Int Offset . Zero ) Ġ} ĊĠĠĠ Ġvar Ġgrid : ĠGrid ? Ġby Ġremember Ġ{ Ġmutable State Of ( null ) Ġ} ĊĠĠĠ Ġvar Ġscope : ĠCor outine Scope Ġ= Ġremember Coroutine Scope () ĊĠĠĠ Ġvar Ġcurrent Job Ġby Ġremember Ġ{ Ġmutable State Of < Job ? >( null ) Ġ} ĊĊĠĠĠ Ġval Ġrnd Ġby Ġremember Ġ{ Ġmutable State Of ( Random ( LocalDateTime . now (). nano )) Ġ} ĊĊĊĊĠĠĠ ĠLocal App Window . current . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġevents . on Resize Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Size Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Dimensions Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Dimension (( width Ġ- ĠBUTTON _ COLUMN _ WIDTH Ġ- Ġ 6 ) Ġ/ ĠBO X _ SIZE ), ĠDimension (( height Ġ- Ġ 3 5 ) Ġ/ ĠBO X _ SIZE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Ġ= ĠGrid ( grid Dimensions . first , Ġgrid Dimensions . second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevents . on Re locate Ġ= Ġ{ Ġwindow Location Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠMaterial Theme Ġ{ ĊĠĠĠĠĠĠĠ ĠRow ( modifier Ġ= ĠModifier . fill MaxSize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 3 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. border ( width Ġ= Ġ 1 . dp , Ġcolor Ġ= ĠColor . Black ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDraw Grid ( grid ) Ġ{ Ġcell Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . on Ġ= Ġ! cell . on ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . cells [ cell . x ][ cell . y ] Ġ= Ġcell ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Ġ= Ġit . sh allow Copy Grid () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . width ( BUTTON _ COLUMN _ WIDTH . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 3 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. border ( width Ġ= Ġ 1 . dp , Ġcolor Ġ= ĠColor . Black ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDraw Buttons ( on Run Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid ?. let Ġ{ Ġg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Job Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . start (). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . cells Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Ġ= Ġg . sh allow Copy Grid () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġon Draw Gl ider Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Cell X Ġ= Ġrnd . nextInt ( grid Dimensions . first . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Cell Y Ġ= Ġrnd . nextInt ( grid Dimensions . second . value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Gl ider ( it , Ġinitial Cell X , Ġinitial Cell Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Ġ= Ġgrid ?. sh allow Copy Grid () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġon Draw Go sper Ġ= Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Go sper ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Ġ= Ġgrid ?. sh allow Copy Grid () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġon Stop Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Job ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġon Clear Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Job ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Ġ= ĠGrid ( grid Dimensions . first , Ġgrid Dimensions . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġon Random Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Ġ= Ġrandomize ( grid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġrandomize ( grid : ĠGrid ?): ĠGrid ? Ġ{ ĊĠĠĠ Ġval Ġr Ġ= ĠRandom ( LocalDateTime . now (). nano ) ĊĊĠĠĠ Ġgrid ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil Ġit . cells . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( column Ġin Ġ 0 Ġuntil Ġit . cells [ row ]. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r . nextInt ( 1 0 ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . cells [ row ][ column ]. on Ġ= Ġ!( it . cells [ row ][ column ]. on ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġgrid ?. deep Copy Grid () Ċ } ĊĊ Ċ @ Composable Ċ fun ĠDraw Buttons ( ĊĠĠĠ Ġon Run : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Stop : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Clear : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Random : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Draw Gl ider : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Draw Go sper : Ġ() Ġ-> ĠUnit , Ċ ) Ġ{ ĊĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill MaxSize (), ĊĠĠĠĠĠĠĠ Ġhorizontal Alignment Ġ= ĠAlignment . Center H orizontally , ĊĠĠĠĠĠĠĠ Ġvertical Arrange ment Ġ= ĠArrange ment . Center ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġon Random , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( 1 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Random ize Cells ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġon Draw Gl ider , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( 1 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Draw ĠGl ider ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġon Draw Go sper , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( 1 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Draw ĠGo sper ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġon Run , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( 1 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Run ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġon Stop , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( 1 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Stop ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġon Clear , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( 1 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Clear ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Composable Ċ fun ĠDraw Grid ( grid : ĠGrid ?, Ġon Cell Click : Ġ( cell : ĠCell ) Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġgrid ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 6 Ġand Ġ 3 5 Ġto Ġdiscount Ġthe Ġ' chrome ' Ġon Ġthe Ġwindow ĊĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġgrid . cells . size ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġgrid . cells [ 0 ]. size ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( rows Ġin Ġ 0 .. height Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( columns Ġin Ġ 0 .. width Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġif Ġ( grid . cells [ columns ][ rows ]. on ) ĠColor . Black Ġelse ĠColor . White ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Ġby Ġremember Ġ{ Ġmutable State Of ( grid . cells [ columns ][ rows ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( BOX _ SIZE . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( BOX _ SIZE . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. border ( width Ġ= Ġ 1 . dp , Ġcolor Ġ= ĠColor . Black ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( color Ġ= Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. click able Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Cell Click ( cell ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ