From bfdf3ad573dd3e19c7a6ee6542841a78b915e018 Mon Sep 17 00:00:00 2001 From: talksik Date: Sun, 27 Sep 2026 10:29:40 -0700 Subject: [PATCH] implement basic game --- .gitignore | 10 ++++++ README.md | 6 ++++ main.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ screenshot.png | Bin 0 -> 5750 bytes 4 files changed, 110 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 main.c create mode 100644 screenshot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2428d9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Emacs backup files (e.g., filename.txt~) +*~ + +# Emacs auto-save files (e.g., #filename.txt#) +\#*\# + +# Emacs lock files / crash recovery links (e.g., .#filename.txt) +.\#* + +*.out \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f27faab --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Typing game +Simple game to type words from a default word bank. + +This is a demonstration of using `raylib` to create a simple rendering loop, handle input events, and manage game state. + +![Screenshot](screenshot.png) \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..4a7665f --- /dev/null +++ b/main.c @@ -0,0 +1,94 @@ +#include +#include +#include + +char *word_bank[] = { + "hypothesis", + "science", + "usurp", + "conditional", + "passionate", + "orion", + NULL // sentinel value marking end +}; + +#define WINDOW_HEIGHT 500 +#define WINDOW_WIDTH 700 +#define CHAR_SPACING 40 + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +int main(int argc, char *argv[]) { + char **curr_word = word_bank; + unsigned short curr_letter_index = 0; + unsigned short wins = 0; + + InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Typing game"); + + while (!WindowShouldClose()) { + char buf[2] = {'c', '\0'}; + size_t word_len = strlen(*curr_word); + + int k = 0; + const char *key_name; + // process queued key events + while ((k = GetKeyPressed()) != 0) { + key_name = GetKeyName(k); + + char c = (*curr_word)[curr_letter_index]; + sprintf(buf, "%c\0", c); + + if (key_name != NULL && + strcmp(key_name, buf) == 0) { + if (curr_letter_index < word_len - 1) { // next letter + curr_letter_index++; + } else { // next word + if (*(curr_word + 1) == NULL) { // wrap around + curr_word = word_bank; + } else { + curr_word++; + wins++; + } + curr_letter_index = 0; + } + } + } + + // render + BeginDrawing(); + ClearBackground(WHITE); + DrawText(*curr_word, 10, 10, 20, BLACK); + + int x = (WINDOW_WIDTH / 2) - (CHAR_SPACING * (word_len / 2)); + int y = WINDOW_HEIGHT / 2; + + for (int i = 0; i < word_len; i++) { + char c = (*curr_word)[i]; + + sprintf(buf, "%c\0", c); + + Color color; + if (i == curr_letter_index) { + color = GOLD; + } else if (i < curr_letter_index) { + color = GRAY; + } else { + color = DARKGRAY; + } + + DrawText(buf, x, y, 50, color); + x += CHAR_SPACING; + } + + DrawFPS(WINDOW_WIDTH - 100, 10); // top right + + char wins_text[20]; + snprintf(wins_text, 20, "%d wins", wins); + DrawText(wins_text, WINDOW_WIDTH - 100, WINDOW_HEIGHT - 20, 20, GRAY); + EndDrawing(); + } + + CloseWindow(); + + return 0; +} diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3e16786cb4cd9b7ded71a57778f2589b9d8994 GIT binary patch literal 5750 zcmeI0Sy&U^J zASeO~1UiXfNa#@<&aL=ldc` zjg@)%Ps@0(dXEqK1R;M(=rbEVrX8fsXn5B41NO!){P$}vZ+)M#`@7w_)>nGB=hTal zHx(BWP9ZtRBQ$Swt71h0LAtVz^=1r0N|v7 z?jFOunSpdpzJkDk>~_+hVg@>~v@U?q9sM-lOuD9ObqaQxvZL+ z%j{EH18AJ4o~+i4=u)rBi+R0hojmLo)(H(CqkRJeEP6uL0Cy-9k;0IyEG)(v!wea! z!x4!@zUUjDG`VC#6Iy64K$79QB_^SrADN+~#YU-)zL61m=3$ytJdJXKhk4DaI9ie< z1$daw0*)ZK);n=?kYJCjuAAl*(#-?90>muw92Q%E^p5PlpS95;fDNb6#n8C%M*~q4 zu5NA&_F|v&KF_7x12Tz-O%5BH!UyTd=EJD@iGwBT&;>kMCdC$*;}DIx_vjd#RGdSh zMMU#LBPjtN%7#lbv_V(A0Zov}YpfC93wsIj`FeF|2Ze%ybLtcH^mLMh7%Ub$?eE!J zoFKlc=PDmViUrKt>KHDyz}(9MHgz-NG`k@NU0IpPWydBcc;-~!IS zkV6s>N2h(xsD=(T`pggF33{S?hWZv#Vf(winl-`fy#B?tCwd1w8V*kn++lFL2vc_{ zRP*UhE;O+|#>d;6v+(S&PU6C4wwo}!2h4_~B^;E9k2}}JW^f*h3&Lchn~fWZiTzBS zsz3gs85Crm%RS!37n!~1|2j4ooqP^!RP|N5mwV~Ea)XEW?RHCSbmF-l) zVxgA*y1hg#NdBCb4E;oZmZzkw^?sRZ9=be*Hx6A+&Bc=;KtPOpb@~Sq;flPuRwCqE zMt^F@YuaXNb%P*>j*gC# zYnA%gAv6w2(=?|v+cb1A+sUIQ@~T~6tCG$|H#aVq%a}1P5BFVeL_p(1971fKXWwNY ziHF0IxDEwpGA%s)6q>f?%m<&cn=BcqED2A42czLlz~>NFkM zm;Pkax-;e@H&q7lAPG~V8xhWS2)NjT80=o-s0iep{c#WHk{dBpCUJJm{nVCh zS(6ZZy22IRl4;-p#Xc2zC7`_sG5t&@??&^IzL(CeO%Yo>cey+3nwb@{cn^onN`#l) z-AQa^*26zKZG)IKJb$BnQ;<*&QydZ>G%co&M5v7v=r|INm%QR;+Urf-c4ZiPIoTDT z$=DA2)A`!mq@hB}glhYp>>dgZO1RvDq&+s7yyfO?pmmsNBNaJX$!2~hXfI%qC={xv z3~FX9T23;3kQM1Dp9E_$v^@VTrP!8|yd4C3NL+q40Pxbo`-OqY~kx zAb+h-P2~--6y6^(}Qiq(6_908^JW99`}i~3;b�+fH0 zIx&7Ybg{sk!R*1?C)ovZ6>!_qpZR?Nv$2oKd5VyhYKAO*cy@B_dSZRRESUwP3B2Ls z=y&!x`cRDT;@xcrN`xof-R)kw(Vjd|0{2nvyaQ&M+1$hyjYCD?;OO0!N>9>65z=?N z=b;x~%oPG;(JI2C2E$U;f+srczC`TV|G%T^cg!T6^<3 zHlfw3EXuRgKP?tK}a($h&qP#Reftn(hU8@H zXaKrlXyMVckM^H&li03HHJi-phwa^531S5iP3elYJPQ zvWx=w{LBLVp_mF9N+%hTxsfJ%Wj+(1$D*$!^|B1CV8YhD!zG;>>_? zz;KERA%;!7YCr6AeUt4akjwqOM%K$SxNp}h>#|?fJGW-MNmY(d=rX@l6N+Xk>==Z) zz-W%iatKsf5vZP@JQ0{hmyeJvRaL=s*Y-T53wmro-Mcg91Q2k1_TJe8B#9&+%HY_O)9qBSGJh;G#-u68@)s#XQN!V)r5GYpxMF zdg1+UnM63y5W)lt_S}rXyN*XkNrn7Jysgf5B`64ONfc`pC68BWQA^h{)rUaJg1J<% zN*Q>*I(A3{Fe$jPe2ccp3-<16A>m`QV3}!I;adGtT%1R~emH@uDYh1#eM9|oD=WU0 zXQNb@I2TguHZ#!Mb7pNy@x>eRW`D2%4fy9bB3d)x>P?}69<`zDve@d+pFf|8?+;^j z1H&)WXm`@AjgOL}xa!bc#QSL-lQb0qOi#mdD$Cw^sat4o%>;$=j*0V<&Hb`7nFg zeW1E94jXT~HpR!0zN5R$t$L1XRe{Auc0VjxDRLZ=64Y}*|E|5=&bS3@5MNVlT-qWlAcQQI|DrfrikD6r1x5V0y2g#1U)KPw==BB|MIa;U$Qocn$0f|CVFqSBaEwUo zR&lgHU>P?=>O$-TntmCUphD3kp3Ua}?nzgsKimqOxPK1-uKOwi-~G4;NZIv8+q$|U z#kUOHKidfggQ*n$T&kRGW&1h!(qP#7l*jo>E!q=h{SbY#X6ak1@m%p+k;VN1u<6w; z9@wD#&O)&XGxo_?AstV9nv~aGd18WlpNBc3gEPc|`(9APZ9O^-C|{h*Sh`T5I2CH$ zw?Qc*Y5}2aQD~!GyW6%su`rmX1!QdY0}U(E_uF$MxpnAM#1*O5VzFQQhZ zmVLrmkoCvUEi{oXMv(b99Xw6Obl5fDBdExQqiUOnbW(D5WrdlTj9uD-K`57u4E41o z7QQKbv|{JSx+m#vF|gC=EqR4NN^!x;*oz1Ldo-|vMI%yQg1l%qBd0CV1n_A5nZDPA zUb|D{vvzvv`}=c;HNpOV+%tC6;6RCzfKdBVIlKwB6XCA_WOy@%qJwxLt7j}mr~i2b z05Tw}XE=jOZ}WY3!(}TFuD`m#-yaD7Vle)NczvDn&-3`JU%vWf^;`VkD77Nugq4Cu zYo$AGic??~6)b$oToCCd z#z6V#`%hnup(Bl-_T2 zLb;EPFCLD$r6sQZR3W{}J$Q-&1^?qYN~I4Q<~YX;;Hq;7(#CHY1zeGZzC_ zMtquPMTvpi{;7cmUVEzYEUvU#Y9RG?hS88`E}Q;iG4cIl@B1EY%y`0PvkOt^wIO## zd5b;UI#+&%d=UVB%=5!X8ADpJtTzEQ)nYCAMv@+*P4y@Ar3m^O+?Ig^1A274&|;s$_6_(|+ZnO7|BD%bny05ibVPK186> zRutO?0!r&MVtIt2Yl6Q`%P={*Dpl}NK!nG{Oxy4OvsKYn&NxH+X@qT1`|6MxgB@pY zH~Cu158)ew-PfA`?Y{mNy0Cq41CSE@H&KPjbHRVnEz`V~z#qxLxzi4(s($+I`hNjv CvrB~l literal 0 HcmV?d00001