From affcb739b42b4b31d14555fb38cb52e1bf906c6a Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Fri, 28 Jan 2011 01:21:12 +0100 Subject: [PATCH] Added the boardgame tic-tac-toe without winning conditions, written entirely in Python. --- games/tic-tac-toe/.main.py.swp | Bin 0 -> 12288 bytes games/tic-tac-toe/TODO | 91 ++++++++++++++++++++++++ games/tic-tac-toe/board.png | Bin 0 -> 270898 bytes games/tic-tac-toe/board.py | 18 +++++ games/tic-tac-toe/board.pyc | Bin 0 -> 1109 bytes games/tic-tac-toe/e.png | Bin 0 -> 2565 bytes games/tic-tac-toe/gamerectangle.py | 7 ++ games/tic-tac-toe/gamerectangle.pyc | Bin 0 -> 816 bytes games/tic-tac-toe/input.py | 23 ++++++ games/tic-tac-toe/input.pyc | Bin 0 -> 1015 bytes games/tic-tac-toe/inputmanager.py | 71 ++++++++++++++++++ games/tic-tac-toe/inputmanager.pyc | Bin 0 -> 2199 bytes games/tic-tac-toe/keypress.py | 29 ++++++++ games/tic-tac-toe/keypress.pyc | Bin 0 -> 922 bytes games/tic-tac-toe/main.py | 47 ++++++++++++ games/tic-tac-toe/mousepress.py | 9 +++ games/tic-tac-toe/mousepress.pyc | Bin 0 -> 936 bytes games/tic-tac-toe/o.png | Bin 0 -> 7712 bytes games/tic-tac-toe/point.py | 12 ++++ games/tic-tac-toe/point.pyc | Bin 0 -> 985 bytes games/tic-tac-toe/rectangle.py | 8 +++ games/tic-tac-toe/rectangle.pyc | Bin 0 -> 698 bytes games/tic-tac-toe/test_board.py | 32 +++++++++ games/tic-tac-toe/test_gamerectangle.py | 23 ++++++ games/tic-tac-toe/test_rectangle.py | 27 +++++++ games/tic-tac-toe/tictactoeboard.py | 51 +++++++++++++ games/tic-tac-toe/tictactoeboard.pyc | Bin 0 -> 2354 bytes games/tic-tac-toe/x.png | Bin 0 -> 7712 bytes 28 files changed, 448 insertions(+) create mode 100644 games/tic-tac-toe/.main.py.swp create mode 100644 games/tic-tac-toe/TODO create mode 100644 games/tic-tac-toe/board.png create mode 100644 games/tic-tac-toe/board.py create mode 100644 games/tic-tac-toe/board.pyc create mode 100644 games/tic-tac-toe/e.png create mode 100644 games/tic-tac-toe/gamerectangle.py create mode 100644 games/tic-tac-toe/gamerectangle.pyc create mode 100644 games/tic-tac-toe/input.py create mode 100644 games/tic-tac-toe/input.pyc create mode 100644 games/tic-tac-toe/inputmanager.py create mode 100644 games/tic-tac-toe/inputmanager.pyc create mode 100644 games/tic-tac-toe/keypress.py create mode 100644 games/tic-tac-toe/keypress.pyc create mode 100644 games/tic-tac-toe/main.py create mode 100644 games/tic-tac-toe/mousepress.py create mode 100644 games/tic-tac-toe/mousepress.pyc create mode 100644 games/tic-tac-toe/o.png create mode 100644 games/tic-tac-toe/point.py create mode 100644 games/tic-tac-toe/point.pyc create mode 100644 games/tic-tac-toe/rectangle.py create mode 100644 games/tic-tac-toe/rectangle.pyc create mode 100644 games/tic-tac-toe/test_board.py create mode 100644 games/tic-tac-toe/test_gamerectangle.py create mode 100644 games/tic-tac-toe/test_rectangle.py create mode 100644 games/tic-tac-toe/tictactoeboard.py create mode 100644 games/tic-tac-toe/tictactoeboard.pyc create mode 100644 games/tic-tac-toe/x.png diff --git a/games/tic-tac-toe/.main.py.swp b/games/tic-tac-toe/.main.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..b191bd079de3b49f4fdbcd31be9ba38c1cfc859b GIT binary patch literal 12288 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 jzisukAzkB+Br^&1N literal 0 HcmV?d00001 diff --git a/games/tic-tac-toe/board.py b/games/tic-tac-toe/board.py new file mode 100644 index 0000000..76f43a0 --- /dev/null +++ b/games/tic-tac-toe/board.py @@ -0,0 +1,18 @@ +from rectangle import Rectangle +from gamerectangle import GameRectangle +from math import sqrt +#param: nr_of_squares, dimensions(could be a Rectangle) +#creates an array of gamerectangles within itself with correct +#positions from each other + +class Board(object): + def __init__(self, nr_of_rectangles, dimensions): + self.game_rectangles = [] + axis = sqrt(nr_of_rectangles) + width = dimensions.width + height = dimensions.height + for index in range(nr_of_rectangles): + x = width * (index % axis) + y = height * int(index / axis) + gr = GameRectangle(index, x, y, width, height) + self.game_rectangles.append(gr) diff --git a/games/tic-tac-toe/board.pyc b/games/tic-tac-toe/board.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1258339b399d1f37cb5d5095a19c814968565f94 GIT binary patch literal 1109 zcmb_b&5qMB5FRH@|FnfYRDi?_HLI}Yws3#Ug4@i~3$|l~_RbppjTeMPhDn}lG z=imvMak|^WirYG#FP`zlGyZ1s@nkao_51CI435SC*KbhF3?awKpaiHGEEq7-11JNi zLRf^I9zxlJDuP7>Y?k-n2l_-H`mjTv0pxv{$8@MfftVq<5yEGY*;Ey!=u8td&C*Kz zWA35ZTsJnO?`Y7QJ-XRqycb>nCXYutgm)gh$hM0NV&`v^PA(Q>N_@EN>U>89`CaCA>H4@@ z3Rx_zH#SJ5aCBLzth+;{cTekDs5~Ynx)VitTX zRJm9?s!E3&N8}exj0hgwOI#&OU5Uh4twdhSCbc4|8(lPMRY_GO^~Nr>O03MD*%U>K zPx#32;bRa{vGy!TqVp%qJ=4;a^RY}h2Vi-15eZl+Q zZ~6}G0&x;)*Sq#JI0%?hb#f%@{74Jt{9Q3%MT=BATkrM|O;s+PX7q^sxFdZ12b`-+ zn6w+ov#B6tV02+i94#6HwL@+ANu>T+qSS)Xv=wW4cM;7O%Z9FB>OXP{*%%zS8oBud z_MN7vMu!PBB!&e{3@b4N>#e&(m!?E+tiZk#uJv2Ej9iEc(e-dmAY3z@0bj6s4zOtE&UIWU-{7z9JD`yLM5U}%h3R-Vll?eE#OTkCFPSPof&)(5{7@>+<- zaIVM1(nH?&wv({p`q5U-nPFH;>6#QQqr9;HirVlT_Fps%KuEaU&HmF|xVDcWI-lvW zm7hU!KZ6-v+2lXrX9y#VE6I5NRoLpO?$4x>NRtBjmdmA?=Y+ynSR?>4n9(}ku}s}* zn^y;RwXWQ7Ln%>thJ#J{2~7jT(49eWs+d4|Qm|;+C=jqD@Wro7<+VcLHe{bkq2ZwD zKApDoQ$D9H+*qQvjc0UD$i4$O0V^wtESsDOBL#!kq>^Yb8>t)=gl|G3javJ=dgneS z+zI!(Z#E-6j4V8Z{K`cXY1QQAYvg55jUXPQX&9LTERYS?Rw`c}*L^)$3F3f{We_W8 zBH4+g4i;VGGHhJN1QsFMws=PKC}Qzt+Ga&Ja(#=-*}!u4VZIGR6rD)iPGjYWuBmNJ zdS4IZ2j(G%Om~ak-9mXt0Vi|ThcK6pXu36)&lHKjg)r?*@P^)V0{g!Z#=p%9*_1ia zNFiE=qd25QYOaLqZ)zR4b*~5edWZ%P1mw)%b0W;u?i9<6D!-t`efY=rqXVVn@m;Ca8+p$dh? zX-_T@3dXU*1OmG_i4#3_STWAh8j8Zh{>#z+UIRNDaZKcPQK;@wKC4N{z3H!5!DxgP zc*~530_Rmw2~F zo_~xLAe~sbdZy=3uWOz*8tJ&0K>w&DS~Wiu5g`;LWB~>~ zvm95e*cF~qe7>Q$kT|X<&n`s|Zczym8*tK&o8s-|`>OVwzo;KX#~ zBPn0k+F%uT{@q%($}(+x;OxJWIlM;|EildHzr?u~i#coCiw^(AQ?@Xpu)yY^p<)Pf zW}@_!KtdtmV59E&8**A4tA1!HTL3M0n1@3q5-bnl9d-l7i>#&M^wZqrj}NsdL=UWa z@KK9sp&25KSU8!>-UtNE7-DeGL84Ss9f>jsETe)&ZA6EnMlQD2%*-m9T(*$0$rKbJ z;@}8v@Jyfz=!G-|_bprDgJhWLx?)Gyt*q0eCxt$6Bsn z8(;8KiVRX2xJq;%MV4srw7De#KR%mHlw`>oP(xtOGGngg&AmW?2wYh%O&I?UG7i;t}0;lxgQn5K22c>-T~L(M~;APh4QIjFY2Q0r&S+bcUhg$f%99AuX^bXwXN z;%67+KzPRc73$8Xwyd7|2%w6eFA#x`!K3P-iaUERb$q1Z$fmM`LtvTinecl^FT zz14fxt2Bi)-{AWKtYe8!OB0~BvTZ`Pgz_*!A^pETwd!zWs-W%3k!r(zz>-Pk2d6ZgAG@Fp&woQS0=aIxi zXF>x9D;U#A$RBB4^5@@qm0-iqKahC(>J~f92z})}ezfrof232z&{k;NBRIHj+Ro`& zD zFD`r@T!q`Dx_tZ+i8TzIpfua={BZTlhw9GnuQ~~z^*-G5kM&rto^(sgY<@6L-yjG3?=INJ0^Z}>KCOwka+Z#oxAD#T-p~KjyrZrExGwL2x-EO&{_PX$aSpnKvlMGRtW zVetsLEOJw?2aF|y#soLEusFoI?XJ#XUszL3lgSWc3k!}Km1v3<=?w*vL1XfaF)TuS zVZ~@vrpaW8v4s`VA}1QJS$F}8EEzN=PiowzSTY1O@l(y!fna};BP-M9NJhlu87o*u zJ9z8tKU}hFZb1pyGiFS~@rih_Qc`r68E6M5o2o9i*1FSN%O{q>>i@q%82-F+;;--< z+?>1zre+QK|K42=-1By<&O|t;KdZmotN7vl%puwCX*t5T1Ih;U8gY__ zP$Zz-2HwC}1keKPrAJV__{;JDF)>sxI8l0L zYzVRey@%}V1L|Q6s2|d5NCL2Hw3*|==g|P#d9rn;7Tz*8v1*sGJ4Tq4y4F_8h>JT; zG^%{tN@m1`$6b2wht6!_IJ!_eFKh&hymH)eTr`!6jcsa`wYo#mxb2#}OR7rOdE72- z(bTck>7`8|jf(T6Qr*uKuiE7fEl-Gxkr?5bMIp>hM2$o#-54Gzt0r?L|L!!!qi`LT?*xETaQVFo%+c`aj)mLX+_b=V=eO&B=dzdc$NAuczFrURh9~7Yp9bHj CbGV@Z literal 0 HcmV?d00001 diff --git a/games/tic-tac-toe/input.py b/games/tic-tac-toe/input.py new file mode 100644 index 0000000..0a08a61 --- /dev/null +++ b/games/tic-tac-toe/input.py @@ -0,0 +1,23 @@ +#Input.py + +#Variables: Key_Id[Int,String], KeyBehaviour[enum], Action[method] +#Methods: update() Param nothing, +#Behaviour + + +#in update. when called. takes the state of the key. compares with the behaviour. +#if fullfilled perform action. + + +#All Input instances have an id. +class Input(object): + id = -1 + fun = None + def __init__(self, id, fun): + self.id = id + self.fun = fun + + def notify(self): + pass + def update(self,state): + pass diff --git a/games/tic-tac-toe/input.pyc b/games/tic-tac-toe/input.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66596fca1d1e19bfa9bc55d6d6f1a7eb95439d94 GIT binary patch literal 1015 zcmb_aO;6)65S^r&quM@H;>P~h{Rey9 zea|U$7sRcOX8dB0XP)2qZf}45``6`dCI5^J_yXpR;cm3ZPZ6C+E%GvuSt2@>X+FSS zmB4Xurd`3@8QinTcf>OoJ{6tGEMpR+n(Z(H!BF%df-el1<~ulP{$Nzh&cQi_UBlcF z+;hU*3LuRj7MSKNKFJvw=!_0LIS*~*88ZC1dNF^$iDk*@!Z}>=Xq&ol-nO;w%(C=# z(Jk%6vTPdDJ`~-`KianNraJK@%+`fzyWmf|RoKOGrA%wQQU}0}6(t!ZA0&!5;jR|k zxaZB-2;YcCQd?m*MDEslGhZD7IjSQ`6(=Ch@L1X1n}Cr;(HGUGtmd z6m+d>TQ;>)VT=`}8mq&Cza)k>Q^^S$_S*0NIuSOPkFc-PE8VAC*s5GOrM7n;O7w%z tVjsY<$~YO~8)c(3>K8ZHZqifjWm;;ErY={B|DS3=f*E#>dYu`(r5l8mRw*Bfmm1 z!AC#{5D9Pv2%1|ES}?Q0wRsz-C76}LE%VfdumVvP+$uyhaBC3N!L38o0Jj0r7Pwmm zr37IUq87L)2 zrJv|r^4gfLryu>(c!eYX4#hb@PXdJs4K@KnN8A!ckra#(Ib!3{v4w(uWMT!!uQ>7# zD5i|#0WAK3a{+tr{)P(+&MgAj!S_#Vko`eGv}D81qYIlZp5Y@v;j#^vf;UUBLubmc zb7|3{;lfeC1Zlfcnq$2B<{ z#Hm&}tA3iwcw(}7=7*bP<}!R=Jj{Taa&{`0-myIK&w@l}oY{zyvsrWS5U|iMQR|*0 zk?iIwiRB~>GGEDVnkCcBkD?%+cGIOgN#d>w#y=__Mu^K$bJBY z;YP?9vu`%aoFN5^=bV-bzUQo%Fst&R8o%131kUP256*E9<~8m(bYn&BV zu3&yu#Mxq;lK5|XnrzSY8fRtCHO#MzI4#C$-C>Wx*%d3lR`%?Q`K}nvTY%4K@%Sbv zopn&QIe>Fl7-CWm2F$Cy;eSjG$&t$BavQw$}m|CWi6>cNz_HwJA6u8SI zpD+OOk%_9)33BTzO@|E#r76$1^!L gP84IY2{vo@*h+sgeE6B^O(E_eyV}CRCffPt3vo-zApigX literal 0 HcmV?d00001 diff --git a/games/tic-tac-toe/keypress.py b/games/tic-tac-toe/keypress.py new file mode 100644 index 0000000..261a8d0 --- /dev/null +++ b/games/tic-tac-toe/keypress.py @@ -0,0 +1,29 @@ +#KeyPress.py + +#Should call method if a key was pressed +#Variales: isPressed, actionPerformed +#To make sure that the key only get's pressed once when holding a button down, Two variables are needed. +#isPressed: If not pressed, call method on next keypress +#actionPerformed: If method was called and key is still down, do not call method no more +#Input instances will be allocated before gameplay, therefore: isPressed and actionPerformed will be initialized false. + +#methods: init, update +#update: Will be called when there is a change in this actual keys state. With respect to the input class behaviour, +#update will evaluate if it's corresponding method should be called or not +#param: state tells if the key is down or up. + + +#Four possible preconditions: is not pressed and key is up. -> Set isPressed to false. +# is not pressed and key is down. -> +# is pressed and key is up. +# is pressed and key is down. + +from input import Input + +class KeyPress(Input): + def __init__(self, id, function): + Input.__init__(self, id, function) + + def update(self,state): + if state == "Down": + self.fun() diff --git a/games/tic-tac-toe/keypress.pyc b/games/tic-tac-toe/keypress.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a762b86b05cd61c17a54755c2ddbf528285c4c8 GIT binary patch literal 922 zcmb_aO-sZu5S_Ftx+r)N6%oAIgW5l!;wK{FD)i>1ls4{G+oUuJQrO%2YyB0zN!3-) z8+Im>boR}AnR!@U8ytL`-{^KpnzGHTjGI=E+N`ciHHw?gjK~im2HbnmKf<^L#)9o!4t7V$H0dCT?)`hG1_`3&g2GdLEb1R)^l|hRbb)F5lliedX rga^lS9*C9DGy48A?8m~7G0*M4;rULRF`Fm7l(o0kxhR-;LGNOvQGH~qK%3E%51 z&Ul|DRbAbwyn6MKo6W7s_UGAkB@1g6_9?{eL)Cbcv?867J0PUHi3sc0qdsoW(} zugEOpM-4PwXZqkP9=W(v{zBXy)SJkq7J?!MAc>@+kqUy$vJ_4g6&Lpv$T`IA zKzWfTMUXe>gj5u8W-uU zu<}RS>D+m1blo>Y>2=-@_F*Wyt}zdJ|LPyD$$e8D_!44u-r3-EKWOI;`_~`AV_1e1 zRmBY!cS=lc7X~syC7u%*{xHEOk$3o;*o;|BZ5sJs*cUUFo7DmPG41cv*aYXncgYE@ z0XOtDfPXOptbWPdmq6ib*6h&w2(DJz0hcJg3lNfzlTa~Rtn~1u+CJ_9Z wZMkJzSg*)?qBhbe z#n*(l-m$VUs@64UW>l*wH6<;h+|m9%i_$C07u3$EuBxhdtd?0|#uF9y)mALAKUG=# zkiFD3XWo*@6;Z6W)a7)PFEE>)PJgD|L`45953L{Jiy=tEumV|>VQ&q4D-aI^q8ky2 zvaEaV91gqD`a5=hiNCwyZbM8g{yGkGG&+x>rw4s~uv#%G1Nl>Mb1}x+5g#ubQS+Qm zgCKVsz56y5>~5ghvkal}1sxqhdAan#Y8`Na z!QzR&xr%H_L1OAh8D*m6QB?h?7BZu-7*PEtnm(1{qeH^v^&i{OKxPOQV`3AN#t~1{ zYd7=;8|0}fNgozts;Uf|lLk(PC+RF!FQxwB^Tigd`4Fd0sW);cQZA`DxwN(_Z0Nw^ zwDiLB={|y})`GR`>p`mi zn8ZXB6yn8Ym@rXR;h=FjvAaQ*OT5P;37`e5rCHXNcy@_>9IC2O>QZ20<;Y0HCrE=7 z?4A}`s0B-R1=&3x*9k!UczK7z~2@b&G0PSGrOAS+u76YFH>!eWue z$!u?rEYX7XuTMIWM(5;80tH(*RV=hNSz_dVzp#G#QPgqTG|E6t$EDv@DcWYlwv|W? zi!;_oYjNR%q%5;W;)csnT{{_>vSl?a&NrJk>XHi}N1 zkZVD;w+vQSXU^b{LwK?VF)_G%F$!-2-^tdk!O4?Gd~{JKAyIKlQ^VrRT|mSu{>DnI zeot)m)29O(irmQxeKjnu1tKDF{=8y@tOo5JV|fT%WHP zuZG2mW#j!5VzlfSY=L@x8^0DH|?v- z#NBY<6)Ie9zPlC`(2i|%_UxtS4gS}9)66F$A3+=I(A?;d@&38r^n_A#hm}Y5P|1XrqmQVR;R6 zw0^po97V*hto(WIhHL1P4SwU=Ys$9~JS?`w$oBtCk31+|3tFxm1THs|7TrnTeH#oW zwyYEKQt&F-{_1M`R#BpLbRa1SiK9iq!wH!yW`BE4Y04`M11zttFgDa#K8z0t&eSlh eK>RjDy>)z7+n?6w8t)fVam}3TtSh= rectangle.x) + and (self.x <= (rectangle.x + rectangle.width)) + and (self.y >= rectangle.y) + and (self.y <= rectangle.y + rectangle.height)) diff --git a/games/tic-tac-toe/point.pyc b/games/tic-tac-toe/point.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b79438f4a54fd4dfa3a28c90ec8cf0d53302325 GIT binary patch literal 985 zcmb_a!EV$r5FIDGsJki>;sD~tja=H?5kja4aiSo$r@dGqaW~#3@oH@gR_d*MHV58w zx^4H|TA62OY|p%T-)eaDHI^i06$F~s$tccnl28`v@@803%C~fVuXQ_2Vs{PvvGm28N%i`R1-Kj zXRyyO{|a!e7(ru^r9}#}NDR&ko{Y@)C*dx|iWA;7-Q~d!d{PkNdqCN`-jqJL!89AY zt%4~xTesR)eQ$?Vx!Hx*4P~(PNvL2B+s+Q*bhC>`xURJwY|uJoB8Zx)nrt{YKZB(j zF0eoW>r@HwYASAV;6a6JC9kj4eglQVl|4AR_t2lGqk9FI{I*WE=eKP_J8BV0p*42Z zhEbucTiyqP9lrZS)%{vS&iiZk1fPWE S5qNzVh5E?H?)ku8Wd8vrjLuE~ literal 0 HcmV?d00001 diff --git a/games/tic-tac-toe/rectangle.py b/games/tic-tac-toe/rectangle.py new file mode 100644 index 0000000..e34eec1 --- /dev/null +++ b/games/tic-tac-toe/rectangle.py @@ -0,0 +1,8 @@ + +class Rectangle(object): + def __init__(self, x, y, width, height): + self.x = x + self.y = y + self.width = width + self.height = height + diff --git a/games/tic-tac-toe/rectangle.pyc b/games/tic-tac-toe/rectangle.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2107113695ea6d058be14b15bfe9453d297d89b GIT binary patch literal 698 zcmb_ZO;5ux40YRqwh7MsgGi>2&pR{ZP=(8o|GUxii3hN%TcjMx=>86Iw=8#F0Fsa%Q z-GR?!DPP9iVUfll6h{DFymR6f=2E~WA`~h(u{a15aS)EgNx0u4<-6wT2pHIX7hDH! z_-0C9hhuoPHdXCYP6nnr-Msuy2a#9{g&82LZL2fqZKuoL47t}?KiF!>+tzed)~|hS zyUd&7+~+W>vq2X=@2W;$^y@H23#CkFyiz_ukDG@4g2(=Sj{`4!KAI33Eqp)`{mq(Nd+viu%_mBT19Zc64DlUI!G80*d F=^IB4nNI)! literal 0 HcmV?d00001 diff --git a/games/tic-tac-toe/test_board.py b/games/tic-tac-toe/test_board.py new file mode 100644 index 0000000..c029834 --- /dev/null +++ b/games/tic-tac-toe/test_board.py @@ -0,0 +1,32 @@ +import unittest +from board import Board +from rectangle import Rectangle + +class TestBoard(unittest.TestCase): + def setUp(self): + nr_of_rectangles = 4 + dimensions = Rectangle(0, 0, 25, 35) + self.b = Board(nr_of_rectangles, dimensions) + + def test_rectangle_placemenets(self): + #rectangle1: 0,0,25,35 + #rectangle2: 26,0,25,35 + #rectangle3: 0,36,25,35 + #rectangle4: 26,36,25,35 + + r0 = self.b.game_rectangles[0] + r1 = self.b.game_rectangles[1] + r2 = self.b.game_rectangles[2] + r3 = self.b.game_rectangles[3] + self.assertEqual(r0.x, 0) + self.assertEqual(r0.y, 0) + self.assertEqual(r1.x, 25) + self.assertEqual(r1.y, 0) + self.assertEqual(r2.x, 0) + self.assertEqual(r2.y, 35) + self.assertEqual(r3.x, 25) + self.assertEqual(r3.y, 35) + + +if __name__ == '__main__': + unittest.main() diff --git a/games/tic-tac-toe/test_gamerectangle.py b/games/tic-tac-toe/test_gamerectangle.py new file mode 100644 index 0000000..b2fe779 --- /dev/null +++ b/games/tic-tac-toe/test_gamerectangle.py @@ -0,0 +1,23 @@ +import unittest +from gamerectangle import GameRectangle + + + +class TestGameRectangle(unittest.TestCase): + def setUp(self): + self.index = 0 + self.x = 1 + self.y = 2 + self.width = 34 + self.height = 0.23 + self.gr = GameRectangle(self.index, self.x, self.y, self.width, self.height) + def test_attributes(self): + self.assertEqual(self.index, self.gr.index) + self.assertEqual(self.gr.state, ' ') + self.assertEqual(self.x, self.gr.x) + self.assertEqual(self.y, self.gr.y) + self.assertEqual(self.width, self.gr.width) + self.assertEqual(self.height, self.gr.height) + +if __name__ == '__main__': + unittest.main() diff --git a/games/tic-tac-toe/test_rectangle.py b/games/tic-tac-toe/test_rectangle.py new file mode 100644 index 0000000..a62e6d9 --- /dev/null +++ b/games/tic-tac-toe/test_rectangle.py @@ -0,0 +1,27 @@ +import unittest +from rectangle import Rectangle + + + +def main(): + x = 1 + y = 2 + width = 34 + height = 0.23 + r = Rectangle(x, y, width, height) + +class TestRectangle(unittest.TestCase): + def setUp(self): + self.x = 1 + self.y = 2 + self.width = 34 + self.height = 0.23 + self.r = Rectangle(self.x, self.y, self.width, self.height) + def test_attributes(self): + self.assertEqual(self.x, self.r.x) + self.assertEqual(self.y, self.r.y) + self.assertEqual(self.r.width, self.r.width) + self.assertEqual(self.r.height, self.r.height) + +if __name__ == '__main__': + unittest.main() diff --git a/games/tic-tac-toe/tictactoeboard.py b/games/tic-tac-toe/tictactoeboard.py new file mode 100644 index 0000000..4ee3cdf --- /dev/null +++ b/games/tic-tac-toe/tictactoeboard.py @@ -0,0 +1,51 @@ +from board import Board +from rectangle import Rectangle +from point import Point +from pygame.image import load +from pygame.rect import Rect +from pygame import Surface + +#inherits Board. +#Used for displaying the board on the screen and interact with it +#thus images are needed for the various rectangles +#as well as a paint function +#Should be updated after every valid player move + +class TicTacToeBoard(Board): + def __init__(self, nr_of_rectangles): + self.image_e = load("e.png") + self.image_x = load("x.png") + self.image_o = load("o.png") #TODO add the o image + dimensions = Rectangle(0, 0, self.image_x.get_width(), + self.image_x.get_height()) + self.players_turn = 0 + Board.__init__(self, nr_of_rectangles, dimensions) + + def paint(self, table_image): + for game_rectangle in self.game_rectangles: + x = game_rectangle.x + y = game_rectangle.y + w = game_rectangle.width + h = game_rectangle.height + + image = None + if game_rectangle.state == ' ': + image = self.image_e + elif game_rectangle.state == 'x': + image = self.image_x + elif game_rectangle.state == 'o': + image = self.image_o + print(game_rectangle.state) + table_image.blit(image, Rect(x, y, w, h)) + + def make_turn(self, mouse_point): + for game_rectangle in self.game_rectangles: + if (mouse_point.inside(game_rectangle) and + game_rectangle.state == ' '): + if self.players_turn == 0: + game_rectangle.state = 'x' + elif self.players_turn == 1: + game_rectangle.state = 'o' + self.players_turn = (self.players_turn + 1) % 2 + + diff --git a/games/tic-tac-toe/tictactoeboard.pyc b/games/tic-tac-toe/tictactoeboard.pyc new file mode 100644 index 0000000000000000000000000000000000000000..007af2bd310bd2bdf939bbb400150e50bc133b7f GIT binary patch literal 2354 zcmcIl%Z}?r5UsYIhcg-OL*gMJA(pudCOcLLp}8Q$f`FJoNRd#>WA`M^_3OHAO(G?$ zuw%uCuxH1wajH7c(JY4~U8!=l%hh#Gm46yu4*u$2{}|KBX8`>hEc*bF;HM}f$`wr& zDYiYzJj#8V`p)(#3n=f&+8h?zJXX1eP@Wzj3Xn%smFz2#pepJ5>VnJ)d0I=4}w2F7AN}_ z%Qg^LxNoaCpjKjfd(#us- z4v?D>XE2eXnX9UpiMBjwC2Ov@T;`S!z_n_*Flipmj5a6w@ zG`8j@oz0te2(!wfm8q?6+PXNR*!JPlIxW&h>k-#XlCUPbZ(qVHYF*yzdXKP`$Vr-; z!lq?mN7zClTCVeWUglL}0CVm7W;&AcqeO&WjEL|CO^9V)at z=G0ZSI!ovUV%iV*8R~_6KUA+(s16u&^1S%j_FstQKa9bG=-c1_W_$p}Lea(-#iI@2 z!WEx39Z`T`msz#xi3wfNJCEvLB}$L47hmpOp13M;^~Lq+-sOwyPjQ9f0^J5XFBqr5 zip2%3!IL4akqz=d1|U*ETaVQH0sV$F9D^q<)BkgkOOfU15?5NT#w^OsDIC1jZCVMa z4*o8#?x1H%O@N1ZZ39S7NOY>7lZ$y<)o5a&!(Em-MOv3Deq_l7tR}k4j26PS4A*&< zCns5n{vdKLDalR3AQ8_-BRN2X1AKyf>}L?92Gj+6i<4ouKb<`SDf@LU4pv_}QV;#`4{C80z($SyZoa92PdCtdmo z8?{d$#eo+*4|cqeap6juGWw#HDUUrFfKSqd36Y{@lT#i%o(hlJpMlNG)*4;$G=Bov z{{c20YI*d|$e4Nq!@h=a(76%dK%2;9-3^O^n?lQI(mF4b7G%_CgG8uSF&$)39-iP{ zLp&|D&dNB-ET$ko@OjC|J#m}Hw^4js8hLy270aj$R2YV@q`2ohCa&q3$1)q`2y(9+ z;V_aPy$6K%f){J@9(Ln@#Z7tTdX)Js?-|CpavlySUClk-a%#>Y<6`%cej?3dwVtKe9#r&j0`b literal 0 HcmV?d00001 diff --git a/games/tic-tac-toe/x.png b/games/tic-tac-toe/x.png new file mode 100644 index 0000000000000000000000000000000000000000..9fbd0600e4691ccd728d5ecd86fe94724d56688c GIT binary patch literal 7712 zcmeHLeN2{B6#u=bArOlc3K0XRkW)bhY5^JYCC~tgSwYQ}CLwc_1w zIrrRipXC|pNuKV0?f^Vfk`prdA1=OwUHDrxGvFfsECrcKaVR_H-@=aD{N(Hcz+P$8!f}1_aC%$@Qs@| zdjZG)M3YDl2=GJL7z7T7m#5JzXN<{V5!2SaDBmYw5gdtt2y1#AGUEFinFN-Csc3`1 zWF>;*=a0W}`wret?F%x8%`bt)L>>L{PF*gULGg z#7S(~(-pqmObM*+Vd;O%ReZk*w1Ii;2M3TP>&4zSf4^rTBS2F1G57s#z>jY8%xIo%Wr(YNiAh zQ&e;~1`JS(+P1kEqcvv<-YUT6-8R9Y5x#n(DA`oWW5+?zyvEde z4gAm;fqwWb50Mk#_ncG0evh#s3@h_r=Q-Y*g5TMZ+dW ziCx)GM2CDa4`W8!sJ91;;zORng4tNHz-Fcsx(vZ-(TJJYTa{tRtHuAlEsp2)TSdX+ zEP5pzKYWgHqkHRf7?v`XTavXvWi?o$oNs~l#OSTvh%-J2U(H8Sv`w%pQ%u6LuG83r zmFux?i|O1!4fI_|5WX%%%p_e*6p#ciCWED>z7}V zlG`^tJ+nrQK>2sNQKiT@uoHWf0Zze0g%?_}^N>LRn1OZcjyQ;%LU-?>xZI!?G6Soo z9;LgSf=Vd4d<6}sW!lWZVx&8fu3X2y!!mvLb|MSnng*2Z28*1tomYODCN-bsL-G`C z+JOg#WfrSe2^qp7rd1p9({}KlbML-HLoYVZ^^%p~UfcV-om%bmxn7gI7;;#|v~0Bq zOuI##T6bO+-p@qDIKdk`$__00k*nAg*`3o;ig%`_ySB(zBHh< z^hjc@s^d6!Sx;WhW3^~QsZ&L9+b5F1Vs&NeT0v7yon#AuH%DVXx(`OgSld~heF-dG zSzRWpl*u8OnXWU)tNG%&;sv6Ne1;$`R(DVWi#t4A|2Z^TsCQZvikI~+#=FE=dGe~Q zi;TCz?AK)0k|YS;abFCSzIo%#&gWU-AZDqF1lT#AY6UyS=`|>|b8uJqX literal 0 HcmV?d00001