From 03240c46559db4b5a2293b06da3d679f8fab1d2e Mon Sep 17 00:00:00 2001 From: Carlos Ballesteros Velasco Date: Sat, 22 Apr 2017 00:58:30 +0200 Subject: [PATCH] Improved tic-tac-toe --- korge-tic-tac-toe/resources/main.fla | Bin 11489 -> 11499 bytes .../src/com.soywiz.korge.tictactoe/Board.kt | 5 +-- .../BoardMediator.kt | 33 ++++++++++++++++++ .../com.soywiz.korge.tictactoe/TicTacToe.kt | 7 ++-- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/korge-tic-tac-toe/resources/main.fla b/korge-tic-tac-toe/resources/main.fla index 350cd82600e8913ba0733ff0a520e9c09559a4ed..d89ac5027f25cc61fcc08565aec442f180aa60c3 100644 GIT binary patch delta 2288 zcmVW{p_g)007q`000jF002Z!O+;^Fb!}yCbS`*pZ0%axj@m{T zzOU4G7)>v7h4GBXhly|`jxEw|vI?6fy;>Q205`@)wpo@|eWX4`U#$PwhGoG9FKU`* z3l|8+^B?E?PYkWzyX#)$F6Sal(Zf6llh+T4Z{t~-E?zgAtAEu>S!qfXPn%R#N%Pb7 z)ySQRxzq5&By~bp;GAkp5hjY`MPs43(Y*OE2_&7>#AxiepQmxO483j?M6r#3P_q|C zE8k0JHZ~Z1o(X?COKr?7_~I_(7}UD;=OXY!VPgWqCc)1lPW&jeF;zHhiiML#@i3f3 zHf~GFs2%!qCw~>F+r?-RIO!yc=QjT6hhDTwFuKp_bBd93FFZ6}Z;6U+h!_e*m<#+FIMev8VIci=23+a)zUOZDJ2Z{hvFd} zxgr!p53KYjenyw6yneSxfo*aFAFrZlVdIGtB;w%Njej#0N!7za?94^m&AxBxKC7!w{6}_0(Rk(-}1MPJhr~dWSanfU-tgQ<>GHZNoGMIZeJ_)lH_d9_#kG)uqg8 zYkf^KRNm=Zgmg$Bzxn<rV->2$3_-kbiExtg>>e8DPDp4z#xEf_jBmRv}i? zOs%F^?HtoBckCG_+)rgTuBQX5X}aaQnzJ#z6ld9~pTgNjtX^BJXKoJKr~;eLc0Ar{ z?j^5QT2!FDbOxn!Q=3o-xz@)01oF9q2!66L-whcVipAlBEw3xNp5QwQ(dy!fuIzM2gv#ueHLqQ8Ysq1 zY8{ob!v|E8ZN+JcPi2oX?+=Uq0tNm!cH;FAj`VHj8%S*!CH3ttl>@at_8*>0meXEm zv?vAF5TYwo$0%LP21eOW7j?Kb&r_w9#(z$j$kxV@75*mj!}L6JGExM_=tKd?t&0z5 zSn?03)LO`nDoFu1JtuX}w5W$57v6m6+}*q%-QM-ux9z+Bb*JCE8+{zyE#hbaZ6E}Z z4?UX9na?(LS4_d~-hTBvjscplAzuD?b%yuOw!GCmh?*}Da$hgR42Y{N!U*Teet&7K z!|f7cPnf)b5F?imLtiAsG>u+D>=I%SV)R=Hu~xHoqnXLbdfTIoa`R}XoH5Co_2)G6 zy@2&;>?~%!3qAp%BF=(L>wU5@)p+)+-tO`*^5-RDPP22r^F z?PrD;~=rEtEOTUBcwF<1!4OFZ3%6aE9N1zCF0GOj_l3c27k61XC=A| zu($LtU;t?~OYRvmg3VRM<2A>@wMHv(V}Fq*k5?f_rnwXIY58bcH6ONaVqXUDNTjJB zPIom}jsriL{RA{oyx!9we1-{c7Ple{1^f0R?nfE&X=fVc@@9|{CH zP!eSml}LePVCkds75%ZUX!#jA?X?CBdw01roFSLN>|wF2@*gf#EsJxL`Jd7^JP5R110hq7)Nmu587_O&9cKv|>sh;vLd`oorxk zX+e<(5CEk@{JB5(-TC|g8DgVez!t8TEMu{$H)}H|e~*rV@O5x}8l|(MB)WUBh_$Qcaq=z5^K; zMTJhKf;C{pqvWE^Uc1y55ipN|wz5Ch82=5`UZHavTMp^UFD0<(1`ZUU3@BtMhmC-4a*ZT;-2 z1pololiVmy0fCb%DMA6XlWr+M0ojwUDJ2|63~(XR0002e0000J000000000000000 z00|G1@F_n543jV_KLJ9Ma4J3lMw729JOTNW>?%G2(HWEB8xxa1D=z}j80Bvb)WpsIPWl&261^@s602BZe03Zbb K0P80J00019DJf3? delta 2317 zcmV+o3G(*qS>aibxqr!(Inka400599000jF002Z!O+;^Fb!}yCbS`*pZ0%axZsJB5 zzOU4G7)>wsD#kM&A7+JD0t_uuvKuYg?)EA&_5kksfNT>&t3FbnqA%8eY(q#e;Gk}| zo5Dqe$MYZO`%g^T&buoo@fMMYb95htarXK?3v4{g^ZDymYk#?1DoagC(rJsTDrtSX zx*T~k5xEyZoaJup30zWbDB?_U{bVc@FNs?BlTgxGEsVyl_j#Hoi`efaVUpVT2etTM zv<&=wW@CfF_n8Q$v)snaf(LJrrl8hM5Q#8|g^dXan}k1$Gz*g0##G_3DHU#>q{DcU z*tjDlqfQ(|ZhtONuZPh*bn{7)MmGK!#D22OFuE)0ONxt&M6Z9H+qOzgb7c7LZL+xK#ix{>I3#q(y*BnU;m znu{Ml3_&T!Q5~n-9bD+${@{Y?U3$R>lwEW*m01q$7^X2OY0CYoZZefQtk>sOk20&H z^)<~O{vO};~V|;r-WF7$cbl2*MDACS-sT^u-;Gy+SqhK{Yos`BUaN) zt)W=$6w@tl>>J12ud^fY-RQs?nr?ZX=B`bz#aVIc$8fe5t2Y+wo9lx%_FKE<@pkJ; z@@nT*1$vUspmeTl6N(|%+PI%VK6eqpk2aROAtOVv*nP3#btyMgjC$_eMUdINs#bEY zX@9buRVC5JdAg8xW+M>_FPEkiD|^_NGA6Ph?91qf^`nK>5q&AGQ=62W0fm)vi_s=COX|D=e zl!I#s(G{v=l&@q1qdZL)O}MpAQ>C4!ZhxG~*2a|;{yGWb{4{e4QUu26L;=XHsxK#4 z@(-xgp39CZ%KmxGExyaIQQpjekwJ zokQ#qlNS(TX$MUZLECmU0Z7r*LlFaIKcPGgFx z%W+Ts7$*OIm1OBcoGH+SaBgsBQGZ4W=<3%k%CstNv8v%fSHJP$Kvh(|NUOvk3fKSr z#QNn+@Uy|Hfh)8+usTkD=Db0OB*givBLR;mExeINHc=M$rdp);-t$)TziS7*S z4gCukK-#UEdxnBweO2*r&9QT>(ayXynCIEURmg#9?#O&vKbr2F58KyiAcJ=#@;r#A z+Zrs!VUW#!0-7XUJ<*_iCo>1C_KkwyAXDg!LaD2kq~Q-YJ-Zi72e^>(+q41Ofm6XOmGS7?a~57k`N5R5IYkFc2Va3)qJOK@OBeSwtmL zAQ@QtsC-3#tSef6MoxRJ0mI&1?hI$hWibD~T-8M+^LxVzR28|o(Ov9zQF^gjpzC@o?J(eL1a}(ua75^w1<*m^)fhfI6#KjsAsT+>lMpcY?{s5%zp_afTj(zKFjT>?3NH039CZv?u`>tu*QOj zwYD^AjDE2iEP-$`?)&%x4e(~M;Zo>W@zT7iLcOg7A0F@Kv-Rvz8(Dt({N?Fs8jvep z0eKTN0MP~5pvk2+vKRL^(cWHk#y43GU-N${@1i>nT01u==aHhSZU*n$`Sl!O#DA(% zDl^kxxhZJbb%74Z1vQFSoi(T~Z50`?wKwpc2}Y)F{*Il|2wxu2UgjH+fl*ZGR4P~l zR{W4$blGc{+9Cqx3DDN|=NjX`q1r2SZezzGT{(s;_b(u?Ceg066MuXa$l0@CSFBGT z9FTAfPxlGOJN*MtO9KQH00IaI0JHTXO9GR!Cp)t|C2|6j?I-XF$(1?Lo&^8^kdx*p zP6BoYlbr?`lTRrq0;vX*&;}Kgjwvbu&Xc(*B^*LZab(f}007be000vJ0000000000 z00000{tlD+DL(-LlR7Ft0XLI+Dn0=_lesE90q&FbDn0_n8I$c97?VybDgwnDlk6K9 zlaebc0iKh+D<&N4)_}kS0ssJK1pojR0000000000000000I498&>$F-7c43k;UWM4 zOi4mgK~h;SQ^T!oVsC73AT*PkEG`T%B>(_zX>Db6d2nTuTP!LtZzTW#Oi4mgK~h;S nQ^T!oVsC73AT=&{ZER3W1qJ{B000yK6aXLv007}900000{B}fz diff --git a/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/Board.kt b/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/Board.kt index 3cfb1d7..e163f3e 100644 --- a/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/Board.kt +++ b/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/Board.kt @@ -49,8 +49,9 @@ class Board(val width: Int = 3, val height: Int = width, val lineSize: Int = wid val moreMovements: Boolean get() = cells.any { it.value == Chip.EMPTY } val winnerLine: List? get() { - for (line in lines) if (line.chipLine != null) return line - return null + val out = arrayListOf() + for (line in lines) if (line.chipLine != null) out += line + return if (out.isEmpty()) null else out.toSet().toList() } val winner: Chip? get() { diff --git a/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/BoardMediator.kt b/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/BoardMediator.kt index d612a93..c24b1e8 100644 --- a/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/BoardMediator.kt +++ b/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/BoardMediator.kt @@ -2,9 +2,14 @@ package com.soywiz.korge.tictactoe import com.soywiz.korge.animate.play import com.soywiz.korge.input.onClick +import com.soywiz.korge.tween.Easings +import com.soywiz.korge.tween.rangeTo +import com.soywiz.korge.tween.tween +import com.soywiz.korge.tween.withEasing import com.soywiz.korge.view.View import com.soywiz.korge.view.get import com.soywiz.korio.async.Signal +import com.soywiz.korio.async.async import com.soywiz.korio.util.Extra var Board.Cell.view by Extra.Property { null } @@ -19,8 +24,36 @@ fun Board.Cell.set(type: Chip) { }) } +fun Board.Cell.setAnimate(type: Chip) { + set(type) + async { + view?.tween( + (View::alpha..0.7..1.0).withEasing(Easings.LINEAR), + (View::scale..0.8..1.0).withEasing(Easings.EASE_OUT_ELASTIC), + time = 300 + ) + } +} + fun Board.Cell.highlight(highlight: Boolean) { view["highlight"].play(if (highlight) "highlight" else "none") + async { + view?.tween( + View::scale..0.1..1.2, + View::rotationDegrees..360.0, + time = 600, easing = Easings.EASE_OUT_ELASTIC + ) + } +} + +fun Board.Cell.lowlight(lowlight: Boolean) { + async { + view?.tween( + View::scale..0.8, + View::alpha..0.5, + time = 300, easing = Easings.EASE_OUT_QUAD + ) + } } fun Board.reset() { diff --git a/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/TicTacToe.kt b/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/TicTacToe.kt index 2a07185..712ad38 100644 --- a/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/TicTacToe.kt +++ b/korge-tic-tac-toe/src/com.soywiz.korge.tictactoe/TicTacToe.kt @@ -57,9 +57,8 @@ class TicTacToeMainScene( is Game.Result.DRAW -> results["result"].setText("DRAW") is Game.Result.WIN -> { results["result"].setText("WIN") - for (cell in result.cells) { - cell.highlight(true) - } + for (cell in result.cells) cell.highlight(true) + for (cell in game.board.cells.toList() - result.cells) cell.lowlight(true) } } sceneView += results @@ -91,7 +90,7 @@ class Game(val board: Board, val players: List) { val pos = currentPlayer.move() println(pos) if (board.cells[pos].value == Chip.EMPTY) { - board.cells[pos].set(currentPlayer.chip) + board.cells[pos].setAnimate(currentPlayer.chip) break } }