From 08c264a9b68ed2e5173c3339d0389ad0e4ca2afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Mon, 9 Feb 2009 18:57:16 +0100 Subject: [PATCH] Add comments --- media/pawn.3ds | Bin 5707 -> 5707 bytes media/pawn.blend | Bin 154500 -> 154660 bytes src/ai.cpp | 21 ++++----------------- src/ai.h | 8 ++++++-- src/field2d.h | 8 +++++++- src/field3d.cpp | 44 ++++++++++++++++++++++++++++++-------------- src/field3d.h | 9 +++++++++ src/optiondlg.cpp | 18 ++++++++++++++++++ src/optiondlg.h | 14 ++++++++++++++ src/optiondlg.ui | 8 ++++---- src/piecelibrary.h | 8 ++++++++ src/testgame.cpp | 5 ++++- src/testgame.h | 2 -- src/toruschess.h | 37 ++++++++++++++++++++++++++++++++----- 14 files changed, 136 insertions(+), 46 deletions(-) diff --git a/media/pawn.3ds b/media/pawn.3ds index 78f3e90b71be4960d957cb315b39526a547b0061..01d32e9be26ce7195ac1f03060e0857ffff8c9c0 100644 GIT binary patch delta 2479 zcmX|?eNa?Y7{-AL#S1Db79TAxe&uNDxEpto_FU7E{G7rPK}58i1Xpw>ff^gS2~waU zpy9Y!Q_eW!%1rr{0^*)cQJSC;3yX0kS7cPM?T^U(936X~v**BHzx&+hectz+mz~=& ztz%k^&76>u#nMx=*!dSrjE((OZ0`7g6YO@o+14aYS9*0^zzc@|L2?!c-?0Ro%loPX zo4e=Q%J#bj`z--)hSbNUWbr4`Px*Y0%&B*~`IHTssT%NwvT-66WXOT8P*C}uDly#s zK)U^Sy<6}Li2>(lQV*fOUsh`Ru>LCJ{aqQ(UNcm9hK{&rn>IC4@YG!y-hQd)=xyE$ zscqtrjU{F%fBI#HczE_oB;WB?@WhQJp?q&yhB$F96^yjC3ARzt?oUEFPXANeJlmB? zk%AXdJK$7KguXvr?c#3&Gw1)v4XoTF8)aBNhw$PoY_~I3Dd^@ zC|`or#lZFMSfBNPrh^Me=Ls$joj0*N=GPIH3O?5z)ur$ z#Bg9WwDgO^c=}AyK%5dUaQZK52OEf6Q3bdzu)0R@y}(&@T3LXjgeG4%{{p6YX+y%oDvxgPr(Oxef z6FhaPrq|FAnYDIi(KUS;HO8PP!+ITqy{LyO&_7} zGdo16(rHk(-n4QIdVJeKZ#gke+3hLiYl(3(=-Y`gsPf|gbYgbvaH;UnA)TRAgWK|s a_k{6h^a9sNS1K6SrA)YqldTaIk^ciGR!Fq~ delta 2479 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

0Hu7aKjSBy+3ex`w)M|WiI>F#6OXwbs@H6L zAnP>rq3ue7b%wi(8|VZud24#?1&x=GI*b1xa^!g#Q781MlkBGV;A0*h`Gi7tlaq7U zloqCDf)k6**;!_8Ed0n*HNI4PJj}H8OEooto>sRlkTu!2BN?xTdIWhF{r)5Rk&m0) zkCMWr{~{NzFs*@$=FHP=s;V1))=>`5>?k+=RAer1mWMz)B|O$&O+sWUCB7;6gZ0

|d%GY|Qj@M+m8JImsI&pGCLv3B@S;ZW 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 A8vp*uod+(P?LfVeMaC4ULJLlZx zy?bBY_^W5S-d5W++B?0b^U59f_8ps^?1Z+oe?cf#l;+@5^G>mD9WMmGBBbR<#$hM~`V$|XX8g(PSUkqtEImtL z@ezjr64YA)5=*LrX+I&D0R4#%U10pl%fKDuM`9*f010ZWOk!3biI_g42NC}1CM20S zk_{c#?9iY1sKt|)5iwUg?lS^N;9O`NNi0)H`s_atIP@pJ!s5xx#5=}E9ESiBG*|)> zv(vGfI;y~-Kk=od#*e&VJLp(#C*u*{A%Fx)OF-h5(e8)rZPXGEc;}4!#@H_-) z51<19&O!qKk*ez5=%Y+~V3Dx{r^@Cv`Y6-RkpfQb$Z7OIR#knnJ@8X2E^Ex<2>;xU zoQ!nh)jsOYzDGUyJr?Zb=A!0Oo{^;cn&H}Hf< zTImSjR9;?V7WwYB9Z_9T6wmX&>83Rm+uTdkO*^}LJdUGAyggVw+pVvP4m#$6pK6|* zleWAl9vh54VjZlj^cIs3>qY*0NwA(IuiM!D?LTdMW_YEsdnvjV+t;6^D!dCu=wO8C^^Y{t6Z}=NN%ItoW zuk!{j{>g|}+7E;4sr^}zJIwV+H|^+`?EyYMYc%?w{muU834`Opi*w8Tvi*-sp&jRO z>g|GXrgOVVz`xGUuUm~=f17DJ4%JrQGQV!qmp%{t%>23)SB65&FU$9^?SQ7+p&z%? zhgKKL{%^X&$naNXU&ntz@>m>tnzCme4s zTu|r;wW4Tyrgwu4c%Lb>X1$Rc?lvt8rJjYtt{0NDvXEfMLi(!;m!xNrld~>-Z;@JE z@{z~;-S=%LpRStvrmN~;H?7+d%r2^ors7qjlPK@S@2B9$eB9KD6bcvrRsN+|H3z59 z{n{Q>t-9jFwsNSctz7wMBTIR+v8a)v?pIDg=RPB&l=zm=NfWTmb-+9Mm#}hP9$k8+t5GQB!LAENMGPEG@fC&-T)tE5|ao(_5OJShBw(jExWgkreOM^p?`lmB|#a2y~f7Waqa7 zgdQ=JBqBii-h`kBL)2IVLkYDcD7~r?<@6xJ|ETdGlW-Hk(xjFCABvX##78ZjyzB-U z50fK3h;XV*1Tr<*ZoohoM1&qhR9FO=gj;eFgtYuHNBR@rVDaQ-jpS*Ek2nO7ptRZq zBC+>>BtU=SlNL{2CV;usK>;|f5kP{#CgVtACeSef4qMir_-ZSYmz765N?;25g8&ln zl0@Qq+XEdE01tnCRv`})6@NLa6!Y4~8+G!7wq4PBuFLqaVwutEkEi)n-wW2CA3AJ6 zmG7Ijes7-c&p>RFnIMlDz4txS$^?-EOTE?eX69_hv$qRQ_|R$`^?}DN?_;=VO>gv5 zraipH*ojlYRfTv4nyIFhZuQYf=jc}B3=-AjqDCKO+LOOFcHq>7bIwuoXFQNk4kk_? zVw!$qFyK;oGaG%BY4>k4cHq>87hYEXzI0fwRnet%yKwtB*=L)$A}%0IT3EoZPHTdqa(}1BcqrQR`=K^-)J3?^DJHSk#Zhm*rsXw9`Kn zH~!$!XCunAS3GU(!0EFQW!kHE8ar@uHu6!Xy?&Rm11D#t{*-BVo-ua8-5+w_^k6%p zUdYc<$4a~AS{r=>&l+EFs7Tpi^=f`MwXtv4T&t#A_&MVSYIR5Wu)1eWXH^r`H}!N? zd3mQ?Yo~wodE*aywP7Kql$B{u?lyMts@S4NA7$E`_82>Gs_OD1`O!Cx%r2*${{Doq zgGW`p^s>6C?@%9g^eIgmA7J$%o-*x~FBm&;IK+RRYekxCUNmOF^ckKq?F}y(J7{9d zE^t53wKDDAmyI1bRd?l)e1>C5w9`NIitz`pI`pF>`7D|Kw9~(0zwrl;djG1E{b{Fv z^{d7oJeXzYsNu`E`lzE%{Q=_xtUA8D(MOqf=QU#oPJMYbo&s2z_Q31L4xDOUfu{gg zrak+^N{J7CanRX64aH_{OsL5Vc*ax)JKUrt^z@rlTUslE5p+4&9(^PMKfK_?d z;mTxX+WiNO9XK^)<&k{i8IyMUm;T=PgGY^8)##&4d*$244xAdl+N`kQbGqhQHQj37 zF>ZjX;Pr<`$>p9@3{4+m8s0S+giz<+V5p1dbqgO~4<G^Qc_bHxMyhn{p zD%mg>6chw4Mf~WRs*{h<@t^G+=H?U1vl?%u41u#z8>;DRJG&k@so?0GUN&r}wm$M# zKvfz@k5^3C=N9qC&Kte=&$c)1;ihFPVz+^vdx2NG@BHDX7h5>5J;xt* zHR>0KRrHSj9{F8P#qd$V`x>(tg98@+6sy9Y?LqERO#B~rZfY|?$L{Lxdek>}T~s{# zt1cnQy7lLO=^lFUaPYme=7fI!;LU2f->Y)gch5&eT~*6-qGLv8W@3~nV=|Jzf5 z?R9ExY=pX9EjT}U!myP(=6qk#WM_|U!(SMC^dF{enLSqDGJF0Zv*&~derD!;VP}rz zZ<#q?+nIxEO+J9JSIM|fefD8L`MZzvFciy{E)C(4O0c6+ zhP~j9xw_Y_MdB-;Yrj}n^69#q9Y%5--@Nk^cOE?Yyx?aqelkRTs;wORyH5AE=w0V0 zldGaVYGFTJ`^aqkZwW|Wj#P&}8qu}}@5jBfOuWjV{$mCn_TVXwy(W|>ERh_K^G&nF z==KB2?v2-9pY*5KCKfC2&w4LL)C8g?Ul_k3=sek+oZaW{M6r|RbaCo*Rzm4uFCv;I$0A8vn>Z^Pszx zKkf7fwf+eIhDQc?fGu#GZvLExq7j)hAuL)bo8uW7G@E*8Fk4(H+Z-hQcwM$(}PN%P`Z(URaJQRg);5c)-GK7-54v= z?sPJE;LN)*R;E2{W$>sw9>Yr@?d(Y_gGVJ`r%b%Rv*8C$zdJ*j_DX994)4z3xaDxcFMF@TRU*-5bTs`ckI{zr+RG0OE6ZZonr``Iu~}zwCfck z|74)P&3FmM;`vx5(ADHeKaQV_lX-eZ4oKw20;%Zyr&osG7*6>u?Tt) zQE3rm5^l*5qht`}^dO?iBFH4%M6fn#5$R8SIMeu(m;Hcow>i>-h zK5FsgWyJr0k2nO7!0B#Nv_z7s1a0^a3DBST3X3N%19yzaZi4_4G*|)>vj?!8bRzA0 zfd0gn_Aq|rP1-*15HGtO0!Waw1SDqWSg#!>K!4%`UgJkz_CQB?^OlPRkf7SiBxdFv z5y--zKk?q4CIKcwJT55h3$SmwSO5tstxV#Uz$X*vl}Uf%n=GD*a0tRD;rW(Jy99V! zBQb~IWCC+(fWLXm#qzLH@z+m|d4J@2uXJ$Ru4sLIlL^LUBUdr~UzuZM`0Iy_lxZig;N?XO$SQbaPFfDc z9gSH`hkqWf?+1O&P9Iu5%>46keXfz=uOh$Q03)}C7& zFN>e_XHD0m9}4*B*0L`>)xba(uiG^OXDM_W&Rl7E#qmDR$e-Qq7;sFgzi;E%y$oj! zuj{R@)^wA6Em{6oypqSbv)ed$mm!(Xk~gC|c`roD2Qu?v1j4xWZ3hWeZ6kcHs1Le9E+YM;JSBc#e-Zo2*QGXr!?NhX=VP2kPikG0OM=i-)(3KFYLL z2aFv!wPhckhg+HU`q9P?oZ9g+o>E$wcE|QFaCnM{hr|2(X0ZLK8?btV`Y{_(m4ZKth%R1*K@wPCK0Zajx!251`4#e;9GbUiX9 zzSf8gS)-$j8?=yOrp zb{{OaTR-9)dI2U$MA&soiJFPfA>JM#Snlewa z^4|`siLZB8HAnvFgIAj(Ll+nsY--CU)XoNk0K?P-FA}{g4F~0g!ygb5VW6Lq}0n3=CFKKGyv7rT}^DWCl zYqM?XkBpqOtv709IYxeYtT2l>9#LxMvlmjwNa%Ei^zmM1WMK6%k}~ZT)-GIfjHFC^ zy|n|UkCBvV4=gbJz^Ngh5Aac@J!Lya*LH|_l9l#Ww>j@PMP)!YX?rPhMh9)_0|rY+5tOd+5>j%fK#8qPMLODneqWn zJi5XSOh(YXkZN65`i(X2zn4v zdb#Da2;r6tF-iteP7flI7C|QACW5s|%QG7Ni4QC`{^VspVBBqv^dO?zBFN;m5it{N zj`SeHyTs;Xk-{xG2|`+am?Qm(ue5mb5-)So9N_6eM3Y63iIHTMYD9z{M1+@`T*xHc zl9wQupR~-8{>0Z?Jb8)7{Ot%IaR?wmXqj;&F$4bx0*C&@*H}Dx*-2O+9VCF09|0ur zUtt_c%s%Uw0H=8CPkhwMIEJ%M+mmc7VzZ3naU z6-6>*L|ivo9TLpf6TJVtIJ3UO;;+$n#e8qMk*imjRw|RXeW>R~HMHDp^wH|cM1958 zMuxw6VZ_R`lUML^hJ&pCR0EuTnV$J@_vRq4x__PUpp7;6#*6e7#qsyQ!KN%^3ui|} zSDL`=AkKDPzFJ+BT6M%Piijgm{mq7l{O#u)hYlU9Mm2BGY*=Odqc^dG&Gz*^ubZAl zW6P0rHF|Aa&V7^IDqsC-161f;c@*7ry^(>r?@RX`A7yT$5J2}daJ8SfZrcsK-v8S7 zxg`_*I`j3#wX-_8=quL58vS?JoNb?Z?Ru)PZIhj*nC__Y)L7sYH&3l-{$A|uE^au} zUuhG)t!>49-a{2MvZ~P9;#efZJ>tVJI(?SYaGQ|{!7wu)KdxswOjg2*5L<=V^srP?6>Dh z2HCOK2fEl#KWGSRHk#J^h-m|lnYP-trAh1ePH}8V9=^0pAUA6@53;US8){2VAMZnk z1X#17wleJ%Ru(S3p>Aidw=#IlhPs_S@UYwwHj5HA?_0=)i6SFgE^FI8Z?cEI9oEFt!2?!`b1y0ae-opd5o8i>BABVPysgro_)wMcCocv-mi1NWhB_iP_g36JYD~nAwYwhY8DItD5@kiS}Z~`%u%bOo8kP z84LNHE6AH#7p-<6@>RaeCR!+|DxWk^UN1RFq-5&ogV>hS-R+sxTMZzzO<#@kLysG| zVvA|Hjia91G1&19q<^NNkyou?#ut!2?`7F|uLf)Fj$!Ue52advgD2)6?jG|`RaEVnJp`WTpJ9y_% z%4juwx*x7J9ze$G#=6_Pg?AZ616tLvb}?Rc$S}_}@ghkUtx1~#ykb4ZxhKDIB5?RP zbd=xa1A^F!ac-MePGXhg-E5;hEyt>N8z@)6gn7KQJ~rNdRlhCj6Iugbbqos^N3RwROd^kHCD;yC2RIURF5c zF~c=A<_Q-~tTc#yTj-!MRQ%q|`05vo?0w6$oEOw{#@D}CtiM-{Rufb2>@za__4leN z(;j%)*aa`&tENnQ_!VOZPJgeOGVRg*#txi*Cz~?u$ybdXIQ_k9%Ct8fFm~X~_o|ry z3#9`A{?`luMEZNxOo;xp)4%j};}0J5z3TP=IuKC#h5>*`e|LZ~?KN*2J8=3aNSXGA zI%5Y;j)FeQv~whZlcS*rvc5>cPwl^=F^e;RM@5+liC1%CYo@#Jdqj}u+Xr#FxKJh< z9^J-PT;yJQN|TNH7d>yz^ZwDuO}3>hi!Allo%vnf2c^FK@3G-C+@YTE5zXqU*R8w( zI!?Z&8B5M^w`Ddom{4eISI@-W8K>Vdu??5Hn?3bMIlZUE0u$Vf*v46IMsMcw69knD zRV8v%(O~b02uIx;-I{+GMj6wg)&Y$}K>MNur)NFh32PX6s_Xx{EuQ|w3zvK(u(X25 z`*i&sM-!}44al+3q`1Su8Tgy~I=6U`nhw`{~$%#csFQlXKmH zqK(zfbuaUvQ(~j$xywEHR%xtip1a3`ub;-s=DUx0sy{BSZJzHgapgB5D~xSi;QBp& zJ%oK!YsTDIO_`f6rdVy6J2K-hCco>|TRVr;_71x*xEY@sRew>%(igcCaz8Vg=*g|U z=5$FrhD+ZfT%SKfa*Nyno=|9PEWuyiU*zWYvOQ5@y9q;M!JT76FL!ICE~}VQd*))- z_2k;YBZ7lrUeL^rU9rrKdP2L#lExGLmJCxf`1&N?oXd^fywnZgCDt)1Z8Bb>7WgyN zJ^o&B)e)W%X@2cHHKr_$~Hx{^1zg>8S2MOs!D$f2~95W)! za3UhSj-M~m3xo0#+P!~Ia&~g|Uq5!6CHR6{%Y)g+Un&v(iEA?g)XQ74Bli@=MStrW z$Dv;Q`yPL3ukrt?j(W?VF#Ms&78?4193XAT2xP9O{>oDajYSZxcbql1P~RQoVe9`@ zUCO^Hy)f}5ek4F>OQ?lkxN~hnnd_O5JZA;@$fMK72w=@EsR}Lwz-KGYT%W4=xCsz6 z0a88G8RUylwdlX9J8>-&opyX=q4bjI9p~0H)Q<%BoQMTv1X2J=Nj}dVc}Tw{-W>7h zA(-*IF(tRWb*SV_5DgmoQTUg;%+QP;|N7Xi5B^o_9p{59s2}{hF?-ir|D%Ue{)0zu z-aCBcX6+w2v~$>00&ain(B2{hkpRA`K|`qr`QE?#bDk1?9`;Gpi+?eK82_V(sQ*3! zjKq)V5A8g(lln7ELRx?Hkgp2*h^}n&X@kdZLl6NtPF{?FNl4~S1QGq9p&Fq5CHpgM zfMHWp0q#Pz6Kz5tg;NQEyJW^az2d_2!4;_j?s_Y7sHD(V{82bnu>=@uyJ* zSrL?Y=0Ho{p+Tzv##>W?G(zGy3=Q3ZKco`V)CPVD{#PT2@z1KG{#6~|9<6_H^MjkI zUj|>nh<{e3?oaDzz$;K=QGqr%&X7v#%aP0r7SI?-`J;m10R$1EWph&jlBjmMO=#e% zR6<{(cb2-#;^KceVhTWm(-Z&_L<|F0r7E@ow0_y#R1baYxgjV&AMVXdM&?H5R=Z{u zEZqLfVE(?&T3@p2UjgbL>s=GPxo~k@{Qr%J)Wbg_fP@%IR&}nU!3NO!$lSG?sXqhc z0BQZd0xzzk{+1t~F&06z9-FaB>Q4vv<<`G*UCRGoo*NRL^c&zG$xE)?oC>fA&LeC> zFRn`^B;;PtfiaS3dS#mm5~FOzFRn{f{Iv-X6#uoGQ$6Gd_hR&t=sVYytg6P|RnOiB zB9|9RH;KV<{vBZj6G6Vf0{#^M!1@nAJ~=q&)?-*TW0IE)J8=1vXPZ?pZN)>l**GE5 zV{= z1R$9jz=4AV*Z^9;e&%)CsAo@z|M(Gyeop(d(z`EW$4L|Nl+kzndU4`1=!NK~cTbu?BJp1Uy}Ps_DE=Rmrviw7 zm%3d+;h#FWg}(&;dxbwd_@!4O41kOhV%Ud-7CrXTD@;iAAlfTLqHj%vME6QyA!1-8 z8Wev?^u}vmdWDHfKQuQ-5~e3GMNLmcoDW|*Tyn#{IlDM zppW)^v!w8|56a!7(eJ(g_L4pKcMfj7A~9+6sZ%Fk_khup=d+#-*Ql+!R`L?H1v0J9PJvn^96GcXg%zAYY!Euv`(~~7n?ZW?c+ynq%FS;}#T`KxglCSyV-WAs3t;t)_TlS}mMAri@)5FQ4W z2f!gbg5$HiA^087`jmTH9-h(VdiXq09>az1a5F?vd;T5n%IqF|yk{Z&V(@A9nW8-3 e{XFJ<6c{{Yto1$WX7~2^8wzU+o^t>8>;DHXx?0iz diff --git a/src/ai.cpp b/src/ai.cpp index fe61551..f9190a7 100644 --- a/src/ai.cpp +++ b/src/ai.cpp @@ -29,6 +29,10 @@ namespace toruschess { static const int NOMOVE = -MAXVAL - 1; static const int DRAWVAL = -7; + /* standard minimax search; saves the best move in *move if move != NULL; + * balance is the current "heuristic value" of a state (mult with curp to get the + * rating for a specifig player) + */ static int minimax(Field &field, int bal, Player curp, unsigned int depth, Move *move) { if (depth == 0) return curp * bal; @@ -72,21 +76,4 @@ namespace toruschess { return move; } - - Move ai::getMove(const Game *game) { - Player curp = NOPLAYER; - switch (game->state()) { - case TURN_WHITE: - curp = WHITE; - break; - case TURN_BLACK: - curp = BLACK; - break; - default: - return Move(); - } - - Field field = *game->field(); - return getMove(field, curp, 2); - } } diff --git a/src/ai.h b/src/ai.h index f0a058e..018e234 100644 --- a/src/ai.h +++ b/src/ai.h @@ -26,10 +26,14 @@ @author Stefan Bühler */ namespace toruschess { - class ai{ + class ai { public: + /** Modifies the field while calculating, so not thread-safe + * (just create a copy of the real field); + * curp: which players turn + * depth: how many moves to be calculated + */ static Move getMove(Field &field, Player curp, int depth); - static Move getMove(const Game *game); }; } diff --git a/src/field2d.h b/src/field2d.h index 9ce7347..b73256e 100644 --- a/src/field2d.h +++ b/src/field2d.h @@ -31,12 +31,14 @@ */ namespace toruschess { + /** Widget for the 2d field view (Game* is shared with other widgets) */ class Field2D : public QWidget { Q_OBJECT public: Field2D(Game *game, QWidget *parent = 0); virtual ~Field2D(); + /** Mark the destination fields */ void markMoves(const QList &moves); virtual QSize sizeHint() const; @@ -48,12 +50,16 @@ namespace toruschess { virtual void mouseReleaseEvent(QMouseEvent *event); virtual void wheelEvent(QWheelEvent *event); + /* update field buffer size */ void checkSizes(); + /* update field buffer */ void updateFieldBuffer(); + /* find position on board from window coords */ Pos findPos(int x, int y); protected slots: + /* slot for game updated event */ void fieldUpdated(); private: @@ -63,7 +69,7 @@ namespace toruschess { QList m_markedMoves; int m_fieldWidth, m_fieldHeight; - int m_originX, m_originY; + int m_originX, m_originY; /* offset for moving board in window */ int m_mouseLastX, m_mouseLastY; diff --git a/src/field3d.cpp b/src/field3d.cpp index 5a8263a..1311535 100644 --- a/src/field3d.cpp +++ b/src/field3d.cpp @@ -27,8 +27,6 @@ #include -#include - #include template @@ -55,13 +53,11 @@ namespace toruschess { m_originX(0), m_originY(0), m_mouseLastX(0), m_mouseLastY(0), m_skySphere(0), m_skyTextureID(0), m_skyTimerID(0), m_skyOffset(0), m_pickTextureID(0) { - qDebug("Field3d::Field3D"); for (int x = 0; x < 8; x++) for (int y = 0; y < 8; y++) m_marked[x][y] = false; m_lib->setSize(m_textureSize / 8, m_textureSize / 8); } Field3D::~Field3D() { - qDebug("Field3d::~Field3D"); freeTexture(); if (m_skySphere) gluDeleteQuadric(m_skySphere); @@ -83,21 +79,23 @@ namespace toruschess { void Field3D::initializeGL() { glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); -// glEnable(GL_CULL_FACE); glEnable(GL_BLEND); glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); + glDisable(GL_LIGHT1); glEnable(GL_COLOR_MATERIAL); { const GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }, inv[] = { 0.0, 0.0, 0.0, 0.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, white); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, inv); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, white); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, inv); glLightfv(GL_LIGHT0, GL_AMBIENT, white); glLightfv(GL_LIGHT0, GL_DIFFUSE, inv); + glLightfv(GL_LIGHT1, GL_AMBIENT, inv); + glLightfv(GL_LIGHT1, GL_DIFFUSE, white); } glFogi(GL_FOG_MODE, GL_EXP2); @@ -127,8 +125,8 @@ namespace toruschess { void Field3D::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); -// m_lib->paint_pawn(); -// return; + glEnable(GL_LIGHT0); + glDisable(GL_LIGHT1); if (m_boardMode == TORUS) { glDisable(GL_FOG); @@ -180,6 +178,29 @@ namespace toruschess { glTexCoord2f( repeat+ox, -repeat+oy); glVertex3f( 10*repeat, 0, 10*repeat); glTexCoord2f( repeat+ox, repeat+oy); glVertex3f( 10*repeat, 0, -10*repeat); glEnd(); + + glDisable(GL_TEXTURE_2D); + glEnable(GL_LIGHT1); + glDisable(GL_LIGHT0); + glMatrixMode(GL_MODELVIEW); + ox *= -10.0; oy *= 10.0; + ox += 10.0/16; oy += 10.0/16; + for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) { + if (m_game->field()->piece(Pos(i, j)) == PAWN) { + if (m_game->field()->player(Pos(i, j)) == WHITE) { + glColor3f(1.0, 1.0, 1.0); + } else { + glColor3f(.0, .0, .0); + } + for (int x = -10; x <= 10; x++) for (int y = -10; y <= 10; y++) { + glPushMatrix(); + glTranslatef(ox + 10.0/8.0*i + 10*x, 0, oy + 10.0/8.0*j + 10*y); + glRotatef(-90, 1, 0, 0); + m_lib->paint_pawn(); + glPopMatrix(); + } + } + } } glDisable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); @@ -235,7 +256,6 @@ namespace toruschess { unsigned char pxbuf[3]; glReadPixels(mx, height() - 1 - my, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pxbuf); paintGL(); - qDebug() << pxbuf[0] << pxbuf[1]; p = Pos(pxbuf[0] - 50, pxbuf[1] - 50); return pxbuf[0] >= 50; } @@ -256,9 +276,7 @@ namespace toruschess { void Field3D::createTexture() { freeTexture(); -// m_textureBuffer = new QGLPixelBuffer(QSize(m_textureSize, m_textureSize), QGLFormat::defaultFormat(), this); m_textureBuffer = new QImage(QSize(m_textureSize, m_textureSize), QImage::Format_ARGB32_Premultiplied); -// m_textureID = m_textureBuffer->generateDynamicTexture(); updateTexture(); @@ -305,13 +323,12 @@ namespace toruschess { m_textureID = 0; } if (m_textureBuffer) { -// delete m_textureBuffer; + delete m_textureBuffer; m_textureBuffer = 0; } } void Field3D::updateTexture() { -// m_textureBuffer->fill(Qt::black); QPainter pt(m_textureBuffer); pt.fillRect(QRect(0, 0, m_textureSize, m_textureSize), Qt::black); @@ -334,7 +351,6 @@ namespace toruschess { pt.setCompositionMode(QPainter::CompositionMode_Plus); pt.fillRect(0, 0, m_textureSize, m_textureSize, Qt::black); pt.setCompositionMode(QPainter::CompositionMode_SourceOver); -// m_textureBuffer->updateDynamicTexture(m_textureID); if (m_textureID) deleteTexture(m_textureID); m_textureID = bindTexture(*m_textureBuffer); } diff --git a/src/field3d.h b/src/field3d.h index e30b374..2958a99 100644 --- a/src/field3d.h +++ b/src/field3d.h @@ -31,6 +31,9 @@ */ namespace toruschess { + /** Widget for the 3d field view (Game* is shared with other widgets) + * Available modes: Plane vs. Torus and 2d vs 3d Figures + */ class Field3D : public QGLWidget { Q_OBJECT public: @@ -42,6 +45,7 @@ namespace toruschess { void markMoves(const QList &moves); + /** Mark the destination fields */ virtual QSize sizeHint() const; BoardMode boardMode() const { return m_boardMode; } @@ -63,15 +67,20 @@ namespace toruschess { virtual void timerEvent(QTimerEvent *event); protected slots: + /* slot for game updated event */ void fieldUpdated(); private: + /* update the GL_MODELVIEW matrix */ void updateCam(); + /* create textures: board texture, pick texture, skybox (sphere) texture */ void createTexture(); void freeTexture(); + /* update board texture */ void updateTexture(); + /* find position on board from window coords */ bool findPos(int mx, int my, Pos &p); Game *m_game; diff --git a/src/optiondlg.cpp b/src/optiondlg.cpp index 00322c0..71d6628 100644 --- a/src/optiondlg.cpp +++ b/src/optiondlg.cpp @@ -26,6 +26,7 @@ namespace toruschess { : QDialog(parent), m_game(game) { m_curMode = m_game->gameMode(); m_curAIStrength = m_game->aiStrength(); + m_curViewMode = VIEW_2D; setupUi(this); m_bgMode = new QButtonGroup(this); @@ -34,6 +35,11 @@ namespace toruschess { m_bgMode->addButton(rb_mode3, COMPUTER_HUMAN); m_bgMode->addButton(rb_mode4, COMPUTER_COMPUTER); + m_vMode = new QButtonGroup(this); + m_vMode->addButton(rb_view1, VIEW_2D); + m_vMode->addButton(rb_view2, VIEW_3D); + m_vMode->addButton(rb_view3, VIEW_TORUS); + dlgReset(); connect(m_game, SIGNAL(changedMode(GameMode)), this, SLOT(gameChangedMode(GameMode))); @@ -66,9 +72,19 @@ namespace toruschess { } } + void OptionDlg::changedViewMode(ViewMode viewMode) { + if (m_curViewMode != viewMode) { + if (m_vMode->checkedId() == m_curViewMode) { + m_vMode->button(viewMode)->setChecked(true); + } + m_curViewMode = viewMode; + } + } + void OptionDlg::dlgReset() { sb_aiStrength->setValue(m_curAIStrength); m_bgMode->button(m_curMode)->setChecked(true); + m_vMode->button(m_curViewMode)->setChecked(true); } void OptionDlg::dlgAccept() { @@ -76,6 +92,8 @@ namespace toruschess { m_game->setAiStrength(m_curAIStrength); m_curMode = (GameMode) m_bgMode->checkedId(); m_game->setGameMode(m_curMode); + m_curViewMode = (ViewMode) m_vMode->checkedId(); + emit setViewMode(m_curViewMode); } } diff --git a/src/optiondlg.h b/src/optiondlg.h index 642f3f8..064482a 100644 --- a/src/optiondlg.h +++ b/src/optiondlg.h @@ -30,11 +30,23 @@ @author Stefan Bühler */ namespace toruschess { + typedef enum { VIEW_2D, VIEW_3D, VIEW_TORUS } ViewMode; + + /** Option Dialog + * Game options are set directly (so one dialog contols only one game instance) + * The view mode option is handled via signal/slot (default is VIEW_2D) + */ class OptionDlg : public QDialog, private Ui::OptionDlg { Q_OBJECT public: OptionDlg(Game *game, QWidget *parent = 0); + signals: + void setViewMode(ViewMode viewMode); + + public slots: + void changedViewMode(ViewMode viewMode); + private slots: void gameChangedMode(GameMode mode); void gameChangedAIStrength(int aiStrength); @@ -46,7 +58,9 @@ namespace toruschess { Game *m_game; GameMode m_curMode; int m_curAIStrength; + ViewMode m_curViewMode; QButtonGroup *m_bgMode; + QButtonGroup *m_vMode; }; } diff --git a/src/optiondlg.ui b/src/optiondlg.ui index b8c7789..a70cdcd 100644 --- a/src/optiondlg.ui +++ b/src/optiondlg.ui @@ -116,9 +116,9 @@ - + - Torus + 2D @@ -130,9 +130,9 @@ - + - 2D + Torus diff --git a/src/piecelibrary.h b/src/piecelibrary.h index ff0ba8b..4be4f9e 100644 --- a/src/piecelibrary.h +++ b/src/piecelibrary.h @@ -29,21 +29,29 @@ */ namespace toruschess { + /** Handles texture/3ds loading from compiled-in Qt-Resource file + */ class PieceLibrary : public QObject { Q_OBJECT public: PieceLibrary(QObject *parent); virtual ~PieceLibrary(); + /* one PieceLibrary instance manages one set of images with a specific size + */ QSize pieceSize() const { return QSize(m_width, m_height); } QSize minPieceSize() const { return QSize(20, 20); } void setSize(int width, int height); + /* just paint the 2d picture of the "place" figure */ void paint(QPainter &pt, int place) const; + /* just paint the 2d picture of the "place" figure into the given rect */ void paint(QPainter &pt, int place, const QRect &rect) const; + /* paint background of a field into the given rect */ void paint_board(QPainter &pt, bool darkField, const QRect &rect) const; + /* paint a 3d pawn */ void paint_pawn(); private: diff --git a/src/testgame.cpp b/src/testgame.cpp index d1875e2..21ed3a9 100644 --- a/src/testgame.cpp +++ b/src/testgame.cpp @@ -44,13 +44,16 @@ namespace toruschess { TestGame::TestGame(QWidget *parent) : QMainWindow(parent), m_game(new Game()), m_optionDlg(new OptionDlg(m_game, this)), m_viewMode((ViewMode) -1) { + connect(this, SIGNAL(changedViewMode(ViewMode)), m_optionDlg, SLOT(changedViewMode(ViewMode))); + connect(m_optionDlg, SIGNAL(setViewMode(ViewMode)), this, SLOT(setViewMode(ViewMode))); + setWindowTitle("Torus Chess"); QWidget *centralWidget = new QWidget(this); m_fieldsLayout = new QStackedLayout(centralWidget); m_field2d = new Field2D(m_game, centralWidget); m_field3d = new Field3D(m_game, centralWidget); - m_fieldsLayout->addWidget(m_field2d); + m_fieldsLayout->addWidget(m_field2d); m_fieldsLayout->addWidget(m_field3d); centralWidget->setLayout(m_fieldsLayout); setCentralWidget(centralWidget); diff --git a/src/testgame.h b/src/testgame.h index ce1858f..e158069 100644 --- a/src/testgame.h +++ b/src/testgame.h @@ -39,8 +39,6 @@ */ namespace toruschess { - typedef enum { VIEW_2D, VIEW_3D, VIEW_TORUS } ViewMode; - class TestGame : public QMainWindow { Q_OBJECT public: diff --git a/src/toruschess.h b/src/toruschess.h index c74df18..44e8502 100644 --- a/src/toruschess.h +++ b/src/toruschess.h @@ -29,7 +29,12 @@ @author Stefan Bühler */ namespace toruschess { - + + /* Game logic + * + * "piece" and "player" are combined to "place": place = piece * player; + */ + class Pos; class Field; class Game; @@ -50,6 +55,7 @@ namespace toruschess { QString state2string(GameState state); + /* coords for a field on the board */ class Pos { public: Pos() : m_x(0), m_y(0) { } @@ -66,6 +72,9 @@ namespace toruschess { int m_x, m_y; }; + /* some basic information for one move: from and to, + * which figure got moved, which (if any) got beaten + */ class Move { public: Move(); @@ -73,8 +82,11 @@ namespace toruschess { const Pos& from() const { return m_from; } const Pos& to() const { return m_to; } + /** figure which gets moved */ int prevFrom() const { return m_prevFrom; } + /** figure which gets beaten */ int prevTo() const { return m_prevTo; } + /** which player is moving (player from prevFrom()) */ Player player() const { return m_player; } bool operator==(const Move &other) const { @@ -92,7 +104,9 @@ namespace toruschess { int m_prevFrom, m_prevTo; Player m_player; }; - + + + /** the raw field: only knows which figures is where */ class Field { public: Field(); @@ -104,23 +118,32 @@ namespace toruschess { int place(const Pos &p) const { return m_places[p.y()][p.x()]; } int& place(const Pos &p) { return m_places[p.y()][p.x()]; } + /* all valid moves for a piece */ QList validMoves(const Pos &from) const; bool validMove(const Move &m) const; /* does not check for inCheck */ - bool move(const Move &m); - bool undo(const Move &m); + bool move(const Move &m); /* check if the move is valid */ + bool undo(const Move &m); /* check if the undo is valid */ + /* check if the king of a player at pos pking is in check */ bool inCheck(Player player, const Pos &pking) const; + /* check if the king of a player is in check */ bool inCheck(Player player) const; void move_unchecked(const Move &m); void undo_unchecked(const Move &m); private: + /* does not check for "in check" */ QList simpleValidMoves(const Pos &from) const; Pos m_wking, m_bking; int m_places[8][8]; }; - + + + /* contains a field plus addition information about the game state + * such as which turn it is or who has won + * also is responsible to do the ai moves, if activated + */ class Game : public QObject { Q_OBJECT public: @@ -131,9 +154,12 @@ namespace toruschess { GameState state() const { return m_state; } QList moves() const { return m_moves; } + /* only valid moves will be done */ bool move(const Move &m); + /* restart the game */ void restart(); + /* all valid moves for the current player */ QList possibleMoves() const; GameMode gameMode() const { return m_gameMode; } @@ -170,6 +196,7 @@ namespace toruschess { bool m_ignoreAI; }; + /* Calculate the ai move in another thread so the main thread (gui) isn't blocked */ class GameAIThread : public QThread { Q_OBJECT public: