From 680ad15b25e20f1183c4860436075f4af511c8f0 Mon Sep 17 00:00:00 2001 From: xavi Date: Fri, 2 Jan 2026 23:16:27 -0800 Subject: [PATCH] Redid everything --- c_projects/tiktaktoe/Makefile | 2 +- c_projects/tiktaktoe/include/gamelogic.h | 105 +++++++++++++++++++++++ c_projects/tiktaktoe/include/tiktaktoe.h | 25 ------ c_projects/tiktaktoe/obj/main.d | 2 - c_projects/tiktaktoe/obj/main.o | Bin 3840 -> 0 bytes c_projects/tiktaktoe/obj/tiktaktoe.d | 2 - c_projects/tiktaktoe/obj/tiktaktoe.o | Bin 14256 -> 0 bytes c_projects/tiktaktoe/src/main.c | 4 +- c_projects/tiktaktoe/src/tiktaktoe.c | 78 ----------------- c_projects/tiktaktoe/tiktaktoe | Bin 25000 -> 0 bytes 10 files changed, 109 insertions(+), 109 deletions(-) create mode 100644 c_projects/tiktaktoe/include/gamelogic.h delete mode 100644 c_projects/tiktaktoe/obj/main.d delete mode 100644 c_projects/tiktaktoe/obj/main.o delete mode 100644 c_projects/tiktaktoe/obj/tiktaktoe.d delete mode 100644 c_projects/tiktaktoe/obj/tiktaktoe.o delete mode 100755 c_projects/tiktaktoe/tiktaktoe diff --git a/c_projects/tiktaktoe/Makefile b/c_projects/tiktaktoe/Makefile index 678e82b..7918112 100644 --- a/c_projects/tiktaktoe/Makefile +++ b/c_projects/tiktaktoe/Makefile @@ -27,7 +27,7 @@ STATIC_LIBS = $(shell find ./ -name "*.a") CC := gcc INCLUDE_LIST := $(foreach m,$(SUBMODULES),$(m)/$(INCLUDE_DIR)) $(INCLUDE_DIR) $(TESTS_INCL_DIR) INCLUDES := $(addprefix -I,$(INCLUDE_LIST)) -CFLAGS := -std=c99 -ggdb -Wall -Wextra -MMD -MP -lncurses -fsanitize=address +CFLAGS := -std=c99 -ggdb -Wall -Wextra -MMD -MP -lcurses -lncurses -fsanitize=address DFLAGS := -D_DEBUG # Main Executable Filename diff --git a/c_projects/tiktaktoe/include/gamelogic.h b/c_projects/tiktaktoe/include/gamelogic.h new file mode 100644 index 0000000..634210a --- /dev/null +++ b/c_projects/tiktaktoe/include/gamelogic.h @@ -0,0 +1,105 @@ +#ifndef GAMELOGIC_H +#define GAMELOGIC_H + +#include +#include +#include + +#define ROWS 3 +#define COLS 3 +#define TOTAL_SQUARES ROWS*COLS +#define DOF 2 + + +typedef enum{OPEN, X, O} squarestate; +enum turn {X_TURN, O_TURN}; + +typedef struct position_t{ + uint8_t row; + uint8_t col; +}position_t; + +position_t cpos; +squarestate boardstate[ROWS * COLS]; +enum turn currturn; + +void print_boardstate(){ + for( int y = 0; y < ROWS; y++ ){ + for( int x = 0; x < COLS; x++ ){ + printf("|%d|", boardstate[COLS*y + x]); + } + printf("\n"); + } +} + +void init_gamestate(){ + // init cursor pos to 0,0 + cpos = (position_t){0,0}; + currturn = X_TURN; + + for( int i = 0; i < TOTAL_SQUARES; i++ ){ + boardstate[i] = OPEN; + } +} + +void check_game_over(){ + //TODO: no idea +} + +void update_boardstate(){ + int idx = COLS * cpos.row + cpos.col; + printf("%d\n", idx); + if(boardstate[idx] == OPEN){ + if(currturn == X_TURN){ + boardstate[idx] = X; + } + else if(currturn == O_TURN){ + boardstate[idx] = O; + } + } + print_boardstate(); + check_game_over(); +} + +void update_gamestate(char input){ + + switch(input){ + case('w'): + if(cpos.row > 0){ + cpos.row--; + } + break; + case('s'): + if(cpos.row < (ROWS - 1)){ + cpos.row++; + } + break; + case('a'): + if(cpos.col > 0){ + cpos.col--; + } + break; + case('d'): + if(cpos.col < (COLS - 1)){ + cpos.col++; + } + break; + case('e'): + update_boardstate(); + currturn = !currturn; + break; + } + + printf("cpos.row = %d, cpos.col = %d,", cpos.row, cpos.col); + printf(" Turn: %d\n", currturn); +} + +void main_loop(){ + int input = 0; + while(1){ + while((input = getchar()) == '\n'); + update_gamestate(input); + } +} + +#endif diff --git a/c_projects/tiktaktoe/include/tiktaktoe.h b/c_projects/tiktaktoe/include/tiktaktoe.h index 4bd394d..ea6bcdf 100644 --- a/c_projects/tiktaktoe/include/tiktaktoe.h +++ b/c_projects/tiktaktoe/include/tiktaktoe.h @@ -1,29 +1,4 @@ #ifndef TIKTAKTOE_H #define TIKTAKTOE_H -#include -#include - -#define GRIDSIZE 3 -#define HEADERSIZE 5 -#define FOOTERSIZE 5 - -extern const char game_end; - -typedef struct w_data_t{ - WINDOW *w_ptr; - int height; - int width; -}w_data_t; - - -// gamelogic -int start_tiktaktoe(void); -void get_input(w_data_t *board); - -// render -void init_windows(w_data_t *board, w_data_t *header, w_data_t *footer); -void create_grid(w_data_t *currwin); -void draw_board(w_data_t *board, w_data_t *header, w_data_t *footer); - #endif diff --git a/c_projects/tiktaktoe/obj/main.d b/c_projects/tiktaktoe/obj/main.d deleted file mode 100644 index 0a34ac8..0000000 --- a/c_projects/tiktaktoe/obj/main.d +++ /dev/null @@ -1,2 +0,0 @@ -obj/main.o: src/main.c include/tiktaktoe.h -include/tiktaktoe.h: diff --git a/c_projects/tiktaktoe/obj/main.o b/c_projects/tiktaktoe/obj/main.o deleted file mode 100644 index 6f31d6b451620d542880001d86ba5f8c3fe485ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3840 zcmbtXdu&r>6#s6!u|db)jBbd?1aVv@93Ph0GhXQdYu9C|%JBmPTim;PIW_anplEo%xVe-e{- zW_|7%&9T|53pEY-<=ZkZtd*qpLZ6=9Sr!v71Rg-hmFwLTW85}6oze#}+9N2bAw%KfU zCM6E5-Wh5g!&t&CwkYDa4T*mXP(*}H7g=JYL^+>GX|-lktyn%s_TZA_bl;*`F9y!O5PN*Wi zn$6|{UY^B(VSpzV9*AQaCWVlrd6fj54n7oV#j{KbBum)|aq(>s`~YzHpd{m~Br$od zrgY@6c@O{)ebbQ#iRM>4L*Lj(3>&yR)B_ti(&eBRYrzk z!zZZFps8hWu%d{TB@JQWys=bOpVSY|2ifYRhwsA|-G^sx+2t`hnAO*8x6ZYiOs3*u zt0~MfpI`R+t$tU%U#|BzI+@if`(%&R<#GARZgF~ju11g5?ee*0zoX9TsB=2%tu0tC zEVwUFa8HbY=k{GiMj;7;ybd1XvycQq9%qkuc!j|4;CKz!;{4E@;COK@Nod`~_;Ead)`iA7QQ$Xl zte$^d$4#7vt353Aovj=f3;b@5;Ytk)#qa01oNKX91LrlM@gcErgLoPzGy0ah{jwdj z->c|4vb@d)+30r${LEM_`(kVIYEQj8#iE0NiI5H3_z!UkbFIc<*2? z?im!lq8RQo$md>!}@qHQa;sR44gQpK(QWtfmA9g@)lzo zz!R>qUG1|OU@n1R17hHFXanyU-NwY zdqpi&m-In!lC6##;Q49}Z80_k98Q%Oev1>deh?BC>Ys2Q82C*wKaU?sasP?=mmoLV z`dy2%f6^e9@@f5|)rK(E%Ig>L0ps5(_%EcGkDPdS0L417DG)qgY7yrz1)S0H^}Nu} K>SVCR{C@%O;gWg) diff --git a/c_projects/tiktaktoe/obj/tiktaktoe.d b/c_projects/tiktaktoe/obj/tiktaktoe.d deleted file mode 100644 index cb06b98..0000000 --- a/c_projects/tiktaktoe/obj/tiktaktoe.d +++ /dev/null @@ -1,2 +0,0 @@ -obj/tiktaktoe.o: src/tiktaktoe.c include/tiktaktoe.h -include/tiktaktoe.h: diff --git a/c_projects/tiktaktoe/obj/tiktaktoe.o b/c_projects/tiktaktoe/obj/tiktaktoe.o deleted file mode 100644 index 2e7df795530a8020b7f26d3ef744beb0f8dbd817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14256 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 diff --git a/c_projects/tiktaktoe/src/main.c b/c_projects/tiktaktoe/src/main.c index 9ec66c6..4436b68 100644 --- a/c_projects/tiktaktoe/src/main.c +++ b/c_projects/tiktaktoe/src/main.c @@ -1,6 +1,8 @@ +#include "gamelogic.h" #include "tiktaktoe.h" int main(){ - start_tiktaktoe(); + init_gamestate(); + main_loop(); return 0; } diff --git a/c_projects/tiktaktoe/src/tiktaktoe.c b/c_projects/tiktaktoe/src/tiktaktoe.c index a91d138..a94ea1b 100644 --- a/c_projects/tiktaktoe/src/tiktaktoe.c +++ b/c_projects/tiktaktoe/src/tiktaktoe.c @@ -1,79 +1 @@ #include "tiktaktoe.h" - -const char game_end = 0; - -int start_tiktaktoe(void){ - w_data_t header; - w_data_t board; - w_data_t footer; - initscr(); - - init_windows(&board, &header, &footer); - - while (!game_end){ - get_input(&board); - draw_board(&board, &header, &footer); - } - - wgetch(board.w_ptr); - endwin(); - return 0; -} - -void get_input(w_data_t *w){ - char s = wgetch(w->w_ptr); - if (s == 'w'){ - mvwprintw(w->w_ptr, w->height / 2, w->width / 2, "x"); - } -} - -void init_windows(w_data_t *board, w_data_t *header, w_data_t *footer){ - const int board_size = LINES - HEADERSIZE - FOOTERSIZE; - - header->w_ptr = newwin(HEADERSIZE,0,0,0); - board->w_ptr = newwin(board_size,0,HEADERSIZE,0); - footer->w_ptr = newwin(FOOTERSIZE,0,HEADERSIZE + board_size,0); - - getmaxyx(header->w_ptr, header->height, header->width); - getmaxyx(board->w_ptr, board->height, board->width); - getmaxyx(footer->w_ptr, footer->height, footer->width); - - box(header->w_ptr, 0, 0); - box(footer->w_ptr, 0, 0); - box(board->w_ptr, 0, 0); - - create_grid(board); - - wrefresh(header->w_ptr); - wrefresh(board->w_ptr); - wrefresh(footer->w_ptr); -} - -void create_grid(w_data_t *currwin){ - int buffer = 10; - int hline_pos = 0; - int vline_pos = 0; - - for (int i = 0; i < GRIDSIZE - 1; i++){ - hline_pos += currwin->height/GRIDSIZE; - mvwhline(currwin->w_ptr, hline_pos, buffer,0,currwin->width - 2 * buffer); - } - for (int i = 0; i < GRIDSIZE - 1; i++){ - vline_pos += currwin->width/GRIDSIZE; - mvwvline(currwin->w_ptr, buffer / 2,vline_pos,0,currwin->height - buffer); - } - -} - -void draw_board(w_data_t *board, w_data_t *header, w_data_t *footer){ - create_grid(board); - - getmaxyx(header->w_ptr, header->height, header->width); - getmaxyx(board->w_ptr, board->height, board->width); - getmaxyx(footer->w_ptr, footer->height, footer->width); - - wrefresh(header->w_ptr); - wrefresh(board->w_ptr); - wrefresh(footer->w_ptr); - -} diff --git a/c_projects/tiktaktoe/tiktaktoe b/c_projects/tiktaktoe/tiktaktoe deleted file mode 100755 index b06a1b86e8d75e25d3fddebcfe79a044b7c9dec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25000 zcmeHP4|G)3nZNTUFBwQ6f90Q61`CQ+CVzks(7=QwI8i`EP_Wuzl9?n^l1w@?A( z2)n0e&)Lm|yzhSB{r=tW-gn=9^WOVzZ(P65aJd8*w^%I*8!A>5ziw#XrYit`Q6pyJ zxJWD%xxjNIO||E@91_rJWum6WDg0FoKx}6R4oiek-|yNq^id4 z@OPTdklVBNDwG~!g9X}uhE_R>O?R!5>)tRC7U@nb=FVvQ2G~e$pO)LFwLPct8`9&zkmd;$vP)Bh=Gqk-w+f?Q z3=@spUBV^tX`oRtG|uhBTZTUx4wC<3&%vi#Z~D#+H_rc;8!7FEf#2;wpYA}9I?%u9 zKwszJ&w2;`%N^)P9Q1tHfxp3l{;v*tHapOvMtJdOFGoR`Y}{$?dF{-=FLj{53wp7b zC;G2ZLVP|aG=0cM7r~}28-n3TJkl0TBqQ-H8|ph^U6C!J=8lL62HQGgUBN^$6i)_& ziq(NJln8YNqg~M?gk*hJB%X*uxHFpQ3?*CIgDvfmmYu;}HOvs}PEva~l8m$@$p%_` z5|Lo26>bFMkz`N2i+NRRXQ-ni))K4~WGB%Q=hk?nI|c_kVxe%2=xvL@nuv6Td!t!- z3&%3ixvRH39_>o@iuFw!8?O~zk=|2T6UkUSQX`4_&IiC!X96QM=bu2|o+wmw+pTPC=+ zbi7*STP`-%Z{2)t+1~3|3|(EtUZMF9ZBp%Qm+@mZ`mqYd zC-iyE{9a9;W22wYbgzxhdMfO6ZLh{gzfa?S8-1VFzs*Mfv!?H`(b+EV^DtDr6_gzt zzFPGUgCzF`3KQaxh0c2dYCCM9&tYc3qZax+3;mddey)Yyul=O`2=Aq-nb%LE)7qRZ zI!<{YP#?H>EOb4kWK)rauD6hqKF31mwVN8e7COa(%VGS=u_4I+YxxZ@cg#}1IImqLG!6KxUAeY zoHR0r0|QTbo{$~SEdMFUnMMDGW8r*1YJ|5_+t{%T%Ax~=(^4^ZSmHk*oR)~OVTtc2 zoR)^MMI2HxN#z{FspVX2R)IA3O0L z2#c;Hyom5)5?@O=o!VoECBBMqI;F>kC0<21oyud6O8i5F(Y@F<`rEzYhh0-R6D* zD^DiR!BDw zPqYG0=2&at{DyIP@~^*kJ7h)A(yf7k+FQUW0;%66X9Naocfq;LIqe{&TM(;*W(62s zH$5@#FZ}R})^VKljkSSyD|Do3MS2W>;-)7g{t-kZ{S*!gue+{pYu%P>19u$X2cE$0 z2Wf43SKM`@cZvSY?XRMsnuDqkuf2w|g(P;VrwB6H~>Hm19xA3lCQQSy)V7Oos z1^&YO4hB*q1JCCTjJRu#6h3%h!E4;}pZ-Ou9rPEZ4vf4s-*x!N$<(M;hS(ekz~_;) zJ7B7ii93f2?;E+?UHEsy3l1T$V0k)yS5}E;;IG@rRlh=KIuGmBrF!~umcbZg9V97rU|1ek?HEP}1>eXr zkb;3>Q~HrQU~!^Xu^e^O(VAs25JEV6N+8s%{<-7>gPJnm`ZFfr0Vy#sjBy(Yqz>7J zmIA28_JkVSU!=D~ieyroa8)~vvCu?gB|u?;BpfH@XdrcP;P-h02i^XfU(>97n`h;V zC$-T)0aPHG4m~`soWq%e=`fo98N_4{=}b7|9`-6@Y1Kn#W4BK|-I*#L99Qf-5q2rX za@L)x;;IRXN7J9dq5QwlILY>F@+svT&Hv^rx-X0xo ze1|rEqm9RL1UR9<8wAEma23`w11H)UT_u8Vs#!Sb_XJuF2co~cZtGU;OK73=-k&;j z@nKiv@zW0Ids+boba3lCgBy;k4Z&=X2To>^w`qSIW~$>QaP$rB*QNq2$*$pxX^lkS zMkc!ijHdg>y^xDG&Bq3Eq45pZz{lTk72f+IwpgQ$CuN+@9gox5`c=+;`3s!lbpj5L zUvbr`>U25`YjrYuCsgSE<8>9f-o2oQ*3Mph4a6CJ+ES; zvWLzSXO%L_v-BAy<~$73b>#Gz|D!hJI7fcN3~E{b8=!n*?KW?!z)qEZOrR600!{kH zuo2btqa?Z8TxsR$_#^QMk^NmG`%4BbZc}9{0#gx~iojF^rXnyEfvE^gMPModQxTYo zz*GdLBJlq+0`!L3U$ZRrF0JxbR(or_?U4{(E?iaZtzJfi72f7pC>~z5!n?9sF|@{F zcw=%^%>;M)CSYfeB;qaQ$>`2xXlF7O@wJGyP-i5Fmny}FeCzA0@NoKE_hn(Ir56Oe z&t)=u0f&xdGW~$5=QEjM!21D@0e&5jUW%&vZ6>oA@R}F#`vc&}SSCYnK&&~AC!BzL z@f*a~0QUnP0;Iz4?6_{(EL?p>u5%0WJVR(BI=z?Wfz1nvu_2G%Ex?x*LM+2y|FfA) zH|dyJv~K2{D+}{`J^ft+_+ZPd@my$S|&`>lZAc4#L% z58&@hXit$Hmfv`woGfg)$W z2cD~O{$2>LIm$9eL;mK3zXPKC0xH^^c=NqXjPS#>hex4X0V;>+jcybT#7W)G-)`*C zx1s#a2HUfK(?IfCOr-VqE`0Y|q$_-%#ov(dHx5NQFicPDk8SAQfy!bnugQY#<1o6OMJ0bgqPtYUPwm%7YlzsZg-(t58OHpuhXzq!(AHQ zt>Nc1{ECL()9|2%zt-^g8os4ruKxICmWCHsNUf<4f<0 zy_L&-RlZ7ZRYleEikix$V)CZS%E~JF)vU6p=5I=WLgZz&Hh3v;L+r&-@qbiEu4GD|xJYjx{nmRv5+Aevo9UX(yi-i-u2dGrOM%ayxZwwbpAxN}T=u!=VG ze$_^XavsLPC^NSKn0FK1E$eKm2qY@52gH2bs*_*DDp$6Gn`9Gyo3Zt12k36)ms|Pe zR(`paUvA}>+mL?ERDMalZsi;p$T`nW9P(en!8l%WIY8llOcmphYtDVtI)FpbCQx#z zR(vJ3y<~dHzmgyjcYbLc_0s*s=blkSil%)Y4Kt^I0aY<=9_od;#P6B*G1QA>y+GuX zguB>y44~{099-^#X>Oja#_eG3cb`Xci&1rvGFLAhh$M`6aEPe(z+~+UKm9U^zjQGHM~y^?J*ev76* z84IXyC76ZMHQPZL4}$-XhKxiFG08||d*UM6IU<(^pwc1FP29jpn~YXobdh%z8nq zqw%M*1j?pI#mao@ys;-NW=}s)Hi$~if!12x+771?(Z~mOm6qrB6fYoL=FYJx}YLo)B~L z=-e{)#Khc(iOG~_J)g+($4Dt_QhameIq1H%|8|pn%hTw-+f9nMN1dU!`k`i_$j@J$ z@5ahz6uTD9EX{Y%KX-nyt0b>zHqI#Bij^(LC)Uh$&s>#%S^moWi{>_!UXHzwX(cw5 zl9+$at+Xj}nW70_aTz|Blv-e1X0n(IbXE+rIi`Tx1uoLtRBFtD)@61|ZlTCu;30*1 ztdRH@8B*S@G}d5`G#wf}6Kv$qA|BZpQd^)qV)YYi=BW{xIUbQh ztpXh*6-A}cNI@xB7nYg%kDGbI$Z;7JC8k+xUi6UZHrAGya~=U)Rbsk~^=0N2tIbP2wPu0gFELBn z%_8FWe8Ma?7MGfZ8Yv+}wLD@P#^N%f=NeTdfQHdol55nLo)M|c*j_6Cm;KPFD8+yH zfWyMoX71xXJ!bwc(@2`Lx100Hy&0Zurn^?@t&yg-nTyC`u5nwDDSf!o%zs#moKHQo ziquaONoGY{Up5=pn}(kf>zS>7d`$)2uA zZCj)(5|6e34aHm9YgM`(?~=B*aI<$wA{nl2f$Wl2WUPoLk-nlf6b>VOMnWI~Nt?H) zD-mt$iiEwi@kz8J!N+7IYLuBUvg|GGp}5i@1!d}z?1L=P8w`h%p@?BGGUX=|wo-h{`M? z(~L-Gn|oSYDGy1oI~lj6ISI!@y+P@^xV~v)!`0V|^7dF~q`WT~kCjsgB3;Q~cRcn{ zBw|UFx5UDca?8WN@|N+o@j%k^K?*z`4WcTt4Ze25CpJ>iIeIbrx19O2=G2yrr^b*9AuMa#fHIhDoRU#Wf zFE-{1`~9a={-v0Mo=*|om?@5WC))V5su7G+ul^3sjaF z#^ib$FfJ4y&JTE@=D);&-|s-b!GZoaL^rU*;lOMCJr4YLfKKt}JSUo6>~`S)rlijh z_Kp2x4*XARe*5PAw+{R+86Wmy9MZmIvT<1rI?aFkJoi9<5yoXN?IbMaDhEA5sb@T2 z7K`LS51lW3=g8x`6Z|ypoCk)_qt83&e@xP62>aIl0O(#eW`WN-=y}J1KOYWEre_i8 zG~aj|#kU3WYKcWVnCNK^HU*K`Y30gbg=PKLO%2(m37nNkLWQe-urUx^x4CXZV=&OL zSp*xlZ>-zUR4;;8tiO6~-TL6w>(*V{xFxuyZteO;qzzLE!E_ETojXfj@ccT@)TEiC zvSRkMSP{B}BN^G%xKxI5!9>!qFkf3)qs&}oNl}%}`89#TlG-X5v}V%sb6zY;hNUxY z$*g9!L}bBWI1vlBhq}TtTbg8B_R6FXI`Y)5C4qP#UYHQU$SFl`Xpa6ObU<;*pLJ3FumPN0Kxm*Pt&M z>BCW;N4|JWE)2d%d$2W5udB6(A~O z<*RLUu*<@5k(RfyiSN}Z$_`rt%Q1PGgZ!+uisNzHgtg229psO!Q}WN*1Z=3F-#P3w zl6*9v