package Ġcom . github . vit av iva . common . view model Ċ Ċ import Ġandroidx . compose . ui . unit . Int Offset Ċ import Ġcom . github . vit av iva . common . api . Api Ċ import Ġcom . github . vit av iva . common . api . Message Ċ import Ġcom . github . vit av iva . common . ui . BOARD _ SIZE Ċ import Ġcom . github . vit av iva . common . ui . LINE _ COUNT Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ const Ġval ĠST ONE _ NONE Ġ= Ġ 0 Ċ const Ġval ĠST ONE _ WHITE Ġ= Ġ 1 Ċ const Ġval ĠST ONE _ BLACK Ġ= Ġ 2 Ċ const Ġval ĠGAME _ PLAY ING Ġ= Ġ 0 Ċ const Ġval ĠGAME _ WIN Ġ= Ġ 1 Ċ const Ġval ĠGAME _ LO ST Ġ= Ġ 2 Ċ Ċ class ĠApp ViewModel ( Ċ ) Ġ: ĠView Controller () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ game Log Ġ= ĠMutable State Flow ("") ĊĠĠĠ Ġval Ġgame Log : ĠFlow < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ game Log ĊĊĠĠĠ Ġprivate Ġval Ġ_ board Ġ= ĠMutable State Flow ( Array ( BOARD _ SIZE ) Ġ{ ĠInt Array ( BOARD _ SIZE ) Ġ}) ĊĠĠĠ Ġval Ġboard Data : ĠFlow < Board Data > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ board ĊĊĠĠĠ Ġprivate Ġvar Ġ_ stone Color Ġ= ĠMutable State Flow ( ST ONE _ NONE ) ĊĠĠĠ Ġval Ġstone Color : ĠFlow < Int > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ stone Color ĊĊĊĠĠĠ Ġprivate Ġvar Ġ_ is Pa ired Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġis Pa ired : ĠFlow < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Pa ired ĊĊĠĠĠ Ġprivate Ġvar Ġ_ game Status Ġ= ĠMutable State Flow ( GAME _ PLAY ING ) ĊĠĠĠ Ġval Ġgame Status : ĠFlow < Int > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ game Status ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdo Ġpair ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdo Pair () Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi . connect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Pa ired . emit ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi . receive Message (). collect Ġ{ Ġmsg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( msg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage . Place Stone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ place Stone ( msg . offset , Ġ_ stone Color . value Ġ!= ĠST ONE _ WHITE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġ_ append Log ("${ if Ġ(_ stone Color . value Ġ== ĠST ONE _ WHITE ) Ġ" b " Ġelse Ġ" w "} : Ġ${ msg . offset }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage . Choose Color Ġ-> Ġ_ set Stone Color (! msg . is White ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage . Game Reset Ġ-> Ġ_ clear St ones () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage . Game Quit Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage . Game Log Ġ-> Ġ_ print Log ( msg . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġselect Ġstone Ġcolor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Stone Color ( is White : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ set Stone Color ( is White ) ĊĠĠĠĠĠĠĠ Ġif Ġ(_ is Pa ired . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . sendMessage ( Message . Choose Color ( is White )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ_ set Stone Color ( is White : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ stone Color . value Ġ= Ġif Ġ( is White ) ĠST ONE _ WHITE Ġelse ĠST ONE _ BLACK ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġplace Ġstone ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplace Stone ( offset : ĠInt Offset ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ stone Color . value Ġ== ĠST ONE _ NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ print Log (" please Ġchoose Ġa Ġcolor ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ place Stone ( offset , Ġ_ stone Color . value Ġ== ĠST ONE _ WHITE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ append Log ("${ if Ġ(_ stone Color . value Ġ== ĠST ONE _ WHITE ) Ġ" w " Ġelse Ġ" b "} : Ġ${ offset }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(_ is Pa ired . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . sendMessage ( Message . Place Stone ( offset )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġ_ place Stone ( offset : ĠInt Offset , Ġis White : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcur Ġ= Ġ_ board . value ĊĠĠĠĠĠĠĠ Ġif Ġ( cur [ offset . x ][ offset . y ] Ġ!= ĠST ONE _ NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ board . value Ġ= Ġcur . copyOf (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ offset . x ][ offset . y ] Ġ= Ġif Ġ( is White ) ĠST ONE _ WHITE Ġelse ĠST ONE _ BLACK ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Game End (_ board . value , Ġoffset . x , Ġoffset . y )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ game End (_ stone Color . value Ġ== Ġif Ġ( is White ) ĠST ONE _ WHITE Ġelse ĠST ONE _ BLACK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġclear Ġst ones ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear St ones () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ clear St ones () ĊĠĠĠĠĠĠĠ Ġ_ game Status . value Ġ= ĠGAME _ PLAY ING ĊĠĠĠĠĠĠĠ Ġif Ġ(_ is Pa ired . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . sendMessage ( Message . Game Reset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ_ clear St ones () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ clear Info () ĊĠĠĠĠĠĠĠ Ġ_ board . value Ġ= Ġ_ board . value . copyOf (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil ĠLINE _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( col Ġin Ġ 0 Ġuntil ĠLINE _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ col ][ row ] Ġ= ĠST ONE _ NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ_ print Log ( info : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ game Log . value Ġ= Ġinfo ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ append Log : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġfun Ġ_ append Log ( info : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ append Log Ġ= Ġ"$ info \ n $_ append Log " ĊĠĠĠĠĠĠĠ Ġ_ game Log . value Ġ= Ġ_ append Log ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ_ clear Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ append Log Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ_ game Log . value Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ_ game End ( is Win : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ game Status . value Ġ= Ġif Ġ( is Win ) ĠGAME _ WIN Ġelse ĠGAME _ LO ST ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ type alias ĠBoard Data Ġ= ĠArray < IntArray >