all repos — tictactoe @ 94c3b37d6926933cf96c409f543bdbc1ad6eb62a

tic-tac-toe game for uxn

refactoring and optimization

- remove logic from drawing code (also simplify)
- remove ability to make move with space key
- fix bug where game instantly restarts at the end
(key release event was triggering the restart)
la-ninpre aaoth@aaoth.xyz
Tue, 29 Aug 2023 14:37:05 +0300
commit

94c3b37d6926933cf96c409f543bdbc1ad6eb62a

parent

e55541a27cea7121d3c09ff10f99ade46d647bf4

2 files changed, 35 insertions(+), 28 deletions(-)

jump to
M README.mdREADME.md

@@ -17,7 +17,7 @@ [2]:https://git.sr.ht/~rabbits/drifblim

## controls -**arrow keys** to move, **button A** (or control or space) to make your move. +**arrow keys** to move, **button A** (or control) to make your move. when the game is over, press any button to restart. ## licence
M tictactoe.taltictactoe.tal

@@ -49,38 +49,41 @@ &restart ( -> )

;on-controller .Controller/vector DEO2 init-game BRK +@on-controller-trap ( -> ) + .Controller/button DEI ?on-reset/restart + BRK + @on-controller ( -> ) - [ LIT2 -game/y -game/x ] LDZ SWP LDZ + .game/x LDZ .game/y LDZ ( ) .Controller/button DEI ( ) #01 ANDk NIP ?&play #10 ANDk NIP ?&up #20 ANDk NIP ?&down #40 ANDk NIP ?&left #80 ANDk NIP ?&right - POP .Controller/key DEI #20 EQUk NIP ?&play POP POP2 BRK &play ( x y key -> ) POP ( x y to addr ) SWPk #03 MUL ADD .game/cells ADD - ( ) LDZk #00 EQU ?&draw + ( is empty ) LDZk #00 EQU ?&commit POP POP2 BRK - &draw ( x y addr -> ) - ( ) ROTk ROT clear-cursor POP2 POP - ( ) .game/current-player LDZ SWP STZk - ( ) POP ROT ROT STH2k draw-move-at - ( redraw ) STH2r .game/current-player LDZ draw-cursor-at + &commit ( x y addr -> ) + ( save move ) .game/current-player LDZk ROT STZk + ( display ) POP STHk SWP2 STH2k draw-move-at + ( swap player ) ROTr STHr #03 EOR SWPk STZ + ( update cursor ) STH2r ROT draw-cursor-at POP ( ) .game/moves LDZk INC SWP STZk POP ( game can't be ended before 5 moves ) #05 LTH ?&end check-win BRK &up ( x y key -> ) - POP clear-cursor coord-dec !&redraw + POP clear-cursor move/- !&redraw &down ( x y key -> ) - POP clear-cursor coord-inc !&redraw + POP clear-cursor move/+ !&redraw &left ( x y key -> ) - POP clear-cursor SWP coord-dec SWP !&redraw + POP clear-cursor SWP move/- SWP !&redraw &right ( x y key -> ) - POP clear-cursor SWP coord-inc SWP + POP clear-cursor SWP move/+ SWP ( >> ) &redraw ( x y -> ) ( save x y ) SWPk .game/x STZk

@@ -113,9 +116,12 @@

@draw-cursor-at ( x y col -- ) STH pos-to-xy OVR2 OVR2 .Screen/y DEO2 .Screen/x DEO2 - #0e STHrk #01 draw-line #0e STHrk #02 draw-line .Screen/y DEO2 + ( top ) #0e STHrk #01 draw-line + ( right ) #0e STHrk #02 draw-line + ( reset pos ) .Screen/y DEO2 .Screen/x DEO2 - #0e STHrk #02 draw-line #0f STHr #01 !draw-line + ( left ) #0e STHrk #02 draw-line + ( bottom ) #0f STHr #01 !draw-line @draw-move-at ( player x y -- ) pos-to-xy

@@ -138,7 +144,7 @@ ( rows ) ORA ORA ORA

( win ) DUP ?&endgame ( draw ) .game/moves LDZ #09 EQU ?&endgame POP JMP2r - &endgame ;on-reset/restart .Controller/vector DEO2 + &endgame ;on-controller-trap .Controller/vector DEO2 #0023 .Screen/x DEO2 #0043 .Screen/y DEO2 ( >> )

@@ -161,14 +167,12 @@ [ LIT2 11 -Screen/sprite ] DEO

JMP2r &x ( fig -- ) ;x .Screen/addr DEO2 - .Screen/sprite DEO - ( | yes, drawing code does logic, i know ) - [ LIT2 02 -game/current-player ] STZk - JMP2r + !&end &o ( fig -- ) ;o .Screen/addr DEO2 + ( >> ) + &end ( col -- ) .Screen/sprite DEO - [ LIT2 01 -game/current-player ] STZ JMP2r @draw-line ( len col dir -- )

@@ -184,13 +188,16 @@

@clear-cursor ( x y -- x y ) DUP2 #00 !draw-cursor-at -@coord-dec ( c -- c' ) - #00 EQUk NIP ?&end - #01 SUB &end JMP2r - -@coord-inc ( c -- c' ) - #02 EQUk NIP ?&end - INC &end JMP2r +@move ( c -- c' ) + &+ ( c -- c++ ) + #02 EQUk NIP ?&end + INC !&end + &- ( c -- c-- ) + #00 EQUk NIP ?&end + #01 SUB + ( >> ) + &end ( -- ) + JMP2r @and3 ( a b c -- x ) LDZ SWP LDZ ROT LDZ AND AND JMP2r