From dc21e0bdcdda9d3805caf7e0a1f9847e7103b2f4 Mon Sep 17 00:00:00 2001 From: Utsav Date: Wed, 4 Feb 2026 14:39:55 +0545 Subject: [PATCH] Added vim keys --- snake | Bin 0 -> 29568 bytes snake.c | 774 ++++++++++++++++++++++++++++---------------------------- 2 files changed, 385 insertions(+), 389 deletions(-) create mode 100755 snake diff --git a/snake b/snake new file mode 100755 index 0000000000000000000000000000000000000000..2c6b574efdcba10864c725f83965192f32ffde04 GIT binary patch literal 29568 zcmeHwdwf*Yz3mxxH4wf>r(P|I8DiGNM%qWNWX8-BkW@66;#GF)OwrFg{mn3KlO8i z((@Ec!*+O5m8YRD?pPQxhG@wcYg7coEuUOf8~xFADUZVw`2aix%E|Z>gyWY z+UK+{m_KL!yu#L|!V;mEugar(r|kpjZssN0RQxDyUH|IjGqb)lY599zPtT7&&XLs7 zuRjNQG=Vh<=)XxoKa+s|NdmeX0UNDcilY}ld)f)YX!4&=Kp#v%|55__wF&$=nm~Sk z0{YJq(6=R^PX^tKpFKST!f5q%CGhjn1oGcZKtGp&o}a+}ss!>sPC)-O0ev>;Ui|E- z3WU+>yEy?plz?6U|Mh)fEyJ0hUiU#Ln~i7eCMB)z``>H&CP~-hX_>H-$;M2R^lO#c z641$xOUcuHE|R}|^ICsZuq9Yi*BT18Y+k#fzNs;|Ik2NX$o&4AhNeb;YbekX^81+( z9aXR~(A?0<8k?$u^??qyyRtqQXkoisg4Hd-)>^hZP*qh)AQWoxH#M?gW7Y1uMpoI@ z(&}#whFDE7)DUQISFnQxDqH;xfo8TF4CvK0)`k4dfw~sf)+i|ryP8|-8biBT<&KtM zU?}U>DG3jSzQ+*Q(Z)n;Tgh#>3+9qM4wXy{QRRo&bLahw01zE7YF2q^_ja956 zP+#9vi5g>Ut5h{^2*68}*wh>Xqq05VudZth)Yt6^GEsgt11H!5gMqfzAcJNj)hXDz zo5sTVM5vUx8`hLBU*Rt)ym}tf*^oB}GN^i%W{H)#Um9 z&E@M>tp~5Duz2CZg~dfBS8JY7DJGSoqHBv5P)j;6&^qv662^W*U`cqACn1+CI0mkS zNg0w&5^@qx0@n##_Y1OcEBXvQkLY>w#NqofoO4#KXl)bfQt1hNJ8(*5eYN5de(kO+ zA)n0lDw=cc&7eBjeG2z|bq@Fr_L$Pw^Ap{VPpg})SIs{(eV?NDZJ<(y=Mft3UN7k| zj?#xyuZ5m6OlGGobT#D^+%p#XM2mc%g+9eX*Y_tqck``ub-xkadf)5&km%}Gm0GG^ zbdS7f21!OgV5LQgZPjFnpG z=@z=rLeH?!H(2PI7Wx(oJGmA^a&=Fv8OF`y+$E+w}np6Zk>89^vg97 z@U(^Qwa_nRFGb-0LGb&;kCr;?~5Z%e~xe(D*I0h{5at>MD}+J{D*|o(AfW&z`sj44T=571pW=eX(;UP z68OImPLGcMeFFb7;WQlgHw*k92&W;kf4ji%CY*-G{tW`(LpTkI{iOnLA)JQ7{vv^Y zj&K?R`@I6+K{yS4{T_keLO2b1{Y>B+38$g1f8bLPrr$`ohwwguFDINHUHzv8ejVX7 z)b)1@yo7KX;`$#G_*I0{(AIxU;8O{wA+5hl;1dX^p{#$Oz;g(vA*{by;Aw=@(AB?P z;10rR$m-u9@bgQ6(@@o43Y^-v`1j?Jmp|)^{LU9XJFsDMS#fvqi@t-4UqqwD$DF`M z!(erxd&+*OpaUFS{1y!O4)WItEF21rLDzTyLew=<<9+Ta`$+D21tI^qkiX`;1ZIBf ziwyXBK3MAO8FKoJ7kn>&8p?x#24%n%@2hrCSvjmv{_R_QS1C-kU0vY|FTN3y%ojNq z%Jg+EUILr(F$+M7RwDK<@GTHDZhL;%U-(hVs)up1*IxtK3fMp`rcEYmr=m~%cRUWX zRH5IJXqiIqm*`T3eo>+e6xuG)c?zwQXt6?Xk?3rNu9oObg)SP2&H?%?-7L{uG>-5w z{J!T@*#(eTtf;f>g71j$U>?Pv0^xot$>Dys7vylaapX7&MSg+W+ygV=vI|Cd?*)Fx zOI=+rKCeu9BYWTXMcVqRPnCU?#7^;ibPh_sgJXVx$CR&gZC_^@B*;jBj0|;z_Tu6` z^zV=g5A6=!iHrNtvjS@gm4}B~+=m_)SaWDwc&OQZ=$is-2;CMQYH%O=ioj|^H;0F6 z-G{y?u$s{L@KDX2FuXLhDm+vf%8A`h9vLiFN6^7y0fNaaww0ih#cm?VS*)C33X3fx z*uY{7qgNwPu@YZrS)VW5jd6+r815&T`TOI8BQN+OzkV7ev*_>t5|2j>()dO6 z_6x|b0iim)_oIeTk^9-Qk7Nj6kWEku0rbsJ5NJVvhGu-!S!$pZ3F7k6Mnew>+b1G?jB0^byf_8 z`!G97t2{FdAOq$m8lfz+4o^~AOiQ3@cUk+MNierKuc?=jw4 zHaJ{xxX-N$9x&@cb`Es6{jaXB+hiAw>>W}CN=1|z9&)<(|0iNVnM1UJ5gu~5_sg#2 za3A^zEQ~#A;UOcmv_A?=Sa_<`QQb3?R6RZJuIBgw!X%M~qwv&nL=|DEjx2Zde}5EB zbfv$k7;C5UIuYWGo}oMvzgWxtR5$1hGOkEZr(=4Y4a8G>BaYZ2yY48yCQ>$o7JlFB zL$jYM8>o_Xh*AgnS3D$PUF5%y2ke1v_kkM$(NSkyPaW@6^zu)r-*W9x<0r%IDl1Gt|(E$xBeLd-CP!KuU7(db2Pz56kZJn_(F zonvZ21h0*FuM#g^xXi1F4s`ZVJieHtPq_ErkE_fcdXBP5f*LThhaRCUZREK3r<&PA zLd_wlV~HxVhxQ>G9=hGVpBB`VIn*dJ&F=kcRpt<_zr#cI?)`F%t9Ku|QBZb<#)XG= zx(_W9SZ!!ic<6JXg8n%`MIb2H1B*QF{g;~*1l)bEr$5sqkjVaS_x?{+gNi%S9e&9J zsrO8pFywXb|1Xn5hQcouLF$xA6H-O){WMBQ2c(o2QV*Fl?G#mJSPCNa;2-uIoup%! zEgXu~4zm||L$_Jk@Fcdz!Y&Fev$EkrtSI^jrf0FMh)zv<9kBlMD6}g!wkwv~74vk( zGP`1FU9ps|SW*|pyw0)#$i4iL?7XDokVEXc1#lJUM}LmThi~>MvKV=+H#@r2R3&?U zq->&_4H^U3tRw43P;meK7vClvoKXW`kW0n%Zvl={Y z8RiBAuEzUhIbxqGqd}4NkCVO29IB2iEPMZsc~BTK4J<4hxMM0&bP?4Dy4$m@A|Q06 zJq=5&{|qiPmQs;Ed3Sb$L1VELcnSjHy@M=tBkCx}jqiQ;yI0Y;;fp+H4jV?daoXsn zapT}}10#a_DH;y$p06Iea!mN}Lz>b=4Xbl<95KC@!^n-$lPbqZMGhlBzJ^@o*z{Aw z$WI4F=Yj9)Nk)%g_klO@NT=I`4bPZpWJRI)nGHZ~esBZ15{+!|#xlq!(~!>NvG%Uj zS=BhEx4^}-)Ol%;s{N`<<6-HX9_*qT(Qf-WrId6JKTV4ItErF#=~U; z2KB<>Cv<1UVCUKaF@Y<_s!6m@WVy?95pGQcBJQ-)5Qx5xD9QN_#Y^`*sx;<_LUOp` zeY#ty%Ji8X2bGD@ojv5czN{}ai*lwcI#t_vqL|VP%Ldz0L?4Nb6H3-rXnR_;fSM4f zXB(tOv;a)$r-||fjiMeWDzYHB%vN&6R*QmggWZRx3*|@nmrs-t{<*10G3;IlzhsD~ z;cz2UZ)y9!l)%7Ak4`b{b#Cww5hWWmn?m=H_y#O;h@7Fx65l}WLga^Re9 zii~Kc7EHu-yNnW!Xu+STLKV@@oSxrh^qj}z^rf$U{7Ix@AeyB(?x!|lGITyka|UHE zK>B-j;Wb!X0vT(VW@xZGS{?n83aPjK!Kz zlKHsQlSMVZK620}2HxQ%39VIENz-yAC7g%BQ_%@{9EmoG%^;I%0}t$F_ctXz?RWU?7yiA(aXNb`N%2Jh|xcg8*s0))Prfq!In=kj2+zbDVF(@ zp%CejQZJfPc|z)fkos>(C0V4tX-bU~QYaa=Q23ZXU{$Vd?G;k|qdBscAH-;|8$9U4 zD!d|!=!)kob?y<>qn_i7RM1w+LEm3s@?n^S-y|)4oG$G?pzKz|Zg{9Mw2QV{4*Xa& z6~9X{XG%}|^h80<>M(D_jt2sqPP-7*H2;mz7RcT{7TSx@o0|xI2{sXg^1ovAj+F~P zQL$(k^Q(hn(kK9?t9#%Z8tKE?G6b>rFkOhE%F&wyLpnhlPMDte7hq?NdI&T3jm@26 zRO(W?6oE?-xDY5t81#_lX&dg6^n^vsfSazLvdKFt)zG?Habt@#YwtU^35rpOI z*Hvs1avRnx+v;6*!?N;qOT7hK=dPQ{Zdkv5rT2zqYs>N}4#q_1^(O(x;^+BoJU#$; zx-T9-1Nh=w@i^_VHvBFgpGPZCz|DYPI~$LO0Jois$LagJu6N?`Cjjd(m3{^AJxrtr z0pG?%KM&!q$2w>p;ODXC+zj{#HU&a}2DV}D19V{0{siD#fUf|49lJb(fIkP!!_1sx zACLZiU=iSEz=_!F3;|No-%J^MHZr5#V@%9Qadn|=qT>ZH8$g|Akl@M`TK9@?-{t|1 z`%OGfo4YK_vnp%cjqdc_u6=CjgzK-mdfHTy8;9Sm_$BIn)P=oBY z<5!IMtOhiBj#VgK@{fRgEBNQA46W*{V$mM3qb#%KOU#=(M^5FpjrMF@K2#VBP00x zO@2H0MQCUGZr#*(rkVDSfIbE7Up#_8+vGn@`sf!GBkXT5?VkZZ2)<#}cU&;}L!hrh zfBNkR{nt(YIP@Qme%3vLf5PN10RLOy&$9BX1zWVw7VsYff1#Bh8s@iy|04K!g)&_K zmSO%8@cY0|l1ok8^xv+WQvTu9gh=BQ z9HXEH$}EenmlRAJMY>mI^!i5?$LPapN*-lc(_N}y?KgdPNQpiqr=-irdlyk3kc22+ z#t8g~62$uufonf7g%!9@@$ogAz_s7P`2U5A{`+xz(eqV5Sf$`+6s%TomxA{wc)x-V zEBK^>FDUq`g6}B!k%GzDvgEM}&QNf^f~yq#jDpn)?o#j`1@BkzVFjO5@C5~5RZ!Qn zZ-dOqzqNDXFX&R(4J%e$=Pkf0Vy3tFn!=L8VsA-N$^4??qN^ERf~gG=*)d*If3x&i z>)$A8+kkcGR-73^`10?e6HIpAFxDwnOe8g$x(lBPGdI4#V97@E8|Zd!B1}o**a2bQ zO|ap(HlrLQ*GeJd`W0l79Vxeilbn>2Ou&_55HOPeQ}8%GmIRU0;xgYg^%-==zSUt<9 z{|0%KF`G(srCb1*o{~gmB)OBP0rSj5o_XF!*6@6ctHYB*jBSD&exP!QrCI=ir(Xz!uUJ5_GWC ze**A|yh9X_Px+*z)NRn2DvY^O1IS+?@_DIm!@x9=_oiNe=yZ{vostcAXQUG1O36U} zN|DbE=uCRB=1 zma|#%+D)Dr2zpS3Lk_ zKIq7NT1&9B09<+3m^Gb*&>DDh2W%``|LiG3hIM$PLECh8Cc4)WF;%iSF0ujcGLMpuSn}DJd_BA~_0B-p>qiLpu)F z!rEjIo-rO*aWw}3v*&i5gvi`@ZQncIDh>*rzK!0F}QHz4# z4y0JteG3Bd17m?iHanV8?qf!_bQGo^hT?tFbdEAT9Ah5_(nN_L@B$D9h05a zad=JEF2&s`nauGsXn)-jMV6Zf)?G#xMJhXAiixdGWR0VH;J$-SjJezJ=vYp;4({&} z{r#j@D#%?yQurCwmm;*sn64s(Q0_5GWNoSt%00$HiEL+S6CI4z7@gF)k;E1)pmB5x zp6jB=)fm%Mj}vjP)fKOG(6gjY2W`899w&8%TNT67u7MBhj4xbHcJY*j%an|x9oq6b z-8;63kggwT`KFPUH)^zsO}G{XFA~-NaI&--kpR};(bg9kh01RcjYYTSc^OIx=pO^(LN>u^MF{W4plxtef#*UZ;JdaMbB=WI2@eEmDK=yO3#8gI*P05j6l8BWkaj$%+>-!nhlA*vvnns`**e z7#MakXCr3$6NrIPo_`h8sj2$~ubNYlBzgku__|)DxoBEDXEiRyq`bYVBtj_} zM>oP?)&WIcDyginjv151156ChbLmZp;Y!w1=ZBP-ag-UHl|$Jvk2$lh%Qvp)3)9PU z9ayP33yr1YK}#pnmE+5E7mYU{n8fXZT&t#Q)#Pa`J$*^KGmEj5Od+0hyy~&o**WO2>Uc6rPU4T_e2AC}ego5qRyR=}}g? zL3S`&%n;S}6u_-XC@ve$kF=NruRtM>hrP%5y0=V`M0tGKx#bFT%5G z>{t;2MZ<(U*KlT~r>hcNq&AKg#^ckC3fw;vtR>}h3cM_8kBGp;VK)4;uw{TIrK#2d z6E()tsSu@6#6ZZ?!IY*h&o-uK<)(KT>4%ME=ah+4s2mSmn4+2w1D;n@C|$OmtWQ4L z4}qI1s--ws2IQj(({fQd)p>f7u_Qem9SOY$Z9sLLk&nR7h2oVXO;T4YP?b_$O?I@I zCJ`2f``=Y2S#--U8VEAkpCxK8EKt2?n_@!S+FEl&NQ7fLAToG`qA#c_kzaGo&Nada zYI-fE6&y>b)yNx$@t3Sj0w|aEhLD+pfduiuZ$5qwV~WF_A_jVKSpk}H6ESYVh3%l+ zPP*`MEY+cJ((&B6`kYSh@T(r?8DZ`W@kw(zcP--Ci#V_5)0iX4`8FQ|VBE-!T0V6R zPd&%eYIyoFj`MJm3|EM!J3cptbC8Pv=Cyb$87xkA6yHPS*`K)K%yG;yc!u-#E!=&abH~hFp0Q14 z3y>|A*}~!M++1!<m!~Y^V-VNlJmnGYT;p2GjeLFu8sY@cJ;_s!^IQ~noR43_Q+jK7>MriN zg}ZwBm1KSkpG=^aFQH<#U@QkX&OKZCD&(9$;aRuv)MGNLu0o!*nxiMA)bKpVs$9<3 zl5VnN?r`X8c#iY-<2=oo^9Xf^>B0-d%pD>#nP~Q(P^;%`Bad=~UpZ^2?UP-valV=- zm)Nhx)A&S0o=S3gxqClPzMJ!{C$@6q7+<}FDmg(^a)L0Hx`v~>%_r#x@KhC5o4gf! zIjGhts!ZlCc({i=ObwBT(}ah4FmaaW!9?$Bo+*6gbGZlIsh1a!l`Z^oX)Jpy&wNLk zNFfu+5Af90d@`B>T8H_>5YG$oOp&2GZ#B;easD7TPV%dSvsusZiPB&OfwMfT#zsi3 zRpDO5Gj8B1CER%hNhZ6h0nkLAWLJ%2YA&Dbz&&xr-TcZfK4uZWKE#*Z&C9y@)r)v> zi07iM+PLv3U$lfff6YB}sV2hC78%Q4p0$-<(IRgIgk!e~Mjir8#l6Zi+PL$WC|P$w zei=GpF3&s1vmfP)&+)wDeD)%`io59n?oo}yGfoJDtNArWJpDEF`ghR2TghVfF`luX zMloLzPd&~TEaIuXdj-yHNU=y=eovN zoE(3QPdvfLx*p|Ou16g+a(SBT9TL2%h&xYw$c+;e`BdBsb9q{rbM(chxY5DU?c4`2 zl1}9*-4F6iXImjpxrQ4BdBW)2Up@ypKfbliY7 z9r6e|^E^CpG+lL5Q4F7_SdD)`V(Vs3{bvhkLN4PTRw& zeKlTjp<36q`o#xp{^q9EI{IV{aj0voZ)$30@~l1_xQFuT+My4#+e9DW=_B)0)FGpD zBp2Le35hs7Panyrj@A?5QPmQk>#<6l&^H`W9O2hmSJN1*@>bU3h`^da1A^Tg#0Ptu z)>ok20{G&Nl`Y$}nGM&+RH2ILGX|UM1C>xEm;Dqf(%hv^{j01ER_-+05L!VT%7?EB zn;Kj7iG2-d2NAuS%h#=3f3rU2Pj;IT1)^12(EU`CSG5Fo%Tk$-dLNE5^iw71n;`Fs zlB?|-`rbJWp|-~0VtjoVY^kdR8fdAkT`W&b_0FkbqM6&7I>^w!ys4>PA7^Numw0m- z;vocOgUdq@sh22MM8oL&gbqGbbn~1d=UaJRf^^a+cIVuwFaL+2dgj7A+YI+>B` ze9^&-R9n%9dE$UjXyg9P`{^ zuM)ttdQ^E@tvc|Q)03kF706fgQX8FKVvxLkpQ^QPM8?3|(Tq)!LjFmp`epb^X$QUe_>G!Le{%vGNt1rE_Av^ZPbho10_X=nug5>Sn4TGSMX8%*r z4V+B+5LMikMw6$VVuOug_V}Ymqt7kMi?Td^?cVpkft1DxH?_xFO#XFia>TQl@&4T=B zc2*~#Hw$_uvv2Ov>z>i<(5tc0=qEwQnOeP1^xM*HXjKiTF@^+21^5fj-(fyCp(?SYPKhC_DCT{O#I~x=-c!gJUWZ z*!e~RI_*%87SD5_Q#|eMOK*w1+Bpj}l29)!(Di$0&B`J=bK`xcqyQD^C%9(AzJ41> zuP`W0h5*IQz6U!~(4~y^x+VeLpMZXcvTuJaaS(J5#yyXUr!M2m3GBo~+%nC7KR}Q2 zKT06~OJ!f5->U8ZM#yI}`*!8q3GCpsvr*e?99}4l){YAj(8~oqli9cIH`9v=wBwNN zKH9G2^-jn`ssi<(dv#?j@E##=A*k#_%8vbA#*>O}->-f)ft@#%ynRbOnm|4oyF=8k z>~GLAK%aWCn~Y8s&T(LG%rlZnrwNaCzICavKT=j;n<`sE#f42c*g3GH&L0ZYV5S<{ zfm5&>H-S2QAhti$;IE`3u`zr1S2g)->YH}Z)H~FK)2jn*n7TDJG}i}1!K%Wd(Ix2A z=sJI(r3G^>%&J;wQcv^Vspb3Ys-n$YND>$qaJ20kLT7R_A{+Tl|}viVqJC7lwX|jok*Le$EDW8 zwl6x`+vMU@?!R^lx}Jw8DoL-~G=J2p{(VlWMj$opq3uhpsZ!Pma*4T z9_p^Sqgv1>%xfXLQ@CLfD0!MYI`_!K?EO`(P5xS({Z0qnm#>EuR_T5m0 znAatY>W1867!g~wEY@mv$83vY3=37V#psy(L`rl&U<)D<+wb4eiu3g8tbVcBR|}>Q zZi%(OHZXc!)Y1A{$nH5U`bU_wEI0lB&1+YvF-5KoXt>%K(YW`YW3la?>M` zqGgpXSH6h^3rcki3rm?NC zxuvN&*b?esg(hi7TOIx(mAWdthop^)W+nt{1Ne6n3adIAVN}9Ui{$LWW(Mu&2r-5D z!E3=ky+8^o*IXYWi}>da3PZF2FQkVMcuivHC=AxB$4+e(bTy{jTDH7=4m}WszI<>= zeVs=!frh$D_|OE)xD<-wq-pd*R)~k9*t9FG3hrpDfnEUrbOY!Tt!u1q()qv+++e#j zhJR2dsPl-P&Jr12+r(QMYwEH0)jG;^{eMWJ*XelIi8ZTCG_R+mVX44|FM2+&DL7hY zgnpOO*KnE^R1nj|5osAP13z6peWFE4L-omnB;rc4)@N)<3QEHPp*$Out03 z`%lwq%%;rp^>@)4(rbQ7m_~`RwLZOur9|H#l87#U9|aRhL;YQ~q+aZQB^dM#v)0$& zEo(^o9+b5IT28}e@aUUpjqC5CH6%VI@}Fe1|3ss7Cw|l>THpLG8(%z7a;bpp^0mIM zKkcWG{&EsV(%*S&sJ{y*efs3XuK!PyNP1qYp!(cHb46Jug3LeSXVv#AJq^2U z9mZy!ebuJlr@mj-@a8;gX%|hq*@HHHy*}4af8VdI*!%ytl)jF?UXN;+Y4cylPuqLc zrmy#ZG(4#V6||Rs!lr+^SPE)*#&k^5?dAUrWb620|M$qeQq8>D%l{QP`1V8GLnNg4 z<@CS%WiLU-)oH}}=_zyCI%;;;Ls*3+64irF$ueNCgs@SFNw%C*WB1_1{%QmHvRKDKlD6Lpn{@s;~D&&Xh`d`}nE# zv{|~piKhM6`v8MV-(zckuU1r$`X`lNWTR_+`~6F@lr*FxfpuPTpvf3a5T@3J{;L)rfZLO49} literal 0 HcmV?d00001 diff --git a/snake.c b/snake.c index 9b9da3b..d3d87c5 100644 --- a/snake.c +++ b/snake.c @@ -1,524 +1,520 @@ -#include #include -#include #include +#include +#include #include "snake.h" -void print_usage(void) -{ - printf("./snake [color_directive] or [print-usage]\n"); - printf(" Color-Directives:\n"); - printf("\t-c Cyan\n"); - printf("\t-r Red\n"); - printf("\t-y Yellow\n"); - printf("\t-p Magenta\n"); - printf("\t-w White\n"); - printf("\t-m Rainbow\n"); - printf(" Print-Usage:\n"); - printf("\t-h Help\n"); - - exit(1); +void print_usage(void) { + printf("./snake [color_directive] or [print-usage]\n"); + printf(" Color-Directives:\n"); + printf("\t-c Cyan\n"); + printf("\t-r Red\n"); + printf("\t-y Yellow\n"); + printf("\t-p Magenta\n"); + printf("\t-w White\n"); + printf("\t-m Rainbow\n"); + printf(" Print-Usage:\n"); + printf("\t-h Help\n"); + + exit(1); } -#define COLOR_NUMS 6 - -short colors[] = { - COLOR_BLUE, - COLOR_RED, - COLOR_GREEN, - COLOR_YELLOW, - COLOR_MAGENTA, - COLOR_WHITE -}; - -static inline void init_all_colors(void) -{ - for (int i=0; i < COLOR_NUMS; i++) - init_pair(i + 1, colors[i], COLOR_BLACK); +#define COLOR_NUMS 6 + +short colors[] = {COLOR_BLUE, COLOR_RED, COLOR_GREEN, + COLOR_YELLOW, COLOR_MAGENTA, COLOR_WHITE}; + +static inline void init_all_colors(void) { + for (int i = 0; i < COLOR_NUMS; i++) + init_pair(i + 1, colors[i], COLOR_BLACK); } -int main(int argc, char *argv[]) -{ - short color = COLOR_BLUE; - opterr = 0; +int main(int argc, char *argv[]) { + short color = COLOR_BLUE; + opterr = 0; - switch (getopt(argc, argv, "+rgcypmwh")) { + switch (getopt(argc, argv, "+rgcypmwh")) { - case ('r'): - color = COLOR_RED; - break; + case ('r'): + color = COLOR_RED; + break; - case ('g'): - color = COLOR_GREEN; - break; + case ('g'): + color = COLOR_GREEN; + break; - case ('c'): - color = COLOR_CYAN; - break; + case ('c'): + color = COLOR_CYAN; + break; - case ('y'): - color = COLOR_YELLOW; - break; + case ('y'): + color = COLOR_YELLOW; + break; - case ('p'): - color = COLOR_MAGENTA; - break; + case ('p'): + color = COLOR_MAGENTA; + break; - case ('w'): - color = COLOR_WHITE; - break; + case ('w'): + color = COLOR_WHITE; + break; - case ('m'): - color = 'm'; - break; + case ('m'): + color = 'm'; + break; - case ('h'): - print_usage(); - break; + case ('h'): + print_usage(); + break; - case ('?'): - OPT_ERROR(argv[1][1]); - } + case ('?'): + OPT_ERROR(argv[1][1]); + } - initscr(); - start_color(); - - if (color != 'm') { - init_pair(1, color, COLOR_BLACK); - attron(COLOR_PAIR(1)); - } else - init_all_colors(); + initscr(); + start_color(); - noecho(); - cbreak(); - - keypad(stdscr, TRUE); - curs_set(0); - nodelay(stdscr, TRUE); + if (color != 'm') { + init_pair(1, color, COLOR_BLACK); + attron(COLOR_PAIR(1)); + } else + init_all_colors(); - struct Head *head = init_snake_head(); - if (!head) - goto end_game; + noecho(); + cbreak(); + + keypad(stdscr, TRUE); + curs_set(0); + nodelay(stdscr, TRUE); - head->multi_color = color == 'm' ? 1 : 0; - mainloop(head); + struct Head *head = init_snake_head(); + if (!head) + goto end_game; + + head->multi_color = color == 'm' ? 1 : 0; + mainloop(head); end_game: - endwin(); + endwin(); - return 0; + return 0; } -static inline void update_segment_direction(struct Head *head) -{ - struct Snake *current = head->body; +static inline void update_segment_direction(struct Head *head) { + struct Snake *current = head->body; - current->prev_direction = current->direction; - current->direction = head->direction; + current->prev_direction = current->direction; + current->direction = head->direction; - while (current->next_segment != NULL) { - int direction = current->prev_direction; - current = current->next_segment; - current->prev_direction = current->direction; - current->direction = direction; - } + while (current->next_segment != NULL) { + int direction = current->prev_direction; + current = current->next_segment; + current->prev_direction = current->direction; + current->direction = direction; + } } -static inline void update_segment_coordinates(struct Snake *segment) -{ - switch (segment->direction) { +static inline void update_segment_coordinates(struct Snake *segment) { + switch (segment->direction) { - case (NORTH): - segment->y--; - break; + case (NORTH): + segment->y--; + break; - case (SOUTH): - segment->y++; - break; + case (SOUTH): + segment->y++; + break; - case (EAST): - segment->x++; - break; + case (EAST): + segment->x++; + break; - case (WEST): - segment->x--; - break; - } + case (WEST): + segment->x--; + break; + } } -void mainloop(struct Head *head) -{ - int game_speed = 100; +void mainloop(struct Head *head) { + int game_speed = 100; - while ( 1 ) { + while (1) { - move_snake(head); + move_snake(head); - if (draw_snake(head)) - break; + if (draw_snake(head)) + break; + + refresh(); - refresh(); + if (head->ate) { + head->ate = 0; + place_snake_food(head); + game_speed = (head->length - 4) % 5 == 0 && game_speed > 25 + ? game_speed - 5 + : game_speed; + } else + mvaddch(head->food_y, head->food_x, ACS_PI); - if (head->ate) { - head->ate = 0; - place_snake_food(head); - game_speed = (head->length - 4) % 5 == 0 && game_speed > 25 ? - game_speed - 5 : game_speed; - } else - mvaddch(head->food_y, head->food_x, ACS_PI); + switch (getch()) { - switch (getch()) { + case ('k'): { + if (head->direction != SOUTH) + head->direction = NORTH; + break; + } - case (KEY_UP): { - if (head->direction != SOUTH) - head->direction = NORTH; - break; - } + case ('j'): { + if (head->direction != NORTH) + head->direction = SOUTH; + break; + } - case (KEY_DOWN): { - if (head->direction != NORTH) - head->direction = SOUTH; - break; - } + case ('h'): { + if (head->direction != EAST) + head->direction = WEST; + break; + } - case (KEY_LEFT): { - if (head->direction != EAST) - head->direction = WEST; - break; - } + case ('l'): { + if (head->direction != WEST) + head->direction = EAST; + break; + } - case (KEY_RIGHT): { - if (head->direction != WEST) - head->direction = EAST; - break; - } + case (KEY_UP): { + if (head->direction != SOUTH) + head->direction = NORTH; + break; + } - case (KEY_P): { - pause(); - break; - } + case (KEY_DOWN): { + if (head->direction != NORTH) + head->direction = SOUTH; + break; + } - case (KEY_Q): { - free_snake(head); - goto end_loop; - } + case (KEY_LEFT): { + if (head->direction != EAST) + head->direction = WEST; + break; + } - default: - break; - } + case (KEY_RIGHT): { + if (head->direction != WEST) + head->direction = EAST; + break; + } - // flash/beep - //delay_output(game_speed); - napms(game_speed); - update_segment_direction(head); + case (KEY_P): { + pause(); + break; + } - getmaxyx(stdscr, head->max_y, head->max_x); + case (KEY_Q): { + free_snake(head); + goto end_loop; + } - clear(); + default: + break; } - int score = head->length - 5; - int print_x = (head->max_x - 8) / 2; - int print_y = head->max_y / 2; + // flash/beep + // delay_output(game_speed); + napms(game_speed); + update_segment_direction(head); - print_score(score, print_x, print_y, head); + getmaxyx(stdscr, head->max_y, head->max_x); + + clear(); + } + + int score = head->length - 5; + int print_x = (head->max_x - 8) / 2; + int print_y = head->max_y / 2; + + print_score(score, print_x, print_y, head); end_loop: - return; + return; } -int draw_snake(struct Head *head) -{ - struct Snake *current = head->body; +int draw_snake(struct Head *head) { + struct Snake *current = head->body; - int max_x = head->max_x; - int max_y = head->max_y; + int max_x = head->max_x; + int max_y = head->max_y; - int multi_color = head->multi_color; - int current_color = 0; + int multi_color = head->multi_color; + int current_color = 0; - while (current != NULL) { + while (current != NULL) { - if (current->x >= max_x || current->y >= max_y || - current->x < 0 || current->y < 0) - return 1; + if (current->x >= max_x || current->y >= max_y || current->x < 0 || + current->y < 0) + return 1; - if (check_segment_intersections(head, current)) - return 1; + if (check_segment_intersections(head, current)) + return 1; - if (multi_color) { - attron(COLOR_PAIR(current_color % COLOR_NUMS + 1)); - current_color++; - } - - mvaddch(current->y, current->x, ACS_DIAMOND); - current = current->next_segment; + if (multi_color) { + attron(COLOR_PAIR(current_color % COLOR_NUMS + 1)); + current_color++; } - return 0; + mvaddch(current->y, current->x, ACS_DIAMOND); + current = current->next_segment; + } + + return 0; } -void add_segment(struct Head *head) -{ - struct Snake *segment = head->body; - head->length++; +void add_segment(struct Head *head) { + struct Snake *segment = head->body; + head->length++; - while (segment->next_segment != NULL) - segment = segment->next_segment; + while (segment->next_segment != NULL) + segment = segment->next_segment; - int x = segment->x; - int y = segment->y; + int x = segment->x; + int y = segment->y; - switch (segment->direction) { + switch (segment->direction) { - case (NORTH): { - y++; - break; - } + case (NORTH): { + y++; + break; + } - case (SOUTH): { - y--; - break; - } + case (SOUTH): { + y--; + break; + } - case (EAST): { - x--; - break; - } + case (EAST): { + x--; + break; + } - case (WEST): { - x++; - break; - } - } + case (WEST): { + x++; + break; + } + } - segment->next_segment = create_segment(segment->prev_direction, x, y); + segment->next_segment = create_segment(segment->prev_direction, x, y); - if (!segment->next_segment) { - free_snake(head); - endwin(); - exit(1); - } + if (!segment->next_segment) { + free_snake(head); + endwin(); + exit(1); + } } -int check_segment_intersections(struct Head *head, struct Snake *segment) -{ - struct Snake *current = head->body; +int check_segment_intersections(struct Head *head, struct Snake *segment) { + struct Snake *current = head->body; - int segment_x = segment->x; - int segment_y = segment->y; + int segment_x = segment->x; + int segment_y = segment->y; - while (current != NULL) { + while (current != NULL) { - if (!(current == segment) && - segment_x == current->x && - segment_y == current->y) - return 1; + if (!(current == segment) && segment_x == current->x && + segment_y == current->y) + return 1; - current = current->next_segment; - } + current = current->next_segment; + } - return 0; + return 0; } -void move_snake(struct Head *head) -{ - struct Snake *current = head->body; - - int food_x = head->food_x; - int food_y = head->food_y; - head->dist++; +void move_snake(struct Head *head) { + struct Snake *current = head->body; - while (current != NULL) { - update_segment_coordinates(current); + int food_x = head->food_x; + int food_y = head->food_y; + head->dist++; - if (current->x == food_x && current->y == food_y) - head->ate = 1; + while (current != NULL) { + update_segment_coordinates(current); - current = current->next_segment; - } + if (current->x == food_x && current->y == food_y) + head->ate = 1; - if (head->ate) { - head->total_dist += head->dist; - head->min_dist += head->food_dist; - if (head->dist == head->food_dist) - head->bonus++; - add_segment(head); - } + current = current->next_segment; + } + + if (head->ate) { + head->total_dist += head->dist; + head->min_dist += head->food_dist; + if (head->dist == head->food_dist) + head->bonus++; + add_segment(head); + } } -void place_snake_food(struct Head *head) -{ - struct Snake *segment = head->body; - int food_x, food_y; +void place_snake_food(struct Head *head) { + struct Snake *segment = head->body; + int food_x, food_y; - while ( 1 ) { - food_x = rand() % head->max_x; - food_y = rand() % head->max_y; + while (1) { + food_x = rand() % head->max_x; + food_y = rand() % head->max_y; - if (is_valid_position(segment, food_x, food_y) == 0) - break; - } + if (is_valid_position(segment, food_x, food_y) == 0) + break; + } - mvaddch(food_y, food_x, ACS_PI); - head->food_x = food_x; - head->food_y = food_y; - head->food_dist = abs(head->body->x - food_x) + - abs(head->body->y - food_y); - head->dist = 0; + mvaddch(food_y, food_x, ACS_PI); + head->food_x = food_x; + head->food_y = food_y; + head->food_dist = abs(head->body->x - food_x) + abs(head->body->y - food_y); + head->dist = 0; } -int is_valid_position(struct Snake *segment, int x, int y) -{ - for (; segment != NULL; segment=segment->next_segment) - if (segment->x == x && segment->y == y) - return 1; - return 0; +int is_valid_position(struct Snake *segment, int x, int y) { + for (; segment != NULL; segment = segment->next_segment) + if (segment->x == x && segment->y == y) + return 1; + return 0; } -struct Head *init_snake_head(void) -{ - struct Head *new_head; - if (!(new_head = malloc(sizeof *new_head))) - return NULL; - - getmaxyx(stdscr, new_head->max_y, new_head->max_x); - new_head->direction = WEST; - new_head->length = SNAKE_INIT_LEN; - new_head->ate = 1; - new_head->body = init_snake_body(new_head->max_x, new_head->max_y); - - if (!new_head->body) { - free(new_head); - return NULL; - } +struct Head *init_snake_head(void) { + struct Head *new_head; + if (!(new_head = malloc(sizeof *new_head))) + return NULL; - return new_head; -} + getmaxyx(stdscr, new_head->max_y, new_head->max_x); + new_head->direction = WEST; + new_head->length = SNAKE_INIT_LEN; + new_head->ate = 1; + new_head->body = init_snake_body(new_head->max_x, new_head->max_y); + + if (!new_head->body) { + free(new_head); + return NULL; + } -struct Snake *init_snake_body(int max_x, int max_y) -{ - int start_x, start_y; + return new_head; +} - start_x = max_x / 2; - start_y = max_y / 2; +struct Snake *init_snake_body(int max_x, int max_y) { + int start_x, start_y; - struct Snake *segment = create_segment(WEST, start_x, start_y); - if (!segment) - return NULL; + start_x = max_x / 2; + start_y = max_y / 2; - struct Snake *current = segment; + struct Snake *segment = create_segment(WEST, start_x, start_y); + if (!segment) + return NULL; - for (int i=0; i < SNAKE_INIT_LEN - 1; i++) { - struct Snake *next = create_segment(current->prev_direction, - current->x + 1, current->y); - if (!next) { - free_snake_body(segment); - return NULL; - } + struct Snake *current = segment; - current->next_segment = next; - current = current->next_segment; + for (int i = 0; i < SNAKE_INIT_LEN - 1; i++) { + struct Snake *next = + create_segment(current->prev_direction, current->x + 1, current->y); + if (!next) { + free_snake_body(segment); + return NULL; } - return segment; + current->next_segment = next; + current = current->next_segment; + } + + return segment; } -struct Snake *create_segment(int direction, int x, int y) -{ - struct Snake *segment; +struct Snake *create_segment(int direction, int x, int y) { + struct Snake *segment; - if (!(segment = malloc(sizeof *segment))) - return NULL; + if (!(segment = malloc(sizeof *segment))) + return NULL; - segment->next_segment = NULL; - segment->prev_direction = direction; - segment->direction = direction; - segment->x = x; - segment->y = y; + segment->next_segment = NULL; + segment->prev_direction = direction; + segment->direction = direction; + segment->x = x; + segment->y = y; - return segment; + return segment; } -void free_snake(struct Head *snake_head) -{ - free_snake_body(snake_head->body); - free(snake_head); +void free_snake(struct Head *snake_head) { + free_snake_body(snake_head->body); + free(snake_head); } -void free_snake_body(struct Snake *body) -{ - while (body != NULL) { - struct Snake *prev_segment = body; - body = body->next_segment; - free(prev_segment); - } +void free_snake_body(struct Snake *body) { + while (body != NULL) { + struct Snake *prev_segment = body; + body = body->next_segment; + free(prev_segment); + } } -void pause(void) -{ - while ( 1 ) { +void pause(void) { + while (1) { - int key = getch(); + int key = getch(); - switch (key) { + switch (key) { - case (KEY_P): - return; + case (KEY_P): + return; - case (KEY_Q): { - ungetch(key); - return; - } - } + case (KEY_Q): { + ungetch(key); + return; + } } + } } -void print_score(int score, int x, int y, struct Head *head) -{ - clear(); - mvprintw(y, x, "SCORE: %d", score); - mvprintw(y - 2, x - 2, "DISTANCE: %d", head->total_dist); - mvprintw(y - 3, x - 4, "MIN-DISTANCE: %d", head->min_dist); - mvprintw(y - 4, x - 1, "BONUS: %d", head->bonus); - refresh(); - play_again(x, y + 2, head); +void print_score(int score, int x, int y, struct Head *head) { + clear(); + mvprintw(y, x, "SCORE: %d", score); + mvprintw(y - 2, x - 2, "DISTANCE: %d", head->total_dist); + mvprintw(y - 3, x - 4, "MIN-DISTANCE: %d", head->min_dist); + mvprintw(y - 4, x - 1, "BONUS: %d", head->bonus); + refresh(); + play_again(x, y + 2, head); } -void play_again(int x, int y, struct Head *head) -{ - mvprintw(y, x - 5, "PLAY AGAIN? (Y/N)"); - - while ( 1 ) { - switch (getch()) { - - case (KEY_Y): { - clear(); - int multi = head->multi_color; - free_snake(head); - head = init_snake_head(); - if (!head) - goto end_game; - head->multi_color = multi; - mainloop(head); - break; - } - - case (KEY_N): { - mvprintw(y - 1, x - 1, "GOOD GAME!"); - refresh(); - napms(1000); - free_snake(head); - goto end_game; - } - - default: - break; - } +void play_again(int x, int y, struct Head *head) { + mvprintw(y, x - 5, "PLAY AGAIN? (Y/N)"); + + while (1) { + switch (getch()) { + + case (KEY_Y): { + clear(); + int multi = head->multi_color; + free_snake(head); + head = init_snake_head(); + if (!head) + goto end_game; + head->multi_color = multi; + mainloop(head); + break; + } + + case (KEY_N): { + mvprintw(y - 1, x - 1, "GOOD GAME!"); + refresh(); + napms(1000); + free_snake(head); + goto end_game; + } + + default: + break; } + } end_game: - return; + return; } -