import Ġandroidx . compose . desktop . App Window Ċ import Ġandroidx . compose . desktop . Window Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . layout .* Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . runtime . collect As State Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . alpha Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . image From Resource Ċ import Ġandroidx . compose . ui . graphics . p ainter . Bitmap Painter Ċ import Ġandroidx . compose . ui . unit . Int Size Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtop . nt ut n . common . App Ċ import Ġtop . nt ut n . common . Game ViewModel Ċ import Ġtop . nt ut n . common . I ViewModel Ċ import Ġtop . nt ut n . common . ui . Game Page Ċ import Ġjava . awt . EventQueue Ċ import Ġjava . awt . event . ActionEvent Ċ import Ġjava . awt . event . ActionListener Ċ import Ġjavax . swing . JOptionPane Ċ import Ġjavax . swing . Swing Utilities Ċ import Ġjavax . swing . Timer Ċ import Ġkotlin . concurrent . thread Ċ Ċ // Ġ éº » å°Ĩ çīĮ æĺ¯ä¸Ģä¸ª N * N çļĦ åĮºåŁŁ ï¼Į æīĢä»¥ N å¿ħé¡» æĺ¯ åģ ¶ æķ° Ċ private Ġconst Ġval ĠN Ġ= Ġ 1 0 Ċ Ċ // Ġ æľĢ å¤ļ ä½¿çĶ¨çļĦ éº » å°Ĩ çļĦ ç§į ç±» ï¼Į è¶Ĭ å¤ļ æ¸¸æĪı å°± è¶Ĭ éļ¾ Ċ private Ġconst Ġval Ġm ah j ong Size Ġ= Ġ 1 5 Ċ Ċ // Ġ æľĢå¤§ åĢĴ è®¡ æĹ¶ æĹ¶éĹ´ ï¼Į åįķä½į ç§Ĵ Ċ private Ġconst Ġval Ġmax Game Time Ġ= Ġ 1 5 Ċ Ċ // Ġæ¯ı å®ĮæĪĲ ä¸Ģæ¬¡ å¢ŀåĬł çļĦ æ¸¸æĪı æĹ¶éĹ´ Ċ private Ġconst Ġval Ġstep Game Time Ġ= Ġ 3 Ċ Ċ fun Ġmain () Ġ= ĠSw ing Utilities . invoke Later Ġ{ ĊĠĠĠ ĠApp Window (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġset Content Size ( 6 0 0 , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġgame ViewModel : ĠI ViewModel Ġ= ĠGame ViewModel () ĊĊĠĠĠĠĠĠĠ Ġval Ġstart Game Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame ViewModel . init ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ah j ong Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Game Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Game Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM ah j ong Desktop . front . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame ViewModel . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġshow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Theme Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgame State Ġby Ġgame ViewModel . game State . collect As State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgame Time State Ġby Ġgame ViewModel . game Time . collect As State () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface ( color Ġ= ĠMaterial Theme . colors . background ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGame Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= Ġgame Time State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame ViewModel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Painter ( image From Resource (" drawable /${ M ah j ong Desktop . all [ it ] }. png ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstart Game () ĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame ViewModel . game State . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" æ¸¸æĪı çĬ¶æĢģ ï¼ļ $ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI ViewModel . GameState . SUCCEEDED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Queue . invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoption Ġ= ĠJOptionPane . show Confirm Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ä½ł èµ ¢ äºĨ ãĢĤ æĺ¯åĲ¦ åĨį æĿ¥ ä¸Ģ å±Ģ ï¼Ł ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ä½ł èµ ¢ äºĨ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOptionPane . OK _ OPTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOptionPane . QUEST ION _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( option Ġ== ĠJOptionPane . OK _ OPTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Game () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI ViewModel . GameState . FAILED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoption Ġ= ĠJOptionPane . show Confirm Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" å¾Ī éģ Ĺ æ Ĩ ¾ ä½ł è¾ĵ äºĨ ãĢĤ æĺ¯åĲ¦ åĨį æĿ¥ ä¸Ģ å±Ģ ï¼Ł ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ä½ł è¾ĵ äºĨ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOptionPane . OK _ OPTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOptionPane . QUEST ION _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( option Ġ== ĠJOptionPane . OK _ OPTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Game () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI ViewModel . GameState . PAUSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoption Ġ= ĠJOptionPane . show Confirm Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" æĺ¯åĲ¦ éĢĢåĩº æ¸¸æĪı ï¼Ł ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" æ¸¸æĪı æļĤ åģľ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOptionPane . OK _ OPTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOptionPane . QUEST ION _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( option Ġ== ĠJOptionPane . OK _ OPTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame ViewModel . resume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTimer ( 1 0 0 0 , Ġobject Ġ: ĠActionListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAction Event ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame ViewModel . time Tick () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}). start () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġfun ĠApp Window . setContent Size ( width : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠ Ġwindow . pack () ĊĠĠĠ Ġval Ġin sets Ġ= Ġwindow . in sets ĊĠĠĠ Ġset Size ( width Ġ+ Ġin sets . left Ġ+ Ġin sets . right , Ġheight Ġ+ Ġin sets . top Ġ+ Ġin sets . bottom ) Ċ }