From f6e163b08f71b58b68c63b8da0cc04fba3d58593 Mon Sep 17 00:00:00 2001 From: hmowen Date: Thu, 10 Mar 2016 09:10:57 -0500 Subject: [PATCH 1/3] Added files via upload --- SoftDesInteractiveProgrammingProject.pdf | Bin 0 -> 76257 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 SoftDesInteractiveProgrammingProject.pdf diff --git a/SoftDesInteractiveProgrammingProject.pdf b/SoftDesInteractiveProgrammingProject.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d05b2219c22e86be9b68fa778b45416575838d04 GIT binary patch literal 76257 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%0DC9 zU6`TBhHfU3Ya%IBf*umYM9|!xaGqC*I_Eo<9%*uf*f1s2kb}K4b_TLp?n!ml9>0NT zWO#tL;n(hfMIAi{CF%&(P+NgKwN6#pM{$avQS@Xq+W19B#35957sci>@$lQQ=y;Lj z-)rgLi6MK1_r25IeHR}A8EjUUmzWzHJv!&x_%?qwHaon{YF3-<#cXZ$t{w%5%nra~ zqE!adC_NYeGMSVq#o>o(`>n22JRprp(TUJXVlfG*F~B~iR3bOC_BU=8sC*oXoT9HB zTpXIz2_CuINGRG80@!$16taRh{c#R;>(e*uqBtI9i1W~5k+HI$!cCUs8qTbob)XJ^1QU7vAuQJ zA<89D6so@{%9Y#zI{|K0^c)&&%n(yG%AvF-xsoBBg#97OAgAp6AFqY6?!}-ns>R_% zMj<1jTbqsuwd@>BtnPu_TIe`90~?CyXcK{FitHWIcF1YRHWiLh!A1J@VpFP8{eD6=UAOnw;p!OlVAx8wmIST359$L(o-9K&Q|fx{Km9=07H{i?Zw0uY-4@SqH;{-gkY6x%K+^Pc3_0k}{EY2Lg9AW5o0 zEcyph_)v$b-+3>`>=>bH!$@dzzYG{M4pkK1Kq5Q0R`L??DEROOW}Givc;DGF8l~SE zVl|!}NAOFTqBXm|4KmaG3AI7t8kCPiu6j1*^dxF1B{n+QZDxPyh3!P;Pt6th+IopSaR9-k%lU%L*q(T;nFd+L3L#Tg|OOR?)yOwsiw*cHXLG-|QrwgOW{O9e}%rI!P)2-C_WPt^MBeXR3~1> zHh>-weD#9D;Sv%KpNoemX!)1Yel=wH5yafEU7SeRANTnQn)O!^PU!ur&jlO1f<_kQ zFHzjCH{B)r+hz3&gA-d_;GW(kbyTV9C``0|CFdw31^AT(dO@|dW;6F`_j`o;ffKTB z&Xdm{a?~Don4NWM-LI5qy$@4ucqhHl+O_#RnCr8Di|lJ;Ah-qB+UE&uhb?fJW5Q>~ zfKx^p+7!Bi`&gj7jB0uv2!yq-wT&IL=xbl~e8kG7D!Q>^md3PcVDtGoiN+8qP!qWj zh7vtV$72!0h@Zs&f>RLaNVe~j#vOUH8))j+z-z#UVsQFga8!Kafmv{Z7k#;21uu`zQp$7g4z$EOpu zuyQhS_@-6{PA0-8Mz+S^g0lDwjQ<>RaCE|FXZ=q$>-x?z|FFaRUA<8qrD7A>KayP(8cy)8U*@5{DC75dMqHx zF9ZiR4-t#`y9pl#AKXKeKPb6q4nG2jGYB6fm+fb`wZ_LvhimMX%Aplg6bg1!_pyeD ztGzp*q-1K*y^X>$Huf`NX89UJUJ3rmZ_4|}-)DQ2F@DyVv#Rkmn8Fs5rb*O7Ui`WH z*UZ6%v!0AMkZs#)0U=IIejV$*hDG@5hz@|>zus7_q@}0&N@8(bNZ@2VI$aM zmQA5j@%TL@B~eB8?kt_HW2$edf5hFgRJzM2!r9s(9b4cPjSyh99`oh!$nk#D9&7I< zA%{Ojv2Ohwha=1dEm9^7yc?yre>JaW8qT?x`KhXyJSCBq>)hv2yG%+Teqa5zj({&> zgv6|9v6VV4JtB41_r~w|BkBVB5#ZG6G)x1fsec{9`&%_^WjcNga`wq=_61`Bd#>|#~dpa-0n+fTaM}Tujva}CE z8a|0Q>YiK6JM`sUOU8mIfRNm*nMG+JOgMvlS4JLmk}#vDulXP|D~WG(CajKEp?Ho{ zp`TP0S_(!KN@8E8m)v}{0icF`rh5e44{r@k5wl@B@oaSnIJ1hAgBbEcXrqWM4d%U> zz}`B~HX)bFp`Lu$o?fC;T`PJf=wausdd^r`gje0>qD1dkf`qSD34nY8`66WF* z7XeXnG8uNW1f*$*7@wgoN$4m!yo4h#QMNVK7!Tk*Iz*c_Gr!}UpJg@Ki5MY}WEO!I z9emxP-nnPI`tq@$PJZ)vm&*h6JeaWQ;_MejALg{EtAmCV61+p;zIH||M?8wAUZ+Yn zY&VlHOBe>&O=n%dARcd`DTkY+i!x3*Irh&x3@n!F8l8|!%Jtp;@6r0d1gns(jgyIu zlOz5=5v+($Cu3r4VIXMhhOhNqr^jdgj!iZWMtmK7I(Y+!Z$W&&JIQ< zj`-Z%_;ey}PGU+<-%bxjQ@7FC<8tt%fA;H@frWE z@qdKn9c+!1OuqHe`YsEL;?pUcxH;j|Nmv`0nF#(n75aB7@sC>S-#}wx^luHQe>d>4nnrpcD6SE+#NeUosg}St%H)C zfzdZM37fcB7?~)FeYgDoie2I+7G~z(eZs_sPp2ef;P?xl>ECWj$=T59UoiMD#s5Q- z|In3A&BFK_6PY*|{vUi~{O;s$9UYw_(!RC^qt!E=f`w}A22~P!xR!!wzC38R(To$m+EVg-d z1{Vt8Q|edS_eUIo|7j2KhyVW~U9w?$CK?H!A?+T4x5)OID7-VzS4(G!wRQ$He9MQ+ zLsRCBeapufUtJy%0>I|_IlRG()8zI1Vh>;jPB)3FBYeo#J=g%#-vip7jD>oar ziWcPEyIR|rs^sQdr?U^sb93_@2&yhV92dmxYs~>Wi)dRKtLaTYspgc zSM{N~c+}eHd<;ux*ETMv&HK~$G&?^cw%Cu8{VCjlNGaew2=q()-t}@EQA_kZq_19n z4t|Bb@Ik@$w!Fv~_%*GOJ4rPj6RtF$x`H(?lSt;&{?u@@mP?k+C=#Ao`0z_e>^sdY=CeY7Gwl! zh?pvMP+K-1zg`kXS*2(n8T-JCpq?k|6uc|D&Lf^KVQGx^Zy$c7u*RN*426F+B!Lz8?4>gMa=IOI? z1NgQh8(#Ul{N(uPrw^A9*a+p&gEBcVV2!K#eRA~J@L-?;0&vY=4mQPsvm#E(p=Y2Y z*DS*@uA@pi?rd%tH?n?{<2Z4X3|{{BMk`ATGd&3;sH>*7hq}%o1Z!DZq*x_6=hKw} zVZ6fWO1}zos(63I?Di2a$;I@Fr?Nb%G9!hEO?^MG77poB-J}=f`;6tmjcC6(&de>l z;=6F>lp+s(Ii>>$c|}Q47L3EY+A)e&{x;8JaoUhzyrR5DpKLEb5|twxsF;r5tPv99 z;cmyXhb-r6Wju>Uo7Twv06r6W?dZzkIXsb|+>1~M&ZD=1p6#PuTs8kNY>^gNbvrHz zc4PjH28IVh<&Yr0)}gHcG(VR?iS?LTZrY+$ru-`&I8>Gz1z(A3_5mu0D~SFlThlpi zK&^hkaRD+s6=yfw`wiUk5Dl3r1QE^5N%Lm5Po*t%QI*BrbQ6 zq=4=`xQwGVR<&z}d#A3Z^1jgOGJ22#$m?f(Y9(dZ3wmLSZ8>BqnaVP7jAW){AO+?6 zds1peEl~9qZ#`F)dyr``G$ClSw%AKq-!Rpj z<A?T0OQ)^`cJs zdlHokD(etn@D}=R19at(XszJd#Eut~^CRMJmM!|v2e0wPQdHF3T7&&33~=ZxpzNPQ zMS8B#g~HWhO%1i&e^Oz1gEvvw?c0Zb1`Nk*ik5?5dIFM`y@TkHL++cl%4^%KniZMW z=xyC&^5{d?en%LLMUUiGt?d;)kJNh1WMTCC;ck~=*Ar<0cp9(D*f9kW>Kys{%lKtT zm9BO*Z`_u;&yc}gd^e+9(Dm~L%)3Y6HKqvz2_(^|WFl^oq*dDEb;s|m^~n8Ot(G=d z`(c-^yR;~Gq)W9P7KZua83nBc@Y|tkmjJi9@lMf zU&cdE=v@*AwwL&Y>)`*EQ0Nk;H3OEvEsa-znlwO>@z_ z&d^UYfcCS04~P5TFcawr@c(9L7a;MhZACc()WkErlI^2+p$@Op&wClpor{F5JHLqc zc@3|f^>B*&lho)w;ihLoUga&(S8ptQ0%qP$=~1c&VhhNt$&-G^VR>b_Hg`}|cf7J1 zwB{>AL4oH`LG4Qd_V|7d_-dPcogCAxYzGk>qgth;NMa9c`B!*7o1qOH79oz*y7s!^ zvLEX_VWAD2?)@ai9+>uT=c8%tk__qgIt$8q-U}H8&hv2>I^%P(c)3Cwk^dM-vF)`R;yunTfWq)sn@#0cIZ0eI-B+UV@s@7Bv+q70@dG6xFf1_G$0R z;PnfGJIm3S!>VY>O7o@&8+-5!^LG_m&E9V|vI@F$2%o$|BW?x{-=S6|RLz!l-gW@L zdJYGsD%p?=(8Q9YusQoUP%MS-0L{txNS}E^rmsJP<~p}G8i&orZl9*k|nnZ?4>e>7XYV$F=dXNCJW%>47Fs>J69I58m0`913n-EVXk^AhON z{O)2#EaIxGjx%HT@DOuL+F9Z+Cf4aT2#y#+Kb{#=G$K4@$rmHwyy!{%(4JH9kWQyO zLRbP4;YlzG5=+B}O&{Hmf;Cn}oRT&eRBQOd8vveh|17tn4+?z#05e=Ti86Z_im$p~}n#EhGU zA2agde$Nd)_~rb>{G3WS+8joR-K4V#pHskuT~|g+5+Sm@7DYMocLZ(z69HZML3Fzi zg$#DSGj|7O6n#t`anmQ%*;`r3P;+vI**`tPQA3N0;$C8R3%&|0`N5LzQ zaZ#5bm`D{(6VS+=%I)>H$X9z?nf!usbMu}~%7PxyAt-^C9H$XTAGylw6v3QPkj~Oq z{;QCW;pEDNDLWP7T{6jfr@D4%mLHo&jXn4PGes#xQ*sxhnv5#br_R8( zdxgN@>~$mX{3J&XqfkuRDLW?;M@g+I2r$}Aik0U z_4Z$Cj)EnJ#M6+{HyZEzu`8eeCiIW%=u5e<-Tc)02KbHX=@2fn%D(XYoKN3@l0iF- z?lQqjwXN)(o=;(|s>W%n-dRWq4~DY4jZbzd!W0>@GUO ze2m`x=a%7SrYXb-)6^OgY&df;#&x;ou-kOBMjJM-z1X4*rC zb)IS@y5dazW`YWJ>w%2)9=x&G0i^$H(djSC0nJ1@b54kMF{iwRR|QB8M!;A5J!WHA zxhX`}huV^H#JF$Czj4t6Bbs`N4$>(H|1S23WEczL=%OV(RWf90g z7(9sK2uAFRswoqpqJNwYEW9JpYu5oC4LbImjFbd=r&RX?Mf6W8N{z1=Js*M5gN*D_ z0@|YbS=$!m+ffHtp!KJ_vbo@NDO^-GYpDgi);uk15Lb*^xlOopuzJT26jO*r)@T(7 zi%?=o6ihqtbuNKM;6tYY(f&q1{k&YmjP!3eNuvG7TvOP=Nw;-8;Dn?%|7MZ2Dp{r& zJySzOcNm=KcuXxEYq9U5^G^8h+bGL82C_3uxh{L{q4Uo9C)kkFQKd^*`RWU-(OF?A zZot@W>%%8Hp54FtOxYfGNZ}3Y8ybb_v>Hk2z*1xtO@rHKZy7$Pz+9qw3sX-cyfHf2 z^XpyRteP5k>)mO+T+W9uSgBUzhiAArMtx6_SS{i1Yq~JJ<6VA1h&hSkK)l5c!5pS@ zY-KTHkpD}1l|UeJbF*G+Baqk-F>nrF3jOl}kM0bN@Nol1cCY`3ErEZA5m@5Y%DXDA zj%2N`jHIvAUQjavIf}d^8rL;2!1}RS@3g)@`OVR!E_u;00Cn^5aJf_o z9~S~Xr4822s?t2#^oKJnC6HC4(v}ys%c<9l&2xcVvPzP_NxLfugE{LsRhi#VCIp z-p3%*fC2%}R75Ixw^fDZ;j{*c7O*hyJiv)J^9w?@9f1|#O7NXLp8Dn)rn9WkllPc( z9OY6noNzRk9~IP2z+h~i+eVbq4mhtH=Q=6m2|FL|Nz4#vy~IZ;o+>dZ+B58A6Fa|qDw1#T02{+!mN979F-Sv-4=?Dt=>-xPXr7Q?r2!IY z2V?b;$BD==(|MAQf7XAcSop z!j~)WV`_mmmmd(s6?fEXO6lzM9+yayI}97=9&||Q1?^Uj@&89q?4hUr_elAl%p#s( zTWz2_y6=@l$6&8FdKp0ZyE_IM=yi4!(_wzfqj*T1cgz?v7IL41yeI zIsCnO!VX?6rCrX;T#jG8&)Sq;?Bd%v00g#>=DwwuXr$jhSTtxJU&t-c24rf|GVa14 ztc1@4pmp>!YV9S-fGMG^i2y><8Kw5r0&q~3p=XPpcd>sfx}z8bBdff++P0{_KDoHd z3KK=27_vZWOQA#j4JLR2BA9p?bqz`Z)@X40uyAlkIckPh%CZ@NL@(FB-T-y^rT*K; z`?X)J=3Kk)3|1~32gz@DbL!qbM=iITMNH_(9u~EAX&xNHkd?|6PQsLDW1U*>7#BrA zcH0db-V?Sb;+?7#8CGu&JVOj_&O17Q4~UaUTRb#_UW2wShYdJ@ihFYnwdKSfhr?D@c&q!fvCibEzjZ$zuakTta~Na)wEXn7dyk zWP?@^u^nIwn>~QwoLC^;k_%900%*LTOPo%Uh>;Phf(09`9$ZJlVa{7a;m^1g94i1Z zqvzjZtxB#P04h4ne~TpeEfOqnqA?(XTG(f0m=2FQ9UQ?tvNPx3U?V=3!g1q($v?;j ztuqe!q*t1{=c9y3_LcPTk-k0dnnHUrDZiY)&dd3=9q})>r~RuW$re?9JYBIu3Q`oI z4W+{lwciNR`D>;@s*Pih{iO}o4xp(lr~dZ|mjFVm-DYr$WM71fCPFj$t>$#iSFQdH6Ye}AO(KOt$G z$L4DjEEAD~EdJ3y6i_b#D$lw@z_$PP!NDTCF$vo*ZG|;F+WWci-@lVhXkw}u+_t{` zy+W$JLwruDioUo7%UPtR2>9$8U=$i&If1={&aE~ltLwK&Nm8>9uNPA4hA76;vh7|O zFw4;$zsLc>4n9L`0c|$)i97v=hzsuT%c>0&ZSblwCtKI$_b5%TbD$_}zYRL%?H1Ze z?MLpptseYe2F!oKfJIE-S#Z4C=$$NxUX7oAsqdL?;)y%sq#6}Idf@954WfQ+k|0R2 zpZ@d3Ef0#9D?a@Hj(B81saVeOY<0q_@uXU4$pQ~%nD!8N!lHcaYZ0Nc>Vk>)q_qw( z(09pzHI!^Fr$nuYH66#y{SVsSGN_UuTF`8uX`rzN8h3YhE*Bc7ad&rjcWK<+xwyN# zySux)yAE%6c6Z*qjhX$kf3h;8Dk`F~PUgwX?+DT#tNhYu)mO!=p|_~Y#Frob4001( zSJ;ljgc&+%K+z+ zv+5xyN(VV)rZc0tW)A?Xk^g4-IrurQ0q%+`yGS@hv!sL-E8wc@0&6jwOZ(%6k{yce z(kEiy=ecwr=W8~L!%!nQC^=6clR_U)-&%lQT?V%h6rNsz^h%Zw=%6YhcDBdt$>MU* z(Q86MX}}1)kRtbI#5IOOq)I_ScoWX(VW1A1^%BB0BUs~JX;;S3!+zYHaC(`Z6a5O2 zHc({%H3Nkqf$ncwwTnDxqe0G~pp<==dg7a(m~$XA!`Wri`;$aTn6Ep=x)5CS9Rltq zu;l!82OBPejj@D@uxMH6A5ntl`zn94WKOT8mpiJg9P%A)uIrysR{YPbk zGI>xT;1i0G6K(ImzzLTB0Z#nCqNM+mlQR-9vaxe~q4NKZ&Doe3*#9$0P=j&Mn0Niy zY-f(8i3qnyC!q1K;C4wO-3?gk@v)#4)iM-!BIzY`OLd*$#u$gI6>az#>GLOCWv9vF zujq-4+{0c<^g?z#7p){T%wI7InUg(?Smd99KZvj`BDmi#JgtRu`z=iER_wWVKifaw zA2*ZSH*r!}h^Vr>cIt)}%SGfqnV!CE^y!hBlPk&TMox?df+ya82tFY(|%XD4fGW-Vb>>%ZW}Q!X zE|53Yq`%Ks@Wpjc!Z%MW4`iolp^?L+Z2>^@`fK)OqYt);;)JYYZE!&|coT|c!eg6^k!37I!`o@y&nMSda&<58B8X^+P%=j`T(JjAF6kK! z>m~C@o_^3Pw;n9Qx{!m%A8ECm_I4sPWAl3rvZwy4ETX?it&MIj=PbMEBcXH4@w>} z+G;j_s&YEL9t_!_ZzObOJ#+aMWo<_ADpE|iAnlX{d z8{?o{D7Ge9{CrU|$MQIa^4Ce)jM4h<_`#_B^97WA?RsOuO+C51_TH_0>k{*DlICC> z{jET8NqT-URo^RvgZ@U)R`2vrH|`Ks3AU|gu$)IPK?e(__2{;=26F5C0t51e541aX zf<-8g7~I9rz{qTN;oj^1-0gN?F5dz@yhvn3U^YOw_x14W+P|EYk&#|DPc~WyKm5D` z9Im`IC2x8#xe=!!cm3yt=xBaFoKkh0>Ev1i?`Ud3+e@wbe098%xp%zsZD$!6pS3Fh zU~-%IEA=Yswg3;BoT$DhK*R)E++PVR0owk)3f&NZTytVWwgb*edml}uNnn@q1?=ll zdLdU}2V0j{dj-y>uGCku_dJg|<$(Yuf3puJ``hkYCE#>fL<(bn7^Zw}W&@$?;8AW} zW?UKdmUR9Uxd1QJ8}ZKIGr=L-Go=?dY65|6TEUUQt*F`$tQwFe-_W__xx$r(S(IPo z+#Xd)KQ|IsoXA7!JOu6z*pq9@YaU1m8moVrJ$^))Fun_Z|{^G4p?#UM|JKKnC zA{<`z7LSsM;?%w3aG2eSuDICL^B3?sHu|ksk@5w3I~RVO?0t}0ZiW)p0v#iESKqI0 zt=1l;j?y3j3nJH&2bUxt>)$r5Y;GP!o}BHPLyp_X>!DsP86RAlFa3;(T&KS z#a=Et2px&A?bMF#U?7uZWk2i{_IQHrOToAv^ncV4dK#?<+&dSy{4&lnCMczM)<+{L zQ#jP9e+3EqpP9l`)xtR?qDndMVV);$VdagIH05T2-Iy_oSM9ef{BTZ~p*9X4c>aph zcTG9^VbHd)=jk7M8#gpQw5;+XJF&ht$g|K42xU82^MpCP=px@hv52ns)Y@@cUm8EQ z=WGTC+DuhEy1Qs|huYr`RbH<&b$1j_{=3@%Z5*DzuVsjHFw56|gVH3O+j0XW*tJVK zw=~LNZ%Ku;R`lM2y{1SOTwaNo7UxW60qhT`wCXGN5DfMj{#bSRA0FZq>aE@W))3Kp z0KOpXVS_FH*)&^2{qt#x;1%&;2~$j7U177-B0MvD8p@l!r~F51>zQh6R+ky^aTpnD z%*chSvmXto1ez!vy{FSkMWd0a#@zMl#17_6@@N4jXZ(hyR|ND`0SJKq| z8N*Aq4^@0SlqtEM8twgPvI^lkq9>USp+&hrJyx3Vr_W);neNI~WY-75_}~id(6hW% z&Sx}BrWkHaizcG%Z>~a!e{pH%Pp`$lSH;@1G!dKp+KU}FW0^ra2nv3e$gM`ZVAauO zxh0Bd1j=b(Nj1a8o8WR=(=)8;-xiAMX>3j?UU#qx19u6GzjDkkvceY~0*VYV9tXco z8Z6$B*eJ3MrE&q8Gpy$yTC`@Xlry8<4^!Ll`WB?=uXFE4)8`$&T@e{wYMnFwye_}P z+VXr8Zo+&W$6q39iD94mcJa9LY_%v~_wy9732#8r>p ztJ6&F8oVK2h?|3sUA=s0ieVqoHJqo-InZO9Dh~=xLEZ0zTkSw+EY;Xd^>i^Khi-iA zI?kF&L+KjnIBj!|>7W++;c3%^(rBd`C9dF25wAym9}3p}xhZ{4UZ^d2MspAz?CvIh zWTBbOM6-tdly{O2uj7M5`lw)-^$>dSg+q}r9HV3L zHN7f(w79Qx^~kI`yv>pM9b&52!l6F)ySAT5mefp0V~rk7#>NLm0RUhvx4v zOnwSjYO=aNOZm|2fl&>}GSDRHZgh$+XP_ug_p7yTA^!w_RDW2gYjJ&>iLJBlnQqXx zG`G9WU@zu-cG&Z}w}Ua|-KK-Kmz~mVMCP&N0%2fQ$byBqCqVP93t+7di3=b~)ZRRJ{HwNcvso<|I(B@%6F?0%-K` z`q=}F{t(s`vT`r%so8^3yC>>vxr*S_h!D*P$%!Afb1z@%N zWl6iLbZOp#{FVFk@bG%_YTpC0Qg5-!eA)2~_RP%*;+1H%-^u{ujLeC-HDGCMz&u>*U*`@wyy4~vS-kPk>H@Y!OCJY=rQJd@s8t+!5#;#w&FkZDRO%S5}`2ELRJZwi@T$R{z~6_AFAbv8n@q?_`(3A?H+Z z$WYUiYtE_O1ATp49@LIjm7}$H%NcLb6K6Z#z_TE`%9=NZcq}ghQu&wGT1q^_Z+_;h zhE0~tzAMcZEVQh|*3_^GTbZ4;Wk!7$tf4u(F`P-FyHboY91bDJrRV9DN$7=) zoe?T7VaUiYX44)wEb^xxh)CM1DR=t?@AGrMP^I4TrSCLFxqGrD6&h1U)lSWJ1noD) zw08Nt?XgJKkBP%_^YwsFH}HNX?;sVG$g@)K+AGAGxWhoybx)?(tu52is4>!?TsKc^|ob=8bPp|Mq8<}UN-c;TvSa? zsdA`N`M(*9svR3qi+DWlD^*r_yAbi|)WF!92Bz0rFuDW|o@QfJSJjr#KSNIjtDME= zY>f^knMKTIwKzEWbLSjKCTUC3WcJ$_fr6Pd#sY33lRbNW16jf`2B={HLXtW2<}Ryk zN7*L@N|1i5RC$kWwqL z^cy@*e}%-4fBn%${a4GEH4#T zHhdCyGc`|~#_2M~r0Dm{%IacGV{BB53%{ADl+sKUOx4Y7WY)|uhbF}>e7tI37~JIfS^8D956;8g+TUU%V?D|EW!Yb;yqR*Kde9rW5~Jr{L`uRI0i4Nu`U zOyj97i3<&74N{9X)>@X;sY+_*&p$!y)2#Cz*>7M-m&UcDl}g) zt>n!cG-q100rGTO+BcpvEHw)a+TP-6^A3so+N*13_n>(r+QgxY+7${k^(q}c39mWa zsxC5`D&9Wr!^@q+HG-Na@t>swaK6J_yHy ziFU+O?qhz46-N4Ftr1rvci1%zHyzB{*+#0~l@Q9=@Vd#=Z6g;UGfrqS_t}-#@#}@O zmqq@E=BRP0IBh<3W1GiYcq<8?|NPP2jL_$}o(#-*cWaFgW-j|D$qe1wMG3u;`lv14n7WZ`MzBLwUMhyqQ{7Fx$- zl2j;ger(%Vu;wsQpo~%}(aa21vj=*hrrlTkA<7$s(39jqW9VN)8L*2sliK+SFXkrL2+7kvPlRTTt0PrFw}T7A^eljpP*>nfB!avQ#1*o#i>J* z39GWgXd^}(gb47W6cm*n9v+k&0F0?l!KfWJ&ig?$>_WXC|LF0|g+nDlNTu;!b1Oe` z$9-)o5v{D3mS$8oRccG}ZFhfES8J7-mldy0X^<;vwl!B+d9DYd#eg=E|AfoA7hW(M zv@zkvm~iL`?g9jxvGCAe*Clhw*)AAVdPu#-PC17IhC&WP_c9uR#D5Na410 zCQfNgq8PF?gfYQGK~g9@W14KzcY(ReeLH4qirQ3`+Z)lrBwT)EfiQuDri%sYn}okG zPOz2zFQ0t_)(`B23lzg$A{JQFwX=(XxU97uQirALer8!>L- zBSCut%kY9*jiXf0OnkkxtkE4$Pl3^3Cy|dCD5Xgi+7>z{(YnmveXSDGN<27S?PT=r zHg0ZDv#Dq;*z0k81tl(-m=Z$1!%JiwG3t}GfX6&w;evCF^;-s@NV_>#$stqYzN5y* zf;uP8nE5?%1M$N{WYF1uhbJsW2S09828MsnYMSjU3J|P?!48qK(U}x_^jt&Ch1}PlE-@HigERM5O#If0V=q11Okogi0#sW_k6p5?yy?064D#9s^kl^F4Ev;oK zJF!ZdFy=vy2#u~W%s4n2ju0!+D@7NslEIIuxQoX($p#?}lK&yiQ#9;2j}%Y(h);e< zlJCO8h}&w!!>Da)I|x(IZzl7fqQG%C0TnUi%S#XbVj3dQks$tHQ9tJV?i)C4w4!6@}28B2@o(w49%1WjO>L;12TdtUv_HXM-)PtquQD{B(2y zI$y<%mhNWEIXZ5rYn%X~V%qR|+$!Ba9Y`8n91>HlS8cx-)ci4W^-F8e?730u;MkN2 zh~9}!tozoXKE^|_d?unpnSAP5sSv>oZRzR_9OnFpa_@YljSTS;{9C^CqRa=hSztVv zq?g9vi&Y8D@yKk1m_CKLbKwogg^rxE#&HeszVrp!Es+OBR7yqAE#04kf7y#C9(%<> zC;LW)VTKI`f(a>KG1WsEN=|SCX+d%4@I@A|M5R!3I#MJZND8XgZW@b}ZnzZVO(TC> zFmP3ZF5QGI!D#U}(dIoF=OG*RrBtqpaSD!|oCV`Ak@h3@P|dvh2a|nbLQ^M53QOm+ z@6Kg_(GAr03%O;>s8Ss3nd{ZI_iN=(mevOS{!%;wDOyKzYH&7KQs~fT_GQBtC$?Nw z#Iv~#<4;fqvRX0JTgUvDBcEDN!=svB6MVT$T-DX6683(+I9$5PSF7zX1gc{K1?x zb-$5G6{W%Oxv7dv(Z%Ew&NCMzc{k52C$87EpvO>|-5RbMk!we%0qHB-gR z?TL*HVY9356xfoCzA=TFNCQD}QJ@eLH4_y8(cV^gT>hO1aQt%~o!Izv$cu9)ZB3Kk zYyzc3xWJxi8EKWR_E1;H~Y=hv?}Sy|FRd!e=cv_1vYl zG&bM+cSo6l-yx7kT@*F^-Z%Ts2gn|K=|5SP$-r|s7-*Qvm}ghqk^s3Lqp&7&ZsujW z4VG3X);gcuQ4+X|DZj2hrGykwF5({J%`+F&DwCvVO#RV@39=GF$KT%`a|V-~f4##&LhC6pS@sQ2^O(szpZNvRXf!_MY z(wR!$GMLjDWiRpZn<-aSw_Z2ep_>XF12qdG6VCF(=R>hKfc1TOz;>_#|GE5rF4?3^ zvzRhr$wZpU!5NAaBDUG%QyFvGKr(PwI!U~D*)d!q;oVH^+=_9~L0rQztimC5ERFvq zV_f0XsDO9ykl*=6x5VT;JZj=Ehk4M9BGiPf(R#yFkoA*vW*YBDW2B{NnU`k!U&~MY z=*({8|3W4H!v*L6a+&yFP>CZ}>QTOF&S`#-qW(RU zOtKO(Aes_*w+Xv6*9Soo_1H12zgO>mF(edieI^-&BrK9>drgh~4~$$Sr=*(;#aYpc z`INxG@6|Gd!CImeJn zKQ7XubW)u6_&B!ziJLz*lKv7;8c)>hN6h{3+ha(9hnM(|HTZw&Cbs`?-Sp+t#KFPL z_J6}0Mn*PP&i_nrJY78$gccr(TjtmQiV~cO^V`KmLw}F`Ldpo?jMm`otXl|g1Y zB-|pb8cOJz@Cu1ggchsd>{cUZYaMEtx)yOIVI_$fP`-Sm!d zwF%MwGYlw>U~ONBRIMwR(eOKg>nu+*gD;*9Z2vXvTztfD6S^J#d`iSEqg~JHia_6O;<1;msQkvV>bn7b7S195^d8ETfnOmq zNAtnz<8&S_-?TpPG-=o7Fq2JA|0X0Z$B!#b<8=5}Buu%#7r*RddT=P+(kQg#|msPFT-Yt@_2Ipc128j>n-DL&P^-gVW{(l+6Bb8g+)bt zj)#2zn+4HtOciMLeSv>bwG)(QEu-b@m;t7FZ#S6rDWSu?kpGh+_Ti6r&0VvGGh3@J zhXHTEmu^TalU1=DpY6Y57a-#rvCU;6B1eHq~Wu;Rp3Bh zk}YN(?5bZFVBBDLfmVK6lKs?r!UF}Nh<$pz%A%(D zQ5fwcnzaqadJ@+^s`oQv8Fve*I?zX&j5kMIN0NWaoB^*Q^39hzwQGpj zPc&-qEts|*?cu7XAdpz+kcvD{cP7K}5ShKCtowHb;!tM&cQ@YqSE4_#$6nzn=HmiV z%ls(+g2+s~3%G3~nd*4r4gT`s9zdwle})=;$IbCo87-!;HsfO#TZ*iPOcY2ylzO_w zSceDEArHEgaSYHTW^~Zg_G#6h?T!BS2D5~58ZwDf$T3~@R{QJ(^Ioh$;j}NjyiC;R z!9TDsT|;T8RQZ|pN_k@LLzQJML$r!f7d^jXB-?~)j4eYoWAcwQA}~}y1vD{qy98SV zGUOD1s&{mV<2ZQrQItjH6=q-Iip#M6Bjr!`L8nPiI0!{+jw~{+S7Au=T+FMbE|+pU zo*eq4UhlJAcSjzD7o3+M@&U$e*zwhWdtc|<{8mynLRybZ+HWv7K<5xZ5^|U2@pO~}I_IJ&ExCZ451M9Crxrx3C z76-MjiXG39R?3G*7KYkYj_95DD$-V?b!{o{In?be>HKbH=EP6{<6lISBiF z={dDuj&X;6+$i;cEn`=-^4!z<-6r~>4v6A*E_&fv)T(zy#UN%yIaT9kzXsLL90f+$ z=7(SVqxG@3(GNrQh$UH7SrbDjgC;&M7)%+I-|f`n5oeAFQPFEI`Pag>VAK39f|n_y zV|FbSJ!gvikE31_=oP%zgbY0XYU@at8>ePpplDCGC#pI?K1?a8qgvKa^kkk&tTGNj z9I=b9_;~^6Ts@&QL*DDLnoU{l5Q?8byQQ;EdOYIMi(utHc~<_e(FzBl z+I^Y;DEJ0~?-BNNT|rI$B|=1oYUndubLF)J()^cLbL&3uX@2eQC@&&uu4!4XWOJh( zx%-;J8%TRz)%mg_<_RrO(KUP<@>$xiu?=S4S@XfWcUgd~poBU6Lr8%$AutHIq8la@ zbNHeb8~+*%+Vl$fdx&Gp4gqujrUc_7uWCOHJ+^!^h@w^#>Gyv1rBdG63^hP1Il^p4 zPU6By&5>w3EB!$yy0f^dcYMLH+XveSwrM0r$VX|h;23dZ19tTzLO}4diuqk_nMnE_ z|K}w`1J!%`vSd ztg2b-U7<7i+xXoaP&|?|@&={{xsQuKo5bO%33*k3x2S&oa9zBmh+lKqK=q_gs|2?g z%I|e}i9t->WX-Q+mfd&XtH3>Yr;L3xg)yBQyB%;;LaITK>%^O|Bu^MvM3g5NU~J%( z&#S5YCoL+T@+w3{uFtk5u{xWt6XJF8L7<>No4;%^-(U#PtYfO^3OO74Re0N~Lny+R zbKro*JGN?9?hkKxOR{3JJS@=*4v`=C-_CEWw**m2#LY6{KgnM|*t=fnpep1(-UGSP z80Qk(#jCSw`Ham`>jc5~KPV2L-iNOqN~8N=0Y_l>vHd2 zz$=+l3;FX*@xVl2sQAgCMxOmZ*Yy}HPBg`X@r-SU zg_DkIE%Wn8V#;({7L9g6VSn zSx=W@Xb=gVnvMADM+fla=buZm zl2dn<18C;|bcq3uHg)$#M_lXFw-)OTk_+G(qeG!g2`S>?P=v)xrD`&$xz291Y zJEK9Jg(q&h`f9D-;O=Y|eB8g`uH0z$c7Akt`nw#eqgzYuh^ikHXIiQq!`Y!u>16qlYPa zF|iP#oF(+nOkd=tXba?Sfj#G{8*>>f;n5|#FKm=xX{hDo_w0h;ozgkNJCj^s+O3w} zAW^!oV5VNrE?AUIbr9;h!*-2s+t?(1h9v!^?UEAT6Ax*<8$GPy>xETv%ZbaF%V5j< z7lalJ7qH8*%OBP88!l=(tbj)EoMwh|lWu_aTD<(h6BxJH%pAlykt5=JS+_u~68go< zMf@53km^2%@MB~Y?6_ZXzvEEt9mjAPSM^=XSQ|7gf|e$#fqJ?6uYF_#Qo;3uT)QqB zE*cWt{kKn3PghS;*XujPyYBsuVfep!nK~#ss6GOp=C93nt;064K1Dqw-+Z46ceI1O zX+KQfpsu~eF;b!v8OR9PyJHx5b+^$I>03M*cW`*wvmzId9R*H=7a~f;D@Tjc)RN?# zHP=&H04E;zu7@I^&x-5~<;&Y)>mt*zn>DnCFkIcvE_?cJ`%ClRS8MQBYi{Q}-Gb_j zni{lLNZ5Tw)soy~X8o@_uwjcgdHa&1oU`_f3oParLO^G_5-PJWyb|ZR))Ox7Mf6PZ z`Jl8+^>35wP?P5-2hAyr$^&c2R~qgv748=C$IWX?9{Zf{%G~UoV^=FKV8~dHTxE><{VtiWgr&kcQCRHO#L1`z*CD zU_!(7C2*D(wCvS_oKOC3Z+>>Zuo56|Yt~(yUx?^2b9wh7zbb9X(Y(Fa5N94N#Y6F$ zdE#a_{ny|ij*@&<3W0n1w66&zgW&l1ooGj}5asNNeXx`3qyKs` z(woK|*ZcUXdv_8iC~=n_&wJ~sVmD=Q5J#GKsC0(H&tDnoMZNcbnP}TI&1!!|Pl`BJLOS*i8IpO|H=7_h~@a(LLjVogcxBWnlZ@ zYm`?WXzBewn67)Ur7>bHt_8XKKi~+Sz{E|>dRgFkw)Zrn()dDE`DB`kOmtFOlzYo|9e%yw%>-pk;cR znE7fqr%cu=FOI=r=85J3$VMCL#%lt+F##3tjliHAhKz_0)qlYP;IvoA|!11;J(it}A%wzsCbl7wya;<=Zrx?Zk(- zvIhQEE%oB^8LOEEQ+D%4Q)iR3x>j2|o-AP5`5fN7lWA-HVEy~b>`LuQ*h=XN(%F1t zo&E~cipUD)IrF*rx%qk71MO#`_u%Jn=OOPE{ZM8JFuf0(xhmZXW<#nBlFwXCwzSoym@HVQ3d`Y`3b(w!<7$u_#kVD>)Q>jD??HrfxW4Wz-o)*WEF9DXojzpX952Z>au z{7xMQF%KFjSi0YM$9l*9I^ap}P1A$)gRlc_Gq`pq{YlA#{DZOsowrJQsc=W+I_@dy z%OZm4#DsnR%8V@-uh8?3dn58;>dSWILvV72YA>gF1+O*1Wje4%2hranat?Y)cV zFsP5oEtG9~aVZ6Hs@#HQeQah~@4+}7y|G%X#Bi~ua+zH(h60`XpZe(Zfr+x2eSK*k zd=9@tXo6mKlPnEtX`h*GToIaipIWux8r?$3{f<%kkhhZYO~wx0n(0ONxKZvBNd?Md zD6Jl~)X8gI_sXwxP^yPW9rE*MR^L)KO_Tehy{YCz-VRJHseoo1`! zB@)syGnHCYNW>{B$mZ`Qk0;9Oy|kDVW;B=0)E1#Y5Inx^@zAJngp@cwGaIq}+7k@Q zC&Tg0uzZ138jrrwLfNvi!Qoi5-G!p^KoCh;a`XVz4`j;^fjU(@9ryT(F2+x^)5 z#kcE~(?r@zwd=xDYZceslCML{O4U}Y_wmNJ=Y>_PPW@hOHmennLrv#R`^&`g)r;0o zUnu;QkE_Ux72+tKhSAnmqsfiIN1$x$XIGpw@O`XXV3OzY4VJ#+?uNP&&+Gi2*c!(( zZo}=h@)F1WvHg+vORI)NNoAU~0~$7P)h{Ea~bJCrpn!trqDnVE7#9<4N69WLgo1zxY5 zEPMG^|9yvAEksmc3gLqS z)~f3UUKlpJ6*#Z$^qh>X!NE1QN)9bGRZm2Jyqh?SVpmyqxwZ}@oEvG1F!oci3T#Ae3VMd%t%2(LW!I01SLf{_U*e;T7@@i<{)QRi$yGQ zEtt!jIV7dSmrpxC0ufmlb__)@5 z9V>t7#M!}&VRegJ!o@lhu+`K&+~Z(R2kvhFde^RWkndiN!*)gjcjaj$-GW{nCZQ!g zBt3zV*I1*VY*;hP-G6tW4^@eNsDI|J=wT*2pOF>lmUsS`QGl1?=BVVP5$^0Ds1XSy zwsR&g$*gveeq?EPzfJsjcM57`$7yY~1jNC>n~!inSbmM=*fbX6Embnw(6nHms}ls= zM1w(HsouR_&hQf4UV=anPN3F?M_KSFHaA-%m&d=dr1$njmo=nP?>|155!y}Xi&UJ5a)bYl{ki080w=&jQ-T{EPN{C^e=4PV0a7z1@Z{SBhq)c z6+)hRv6<+qIe}wM8%J-HErmexU3wY707YtpNyad&&A8b@o+<9botS9*V-^|oB3Q(> z8rC@=uR68rq4=0^ZE#W!D)eCUsxkuY<36+DT>et>6XG-32@DD>!aIBt(^NX)0utVXF zZv{=z6gFoTd4OoZ;aL>J7L$YfV*XNc%M=EiEt>)#=F}RJ93O_g>_5uIvTt9dP+0e{ z2>%DT%}or0F&@XWXmTnfLX?`>T%N$&lh23TpdN}>JrQ{Gwf2kni9h@Gsse`;gSj?#gH7)F!WnuKKQER>ot>G=HaI?T76M6o+|?UQY280XG&N-hV$-f_f-8fXS7I z?DEnyeY9ll%?F2>)Abhml09+L#~I7o6k-G?OEzLU*IB(o zgd3e$Vcv5Ps~Tz+JB~oayb&KvHHrT3L^s1nk9TU_W;s#WMu#0o&P3LsUaZY*(5%v= zb4<|?Ey(NmoHQ@fyap|doTizP4+N#VTrgu? zr%kQGo9W#g_U5OF;fuR#COeLPCr6u9dFon#MDtnb#Nav1O=zhlPK{S}MjIsS;j8mk zUY7MNrW-OFpw$br5cszFEdBZY`ThL-%J_(ap=4zW)i#go1fL;o$jzHbZZ6>%kV6p< zZzwyd6I~-9ZC@Z<0cLSec`5o!B$tFxk|VS2yc6N2hJ+k{Xl?bA8+%Do<5>p)G`4c( zcRyFAzF2W^oyr$+@90{N#2ZakD{oS@U}R;X%i&&#RTs zXIJxRp1b6n!fepaMnz0+EJvGGz9(wD$&Y|^TOJD=N~AdwgZJBT$dYYuXBywGoy1qe zhM}Lj`Dsgslsq|p_530srMgv_o^)1`yfN0+c|L6fCo)LFqb>GWPADj0Y@1F|ZU7(_ zA}GvHLM0bch4;HykVqAgl&MvgWchb9C4pVsOkTBcil_kDS)Df78H)k(=Q{pja-U$s z;SA28#xq_tcGB^8yLNLlbf;UT{o@xak;rGi=;*XViuk#UyMsPX=C;TtIM2s?d-@q} zWj1ZBr0TQ-BO}Ah%(R2CqGp!!nK2G`;fc)a*&pzh1*Zi*6@0UFOiL`BO9aK{Z&P6` zhzaAn`4!o6i!#OL9xE>SVG7~WqZ_z_`gS(w3J!?YD1I*E5y8Wlv!rbn@jo}j^;>Ae zI0*K%&&>VRT_`q=dcG~s@wR)nSoCDZN?PuZW-iZJF6T2MK`lAeQsT^??+(c16!vKH ztutw24tQI=WsS%a;#zT|tam>6H%PQK8a4q1~VkubaCM{nH3^~JyAE2+WBy7+@QDln%> zBEwF!dDw*>%hu$fJ>>NFd6Q7X+|L969MQO=z|A{c;*8xqJ1=Y}vF65fK-Uy+oTW@#R{W0It|W)iFUKXBE2lO{ z_oz6f!9`k8nC-xsAcI+YWB9u8YIVOZjX33Xj=Je;CIB4rokZGXPki(wFXDAu<4ZgG z-OBo8E9Rd_CAuNGU#HqC#-QzciLUZXAfbwH%7Ci};aV{KB5zWa-Km@nEqCqk_C?D_ zfkaa%pe_aBD=9B`RQ1@s=$em@$2O zH-ahrp)yN&Vq{>_%al!B{0#FQQ~U7FQf=EDvf1DIJk^Tpc7Y6&Z{vRTh}nmmOVS>g zJfrnVeH@z@X0V-as%~jodCX-{;zshz78^lHH|}+IKm7*4p7!EkKQ@A=rHRZQu4TLw zTBXl^J1%6x7kXM&6Tvu;uS-tWFpMb}TRo6J(7pbP+P{6uc+)?3x~_6rH5x3dEYMRE z0UVPr_`>VYE+>>lYmO>a^VUk9LA%F!cF($^X%9`B1*{OAn=<|YrS#BNG_IMb>c8g@ zwr&RmHez|*$_J(X+@|5 z6ie&WuUs_%#BRa4Jy5)bYHTVO^%jk1b=>5i+~W`AILDQXo6a4V&vEc`RV}�+PL2 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 Date: Thu, 10 Mar 2016 13:39:07 -0500 Subject: [PATCH 2/3] Game --- pong_game.py | 300 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 pong_game.py diff --git a/pong_game.py b/pong_game.py new file mode 100644 index 0000000..f176b22 --- /dev/null +++ b/pong_game.py @@ -0,0 +1,300 @@ +import pygame +from pygame.locals import QUIT, KEYDOWN +import time +import random +import math +from multiprocessing import Process, Pipe +import track + +""" Questions/Commentary Section """ +# weird bug in scoring system that makes the first bounce count for 2 pts +# haven't looked into it yet ... + +size = (1080, 720) + + +class PyGameBrickBreakerView(object): + """ Provides a view of the brick breaker model in a pygame + window """ + def __init__(self, model, size): + """ Initialize with the specified model """ + self.model = model + self.screen = pygame.display.set_mode(size) + + + def draw(self): + """ Draw the game to the pygame window """ + # draw all the bricks to the screen + self.screen.fill(pygame.Color('black')) + + text_init = pygame.font.SysFont("UbuntuBold", 100) + + # left_score = text_init.render(str(self.model.score.left), 1, (255,255,255)) + # self.screen.blit(left_score, (size[0]/2 + 100, 15)) + + # right_score = text_init.render(str(self.model.score.right), 1, (255,255,255)) + # self.screen.blit(right_score, (size[0]/2 - 150, 15)) + + for wall in self.model.walls: + r = pygame.Rect(wall.left, + wall.top, + wall.width, + wall.height) + pygame.draw.rect(self.screen, pygame.Color('white'), r) + + for dash in self.model.centerline: + r = pygame.Rect(dash.left, + dash.top, + dash.width, + dash.height) + pygame.draw.rect(self.screen, pygame.Color('white'), r) + + pygame.draw.circle(self.screen, + pygame.Color('white'), + (int(self.model.ball.center_x + 0.5), int(self.model.ball.center_y + 0.5)), + self.model.ball.radius) + + if center_parent.recv() != None: + + self.model.paddle1.top = (center_parent.recv()[1]-240) * 2 +240 +100 + self.model.paddle2.top = (center_parent.recv()[3]-240) * 2 +240 +100 + + + r1 = pygame.Rect(self.model.paddle1.left, + self.model.paddle1.top - self.model.paddle1.height/2, + self.model.paddle1.width, + self.model.paddle1.height) + r2 = pygame.Rect(self.model.paddle2.left, + self.model.paddle2.top - self.model.paddle2.height/2, + self.model.paddle2.width, + self.model.paddle2.height) + pygame.draw.rect(self.screen, pygame.Color('orange'), r1) + pygame.draw.rect(self.screen, pygame.Color('blue'), r2) + + + left_score = text_init.render(str(self.model.score.left), 1, (255,255,255)) + self.screen.blit(left_score, (size[0]/2 + 100, 15)) + + right_score = text_init.render(str(self.model.score.right), 1, (255,255,255)) + self.screen.blit(right_score, (size[0]/2 - 150, 15)) + + # if self.ball.center_x <=1 or self.ball.center_x >= self.paddle2.left + 10: + # self.score.right += 1 + + + + + pygame.display.update() + + +class BrickBreakerModel(object): + """ Represents the game state for brick breaker """ + def __init__(self, width, height): + self.height = height + self.width = width + + self.MARGIN = 5 + self.WALL_WIDTH = width - self.MARGIN*2 + self.WALL_HEIGHT = 10 + self.GRID_BOTTOM = height/2 + self.BALL_RADIUS = 10 + self.WALL1_TOP = self.MARGIN + 100 + self.WALL2_TOP = height - (self.MARGIN + self.WALL_HEIGHT) + self.DASH_WIDTH = 10 + self.DASH_HEIGHT = 10 + + self.walls = [Wall(self.MARGIN, self.WALL1_TOP, self.WALL_WIDTH, self.WALL_HEIGHT), + Wall(self.MARGIN, self.WALL2_TOP, self.WALL_WIDTH, self.WALL_HEIGHT)] + + self.centerline = [] + for top in range(self.WALL1_TOP, + self.WALL2_TOP, + self.DASH_WIDTH + self.MARGIN): + self.centerline.append(Dash(width/2-(self.DASH_WIDTH/2), top, self.DASH_WIDTH, self.DASH_HEIGHT)) + + self.score = Score(0, 0) + + self.ball = Ball(width/2, (height/2 + self.WALL1_TOP/2), self.BALL_RADIUS) + self.paddle1 = Paddle(5, (height/2 + self.WALL1_TOP/2)) + self.paddle2 = Paddle(width - 15, (height/2 + self.WALL1_TOP/2)) + + def collision(self): + + if self.ball.center_x <= self.paddle1.left + self.paddle1.width and self.ball.center_x >= self.paddle1.left + self.paddle1.width/2 - 10: + if self.ball.center_y >= self.paddle1.top - self.paddle1.height/2 and self.ball.center_y <= self.paddle1.top + self.paddle1.height/2: + n = 180 - (self.ball.center_y - (self.paddle1.top))/self.paddle1.height*180 + self.bounce(n) + if self.ball.velocity_x <= 5: + self.ball.velocity_x = 5 + print 'panel1 hit' + self.ball.center_x = self.paddle1.left + self.paddle1.width +1 + + self.score.right += 1 + + elif self.ball.center_x >= self.paddle2.left and self.ball.center_x <= self.paddle2.left + self.paddle2.width/2 + 10: + if self.ball.center_y >= self.paddle2.top - self.paddle2.height/2 and self.ball.center_y <= self.paddle2.top + self.paddle2.height/2: + n = 180 - (self.ball.center_y - (self.paddle2.top))/self.paddle2.height*180 + self.bounce(n) + if self.ball.velocity_x <= 5: + self.ball.velocity_x = 5 + self.ball.velocity_x = -self.ball.velocity_x + print self.score.left + print 'panel2 hit', self.ball.center_y, (self.paddle2.top) + self.ball.center_x = self.paddle2.left-1 + self.score.left += 1 + + + + if self.ball.center_y <= (self.WALL1_TOP + self.WALL_HEIGHT) or self.ball.center_y >= self.WALL2_TOP: + self.ball.velocity_y = -self.ball.velocity_y + + + def bounce(self, n): + + self.ball.velocity_x = abs(math.cos(math.radians(n)) * self.ball.speed) + self.ball.velocity_y = abs(math.sin(math.radians(n)) * self.ball.speed) + + def update(self): + """ Update the model state """ + self.collision() + self.ball.update() + + +class Paddle(object): + """ Represents the paddle in the game """ + def __init__(self, left, top): + self.left = left + self.top = top + self.width = 10 + self.height = 100 + + + +class Ball(object): + """ Represents a ball in my pong game """ + def __init__(self, center_x, center_y, radius): + """ Create a ball object with the specified geometry """ + self.center_x = center_x + self.center_y = center_y + + self.radius = radius + self.velocity_x = random.choice([10,-10]) # pixels / frame + self.velocity_y = 0 # pixels / frame + self.speed = math.sqrt(self.velocity_x **2 + self.velocity_y **2) + + def update(self): + """ Update the position of the ball due to time passing """ + self.center_x += self.velocity_x + self.center_y += self.velocity_y + + + +class Wall(object): + """ Represents a wall in my pong game """ + def __init__(self, left, top, width, height): + """ Initializes a Wall object with the specified + geometry and color """ + self.left = left + self.top = top + self.width = width + self.height = height + #self.color = color + +class Dash(object): + """ Represents a dash in my pong game """ + def __init__(self, left, top, width, height): + """ Initializes a Dash object with the specified + geometry and color """ + self.left = left + self.top = top + self.width = width + self.height = height + +class Score(object): + """ Represents the score in my pong game """ + def __init__(self, left, right): + """ Initializes a Score object with the specified + left and right values """ + self.left = left + self.right = right + +class PyGameKeyboardController(object): + def __init__(self, model, size): + self.model = model + + + + + def handle_event(self,event): + keystate = pygame.key.get_pressed() + jump = 20 + margin = 50 + upper_wall = 110 + + """ Looks for w & s keypresses to move the y position of Paddle 1 + if Paddle is in range of board""" + if event.type != KEYDOWN: + return + if event.key == pygame.K_w: + if jump+margin + upper_wall < self.model.paddle1.top: + self.model.paddle1.top -= jump + else: + return + if event.key == pygame.K_s: + if self.model.paddle1.top < size[1] - (jump + margin + 10): + self.model.paddle1.top -= -jump + else: + return + + + """ Looks for UP & DOWN keypresses to move the y position of Paddle 2 + if Paddle is in range of board""" + if event.type != KEYDOWN: + return + if event.key == pygame.K_UP: + if jump + margin + upper_wall < self.model.paddle2.top: + self.model.paddle2.top -= jump + else: + return + if event.key == pygame.K_DOWN: + if self.model.paddle2.top < size[1] - (jump + margin + 10): + self.model.paddle2.top -= -jump + else: + return +def run(center_parent): + pygame.init() + model = BrickBreakerModel(size[0], size[1]) + view = PyGameBrickBreakerView(model, size) + controller = PyGameKeyboardController(model, size) + running = True + while running: + + for event in pygame.event.get(): + if event.type == QUIT: + running = False + else: + controller.handle_event(event) + model.update() + view.draw() + # print center_parent.recv() + # print model.paddle2.top + # print model.ball.center_y + # print model.ball.velocity_x + # time.sleep(0.001) +if __name__ == '__main__': + # pygame.init() + # size = (1080, 720) + + # model = BrickBreakerModel(size[0], size[1]) + # view = PyGameBrickBreakerView(model, size) + # controller = PyGameKeyboardController(model, size) + center_parent, center_child = Pipe() + q = Process(target=track.Tracking, args=(center_child,)) + p = Process(target=run, args=(center_parent,)) + + q.start() + p.start() + q.join() + p.join() + + From 8daf5aa84de722a447d222b8ab3d4be8aa4340de Mon Sep 17 00:00:00 2001 From: Bill Date: Thu, 10 Mar 2016 13:39:45 -0500 Subject: [PATCH 3/3] Object Tracking --- track.py | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 track.py diff --git a/track.py b/track.py new file mode 100644 index 0000000..5a0eb43 --- /dev/null +++ b/track.py @@ -0,0 +1,90 @@ +import cv2 +import numpy as np + +def Tracking(center_child): + camera_feed = cv2.VideoCapture(0) + + while(1): + + _,frame = camera_feed.read() + #Convert the current frame to HSV + hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) + + #Define the threshold for finding a blue object with hsv + lower_blue = np.array([90,50,50]) + upper_blue = np.array([110,255,255]) + + lower_pink = np.array([20,100,100]) + upper_pink = np.array([30,255, 255]) + + + #Create a binary image, where anything blue appears white and everything else is black + mask_blue = cv2.inRange(hsv, lower_blue, upper_blue) + mask_pink = cv2.inRange(hsv, lower_pink, upper_pink) + #Get rid of background noise using erosion and fill in the holes using dilation and erode the final image on last time + element = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)) + mask_blue = cv2.erode(mask_blue,element, iterations=2) + mask_blue = cv2.dilate(mask_blue,element,iterations=2) + mask_blue = cv2.erode(mask_blue,element) + + mask_pink = cv2.erode(mask_pink,element, iterations=2) + mask_pink = cv2.dilate(mask_pink,element,iterations=2) + mask_pink = cv2.erode(mask_pink,element) + + mask = mask_blue + mask_pink + #Create Contours for all blue objects + imb, contoursb, hierarchyb = cv2.findContours(mask_blue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + maximumAreab = 0 + bestContourb = None + for contourb in contoursb: + currentAreab = cv2.contourArea(contourb) + if currentAreab > maximumAreab and currentAreab > 500: + bestContourb = contourb + maximumAreab = currentAreab + + #Create a bounding box around the biggest blue object + if bestContourb is not None: + x,y,w,h = cv2.boundingRect(bestContourb) + cv2.rectangle(frame, (x,y),(x+w,y+h), (0,0,255), 3) + + # center = [x+w/2, y+h/2] + # center_child.send(center) + # q.put(arr) + + imp, contoursp, hierarchyp = cv2.findContours(mask_pink, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + maximumAreap = 0 + bestContourp = None + for contourp in contoursp: + currentAreap = cv2.contourArea(contourp) + if currentAreap > maximumAreap and currentAreap > 500: + bestContourp = contourp + maximumAreap = currentAreap + + #Create a bounding box around the biggest blue object + if bestContourp is not None: + a,b,c,d = cv2.boundingRect(bestContourp) + cv2.rectangle(frame, (a,b),(a+c,b+d), (0,0,255), 3) + + if bestContourb is not None and bestContourp is not None: + + center = [a+c/2, b+d/2, x+w/2, y+h/2] + center_child.send(center) + + + #Show the original camera feed with a bounding box overlayed + cv2.imshow('frame',frame) + #Show the contours in a seperate window + cv2.imshow('mask',mask) + #Use this command to prevent freezes in the feed + k = cv2.waitKey(5) & 0xFF + #If escape is pressed close all windows + if k == 27: + break + + print q.get() + + + cv2.destroyAllWindows() + +if __name__ == '__main__': + Tracking() \ No newline at end of file