From 377ee229b34c8634f13c12373c6e746d64a216c5 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Mon, 25 Apr 2016 12:29:29 +0200 Subject: [PATCH 01/68] =?UTF-8?q?Grafiken=20f=C3=BCr=20Einheiten=20von=20J?= =?UTF-8?q?ulien?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aufgrund von technischen Schwierigkeiten beim Upload wurden diese Grafiken von mir hochgeladen. Urheber davon ist Julien. --- images/dickebertaskal-blau.png | Bin 0 -> 2607 bytes images/dickebertaskal-gelb.png | Bin 0 -> 2907 bytes images/dickebertaskal-grün.png | Bin 0 -> 2460 bytes images/dickebertaskal-lila.png | Bin 0 -> 3186 bytes images/dickebertaskal-rot.png | Bin 0 -> 2500 bytes images/dickebertaskal-schwarz.png | Bin 0 -> 2198 bytes images/infanterieskal-blau.png | Bin 0 -> 2879 bytes images/infanterieskal-gelb.png | Bin 0 -> 3068 bytes images/infanterieskal-grün.png | Bin 0 -> 3020 bytes images/infanterieskal-lila.png | Bin 0 -> 2977 bytes images/infanterieskal-rot.png | Bin 0 -> 3009 bytes images/infanterieskal-schwarz.png | Bin 0 -> 2784 bytes images/pferdreiterskal-blau.png | Bin 0 -> 3136 bytes images/pferdreiterskal-gelb.png | Bin 0 -> 3115 bytes images/pferdreiterskal-grün.png | Bin 0 -> 3140 bytes images/pferdreiterskal-lila.png | Bin 0 -> 3142 bytes images/pferdreiterskal-rot.png | Bin 0 -> 3127 bytes images/pferdreiterskal-schwarz.png | Bin 0 -> 3125 bytes 18 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/dickebertaskal-blau.png create mode 100644 images/dickebertaskal-gelb.png create mode 100644 images/dickebertaskal-grün.png create mode 100644 images/dickebertaskal-lila.png create mode 100644 images/dickebertaskal-rot.png create mode 100644 images/dickebertaskal-schwarz.png create mode 100644 images/infanterieskal-blau.png create mode 100644 images/infanterieskal-gelb.png create mode 100644 images/infanterieskal-grün.png create mode 100644 images/infanterieskal-lila.png create mode 100644 images/infanterieskal-rot.png create mode 100644 images/infanterieskal-schwarz.png create mode 100644 images/pferdreiterskal-blau.png create mode 100644 images/pferdreiterskal-gelb.png create mode 100644 images/pferdreiterskal-grün.png create mode 100644 images/pferdreiterskal-lila.png create mode 100644 images/pferdreiterskal-rot.png create mode 100644 images/pferdreiterskal-schwarz.png diff --git a/images/dickebertaskal-blau.png b/images/dickebertaskal-blau.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5f01cc631f7e1e5a277d121d1b5f6873d6d019 GIT binary patch literal 2607 zcmV+~3efe5P)E5H-6fcc%aV03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*011;xL_t(|+U?nEj9pa~ z2k`$|`|NY>IrlYp=60r?z9=mPS}CpJDM6zj)Zim3kf790XL~8jdS^l1BRqLOBLI)cb5AQqYvel#YUhRg~rvk*t(&t`seW?DWt`0Uk;xc=xYC$AfI;FGp866fcN&%Ln{}fC%r2&RD zhl#jim?M+)cX86+RjQ5NH0kM8OCq8HAwYzLK&s-HLo0CP?2>{Quqs<3-vKbjHdN!t zm$!N+slXo(XW4`!DiCw1LFJ04$GkM&J=O32>2{M%f2z~|+2)r&)SCP5aeKVB;%1wr z6P)ySmBP}yd(L)>6qFMZYlu9nyt)C{4Kjx;5mcN`uGao~3zCF+XbvE->umWiPM<`8 zuZjGjmFw>PE#Q>3?J?)#sB!cL25bZXE7$*|<6NJT-k)uj9q_~GBIEgMIwn2JN)0)% z$KtwVvT4_4!~#IXr6O9n1YN{1-`#&vETh; zHH^+{cb9%$EDe3U(VV?~%^=gHk&3^We0JhgN^fx3qM#%Cw7|V%r9&OaU{;R z6aXl1)P}_ixjB0m0~rC90N>R{ub(BZEQHb9w}@B(4n%_q$YfLS^r{!KB1;c}$b*P9 zt!W&!rYXb)>*>`kfd_&mV&7--#{svFRTTo&nV-HXa%PbMgYgXy-res$8aHR}yb%CK z*W5GTX+KacMCVN|%zX0{I+5#@AUroQ*%7T&RYX$qgUuOnQFq!8@L=n(6`ogzb6pSx z8Ih+znw@RS@}dknI7OI?nz;z(5_GTuL=l|pf>jxwH~JG+k%(M6AdmxD`fRt| zxaUm392Dd_=aDL_s#Hfl*PJPO&g3ro!ho)<~i5D~Liw?uxSRQ(7{dH|kY4N@f# z2+m~>&rW{ky~kNsyrx3>PYcFK1Ko|gle4|v^vN!C8N58(*p1*H+&}p$_uihFSyZPbCXD__s*t?Fby7M<{j=0c>JCBaVy~oz}79V=WkNV+`801;NbPLfrb6N8A zDW&SA(}m*sU2A*PoVoQ>KqxF-yh{fgV}c5@^f?XKvxe$7JmXvoI@r8u-4eHEzq4cJ z&{bijwsXcw7dC5v$WJGqea98cf6H^7_Whf(WbgXhY zKXuc#`uO+ySvtY(#$7>u{LZHVZ2{voj^4N>h%R)M+LiI#k!zz@YrIsw{Ap{OJ#pQ> z^4G2Gwtl+#1g^eic^K1jUA!NXw9;hn)&E#J{^RqQ|Iu^se|r;I0^l$ImthXMTrQW( z<^G?QYdfi2+v%U|-{rT+f~%CLNG_Ml<#M@PE|<&Ya=BbCm&@gHxm@ne=002ovPDHLkV1l)&_7ngB literal 0 HcmV?d00001 diff --git a/images/dickebertaskal-gelb.png b/images/dickebertaskal-gelb.png new file mode 100644 index 0000000000000000000000000000000000000000..41c9cea05c55f14b74172936a5dcd7858edc54a9 GIT binary patch literal 2907 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 FV1lhwd&&R+ literal 0 HcmV?d00001 diff --git a/images/dickebertaskal-grün.png b/images/dickebertaskal-grün.png new file mode 100644 index 0000000000000000000000000000000000000000..6248173b08158f8e9c21ecbcf65f63e2e43d05af GIT binary patch literal 2460 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

=bZ&(rolGA%WoCYpjGiu`rPTiQ7# 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 O0000_@fXYFCQ)-#mIOUoETpO z4wF|nrSRaRfZ7-Ad6H}&5f&B{P8K`?z&v;zvtu2NE$8RF!TopVyeiH~=;=v}E~5hjH+{wmvNn1-LYMys zs!}D}YCpg1;YvGM!rrAg}*r2-Eye&VJBP- z14U*)Uw>O)UvEsih_pGRY7acMgyQa3xJbs~Ocs6ZRQ!Vy!n({l}Eq~ol z&RA!x1&~=XV>vWJ&80O|qE8XI_>6}fE5lC3n9~V6ysB_slLP=yb%-W1m0(DuS`STp5xYMJzMu-JOelOj}ug2$Mxu^KczXzD`agIQ>L$0e(H zwnbe-ECSy-a~q*e|F3jvaof_3zv>A-@9h;e~yOJL!H*3WX`c@AHt z*&Iy*l{vfV<&$kIqj5E&X1FP8-lco8-`egbX28S`95iqlI05c6hc@ALB!o>_0JrFmN@ zynF<6>=yJ@LEIjgq(;uh)n+N+X4_+}A~$X=(fSA_HdZ#fd-7iU_<{owp^XFwyWsYW zqnsuoHxSIC=jS)AK9#Wt7^svk-)^65rt9(JHC|~ViL#WzpUA24wlQs!Dv-g1IKa5Av!(gYs9 zA6NkLP$@I7Ld)%)4Rrb+l@??!&9*0UT5uR9KTf&E}$oF82- zC^kdOhfb%<-f15v+Z3Ledt=mHory~MEn$b#svQc){gYxir96$mh%fNk;ldzJe7tgQ zGAhpI)DXuxtPdXsxiVy+Qe513@fa3Fuv=`*&DX~#jHK&^yV#N6M@f%OTuMjhVr}sm z9$-PzNAvqiHN)RAr4){zoajxhlp~AbogApE=K%}*uo;~ za2S&{m0wKcR%QtYq?ktGEM z540rEd!%eWXHeM_62^sE_{9)!;TY4jHPxXJOZs~g7fQG)=G6h@$ay;MNeSyh?8 zrimmHs75uer2_@f8@uehpZi}U8s#DeW43F4UZQpcLV#gS=G9^p!!zq&?{0Ix+l%Yp zC#Xn^4xTf@10)1HXcqQ_^`R`}(~o;ew|Z(J>iCQ_&lL|4RI)67=}&UTZWZ@^)wi$k zDzB_vKe_t{ODs`twt-jaRgNwk$U{TSzpH#Z?#r(i447VbMn_3XjGQn@dmZV)|u+iR=uV)?)a3!T}O5ym$U@OCb` z?4akMy!)ZD{zM41lFWa-x2PKqH9KS4>6D>07+B>*p-^@z z7}s-S%xEmSRx&hw4=!MJb(LprZO!`V#T=;CTcef4t;Wkyi^@zoMUXcPr&ces;^WN` zsvVI{yJ2~~(`cbq!Eej8@RoN+U`T=qB2N5VkI)b?pY}q&zSr?Z26#BVQI%weZRM=Q zHeRb-sZI#38-287wbL!gRF-WwAH4Wm3ps&G$rc3HvRJI5U=@G;M?ZNy-WK!j@CA`n&MoOZkgdY4qjjjc5;&%oU}X|A!5|MRfMFqX|n+QFs5G2Y8$- Kwi0vp#(w~TX$;-~ literal 0 HcmV?d00001 diff --git a/images/infanterieskal-blau.png b/images/infanterieskal-blau.png new file mode 100644 index 0000000000000000000000000000000000000000..30a16200aa44479a33a8c3ae13137b4f2cfe8a7c GIT binary patch literal 2879 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 KMNUMnLSTabUhf3} literal 0 HcmV?d00001 diff --git a/images/infanterieskal-grün.png b/images/infanterieskal-grün.png new file mode 100644 index 0000000000000000000000000000000000000000..02bf7a5acfe16e5d308bb3c7380cd86db825dc98 GIT binary patch literal 3020 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 FV1k*`$M*mL literal 0 HcmV?d00001 diff --git a/images/pferdreiterskal-grün.png b/images/pferdreiterskal-grün.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9a51afdce9706bd3ca1d40c3b8d3606ae233b5 GIT binary patch literal 3140 zcmV-K47>A*P)E7AjzR-P8a803B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*01K!|L_t(&-tAg@aFo>* z|J{4P@9s03WV3-J1d^B+50$4NTC0EvRs@`))08-M>>!RhSQWJ*P_-RtHQ-D~?ckMtW47^8t4AiRaNRz07Cn-$m8)8W@cpM^#(*`MTK@T zfb{D}98RaDw{zF7TW4OfK-zsia;e2gzkt~7_DFx@>ynC*rq)(_L(2)88UvLT6|BoN z)y?bDVXYZ+=JL6tOI{o*qnCFaJ2G?8x_1LTOjQHPlmlXs%8Ck7Sy4d%VAK2mGBVTL zo6?+~VP6)P=JyfA4=bravL1YZ_rhfq0QJT%Z&NL+mZ_(2x$%O#SAWc`12A%*vm!_jrMNzC;-^CxB|**N6kquHZ>f%_n+H${q+ZRtuA5$fCx%)d~b`bOJJXNKs##c z3~y&AuE@#W9S3nqv6cb=LWltnGJenSQw7KLo!!Mo!I10^v~b8fcJ<#TUC2Q1i(&>q zbOn=JWmAwq^pp_pS&o{T>E6*PdeuPJc;{siP18y(I$f0-+??}#0BBkoB7{+*do*pt znBnD9j}&`*Vy&O<8!fJH7#$w=q^tfy1pQf0CeQ7-?s!|^v)(Am`IAi&LMUNC+594t zXKO@b8k0gP-=0q8D77k!TPMEiKzRG~1NMtr8F0>rB&@J#YJU55#hJlws5dM1bIwY8 zD07iTW-Yd=VQZYqbH7aiPb}G2yAwpf$rf;1)Sot(B!SV%$0=n~xgmuoq=n zHIIWIeCO+y(v&%)IOiMyH4G!%{7lf=Rf!vJ$VdpgmVU>kWld9Gi-wC=H0rue4a4|u zM5Yy44&4k#h13{1HKo8+dZ;bbw)d#t9iRHSVHkvSZhhvNXP9Qif@P1beA5j#!iZqh z@;v1Xq@!(_K||wwIC9ldT|`78jt0!VSWg2|N(lffW?g3d@smb<)4?`2t;Efn{RSz> zwA#Kn)SkKtpHj;G^2pqeH-1%HSvb3t>C;S-Q|N(HOT)417NQ-s!vE+|S$w>Vh`F{G zy`Q#D0q_q1{)1>A?!GeeA6X;j~^kCx5Ekd>$sq-#W^oB45R+3n@fa~Q!^A5 zFol9mXV5ib2}Ole5_H9fb=|fr0D=I(-Q1jbd$|_ybRet4gNSaJ1ygd^mga3=H7^N_ z8%WnWBah@|yK)S}s0RRlM1l~&qEXl_3>qVvKWt+8hC1r7XvXrHMY0>6K>*`4O>^CR z&$Pptr#t|FR#%Ji{=N|huliP@EIj&xC&c5e{-!0A*`!X}dv^iW%v zKE1IXt8OU?OQlr0T}!3W|E9eE(lpIXYlmfc#-A7!81uLMLbs$@ zdYb|W=iJ(_7&+_>gHcM;I3b_c2iZsaPbA0gyP-r{bxI;a>A!vNV601=n2WW0n#Kdz z1YiaLuym658Qnr81aA6pKK6~<4gQiFlnP6r&Ooj$4~-oS6o5S21`Wed0K)wO;?yZX z3E5ij^VYWbGp$^o7&fAN0N~|MYbk)_aXvSC< z$EhX52`yL0{@ia!u4kBNT;GsdzmW?O?5Aa2N-398Mmgsb4a3;|$c$nPwG&f;2u4p^ zPD6&ID?Y3}jnaz>iqLQcK0GtM*YF=4{GfG#_D~kZY7meP} z?K;~C;K{S)xAX2t48sTmKwC({lpygR)8p<*;<}hriUNRLBe-nL6ac_Y)2HLkg$t9q zemA>V0MMdBS^)6p=axnQAQ%<10Q>>KN&rJIXk%qcg@{lfDVqntyT)6{*Q&-|J`(XJ z3@TPAU|HpC@$|+zCY6$*s6sF*1tn)#cO@a@?!N4=&p-@Qf-^!@tmTcySx3a*iv$Zj z|I**dLYuBxd#l_l<3;-A*it7|BKB(0|K&#>|mJC#-o~4vNbRmE!E7$fp zEE*zFk)TW&2Vka>L}F7@#8eRxJO&2uu@C4oi((362E z>8hK6!XGh6rq!kr{`biGn$&_ztD08^LWlwYt41fJt`|Z)K`HeBxaWLbi+BT(f41pv!$pCI?HUxa5D7pV7l2Z#}+N#99;sJx~a*N@Cq0I+m@ z4G3UX%_}pi8+{qw?BQC*SpInd;hfXNW*1H^#?L1eV&#S!cC1tBVF5}2#Pb0On^FgW zq4`<3vMdigkYxfuuFIlALXo8@ASfZQF?>^&lfDH2f+n;?{M}HR6(YdhaVspAQvO8< zQGR}|CB=;imtd5@Zqac2RYh3y$w9L4>LR_wtwqyxA^{LPkEzYbv_nV*hcy<855N1p zE8Tfb2?zm>wsoq_`zbI&7cD+F=05i_^T9b57z_ zaX(5FQ~bLNoj})Otn*rR15O46RWX)H-UHiQb{aJ$YFfj|1Di8$1b%gG48+NfFgEXR zPIw#Hd)PY>0G@cSh6M~o#^gFNet7!s#PcQ2xddQ#1<_~vt+@KKSf-Aecy)UnUf)rd zT;CZH3;;2uB2}9k2mmbj%{r`I|83_B>-QyTHQlN~0SFl;YEN`@06^u`BAQx_U!L#Y zx_mSSO8${j)v22^1nIS_LGr$89RUdlVUk)h#hxL8TRae zB*gOE^sxYN%p1VFdk>{%@HPO-Y0(P+zz~Wib|fSsQp&>sNP;K;pt04TbD-Jp(-kOz+YCfA<|noOgbkZQ(20HNMMWDEd!14g$ES!X1A7y!IsDV0jLuI*jg)#SSB z+Lnx0w$&n$8#(7W-GSM%zlnd>YSJ{THgq6>NTuKf08^d4G-@}9VF(qCZ(g3OD~%W; zddK8KVHieJPjlbc*$7`m4G0h%X!30YfH8ULXT1+=51Y}W?a|)!-vj{O+}WTTik-7e zI@uYi@9A+xUsFXoWF0ts^8al z)YFC66ssOi#~VXP!o5_N4gjHWMD@mcoUzeovr3<8EdcO`qU2{+4)1Z2FJ!9JlIC3c zPIN?ibrsZUh|Q1RSXA8;m_E0O`rVyyt+KUR2a+x~^w1#?pGht{3eOI;UA|xZ5!tKUU$KJBGQP<(zXD24zqNWl#oX ePzGgC2Ic>NIm$E7ZJ#61+f4C03B&m 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 gNQPuchGaE7y(j62^s(Z03B&m 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 RyKn#i002ovPDHLkV1mxiw?zN| literal 0 HcmV?d00001 diff --git a/images/pferdreiterskal-schwarz.png b/images/pferdreiterskal-schwarz.png new file mode 100644 index 0000000000000000000000000000000000000000..e70515ae63e706eba49f8b563055582709d18317 GIT binary patch literal 3125 zcmV-549fF~P)E7#KD#q1pfd03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*01KH(L_t(&-tAgzY+cor z{?^|6ocpq`pTUnf*pBT42+xE`fR?sHnrSH`mirBWf~y2)p{yZKT8BF?8%ZEbB! zRb^%4Oh9yXcB+p8$azf?D=Q1lwC(0CTY^g#$mqxjU1~mZUO=MJsCT~pbxHZiz~ErC z|I}$Q(FeLZJ7q~Tp5%Awu-59^*Sc%3YX4rH^{*Z~acs@KTV6_?qbbiNQ_hJ-x;i_l ztFw~;V8_eW(nfb@sVg{#pmvP=6f&XZx2kh%P)NCi}=fHuEh6W z+k>aJ{rZv%hzT7m7euTfTB z8BdN5C(oKl2oMq2S}-$x*b%Y%8^u&1JI8KxAYoy1|2q7GT$-2a*H4<+bQ_6wo zrIVp>7*a||sSpZ<5G}7jG*)e+@y5Q3!D>_POk;KI*7t`~znxN5QbGucNUSQbMk}xZ zNP^jb2w-M_2_S$#U=XLqM`*6iY)Xv`jr;EvuJ66MDS2yKRi?C!F{aj-0OQF)udItjTWi9qHs&6D@&8YCOlWhZQp#0I zwPiAy{l2fmL*cd>Dh=_8UnxVuisuux3a&-9EtTo~|j?h}~Ylw&3 znwS%0ePflNGpm~89m|{I!xNgms*RZf z$MzlUj?^vUaI}g;;c~Fake5xtSPSKrTV|iis#6Ce=s@l;B9Rnz@!6%v~Ps=Ek#|$ z$49f`yRRO_)1Pn8T4t(OYWV97e{Id5f<8N(l#gSu2A*FyDD}$d&!`B+j zj7_(gS-QmP*bD5&h#Gkd+&;S1}0QgK$Qj~%K02^^d@a*3#^#I_J zM;`|O^dISmwFbWLBQ=tM_B=2%y4Nl7Tq(pe>y~%`@Vmo_SEG*H4&WR4Z2RKWBL!z0 z&R7H%l%LGW`x)iOl9pKjKvWSHFIxow_^aD)!`*2Kl?B%&|RW__~;q5}(8l3*YJ;OAM#bE=W0_3;K{Ek3|;P9{{{>y{Kq0%~0fDj8Mn!AwgF=WEa|-0Lc%(e6Bv(Zp7Ie4a= z_dYNkAm$32C;W*_i4qg*Wafv6Xu))c3Nw{&T1K+DHWodZHX#@L6_2xJF#Y3yxL}Qt>B>~h2Acj&tm5xmiNP3#8!Vxam-@{vb zCcbA;-RqWsC|7!gl~`Uhys0Hv37iwCRNO{eLK=|yAKBNQ4d@-1_=Un+}!%8v$ zY`Al|eS7P@*mPerzq~g^+80IJDS+s@r466FqJaV6k*z%-An0DVMDIR4QaQ;QJ|?AX zx*#B~>x#l+*WcWRzrC>qPj2gxC&t;y8VCZAj|Y?utOEdbO*Oc7Nh91;O#lE5@epSW z(<2i=2qHuz{;;IJ;x_=04xkGD_ow~oZrdFrDTKVM;SpXDubHi3vMPV!>7S6fiLoa<`N_XGV4kFfASgt zSbllcTTg83S@HB2mdNM6xYYjNiLuE406!{}N_m=3xUNh2toS@ql)(H~37x=EIoA32 z-TfF!8NoT0DV_sI;!)uT7CnR6;)dOR{pI+(kL5rNjb*WO|H*>2(c4E8D*)iJU-Zb7 zW?I%zh8q@D>@B=sa$VN~2ueZBntnTPTAYj2et_rS=)+HU^%eV%dqx7Fz%q63>?Z)Y zen`G>!Gi0?LkLv0Nay60lZ1MiQlJai@< zNF|i9ym~Hxh(yX;1^|hap0pqv_xz&(kjPrgTr6EjOUl(^zump3Du42NFAA~Ib=~^O z!2D+afV*!n5anT2Hy1!GGZFw0OmoaRs!40Zetz+Gx~kOE#=mQ2i_uySoU82%dk$m7 z<2eC>0|O)50bp5U#gsMnXg2VVkNPvIzX<^TV^6=MSx%cK4UKz;raNYxDQgYn3#5tZ zd#O~v_|}nfok=pAHX;>kV|;5Ap(F#x`2)xzc(WYp!3<5Ws1 z%V)r@AK3>wXK8Fvb!-v-T*Yq literal 0 HcmV?d00001 From 40b1752ddc55691daae0c742266cc7b385275a34 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Tue, 26 Apr 2016 18:32:27 +0200 Subject: [PATCH 02/68] Button und ButtonEvent Erste Codezeilen zum Eventhandling bei den Buttons --- Button.java | 34 +++++++++++++++++++++++----------- ButtonEvent.java | 12 ++++++++++++ 2 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 ButtonEvent.java diff --git a/Button.java b/Button.java index bc3b248..676387b 100644 --- a/Button.java +++ b/Button.java @@ -1,19 +1,31 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** - * Write a description of class Menue_Button here. + * Diese Klasse stellt einen Button dar. * - * @author (your name) - * @version (a version number or a date) + * @author Felix Stupp + * @version 26.04.2016 */ -public class Button extends GUI_Interface -{ +public class Button extends GUI_Interface { + + ButtonEvent handler; + /** - * Act - do whatever the Menue_Button wants to do. This method is called whenever - * the 'Act' or 'Run' button gets pressed in the environment. + * Erstellt einen Button mit dem gegebenen Objekt als Event-Handler. + * + * @param h Der Handler mit dem Interface ButtonEvent implementiert. */ - public void act() - { - // Add your action code here. - } + public Button(ButtonEvent h) { + handler = h; + } + + /** + * Fragt ab, ob ein Klick auf den Button gekommen ist. + */ + public void act() { + if(Greenfoot.mouseClicked(this)) { + handler.buttonClicked(this); + } + } + } diff --git a/ButtonEvent.java b/ButtonEvent.java new file mode 100644 index 0000000..5265439 --- /dev/null +++ b/ButtonEvent.java @@ -0,0 +1,12 @@ +import greenfoot.*; + +/** + * Dieses Interface stellt einen Zugriff auf Methoden für die Eventverarbeitung bei Buttons. + * Jede Klasse, die als Event-Handler dienen will, muss dieses Interface implementieren. + * + * @author Felix Stupp + * @version 26.04.2016 + */ +public interface ButtonEvent { + public void buttonClicked(Button obj); +} \ No newline at end of file From a1e62f825ee63f716c359a114817b9c2dacfad38 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Tue, 10 May 2016 18:29:54 +0200 Subject: [PATCH 03/68] GUI Klassen Version 0.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unvollständige Variante der Klassen für Button und Label, zusätzlich noch die Oberklasse GUI_Interface. --- Button.java | 63 +++++++++++++++++++++++++++++++++++++++ ButtonEvent.java | 2 ++ GUI_Interface.java | 33 +++++++++++++++----- Label.java | 43 ++++++++++++++++++++++++++ images/Button_Corner.png | Bin 0 -> 173 bytes images/Button_Side.png | Bin 0 -> 164 bytes 6 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 Label.java create mode 100644 images/Button_Corner.png create mode 100644 images/Button_Side.png diff --git a/Button.java b/Button.java index 676387b..da11981 100644 --- a/Button.java +++ b/Button.java @@ -8,6 +8,12 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) */ public class Button extends GUI_Interface { + boolean autoSize = true; + Color foreC = Color.WHITE + Color backC = Color.BLACK + int textSize = 1; + String text = ""; + ButtonEvent handler; /** @@ -28,4 +34,61 @@ public class Button extends GUI_Interface { } } + public boolean getAutoSize() { + return autoSize; + } + + public void setAutoSize(boolean b) { + autoSize = b; + if(autoSize) { + redraw(); + } + } + + public int getTextSize() { + return textSize; + } + + public void setTextSize(int s) { + if(textSize != s && s > 0) { + textSize = s; + redraw(); + } + } + + public String getText() { + return text; + } + + public void setText(String s) { + if(text != s) { + text = s; + redraw(); + } + } + + private void redraw() { + GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); + GreenfootImage corner = new GreenfootImage("images/Button_Corner.png"); + int csx = corner.getWidth(); + int csy = corner.getHeight(); + GreenfootImage side = new GreenfootImage("images/Button_Side.png"); + if(autoSize) { + sx = tI.getWidth() + (csx * 2); + sy = tI.getHeight() + (csy * 2); + } + GreenfootImage all = new GreenfootImage(sx,sy); + all.drawImage(corner,0,0); + corner.rotate(90); + all.drawImage(corner,sx-csx,0); + corner.rotate(90); + all.drawImage(corner,sx-csx,sy-csy); + corner.rotate(90); + all.drawImage(corner,0,sy-csy); + for(int i = csx; i < (sx-csx+1); i++) { + + } + all.drawImage(tI,(sx-tI.getWidth())/2,(sy-tI.getHeight())/2); + setImage(all); + } } diff --git a/ButtonEvent.java b/ButtonEvent.java index 5265439..b3a914d 100644 --- a/ButtonEvent.java +++ b/ButtonEvent.java @@ -8,5 +8,7 @@ import greenfoot.*; * @version 26.04.2016 */ public interface ButtonEvent { + public void buttonClicked(Button obj); + } \ No newline at end of file diff --git a/GUI_Interface.java b/GUI_Interface.java index 60dc87a..69c48da 100644 --- a/GUI_Interface.java +++ b/GUI_Interface.java @@ -1,19 +1,36 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** - * Write a description of class GUI_Interface here. + * Oberklasse für sämtliche GUI Objekte, wie Labels und Buttons * - * @author (your name) - * @version (a version number or a date) + * @author Felix Stupp + * @version 10.05.2016 */ public class GUI_Interface extends Actor { - /** - * Act - do whatever the GUI_Interface wants to do. This method is called whenever - * the 'Act' or 'Run' button gets pressed in the environment. - */ + protected int sx = 1; + protected int sy = 1; + + public int getWidth() { + return sx; + } + + public int getHeight() { + return sy; + } + + public void setSize(int w, int h) { + if(w < 0 || h < 0) { + return; + } + sx = w; + sy = h; + } + public void act() { // Add your action code here. - } + } + + public abstract void redraw(); } diff --git a/Label.java b/Label.java new file mode 100644 index 0000000..37ef6c6 --- /dev/null +++ b/Label.java @@ -0,0 +1,43 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import System.awt.Color; + +/** + * Zeigt einen Text an. + * + * @author Felix Stupp + * @version 10.05.2016 + */ +public class Label extends GUI_Interface { + + Color foreC = Color.WHITE + Color backC = Color.BLACK + int textSize = 1; + String text = ""; + + private void redraw() { + GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); + setImage(tI); + } + + public int getTextSize() { + return textSize; + } + + public void setTextSize(int s) { + if(textSize != s && s > 0) { + textSize = s; + redraw(); + } + } + + public String getText() { + return text; + } + + public void setText(String s) { + if(text != s) { + text = s; + redraw(); + } + } +} diff --git a/images/Button_Corner.png b/images/Button_Corner.png new file mode 100644 index 0000000000000000000000000000000000000000..937cca31107ae7650db5cd2e89fb5d892b7a26ab GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJg0#LT=By}Z;C1rt33 zJVM%xNb!1@J z*w6hZkrl}2EbxddW?@k_E_DC^ literal 0 HcmV?d00001 From 4ac3af0cbf550755891eaed694f153bd2bde489f Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Tue, 10 May 2016 20:16:19 +0200 Subject: [PATCH 04/68] GUI Objekte verbessert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Button.redraw() vervollständigt Fehlende Semikolonen hinzugefügt 4 Leerzeichen durch Tabs ersetzt (Verringerung der Dateigröße) --- Button.java | 181 ++++++++++++++++++++++++--------------------- GUI_Interface.java | 51 ++++++------- Label.java | 64 ++++++++-------- 3 files changed, 154 insertions(+), 142 deletions(-) diff --git a/Button.java b/Button.java index da11981..e4c23fe 100644 --- a/Button.java +++ b/Button.java @@ -2,93 +2,104 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** * Diese Klasse stellt einen Button dar. - * + * * @author Felix Stupp * @version 26.04.2016 */ public class Button extends GUI_Interface { - - boolean autoSize = true; - Color foreC = Color.WHITE - Color backC = Color.BLACK - int textSize = 1; - String text = ""; - - ButtonEvent handler; - - /** - * Erstellt einen Button mit dem gegebenen Objekt als Event-Handler. - * - * @param h Der Handler mit dem Interface ButtonEvent implementiert. - */ - public Button(ButtonEvent h) { - handler = h; - } - - /** - * Fragt ab, ob ein Klick auf den Button gekommen ist. - */ - public void act() { - if(Greenfoot.mouseClicked(this)) { - handler.buttonClicked(this); - } - } - - public boolean getAutoSize() { - return autoSize; - } - - public void setAutoSize(boolean b) { - autoSize = b; - if(autoSize) { - redraw(); - } - } - - public int getTextSize() { - return textSize; - } - - public void setTextSize(int s) { - if(textSize != s && s > 0) { - textSize = s; - redraw(); - } - } - - public String getText() { - return text; - } - - public void setText(String s) { - if(text != s) { - text = s; - redraw(); - } - } - - private void redraw() { - GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); - GreenfootImage corner = new GreenfootImage("images/Button_Corner.png"); - int csx = corner.getWidth(); - int csy = corner.getHeight(); - GreenfootImage side = new GreenfootImage("images/Button_Side.png"); - if(autoSize) { - sx = tI.getWidth() + (csx * 2); - sy = tI.getHeight() + (csy * 2); - } - GreenfootImage all = new GreenfootImage(sx,sy); - all.drawImage(corner,0,0); - corner.rotate(90); - all.drawImage(corner,sx-csx,0); - corner.rotate(90); - all.drawImage(corner,sx-csx,sy-csy); - corner.rotate(90); - all.drawImage(corner,0,sy-csy); - for(int i = csx; i < (sx-csx+1); i++) { - - } - all.drawImage(tI,(sx-tI.getWidth())/2,(sy-tI.getHeight())/2); - setImage(all); - } + + boolean autoSize = true; + Color foreC = Color.WHITE; + Color backC = Color.BLACK; + int textSize = 1; + String text = ""; + + ButtonEvent handler; + + /** + * Erstellt einen Button mit dem gegebenen Objekt als Event-Handler. + * @param h Der Handler mit dem Interface ButtonEvent implementiert. + */ + public Button(ButtonEvent h) { + handler = h; + } + + /** + * Fragt ab, ob ein Klick auf den Button gekommen ist. + */ + public void act() { + if(Greenfoot.mouseClicked(this)) { + handler.buttonClicked(this); + } + } + + public boolean getAutoSize() { + return autoSize; + } + + public void setAutoSize(boolean b) { + autoSize = b; + if(autoSize) { + redraw(); + } + } + + public int getTextSize() { + return textSize; + } + + public void setTextSize(int s) { + if(textSize != s && s > 0) { + textSize = s; + redraw(); + } + } + + public String getText() { + return text; + } + + public void setText(String s) { + if(text != s) { + text = s; + redraw(); + } + } + + private void redraw() { + GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); + GreenfootImage corner = new GreenfootImage("images/Button_Corner.png"); + int csx = corner.getWidth(); + int csy = corner.getHeight(); + GreenfootImage side = new GreenfootImage("images/Button_Side.png"); + if(autoSize) { + sx = tI.getWidth() + (csx * 2); + sy = tI.getHeight() + (csy * 2); + } + GreenfootImage all = new GreenfootImage(sx,sy); + all.drawImage(corner,0,0); // top left + corner.rotate(90); + all.drawImage(corner,0,sy-csy); // bottom left + corner.rotate(90); + all.drawImage(corner,sx-csx,sy-csy); // bottom right + corner.rotate(90); + all.drawImage(corner,sx-csx,0); // top right + for(int i = csx; i > (sx-csx); i++) { + all.drawImage(side,i,0); // top + } + side.rotate(90); + for(int i = csy; i > (sy-csy); i++) { // left + all.drawImage(side,0,i); + } + side.rotate(90); + for(int i = csx; i > (sx-csx); i++) { // bottom + all.drawImage(side,i,sy-csy); + } + for(int i = csy; i > (sy-csy); i++) { + all.drawImage(side,sx-csx,i); // right + } + side.rotate(90); + all.drawImage(tI,(sx-tI.getWidth())/2,(sy-tI.getHeight())/2); + setImage(all); + } } diff --git a/GUI_Interface.java b/GUI_Interface.java index 69c48da..730c98b 100644 --- a/GUI_Interface.java +++ b/GUI_Interface.java @@ -8,29 +8,30 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) */ public class GUI_Interface extends Actor { - protected int sx = 1; - protected int sy = 1; - - public int getWidth() { - return sx; - } - - public int getHeight() { - return sy; - } - - public void setSize(int w, int h) { - if(w < 0 || h < 0) { - return; - } - sx = w; - sy = h; - } - - public void act() - { - // Add your action code here. - } - - public abstract void redraw(); + protected int sx = 1; + protected int sy = 1; + + public int getWidth() { + return sx; + } + + public int getHeight() { + return sy; + } + + public void setSize(int w, int h) { + if(w < 0 || h < 0) { + return; + } + sx = w; + sy = h; + redraw(); + } + + public void act() + { + // Add your action code here. + } + + public abstract void redraw(); } diff --git a/Label.java b/Label.java index 37ef6c6..73d0155 100644 --- a/Label.java +++ b/Label.java @@ -8,36 +8,36 @@ import System.awt.Color; * @version 10.05.2016 */ public class Label extends GUI_Interface { - - Color foreC = Color.WHITE - Color backC = Color.BLACK - int textSize = 1; - String text = ""; - - private void redraw() { - GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); - setImage(tI); - } - - public int getTextSize() { - return textSize; - } - - public void setTextSize(int s) { - if(textSize != s && s > 0) { - textSize = s; - redraw(); - } - } - - public String getText() { - return text; - } - - public void setText(String s) { - if(text != s) { - text = s; - redraw(); - } - } + + Color foreC = Color.WHITE; + Color backC = Color.BLACK; + int textSize = 1; + String text = ""; + + private void redraw() { + GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); + setImage(tI); + } + + public int getTextSize() { + return textSize; + } + + public void setTextSize(int s) { + if(textSize != s && s > 0) { + textSize = s; + redraw(); + } + } + + public String getText() { + return text; + } + + public void setText(String s) { + if(text != s) { + text = s; + redraw(); + } + } } From 6cb9130ddd3e07bef2857cc62eab6e09a78c2f5a Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Tue, 10 May 2016 20:33:41 +0200 Subject: [PATCH 05/68] GUI Objekte 0.1 debuggt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Imports generell verbessert "GUI_Interface" zu "abstract" erklärt --- Button.java | 1 + GUI_Interface.java | 2 +- Label.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Button.java b/Button.java index e4c23fe..c8b1089 100644 --- a/Button.java +++ b/Button.java @@ -1,4 +1,5 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import Java.awt.Color; /** * Diese Klasse stellt einen Button dar. diff --git a/GUI_Interface.java b/GUI_Interface.java index 730c98b..a846c13 100644 --- a/GUI_Interface.java +++ b/GUI_Interface.java @@ -6,7 +6,7 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) * @author Felix Stupp * @version 10.05.2016 */ -public class GUI_Interface extends Actor +public abstract class GUI_Interface extends Actor { protected int sx = 1; protected int sy = 1; diff --git a/Label.java b/Label.java index 73d0155..77d9570 100644 --- a/Label.java +++ b/Label.java @@ -1,5 +1,5 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) -import System.awt.Color; +import Java.awt.Color; /** * Zeigt einen Text an. From e543bf666ae5a0adacaf611546f65431046e32f0 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Tue, 10 May 2016 20:41:08 +0200 Subject: [PATCH 06/68] CurrentPlayerArrow entfernt Ein Rest aus dem ersten Versuchen und Tests, diese Anzeige soll innerhalb der Welt direkt erzeugt werden. --- CurrentPlayerArrow.java | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 CurrentPlayerArrow.java diff --git a/CurrentPlayerArrow.java b/CurrentPlayerArrow.java deleted file mode 100644 index 21a08bc..0000000 --- a/CurrentPlayerArrow.java +++ /dev/null @@ -1,38 +0,0 @@ -import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) - -/** - * Write a description of class CurrentPlayerArrow here. - * - * @author (your name) - * @version (a version number or a date) - */ -public class CurrentPlayerArrow extends GUI_Interface -{ - /** - * Act - do whatever the CurrentPlayerArrow wants to do. This method is called whenever - * the 'Act' or 'Run' button gets pressed in the environment. - */ - public void act() - { - // Add your action code here. - } - - public void CurrentPlayerArrow(int currentPlayer, int playerNumber) - { - switch (currentPlayer) { - case 1 : - setLocation(120,100); - break; - case 2 : - setLocation(120,100 + (825 / playerNumber)); - break; - case 3 : - setLocation(120,100 + (825 / playerNumber)*2); - break; - case 4 : - setLocation(120,100 + (825 / playerNumber)*3); - break; - - } - } -} From 3ebea693cbf4c6c9ab284aa5c4c3948e6110a9d2 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Tue, 10 May 2016 20:42:11 +0200 Subject: [PATCH 07/68] =?UTF-8?q?GUI=20Objekte=200.1=20Debug=202=20Import?= =?UTF-8?q?=20erneut=20verbessert=20("Java"=20zu=20"java")=20"redraw()"=20?= =?UTF-8?q?Methoden=20nun=20=C3=BCberall=20zu=20"public"=20ge=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Button.java | 4 ++-- Label.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Button.java b/Button.java index c8b1089..82bb984 100644 --- a/Button.java +++ b/Button.java @@ -1,5 +1,5 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) -import Java.awt.Color; +import java.awt.Color; /** * Diese Klasse stellt einen Button dar. @@ -67,7 +67,7 @@ public class Button extends GUI_Interface { } } - private void redraw() { + public void redraw() { GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); GreenfootImage corner = new GreenfootImage("images/Button_Corner.png"); int csx = corner.getWidth(); diff --git a/Label.java b/Label.java index 77d9570..1a21cc3 100644 --- a/Label.java +++ b/Label.java @@ -1,5 +1,5 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) -import Java.awt.Color; +import java.awt.Color; /** * Zeigt einen Text an. @@ -14,7 +14,7 @@ public class Label extends GUI_Interface { int textSize = 1; String text = ""; - private void redraw() { + public void redraw() { GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); setImage(tI); } From 51536fe0cabca35b157388432a0d92bca4ffdbb3 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Tue, 10 May 2016 21:19:39 +0200 Subject: [PATCH 08/68] Button Bilder erweitert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Für Tests mit den Buttons wurden die Teilbilder farblich invertiert und separat abgespeichert. --- images/Button_Corner_Inv.png | Bin 0 -> 166 bytes images/Button_Side_Inv.png | Bin 0 -> 148 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/Button_Corner_Inv.png create mode 100644 images/Button_Side_Inv.png diff --git a/images/Button_Corner_Inv.png b/images/Button_Corner_Inv.png new file mode 100644 index 0000000000000000000000000000000000000000..56a88b695326c3acc02f77d601826c337010fc57 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJg!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}y;_2cT zA`zbaN=ir=7|vCVj*kA%%n;8RVdk$lD;=nw!PC{xWt~$( F697zaD<=Q| literal 0 HcmV?d00001 diff --git a/images/Button_Side_Inv.png b/images/Button_Side_Inv.png new file mode 100644 index 0000000000000000000000000000000000000000..f91226a068d15315cd907b9f9e76029cf773f6ac GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrJ!2~4T^fnv@QY`6?zK#qG8~eHcB(eheoCO|{ z#S9F5hd`K7RKu$QC@4|l8c`CQpH@)-5guKQ5Ma7n?mU0A(3GUHx3vIVCg!02zKI3IG5A literal 0 HcmV?d00001 From ac3e6477f4ac6b4dc4e42331e9f981efeb49eec6 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Tue, 10 May 2016 21:22:51 +0200 Subject: [PATCH 09/68] GUI Objekte 0.1 erweitert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Standard Textgröße auf 32 gesetzt Button Handler darf nun auch "null" sein Weitere Konstruktoren eingebaut --- Button.java | 50 ++++++++++++++++++++++++++++++++++------------- Label.java | 8 +++++++- Menue_Button.java | 4 ++++ Roll_Button.java | 4 ++++ 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/Button.java b/Button.java index 82bb984..9d196df 100644 --- a/Button.java +++ b/Button.java @@ -12,24 +12,36 @@ public class Button extends GUI_Interface { boolean autoSize = true; Color foreC = Color.WHITE; Color backC = Color.BLACK; - int textSize = 1; + int textSize = 32; // as default text size String text = ""; ButtonEvent handler; + public Button(String txt, int size) { + text = txt; + textSize = size; + redraw(); + } /** * Erstellt einen Button mit dem gegebenen Objekt als Event-Handler. * @param h Der Handler mit dem Interface ButtonEvent implementiert. */ public Button(ButtonEvent h) { handler = h; + redraw(); + } + public Button(String txt, int size, ButtonEvent h) { + text = txt; + textSize = size; + handler = h; + redraw(); } /** * Fragt ab, ob ein Klick auf den Button gekommen ist. */ public void act() { - if(Greenfoot.mouseClicked(this)) { + if(Greenfoot.mouseClicked(this) && handler != this) { handler.buttonClicked(this); } } @@ -37,7 +49,6 @@ public class Button extends GUI_Interface { public boolean getAutoSize() { return autoSize; } - public void setAutoSize(boolean b) { autoSize = b; if(autoSize) { @@ -48,7 +59,6 @@ public class Button extends GUI_Interface { public int getTextSize() { return textSize; } - public void setTextSize(int s) { if(textSize != s && s > 0) { textSize = s; @@ -59,7 +69,6 @@ public class Button extends GUI_Interface { public String getText() { return text; } - public void setText(String s) { if(text != s) { text = s; @@ -67,6 +76,16 @@ public class Button extends GUI_Interface { } } + public ButtonEvent getHandler() { + return handler; + } + public void setHandler(ButtonEvent h) { + handler = h; + } + public void removeHandler() { + handler = null; + } + public void redraw() { GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); GreenfootImage corner = new GreenfootImage("images/Button_Corner.png"); @@ -74,32 +93,35 @@ public class Button extends GUI_Interface { int csy = corner.getHeight(); GreenfootImage side = new GreenfootImage("images/Button_Side.png"); if(autoSize) { - sx = tI.getWidth() + (csx * 2); - sy = tI.getHeight() + (csy * 2); + sx = tI.getWidth() + (csx * 2) + 4; + sy = tI.getHeight() + (csy * 2) + 4; } GreenfootImage all = new GreenfootImage(sx,sy); + all.setColor(Color.BLACK); + all.fill(); all.drawImage(corner,0,0); // top left corner.rotate(90); - all.drawImage(corner,0,sy-csy); // bottom left + all.drawImage(corner,sx-csx,0); // top right corner.rotate(90); all.drawImage(corner,sx-csx,sy-csy); // bottom right corner.rotate(90); - all.drawImage(corner,sx-csx,0); // top right + all.drawImage(corner,0,sy-csy); // bottom left for(int i = csx; i > (sx-csx); i++) { all.drawImage(side,i,0); // top + System.out.println("This is a test line at " + i); } side.rotate(90); - for(int i = csy; i > (sy-csy); i++) { // left - all.drawImage(side,0,i); + for(int i = csy; i > (sy-csy); i++) { + all.drawImage(side,sx-csx,i); // right } side.rotate(90); for(int i = csx; i > (sx-csx); i++) { // bottom all.drawImage(side,i,sy-csy); } - for(int i = csy; i > (sy-csy); i++) { - all.drawImage(side,sx-csx,i); // right - } side.rotate(90); + for(int i = csy; i > (sy-csy); i++) { // left + all.drawImage(side,0,i); + } all.drawImage(tI,(sx-tI.getWidth())/2,(sy-tI.getHeight())/2); setImage(all); } diff --git a/Label.java b/Label.java index 1a21cc3..f6c95ec 100644 --- a/Label.java +++ b/Label.java @@ -11,9 +11,15 @@ public class Label extends GUI_Interface { Color foreC = Color.WHITE; Color backC = Color.BLACK; - int textSize = 1; + int textSize = 32; String text = ""; + public Label(String txt, int size) { + text = txt; + textSize = size; + redraw(); + } + public void redraw() { GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); setImage(tI); diff --git a/Menue_Button.java b/Menue_Button.java index 44805e3..cb538aa 100644 --- a/Menue_Button.java +++ b/Menue_Button.java @@ -8,6 +8,10 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) */ public class Menue_Button extends Button { + public Menue_Button(ButtonEvent h) { + super(h); + } + /** * Act - do whatever the Menue_Button wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. diff --git a/Roll_Button.java b/Roll_Button.java index 53ff8bc..46b6d7d 100644 --- a/Roll_Button.java +++ b/Roll_Button.java @@ -8,6 +8,10 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) */ public class Roll_Button extends Button { + public Roll_Button(ButtonEvent h) { + super(h); + } + /** * Act - do whatever the Würfel_Button_Angriff wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. From 711090cebc763ccfaa2977a6da73c6628604992e Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Tue, 10 May 2016 21:25:24 +0200 Subject: [PATCH 10/68] [DEBUG] Auskommentieren fehlerbringender Zeilen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Da die Konstruktoren der hier verwendeten Klassen verändert wurden, arbeiten diese Code-Zeilen nicht mehr korrekt. Um Fehlern aus dem Weg zu gehen, wurden diese auskommentiert. Diese Klasse wird später über einen anderen Branch wieder verbessert. Diese Änderung muss beim Pull Request nicht übernommen werden. --- GeneralMap.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GeneralMap.java b/GeneralMap.java index fc9b8cd..27b1f87 100644 --- a/GeneralMap.java +++ b/GeneralMap.java @@ -28,9 +28,9 @@ public class GeneralMap extends World * @param p Kantenlänge der Felder in Pixeln */ super(1600, 900, 1); - addObject(new Menue_Button(),100,38); - addObject(new Roll_Button(),84,835); - addObject(new Roll_Button(),1513,835); + //addObject(new Menue_Button(),100,38); + //addObject(new Roll_Button(),84,835); + //addObject(new Roll_Button(),1513,835); } static GeneralMap generateMap(int mapID) From d6a3ac0a4eef87506634d2eb8d871ad46c774d28 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Wed, 11 May 2016 20:07:30 +0200 Subject: [PATCH 11/68] =?UTF-8?q?Rechtschreibung=20der=20Markdown=20Dateie?= =?UTF-8?q?n=20verbessert=20In=20diesen=20Dateien=20waren=20teilweise=20ni?= =?UTF-8?q?cht=20alle=20W=C3=B6rter=20richtig=20geschrieben.=20Dies=20wurd?= =?UTF-8?q?e=20nun=20angepasst.=20Inhaltlich=20sind=20die=20Dokumente=20id?= =?UTF-8?q?entisch.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/README.md | 2 +- planung/architektur.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/planung/README.md b/planung/README.md index 386873e..f647fb9 100644 --- a/planung/README.md +++ b/planung/README.md @@ -1,7 +1,7 @@ Planung ======= -Hier sind nun für unser Team sämtliche Dokumente, die während der Planung des Projekts aufgetretten sind oder noch werden, zu finden. Eventuell wird noch zusätzliche Software wie Word benötigt, um diese Dateien anzeigen zu können. +Hier sind nun für unser Team sämtliche Dokumente, die während der Planung des Projekts aufgetreten sind oder noch werden, zu finden. Eventuell wird noch zusätzliche Software wie Word benötigt, um diese Dateien anzeigen zu können. Dasselbe lässt sich hier nochmal mit Office Integration bei mir in OneDrive anzeigen: [Hier klicken](https://onedrive.live.com/redir?resid=C26B53478C4AFFD1!238212&authkey=!ADhY-TMN8w_Egjc&ithint=folder%2cjpg OneDrive von Felix Stupp) diff --git a/planung/architektur.md b/planung/architektur.md index 0a321bc..37f9782 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -12,10 +12,10 @@ Hier ein möglicher Architekturplan von *Felix Stupp*. Dieser Plan wird regelmäßig angepasst, oben am Datum zu erkennen. Hier werden alle Klassen und deren öffentliche Methoden und Eigenschaften zusammengefasst. -Auch zu sehen ist der Author / sind die Authoren der Klasse, um bei Fragen diese kontaktieren zu können. +Auch zu sehen ist der Autor / sind die Autoren der Klasse, um bei Fragen diese kontaktieren zu können. -**Alle Anfragen aufgrund von Architekturänderungen erst an mich weitergeben, damit ich dies mit den jeweiligen Authoren besprechen kann!** -Die Authoren sollen nur Fragen zu bisher vorhandenen Methoden erhalten. +**Alle Anfragen aufgrund von Architekturänderungen erst an mich weitergeben, damit ich dies mit den jeweiligen Autoren besprechen kann!** +Die Autoren sollen nur Fragen zu bisher vorhandenen Methoden erhalten. ### Erklärung @@ -78,7 +78,7 @@ Der Spieler kann mithilfe der Welt dann herausfinden, welche Provinzen ihm gehö ## MainMenu -Stellt eine *World* als Hauptmenü dar, bekommmt die Aufgabe, die einzelnen Menüpunkte anzuzeigen. Aktiviert gegebenenfalls andere *Worlds*. +Stellt eine *World* als Hauptmenü dar, bekommt die Aufgabe, die einzelnen Menüpunkte anzuzeigen. Aktiviert gegebenenfalls andere *Worlds*. --- From 4a460d84cd44b63721234633cd4950c305ed12c2 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Wed, 11 May 2016 21:33:36 +0200 Subject: [PATCH 12/68] =?UTF-8?q?GUI=20Objekte=20Version=200.2=20Funktione?= =?UTF-8?q?n=20teilweise=20durch=20=C3=9Cberf=C3=BChrung=20in=20die=20GUI?= =?UTF-8?q?=5FInterface-Klasse=20verallgemeinert=20InCode=20Dokumentation?= =?UTF-8?q?=20hinzugef=C3=BCgt/angepasst=20Fehler=20verbessert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Button.java | 97 ++++++++++++++++++++++++++++++++++++---------- GUI_Interface.java | 76 +++++++++++++++++++++++++++++++----- Label.java | 86 ++++++++++++++++++++++++++++++++-------- 3 files changed, 212 insertions(+), 47 deletions(-) diff --git a/Button.java b/Button.java index 9d196df..ff18971 100644 --- a/Button.java +++ b/Button.java @@ -2,34 +2,44 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.awt.Color; /** - * Diese Klasse stellt einen Button dar. - * - * @author Felix Stupp - * @version 26.04.2016 - */ + Diese Klasse stellt einen Button dar. + Als Vorbild dafür hält der Button aus dem .NET-Framework für UWP-Apps dar. + + @author Felix Stupp + @version 11.05.2016 +*/ public class Button extends GUI_Interface { - boolean autoSize = true; - Color foreC = Color.WHITE; - Color backC = Color.BLACK; - int textSize = 32; // as default text size - String text = ""; + private boolean autoSize = true; + private int textSize = 32; // as default text size + private String text = ""; - ButtonEvent handler; + private ButtonEvent handler; + /** + Erstellt einen Button mit dem gegebenen Text und der zugehörigen Textgröße. + @param txt Der Text, den der Button darstellen soll. + @param size Die Textgröße, in der der Button den Text darstellen soll. + */ public Button(String txt, int size) { text = txt; textSize = size; redraw(); } /** - * Erstellt einen Button mit dem gegebenen Objekt als Event-Handler. - * @param h Der Handler mit dem Interface ButtonEvent implementiert. - */ + Erstellt einen Button mit dem gegebenen Objekt als Event-Handler. + @param h Der Handler mit dem Interface ButtonEvent implementiert. + */ public Button(ButtonEvent h) { handler = h; redraw(); } + /** + Erstellt einen Button mit dem gegebenen Text, der zugehörigen Textgröße und dem gegebenen Objekt als Event-Handler. + @param txt Der Text, den der Button darstellen soll. + @param size Die Textgröße, in der der Button den Text darstellen soll. + @param h Der Handler mit dem Interface ButtonEvent implementiert. + */ public Button(String txt, int size, ButtonEvent h) { text = txt; textSize = size; @@ -38,17 +48,27 @@ public class Button extends GUI_Interface { } /** - * Fragt ab, ob ein Klick auf den Button gekommen ist. - */ + Fragt ab, ob ein Klick auf den Button gekommen ist. + Wird intern von Greenfoot benötigt. + */ public void act() { if(Greenfoot.mouseClicked(this) && handler != this) { handler.buttonClicked(this); } } + /** + Gibt zurück, ob die Größe des Buttons von dem Text bestimmt werden soll. + @return Wert der AutoSize-Eigenschaft + */ public boolean getAutoSize() { return autoSize; } + /** + Legt fest, ob die Größe des Buttons von dem Text bestimmt werden soll. + Wird der Wert auf TRUE geändert, erfolgt automatisch ein Redraw des Objekts. + @param b Der neue Wert der AutoSize-Eigenschaft. + */ public void setAutoSize(boolean b) { autoSize = b; if(autoSize) { @@ -56,38 +76,74 @@ public class Button extends GUI_Interface { } } + /** + Gibt die aktelle Textgröße zurück. + @return Aktuelle Textgröße + */ public int getTextSize() { return textSize; } - public void setTextSize(int s) { + /** + Legt eine neue Textgröße fest. + @param s Neue Textgröße + @return Gibt an, ob sich die Textgröße geändert hat. Bei TRUE erfolgte bereits ein Redraw. + */ + public boolean setTextSize(int s) { if(textSize != s && s > 0) { textSize = s; redraw(); + return true; } + return false; } + /** + Gibt den aktuellen Text zurück. + @return Der aktuelle Text + */ public String getText() { return text; } - public void setText(String s) { + /** + Setzt den darzustellenden Text auf den neuen Wert. + @param s Der neue Text + @return Gibt an, ob sich der Text geändert hat. Bei TRUE erfolgte bereits ein Redraw. + */ + public boolean setText(String s) { if(text != s) { text = s; redraw(); + return true; } + return false; } + /** + Gibt den aktuellen EventHandler des Buttons zurück. + @return Der Handler als ButtonEvent + */ public ButtonEvent getHandler() { return handler; } + /** + Setzt den EventHandler auf ein neues Objekt. + @param h Der Handler mit implementiertem ButtonEvent-Interface + */ public void setHandler(ButtonEvent h) { handler = h; } + /** + Entfernt den aktuellen EventHandler, um die Ausführung zukünftiger Events zu verhindern. + */ public void removeHandler() { handler = null; } + /** + Zeichnet das GreenfootImage des Buttons erneut und zeigt es an. + */ public void redraw() { - GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); + GreenfootImage tI = new GreenfootImage(text,textSize,textC,backC); GreenfootImage corner = new GreenfootImage("images/Button_Corner.png"); int csx = corner.getWidth(); int csy = corner.getHeight(); @@ -97,7 +153,7 @@ public class Button extends GUI_Interface { sy = tI.getHeight() + (csy * 2) + 4; } GreenfootImage all = new GreenfootImage(sx,sy); - all.setColor(Color.BLACK); + all.setColor(backC); all.fill(); all.drawImage(corner,0,0); // top left corner.rotate(90); @@ -108,7 +164,6 @@ public class Button extends GUI_Interface { all.drawImage(corner,0,sy-csy); // bottom left for(int i = csx; i > (sx-csx); i++) { all.drawImage(side,i,0); // top - System.out.println("This is a test line at " + i); } side.rotate(90); for(int i = csy; i > (sy-csy); i++) { diff --git a/GUI_Interface.java b/GUI_Interface.java index a846c13..762cabc 100644 --- a/GUI_Interface.java +++ b/GUI_Interface.java @@ -1,24 +1,38 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** - * Oberklasse für sämtliche GUI Objekte, wie Labels und Buttons - * - * @author Felix Stupp - * @version 10.05.2016 - */ + Oberklasse für sämtliche GUI Objekte, wie Labels und Buttons + + @author Felix Stupp + @version 11.05.2016 +*/ public abstract class GUI_Interface extends Actor { protected int sx = 1; protected int sy = 1; + protected Color backC = Color.BLACK; + protected Color textC = Color.WHITE; + /** + Gibt die Breite des Objektes zurück. + @return Die aktuelle Breite + */ public int getWidth() { return sx; } - + /** + Gibt die Höhe des Objektes zurück. + @return Die aktuelle Höhe + */ public int getHeight() { return sy; } - + /** + Legt die Größe des Objektes neu fest und zeichnet es danach damit neu. + Je nach Objekttyp kann diese Größe wieder vom Objekt selbst angepasst werden, falls nötig. + @param w Die neue Breite + @param h Die neue Höhe + */ public void setSize(int w, int h) { if(w < 0 || h < 0) { return; @@ -28,10 +42,52 @@ public abstract class GUI_Interface extends Actor redraw(); } - public void act() - { - // Add your action code here. + /** + * Gibt die aktuelle Hintergrundfarbe des Objektes zurück. + * @return Die aktuelle Hintergrundfarbe als System.awt.Color + */ + public Color getBackColor() { + return backC; + } + /** + Legt die Hintergrundfarbe des Objektes fest. + @param c Die neue Hintergrundfarbe als System.awt.Color + @return Gibt an, ob diese Farbe unterschiedlich zur bisherig genutzten Farbe wahr. Bei TRUE erfolgte bereits ein Redraw. + */ + public boolean setBackColor(Color c) { + if(!c.equals(backC)) { + backC = c; + redraw(); + return true; + } + return false; + } + + /** + Gibt die aktuelle Vordergrundfarbe (meist die Textfarbe) des Objektes zurück. + @return Die aktuelle Vordergrundfarbe als System.awt.Color + */ + public Color getForeColor() { + return foreC; } + /** + Legt die Vordergrundfarbe (meist die Textfarbe) des Objektes fest. + @param c Die neue Vordergrundfarbe als System.awt.Color + @return Gibt an, ob diese Farbe unterschiedlich zur bisherig genutzten Farbe wahr. Bei TRUE erfolgte bereits ein Redraw. + */ + public boolean setForeColor(Color c) { + if(!c.equals(foreC)) { + foreC = c; + redraw(); + return true; + } + return false; + } + + public void act() {} + /** + Diese Funktion soll die erneute Zeichnung des Objekts erzwingen und wird daher auch von (fast) allen set-Methoden aufgerufen, sollte der neue Wert sich von dem alten unterscheiden. + */ public abstract void redraw(); } diff --git a/Label.java b/Label.java index f6c95ec..58786dd 100644 --- a/Label.java +++ b/Label.java @@ -2,48 +2,102 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.awt.Color; /** - * Zeigt einen Text an. - * - * @author Felix Stupp - * @version 10.05.2016 - */ + Zeigt einen Text an. + + @author Felix Stupp + @version 11.05.2016 +*/ public class Label extends GUI_Interface { - Color foreC = Color.WHITE; - Color backC = Color.BLACK; - int textSize = 32; - String text = ""; + private boolean autoSize = true; + private int textSize = 32; // as default text size + private String text = ""; + /** + Erstellt ein neues Label mit dem gegebenen Text und der zugehörigen Textgröße. + @param txt Der darzustellende Text + @param size Die dazugehörige Textgröße + */ public Label(String txt, int size) { text = txt; textSize = size; redraw(); } - public void redraw() { - GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); - setImage(tI); + /** + Gibt zurück, ob die Größe des Buttons von dem Text bestimmt werden soll. + @return Wert der AutoSize-Eigenschaft + */ + public boolean getAutoSize() { + return autoSize; + } + /** + Legt fest, ob die Größe des Buttons von dem Text bestimmt werden soll. + Wird der Wert auf TRUE geändert, erfolgt automatisch ein Redraw des Objekts. + @param b Der neue Wert der AutoSize-Eigenschaft. + */ + public void setAutoSize(boolean b) { + autoSize = b; + if(autoSize) { + redraw(); + } } + /** + Gibt die aktelle Textgröße zurück. + @return Aktuelle Textgröße + */ public int getTextSize() { return textSize; } - - public void setTextSize(int s) { + /** + Legt eine neue Textgröße fest. + @param s Neue Textgröße + @return Gibt an, ob sich die Textgröße geändert hat. Bei TRUE erfolgte bereits ein Redraw. + */ + public boolean setTextSize(int s) { if(textSize != s && s > 0) { textSize = s; redraw(); + return true; } + return false; } + /** + Gibt den aktuellen Text zurück. + @return Der aktuelle Text + */ public String getText() { return text; } - - public void setText(String s) { + /** + Setzt den darzustellenden Text auf den neuen Wert. + @param s Der neue Text + @return Gibt an, ob sich der Text geändert hat. Bei TRUE erfolgte bereits ein Redraw. + */ + public boolean setText(String s) { if(text != s) { text = s; redraw(); + return true; + } + return false; + } + + /** + Zeichnet das GreenfootImage des Labels erneut und zeigt es an. + */ + public void redraw() { + GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); + if(autoSize) { + sx = tI.getWidth(); + sy = tI.getHeight(); } + GreenfootImage all = new GreenfootImage(sx,sy); + all.setColor(backC); + all.fill(); + + setImage(all); } } From 3a9f7c9bec3483176cf5d77d775221f70f962740 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Wed, 11 May 2016 22:06:58 +0200 Subject: [PATCH 13/68] =?UTF-8?q?VS=20Code=20Einstellungen=20erweitert=20F?= =?UTF-8?q?=C3=BCr=20Verwender=20des=20Editors=20"Visual=20Studio=20Code"?= =?UTF-8?q?=20verbessert=20diese=20Datei=20den=20Umgang=20mit=20dem=20Date?= =?UTF-8?q?i-Explorer=20an=20der=20Seite,=20indem=20unn=C3=B6tige=20und=20?= =?UTF-8?q?nicht=20lesbare=20Dateien=20ausgeblendet=20werden.=20Nicht-Verw?= =?UTF-8?q?ender=20des=20Tools=20k=C3=B6nnnen=20diese=20Datei=20ignorieren?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 1a124ba..2d95c3e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,14 +1,17 @@ // Place your settings in this file to overwrite default and user settings. { "files.exclude": { + // IDE Einstellungen "**/.git": true, "**/.DS_Store": true, + "**/.vscode": true, + // Greenfoot Dateien + "project.greenfoot": true, "*.class": true, "*.ctxt": true, - "project.greenfoot": true, - "**/.vscode": true, - "*.ods": true, - "*.xls": true, - "*.xlsx": true + // Excel Tabellen + "**/*.ods": true, + "**/*.xls": true, + "**/*.xlsx": true } } \ No newline at end of file From dd08706ed6a17225ddb4396581c4007c782ef6fd Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Thu, 12 May 2016 17:32:43 +0200 Subject: [PATCH 14/68] =?UTF-8?q?Button=20Zeichnung=20angepasst=20Der=20Bu?= =?UTF-8?q?tton=20ist=20nun=20in=20der=20Lage,=20sich=20selbst=20ohne=20Gr?= =?UTF-8?q?afiken=20zu=20zeichnen,=20da=20der=20Einsatz=20dieser=20Grafike?= =?UTF-8?q?n=20nicht=20mit=20Erfolg=20verlief.=20In=20der=20Utils=20Klasse?= =?UTF-8?q?=20wurde=20dazu=20auch=20eine=20neue=20Funktion=20hinzugef?= =?UTF-8?q?=C3=BCgt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Button.java | 43 ++++++++++++------------------------------- Utils.java | 8 ++++++++ 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/Button.java b/Button.java index ff18971..cd29f19 100644 --- a/Button.java +++ b/Button.java @@ -144,40 +144,21 @@ public class Button extends GUI_Interface { */ public void redraw() { GreenfootImage tI = new GreenfootImage(text,textSize,textC,backC); - GreenfootImage corner = new GreenfootImage("images/Button_Corner.png"); - int csx = corner.getWidth(); - int csy = corner.getHeight(); - GreenfootImage side = new GreenfootImage("images/Button_Side.png"); if(autoSize) { - sx = tI.getWidth() + (csx * 2) + 4; - sy = tI.getHeight() + (csy * 2) + 4; + sx = tI.getWidth() + (6 * 2) + 4; + sy = tI.getHeight() + (6 * 2) + 4; } GreenfootImage all = new GreenfootImage(sx,sy); - all.setColor(backC); - all.fill(); - all.drawImage(corner,0,0); // top left - corner.rotate(90); - all.drawImage(corner,sx-csx,0); // top right - corner.rotate(90); - all.drawImage(corner,sx-csx,sy-csy); // bottom right - corner.rotate(90); - all.drawImage(corner,0,sy-csy); // bottom left - for(int i = csx; i > (sx-csx); i++) { - all.drawImage(side,i,0); // top - } - side.rotate(90); - for(int i = csy; i > (sy-csy); i++) { - all.drawImage(side,sx-csx,i); // right - } - side.rotate(90); - for(int i = csx; i > (sx-csx); i++) { // bottom - all.drawImage(side,i,sy-csy); - } - side.rotate(90); - for(int i = csy; i > (sy-csy); i++) { // left - all.drawImage(side,0,i); - } - all.drawImage(tI,(sx-tI.getWidth())/2,(sy-tI.getHeight())/2); + Color gray = new Color(127,127,127,255); + Utils.drawInsideRectangle(all,gray,0); + Utils.drawInsideRectangle(all,backC,2); + Utils.drawInsideRectangle(all,gray,6); + Utils.drawInsideRectangle(all,backC,7); + all.setColor(new Color(0,0,0,0)); + all.fillRect(0,0,1,1); + all.fillRect(sx-1,0,1,1); + all.fillRect(0,sy-1,1,1); + all.fillRect(sx-1,sy-1,1,1); setImage(all); } } diff --git a/Utils.java b/Utils.java index bdbeffd..4063252 100644 --- a/Utils.java +++ b/Utils.java @@ -1,4 +1,5 @@ import greenfoot.*; +import System.awt.Color; /** * Diese Klasse enthält nur statische Funktionen, welche für euch als Unterstützung gedacht sind. Damit könnt ihr dann hoffentlich viele Code-Zeilen sparen. :) @@ -31,4 +32,11 @@ public final class Utils { return b; } + public static void drawInsideRectangle(GreenfootImage i, Color c, int b) { + int sx = i.getWidth(); + int sy = i.getHeight(); + i.setColor(c); + i.fillRect(b,b,sx-(2*b),sy-(2*b)); + } + } From 9018f372c6a4f2135688e072c95faab423ce6718 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Thu, 12 May 2016 21:19:24 +0200 Subject: [PATCH 15/68] =?UTF-8?q?GUI=20Objekte=20Version=200.2=20Debug=20D?= =?UTF-8?q?ebuggen=20der=20letzten=20=C3=84nderungen=20an=20den=20GUI=20Ob?= =?UTF-8?q?jekten=20und=20der=20zugeh=C3=B6rigen=20Methoden=20in=20der=20U?= =?UTF-8?q?tils=20Klasse.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Button.java | 10 ++++++---- GUI_Interface.java | 3 ++- Utils.java | 24 ++++++++++++++++++++++-- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/Button.java b/Button.java index cd29f19..fa7cf86 100644 --- a/Button.java +++ b/Button.java @@ -143,22 +143,24 @@ public class Button extends GUI_Interface { Zeichnet das GreenfootImage des Buttons erneut und zeigt es an. */ public void redraw() { - GreenfootImage tI = new GreenfootImage(text,textSize,textC,backC); + GreenfootImage tI = new GreenfootImage(text,textSize,foreC,backC); if(autoSize) { sx = tI.getWidth() + (6 * 2) + 4; sy = tI.getHeight() + (6 * 2) + 4; } GreenfootImage all = new GreenfootImage(sx,sy); - Color gray = new Color(127,127,127,255); + Color gray = new Color(133,133,133,255); + Color black = new Color(0,0,0,255); Utils.drawInsideRectangle(all,gray,0); - Utils.drawInsideRectangle(all,backC,2); + Utils.drawInsideRectangle(all,black,2); Utils.drawInsideRectangle(all,gray,6); - Utils.drawInsideRectangle(all,backC,7); + Utils.drawInsideRectangle(all,black,7); all.setColor(new Color(0,0,0,0)); all.fillRect(0,0,1,1); all.fillRect(sx-1,0,1,1); all.fillRect(0,sy-1,1,1); all.fillRect(sx-1,sy-1,1,1); + all.drawImage(tI,(sx-tI.getWidth())/2,(sy-tI.getHeight())/2); setImage(all); } } diff --git a/GUI_Interface.java b/GUI_Interface.java index 762cabc..6cd9059 100644 --- a/GUI_Interface.java +++ b/GUI_Interface.java @@ -1,4 +1,5 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import java.awt.Color; /** Oberklasse für sämtliche GUI Objekte, wie Labels und Buttons @@ -11,7 +12,7 @@ public abstract class GUI_Interface extends Actor protected int sx = 1; protected int sy = 1; protected Color backC = Color.BLACK; - protected Color textC = Color.WHITE; + protected Color foreC = Color.WHITE; /** Gibt die Breite des Objektes zurück. diff --git a/Utils.java b/Utils.java index 4063252..5081b61 100644 --- a/Utils.java +++ b/Utils.java @@ -1,5 +1,5 @@ import greenfoot.*; -import System.awt.Color; +import java.awt.Color; /** * Diese Klasse enthält nur statische Funktionen, welche für euch als Unterstützung gedacht sind. Damit könnt ihr dann hoffentlich viele Code-Zeilen sparen. :) @@ -9,7 +9,11 @@ import System.awt.Color; */ public final class Utils { - //Kopiert ein Array eines (annäherend) beliebigen Types. + /** + Kopiert ein boolean-Array und übergibt diese. + @param a Das zu kopierende Array + @return Die Kopie des Arrays + */ public static boolean[] copyArray(boolean[] a) { boolean[] b = new boolean[a.length]; for(int i = 0; i >= a.length; i++) { @@ -17,6 +21,11 @@ public final class Utils { } return b; } + /** + Kopiert ein int-Array und übergibt diese. + @param a Das zu kopierende Array + @return Die Kopie des Arrays + */ public static int[] copyArray(int[] a) { int[] b = new int[a.length]; for(int i = 0; i >= a.length; i++) { @@ -24,6 +33,11 @@ public final class Utils { } return b; } + /** + Kopiert ein String-Array und übergibt diese. + @param a Das zu kopierende Array + @return Die Kopie des Arrays + */ public static String[] copyArray(String[] a) { String[] b = new String[a.length]; for(int i = 0; i >= a.length; i++) { @@ -32,6 +46,12 @@ public final class Utils { return b; } + /** + Zeichnet innerhalb eines GreenfootImage ein gefülltes Rechteck in der gegebenen Farbe und mit dem gegebenen Abstand zum Rand. + @param i Das GreenfootImage, in dem gezeichnet werden soll. + @param c Die Farbe, in der das gefüllte Rechteck gezeichnet werden soll. + @param b Der Abstand zum Rand der Grafik. + */ public static void drawInsideRectangle(GreenfootImage i, Color c, int b) { int sx = i.getWidth(); int sy = i.getHeight(); From 4239efad0da5dd10943d88ffbcb940e129b82041 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Thu, 12 May 2016 21:19:28 +0200 Subject: [PATCH 16/68] =?UTF-8?q?Architektur=20Anpassung=20(Teil=201)=20An?= =?UTF-8?q?passung=20der=20Architektur=20und=20der=20Funktionsliste=20an?= =?UTF-8?q?=20die=20neuen=20Methoden=20bei=20den=20GUI=20Objekten=20und=20?= =?UTF-8?q?der=20Utils=20Klasse.=20Die=20Architektur=20selbst=20ist=20noch?= =?UTF-8?q?=20unvollst=C3=A4ndig=20in=20dieser=20Hinsicht.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/architektur.md | 17 ++--- planung/funktionsliste.md | 143 ++++++++++++++++++++++++-------------- 2 files changed, 98 insertions(+), 62 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index 37f9782..6d6451a 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -1,8 +1,8 @@ # Architekturplan Zweiundvierzig -**Version: 2** +**Version: 3** -**Stand: 10.04.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Stand: 12.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die neuste offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) @@ -61,14 +61,11 @@ Der Spieler kann mithilfe der Welt dann herausfinden, welche Provinzen ihm gehö - *Player* - *Dice* (Würfel) -### Sonstige Actors (Control Elemente) +### Sonstige Actors (GUI Objekte) - *GUI_Interface* - *Label* - *Button* - - *Menue_Button* - - *Roll_Button* -- *CurrentPlayerArrow* ### Sonstige @@ -365,8 +362,12 @@ Die Hauptklasse für Buttons, wird durch Erbung spezifiziert. ## Utils -Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verkleinern und besser lesbar gestalten soll. Ergänzungen in Form von eigenen Funktionen dürfen selbst eingebracht werden. +Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verkleinern und besser lesbar gestalten soll. Ergänzungen in Form von eigenen Funktionen dürfen **selbst** eingebracht werden. ### copyArray() -Kopiert ein Array des Types **boolean**, **int** oder **String** mit identischer Größe. \ No newline at end of file +Kopiert ein Array des Types **boolean**, **int** oder **String** mit identischer Größe. + +### drawInsideRectangle() + +Zeichnet innerhalb eines **GreenfootImage** ein Rechteck gefüllt mit der angegebenen Farbe. Es besitzt zu allen Seiten den gegebenen Abstand zum Rand des Image. \ No newline at end of file diff --git a/planung/funktionsliste.md b/planung/funktionsliste.md index 14c33ac..d19ee62 100644 --- a/planung/funktionsliste.md +++ b/planung/funktionsliste.md @@ -1,92 +1,127 @@ # Funktionsliste Zweiundvierzig -**Version: 2** +**Version: 3** -**Stand: 10.04.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Stand: 12.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die neuste offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) [Hier zum gesamten Architekturplan](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) -Hier einfach eine grobe Übersicht über alle Funktionen, die jede Klasse als Public / Protected besitzen soll. +Hier einfach eine grobe Übersicht über alle Funktionen, die jede Klasse als Public / Protected besitzen soll beziehungsweise bereits besitzt. +Weitere Informationen zu den Funktionen findet ihr in der Architektur oder, falls die Funktion bereits vorhanden ist, in der Dokumentation, die von Greenfoot automatisch erstellt wird (durch die InCode Dokumentation). Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Funktionen im Code präsent habt. ## GeneralMap -- **static GeneralMap generateMap(int mapID, ...)** +- static *GeneralMap* **generateMap** ( *int* mapID, ... ) -- **int getPlayerCount()** -- **String getPlayerName()** -- **String getPlayerName(int)** -- **int getPlayerStars()** -- **int getProvinceOwner(int)** -- **int[] getProvinceOwners()** -- **int getProvinceEntityCount(int)** -- **int getProvincesEntityCounts(int[])** -- **int getProvincesEntityCounts(boolean[])** -- **int getProvincesEntityCounts(int)** +- *int* **getPlayerCount** () +- *String* **getPlayerName** () +- *String* **getPlayerName** ( *int* ) +- *int* **getPlayerStars** () + +- *int* **getProvinceOwner** ( *int* ) +- *int[]* **getProvinceOwners** () +- *int* **getProvinceEntityCount** ( *int* ) +- *int* **getProvincesEntityCounts** ( *int[]* ) +- *int* **getProvincesEntityCounts** ( *boolean[]* ) +- *int* **getProvincesEntityCounts** ( *int* ) ## Province -- **Province(int, int, int, int, int, String, int[])** -- **Province(int, int, int, int, int, String, boolean[])** +- *Province* ( *int*, *int*, *int*, *int*, *int*, *String*, *int[]* ) +- *Province* ( *int*, *int*, *int*, *int*, *int*, *String*, *boolean[]* ) + +- *int* **getID** () +- *int* **getContinentID** () +- *String* **getDisplayName** () +- *boolean* **isProvinceNear** ( *int* ) + +- *int* **getStars** () -- **int getID()** -- **int getContinentID()** -- **boolean isProvinceNear(int)** -- **String getDisplayName()** -- **int getStars()** -- **int getOwner()** -- **setOwner(int)** -- **int getEntityCount()** -- **int addToEntities(int)** -- **int removeFromEntities(int)** -- **int setEntityCount(int)** +- *int* **getOwner** () +- *void* **setOwner** ( *int* ) -- **redrawProvince()** +- *int* **getEntityCount** () +- *int* **addToEntities** ( *int* ) +- *int* **removeFromEntities** ( *int* ) +- *int* **setEntityCount** ( *int* ) + +- *void* **redrawProvince** () ## Player -- **Player(int, String)** +- *Player* ( *int*, *String* ) -- **int getID()** -- **String getDisplayName()** -- **int getStars()** -- **int addToStars(int)** -- **int removeFromStars(int)** -- **int setStars(int)** -- **boolean cnaStarsRemoved(int)** +- *int* getID () +- *String* **getDisplayName** () +- *int* **getStars** () +- *int* **addToStars** ( *int* ) +- *int* **removeFromStars** ( *int* ) +- *int* **setStars** ( *int* ) +- *boolean* **canStarsRemoved**( *int* ) -- **int[] getStatistics()** -- **gotProvince()** -- **lostProvince()** -- **gotEntities(int)** -- **lostEntity()** +- *int[]* **getStatistics** () +- *void* **gotProvince** () +- *void* **lostProvince** () +- *void* **gotEntities** ( *int* ) +- *void* **lostEntity** () -- **boolean[] getMyProvinces()** -- **int getProvinceCount()** -- **redrawPlayer()** +- *boolean[]* **getMyProvinces** () +- *int* **getProvinceCount** () +- *void* **redrawPlayer** () ## Dice -- **Dice()** +- *Dice* () -- **int getNumber()** +- *int* **getNumber** () -- **int roll()** +- *int* **roll** () ## GUI_Interface -*Noch unvollständig* +- *int* **getWidth** () +- *int* **getHeight** () +- *void* **setSize** ( *int*, *int* ) + +- *System.awt.Color* **getBackColor** () +- *boolean* **setBackColor** ( *System.awt.Color* ) +- *System.awt.Color* **getForeColor** () +- *boolean* **setForeColor** ( *System.awt.Color* ) + +- abstract *void* **redraw** () + +## Label (erweitert GUI_Interface) + +- *Label* ( *String*, *int* ) + +- *boolean* **getAutoSize** () +- *boolean* **setAutoSize** ( *boolean* ) + +- *int* **getTextSize** () +- *boolean* **setTextSize** ( *int* ) + +- *String* **getText** () +- *boolean* **setText** ( *String* ) + +## Button (erweitert GUI_Interface) -## Label +- *Button* ( *String*, *int* ) +- *Button* ( *ButtonEvent* ) +- *Button* ( *String*, *int*, *ButtonEvent* ) -*Noch unvollständig* +- *boolean* **getAutoSize** () +- *boolean* **setAutoSize** ( *boolean* ) -- **String getText()** -- **String setText(String)** +- *int* **getTextSize** () +- *boolean* **setTextSize** ( *int* ) -## Button +- *String* **getText** () +- *boolean* **setText** ( *String* ) -*Noch unvollständig* \ No newline at end of file +- *ButtonEvent* **getHandler** () +- *void* **setHandler** ( *ButtonEvent* ) +- *void* **removeHandler** () \ No newline at end of file From 29f8978099199dce80bf91cb1bb30ec437af1587 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Fri, 13 May 2016 15:34:50 +0200 Subject: [PATCH 17/68] =?UTF-8?q?README=20Datei=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit README Datei um einen direkten Link zur Funktionsliste erweitert. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a6c0a6d..c9e9761 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,6 @@ Genutzt wird hierfür die Umgebung von [Greenfoot](http://www.greenfoot.org/over [Link zum Architekturplan](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) +[Link zur Funktionsliste](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) + **Weitere Informationen hier werden folgen.** From 7b0befac0f3f9438c36364aa975c0a2bdfe24d97 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Fri, 13 May 2016 15:37:05 +0200 Subject: [PATCH 18/68] GUI Objekte Version 0.2 Debug 2 Versionsnummern aktualisiert Beim GUI_Interface haben nun auch die protected Variablen einen Kommentar Das Label ist nun wieder in der Lage, seinen Text zu zeichnen. --- Button.java | 2 +- GUI_Interface.java | 14 +++++++++++++- Label.java | 4 ++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Button.java b/Button.java index fa7cf86..5d3fbd6 100644 --- a/Button.java +++ b/Button.java @@ -6,7 +6,7 @@ import java.awt.Color; Als Vorbild dafür hält der Button aus dem .NET-Framework für UWP-Apps dar. @author Felix Stupp - @version 11.05.2016 + @version 13.05.2016 */ public class Button extends GUI_Interface { diff --git a/GUI_Interface.java b/GUI_Interface.java index 6cd9059..9574061 100644 --- a/GUI_Interface.java +++ b/GUI_Interface.java @@ -5,13 +5,25 @@ import java.awt.Color; Oberklasse für sämtliche GUI Objekte, wie Labels und Buttons @author Felix Stupp - @version 11.05.2016 + @version 13.05.2016 */ public abstract class GUI_Interface extends Actor { + /** + Die Breite des Objektes + */ protected int sx = 1; + /** + Die Höhe des Objektes + */ protected int sy = 1; + /** + Die Hintergrundfarbe des Objektes + */ protected Color backC = Color.BLACK; + /** + Die Vordergrundfarbe (meist die Textfarbe) des Objektes + */ protected Color foreC = Color.WHITE; /** diff --git a/Label.java b/Label.java index 58786dd..d820642 100644 --- a/Label.java +++ b/Label.java @@ -5,7 +5,7 @@ import java.awt.Color; Zeigt einen Text an. @author Felix Stupp - @version 11.05.2016 + @version 13.05.2016 */ public class Label extends GUI_Interface { @@ -97,7 +97,7 @@ public class Label extends GUI_Interface { GreenfootImage all = new GreenfootImage(sx,sy); all.setColor(backC); all.fill(); - + all.drawImage(tI,(sx-tI.getWidth())/2,(sy-tI.getHeight())/2); setImage(all); } } From 5ec532398fbcf3d301822458d5d53df278427f2c Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Fri, 13 May 2016 16:21:23 +0200 Subject: [PATCH 19/68] Markdown Dateien verbessert Die meisten Links sind nun als relative Links definiert, damit sie, sofern es nicht dabei steht, immer auf dem aktuellen Branch verlinken. --- README.md | 4 ++-- planung/architektur.md | 6 +++--- planung/funktionsliste.md | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c9e9761..14a0239 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ Zweiundvierzig Dieses Projekt soll zu einem von Risiko inspiriertem Java Computer Spiel werden. Genutzt wird hierfür die Umgebung von [Greenfoot](http://www.greenfoot.org/overview) von der Universität von Kent. -[Link zum Architekturplan](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) +[Link zum Architekturplan auf dem aktuellen Branch](planung/architektur.md) -[Link zur Funktionsliste](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) +[Link zur Funktionsliste auf dem aktuellen Branch](planung/funktionsliste.md) **Weitere Informationen hier werden folgen.** diff --git a/planung/architektur.md b/planung/architektur.md index 6d6451a..bb14d88 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -2,11 +2,11 @@ **Version: 3** -**Stand: 12.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Stand: 13.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) -[Hier die neuste offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) +[Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) -[Hier zur übersichtlicheren Funktionsliste](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) +[Hier zur übersichtlicheren Funktionsliste auf dem aktuellen Branch](funktionsliste.md) Hier ein möglicher Architekturplan von *Felix Stupp*. Dieser Plan wird regelmäßig angepasst, oben am Datum zu erkennen. diff --git a/planung/funktionsliste.md b/planung/funktionsliste.md index d19ee62..b1966bf 100644 --- a/planung/funktionsliste.md +++ b/planung/funktionsliste.md @@ -2,11 +2,11 @@ **Version: 3** -**Stand: 12.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Stand: 13.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) -[Hier die neuste offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) +[Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) -[Hier zum gesamten Architekturplan](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) +[Hier zum gesamten Architekturplan auf dem aktuellen Branch](architektur.md) Hier einfach eine grobe Übersicht über alle Funktionen, die jede Klasse als Public / Protected besitzen soll beziehungsweise bereits besitzt. Weitere Informationen zu den Funktionen findet ihr in der Architektur oder, falls die Funktion bereits vorhanden ist, in der Dokumentation, die von Greenfoot automatisch erstellt wird (durch die InCode Dokumentation). From 799ce6c6ff6fd0cd182d868c28a33a585d566fd1 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Fri, 20 May 2016 18:21:56 +0200 Subject: [PATCH 20/68] Kleine Verbesserungen Befehle zum Zeichnen des Rands angepasst, um einen Geschwindigkeitsboost zu erhalten Kommentar zur Klasse verbessert --- Button.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Button.java b/Button.java index 5d3fbd6..d74127e 100644 --- a/Button.java +++ b/Button.java @@ -3,10 +3,10 @@ import java.awt.Color; /** Diese Klasse stellt einen Button dar. - Als Vorbild dafür hält der Button aus dem .NET-Framework für UWP-Apps dar. + Als funktionelles Vorbild dafür hält der Button aus dem .NET-Framework für UWP-Apps dar. @author Felix Stupp - @version 13.05.2016 + @version 20.05.2016 */ public class Button extends GUI_Interface { @@ -151,15 +151,15 @@ public class Button extends GUI_Interface { GreenfootImage all = new GreenfootImage(sx,sy); Color gray = new Color(133,133,133,255); Color black = new Color(0,0,0,255); + Color trans = new Color(0,0,0,0); Utils.drawInsideRectangle(all,gray,0); Utils.drawInsideRectangle(all,black,2); Utils.drawInsideRectangle(all,gray,6); Utils.drawInsideRectangle(all,black,7); - all.setColor(new Color(0,0,0,0)); - all.fillRect(0,0,1,1); - all.fillRect(sx-1,0,1,1); - all.fillRect(0,sy-1,1,1); - all.fillRect(sx-1,sy-1,1,1); + all.setColorAt(0,0,trans); + all.setColorAt(sx-1,0,trans); + all.setColorAt(0,sy-1,trans); + all.setColorAt(sx-1,sy-1,trans); all.drawImage(tI,(sx-tI.getWidth())/2,(sy-tI.getHeight())/2); setImage(all); } From 7e67fd62bd4b175603ef4bb826ed905c8edc60b8 Mon Sep 17 00:00:00 2001 From: 4ngelica Date: Sun, 29 May 2016 22:15:45 +0200 Subject: [PATCH 21/68] Spieloptionen --- Spieleranzahl.java | 32 ++++++++++ Spieloptionen.java | 21 +++++++ Weltenauswahl.java | 19 ++++++ project.greenfoot | 147 +++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 215 insertions(+), 4 deletions(-) create mode 100644 Spieleranzahl.java create mode 100644 Spieloptionen.java create mode 100644 Weltenauswahl.java diff --git a/Spieleranzahl.java b/Spieleranzahl.java new file mode 100644 index 0000000..15730ea --- /dev/null +++ b/Spieleranzahl.java @@ -0,0 +1,32 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) + +/** + * Write a description of class Spieleranzahl here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class Spieleranzahl extends Spieloptionen +{ + + /** + * Constructor for objects of class Spieleranzahl. + * + */ + public Spieleranzahl() + { + addObject (new Button(), 100, 300); + } + + public void act() + { + if (handler.buttonClicked(this)); + { + int s; + if (s > 3) + { + int s = Spieleranzahl; + } + } + } +} diff --git a/Spieloptionen.java b/Spieloptionen.java new file mode 100644 index 0000000..161a488 --- /dev/null +++ b/Spieloptionen.java @@ -0,0 +1,21 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) + +/** + * Write a description of class Spieloptionen here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class Spieloptionen extends World +{ + + /** + * Constructor for objects of class Spieloptionen. + * + */ + public Spieloptionen() + { + // Create a new world with 600x400 cells with a cell size of 1x1 pixels. + super(600, 400, 1); + } +} diff --git a/Weltenauswahl.java b/Weltenauswahl.java new file mode 100644 index 0000000..f2458d9 --- /dev/null +++ b/Weltenauswahl.java @@ -0,0 +1,19 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) + +/** + * Write a description of class Weltenauswahl here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class Weltenauswahl extends Spieloptionen +{ + + /** + * Constructor for objects of class Weltenauswahl. + * + */ + public Weltenauswahl() + { + } +} diff --git a/project.greenfoot b/project.greenfoot index 1463f60..96163f8 100644 --- a/project.greenfoot +++ b/project.greenfoot @@ -1,8 +1,147 @@ -#Greenfoot project file +#Greenfoot properties +#Sun May 29 22:05:35 CEST 2016 +editor.fx.0.height=700 +target2.width=100 +target8.name=Map_World +target11.y=190 +target11.x=10 +class.GUI_Interface.superclass=greenfoot.Actor +target1.type=ClassTarget +target7.showInterface=false mainWindow.height=600 +target6.typeParameters= +target1.height=50 +class.Dice_Offender.superclass=Dice +target8.y=70 +target8.x=170 +dependency2.type=UsesDependency +target5.type=ClassTarget +target6.y=10 +target6.x=120 +target1.showInterface=false +target4.y=310 +target4.x=10 +target4.showInterface=false +target9.type=ClassTarget +target2.y=250 +target2.x=10 +target10.type=ClassTarget +target8.height=50 +target11.height=50 +target10.typeParameters= +dependency4.from=Map_World +class.Weltenauswahl.superclass=Spieloptionen +target1.name=Dice +target10.showInterface=false +class.Map_World.superclass=GeneralMap +target4.typeParameters= +target5.name=Province +world.lastInstantiated=Map_World +class.Dice.superclass=greenfoot.Actor mainWindow.width=800 -mainWindow.x=10 +readme.width=47 +class.Dice_Defender.superclass=Dice +class.GeneralMap.superclass=greenfoot.World +class.CurrentPlayerArrow.superclass=GUI_Interface +target9.name=Button +target5.height=50 +target10.name=Dice_Offender +target2.type=ClassTarget +dependency1.to=Utils +dependency3.type=UsesDependency +target2.height=50 +target2.typeParameters= +target6.type=ClassTarget +editor.swing.0.height=700 +class.Spieloptionen.superclass=greenfoot.World +target9.typeParameters= +target11.type=ClassTarget +version=2.8.0 +editor.fx.0.y=0 +editor.fx.0.x=0 +target2.showInterface=false +dependency1.from=Province mainWindow.y=10 +editor.swing.0.y=0 +mainWindow.x=10 +editor.swing.0.x=78 +target5.showInterface=false +target8.showInterface=false +target7.typeParameters= +target2.name=GUI_Interface +readme.name=@README +class.Menue_Button.superclass=Button +editor.swing.0.width=701 +target6.name=CurrentPlayerArrow +target9.height=50 +target12.y=190 +target12.x=190 +editor.fx.0.width=700 +target11.showInterface=false +target10.y=130 +target10.x=100 +dependency2.to=Menue_Button +target12.width=90 +target11.name=Utils +target12.height=50 +class.Province.superclass=greenfoot.Actor +target9.y=130 +target9.x=10 +target3.type=ClassTarget +target6.height=50 +target7.y=70 +target7.x=70 +target11.typeParameters= +target5.y=310 +target5.x=130 +dependency4.type=UsesDependency +target7.type=ClassTarget +target10.width=110 +target3.y=250 +target3.x=120 +target11.width=80 +target3.height=50 +target1.y=190 +target1.x=100 +target12.type=ClassTarget +target5.typeParameters= +dependency2.from=GeneralMap project.charset=UTF-8 -version=2.8.0 -world.lastInstantiated=GUI_Ingame +target3.showInterface=false +class.Spieleranzahl.superclass=Spieloptionen +target3.name=Menue_Button +target6.showInterface=false +target3.typeParameters= +target9.showInterface=false +dependency3.to=Roll_Button +target7.name=GeneralMap +package.numDependencies=4 +package.numTargets=12 +target12.name=Roll_Button +dependency1.type=UsesDependency +target4.type=ClassTarget +target12.showInterface=false +target8.width=90 +target9.width=80 +target7.height=50 +target8.type=ClassTarget +class.Button.superclass=GUI_Interface +target6.width=140 +target10.height=50 +target7.width=90 +class.Roll_Button.superclass=Button +dependency3.from=GeneralMap +target1.typeParameters= +target3.width=110 +target4.width=110 +target8.typeParameters= +target5.width=80 +dependency4.to=Province +class.Utils.superclass= +target4.name=Dice_Defender +readme.y=10 +readme.x=10 +target4.height=50 +readme.height=58 +target12.typeParameters= +target1.width=80 From 6c5d42654afefb83e5f138ec1afbb52158c67b18 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Tue, 31 May 2016 08:38:40 +0200 Subject: [PATCH 22/68] Programmablaufplan erweitert Nach Meilenstein 2 --- planung/Programmablaufplan.ods | Bin 16952 -> 6569 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/planung/Programmablaufplan.ods b/planung/Programmablaufplan.ods index 1025ba30b0a400e151a4caf2d03cdc61698c981a..f9af5ffb8c776ee312f6b1e2740572a241862bf9 100644 GIT binary patch literal 6569 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 V$|$IR?V$YWG=E|SfBDz!zW_#c7_a~U literal 16952 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 From 645e89120ea85d2f8f96f7bb7c6a74dee04fc470 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Tue, 31 May 2016 09:10:48 +0200 Subject: [PATCH 23/68] Update Province.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Maus Abfrage hinzugefügt --- Province.java | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Province.java b/Province.java index 042f91e..f458acc 100644 --- a/Province.java +++ b/Province.java @@ -3,11 +3,15 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** * Write a description of class Province here. * - * @author GruenerWal + * @author GruenerWal, Felix Stupp * @version 0.0.2 */ public class Province extends Actor { + @Override public GeneralMap getWorld() { + return (GeneralMap) super.getWorld(); + } + private int stars = 1; private int provinceID; private String displayName; @@ -18,13 +22,16 @@ public class Province extends Actor private int yPos; private int eCount; + private boolean clicked = false; + /** - * leere Act-Methode - * (Für später; falls die Provinz bestimmte Aktionen ausführen sollte.) + * Überprüft, ob die Provinz angeklickt wurde. */ public void act() { - // GruenerWal war hier :3 + if(Greenfoot.mouseClicked(this)) { + clicked = true; + } } // Haupt-Konstruktor @@ -224,4 +231,10 @@ public class Province extends Actor setImage(province); } + public boolean hasClicked() { + boolean b = clicked; + clicked = false; + return b; + } + } From 782e9dbb136b98c71efc7fe87628ec1d79e35b39 Mon Sep 17 00:00:00 2001 From: Achim Date: Tue, 31 May 2016 09:16:19 +0200 Subject: [PATCH 24/68] Add files via upload --- ArmySchubser.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 ArmySchubser.java diff --git a/ArmySchubser.java b/ArmySchubser.java new file mode 100644 index 0000000..af0d55f --- /dev/null +++ b/ArmySchubser.java @@ -0,0 +1,27 @@ +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import greenfoot.MouseInfo.*; + +/** + * Schubst Einheiten. + * + * @author MaxiJohl, GruenerWal + * @version 0.0.1 + */ +public class ArmySchubser extends Map_World +{ + + /** + * Constructor for objects of class ArmySchubser. + * + */ + public ArmySchubser() + { + // Hi. + } + + public void act() + { + MouseInfo m = Greenfoot.getMouseInfo(); + Actor startProvince = m.getActor(); + } +} From 3d536096b5fc3c84fd9aeac9a3eded6b1bbb1155 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Tue, 31 May 2016 09:17:35 +0200 Subject: [PATCH 25/68] Update architektur.md Code-Snippet zu "getWorld()" verbessert --- planung/architektur.md | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index bb14d88..c67a0c3 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -1,8 +1,8 @@ # Architekturplan Zweiundvierzig -**Version: 3** +**Version: 4** -**Stand: 13.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Stand: 31.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) @@ -21,6 +21,8 @@ Die Autoren sollen nur Fragen zu bisher vorhandenen Methoden erhalten. Die englischen Begriffe *World* und *Actor* stehen für die gegebenen Oberklassen von Greenfoot. +Alle Methoden sind als "public" zu sehen und werden hauptsächlich von anderen Klassen aufgerufen. + ### Generell - Allgemein wird vom Konstruktor erwartet, dass er alle feste Eigenschaften einer Klasse in der Reihenfolge, wie hier in den Listen vorzufinden, und als die angegebenen Typen annimmt und korrekt speichert. Es kann aber auch spezifische Konstruktoren geben. @@ -30,7 +32,7 @@ Die englischen Begriffe *World* und *Actor* stehen für die gegebenen Oberklasse - Alle Klassen, die als Actor agieren, müssen teilweise mit ihrer Welt interagieren. Um diese richtig gleich richtig entgegen nehmen zu können und auf die Features zugreifen zu können, kann euch folgender Code Snippet helfen. Einfach einfügen und **getWorld()** wird euch besser helfen können. - @Overrides private GeneralMap getWorld() { + @Override public GeneralMap getWorld() { return (GeneralMap) super.getWorld(); } @@ -52,7 +54,6 @@ Der Spieler kann mithilfe der Welt dann herausfinden, welche Provinzen ihm gehö - *GeneralMap* - Alle spezifischen Maps - *Map_World* (gesamte Weltkarte) -- *MainMenu* - *GameOptions* ### Actors @@ -73,12 +74,6 @@ Der Spieler kann mithilfe der Welt dann herausfinden, welche Provinzen ihm gehö --- -## MainMenu - -Stellt eine *World* als Hauptmenü dar, bekommt die Aufgabe, die einzelnen Menüpunkte anzuzeigen. Aktiviert gegebenenfalls andere *Worlds*. - ---- - ## GameOptions Eine *World*, welche das Optionsmenü vor dem Start eines Spiels anzeigt. Diese erstellt dann eine Weltkarte über **generateMap()** und übergibt diese Greenfoot als neue *World*. @@ -114,12 +109,9 @@ Für diese Klasse wird der Konstruktor nicht direkt von den Eigenschaften festge - **String getPlayerName(int)** - **int getPlayerStars()** -- **int getProvinceOwner(int)** -- **int[] getProvinceOwners()** -- **int getProvinceEntityCount(int)** -- **int getProvincesEntityCounts(int[])** -- **int getProvincesEntityCounts(boolean[])** -- **int getProvincesEntityCounts(int)** +- *int* **getProvinceOwner** ( *int* ) +- *int[]* **getProvinceOwners** () +- *int* **getProvinceEntityCount** ( *int* playerID ) #### generateMap() @@ -151,13 +143,7 @@ Gibt die Anzahl der Einheiten aus einer bestimmten Provinz zurück. Bei falschen #### getProvincesEntityCounts() -Zählt die Einheiten aus mehreren Provinzen zusammen und gibt die Summe davon aus. - -Die **int[]** Variante bekommt dabei in einem Array als Werte die IDs der Provinzen, von denen sie es zählen soll, unabhängig vom Besitzer. - -Die **boolean[]** Variante bekommt ein Array, bei dem die Indexen die Provinzen angeben und der **boolean**-Wert, ob diese Provinz mitgezählt werden soll. - -Die **int** Variante bekommt nur die ID des Spielers und zählt dabei alle Einheiten, die er besitzt. +Zählt die Einheiten aus mehreren Provinzen zusammen und gibt die Summe davon aus. Diese Methode --- @@ -370,4 +356,4 @@ Kopiert ein Array des Types **boolean**, **int** oder **String** mit identischer ### drawInsideRectangle() -Zeichnet innerhalb eines **GreenfootImage** ein Rechteck gefüllt mit der angegebenen Farbe. Es besitzt zu allen Seiten den gegebenen Abstand zum Rand des Image. \ No newline at end of file +Zeichnet innerhalb eines **GreenfootImage** ein Rechteck gefüllt mit der angegebenen Farbe. Es besitzt zu allen Seiten den gegebenen Abstand zum Rand des Image. From 17b61d22b8fec131a406384936a9743040d6be9f Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Tue, 31 May 2016 21:31:56 +0200 Subject: [PATCH 26/68] =?UTF-8?q?Erweiterung=20Teil=202=20(noch=20nicht=20?= =?UTF-8?q?fertig)=20Diese=20Erweiterung=20verbessert=20schon=20einige=20B?= =?UTF-8?q?eschwerden=20zu=20der=20Architektur.=20Dennoch=20sind=20noch=20?= =?UTF-8?q?nicht=20alle=20=C3=84nderungen=20vollzogen,=20daher=20kann=20da?= =?UTF-8?q?s=20Layout=20aktuell=20noch=20unterschiedlich=20an=20verschiede?= =?UTF-8?q?nen=20Stellen=20sein=20und=20der=20Inhalt=20kann=20genauso=20no?= =?UTF-8?q?ch=20unvollst=C3=A4ndig=20sein.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/architektur.md | 159 +++++++++++++++++++++-------------------- 1 file changed, 83 insertions(+), 76 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index c67a0c3..30e2e9f 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -2,52 +2,49 @@ **Version: 4** -**Stand: 31.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Letztes Update: 31.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) [Hier zur übersichtlicheren Funktionsliste auf dem aktuellen Branch](funktionsliste.md) -Hier ein möglicher Architekturplan von *Felix Stupp*. -Dieser Plan wird regelmäßig angepasst, oben am Datum zu erkennen. +Dieser Plan wird verfasst und regelmäßig gepflegt durch *Felix Stupp*. Das Alter der vorliegenden Version ist am Datum am Dateianfang zu erkennen. -Hier werden alle Klassen und deren öffentliche Methoden und Eigenschaften zusammengefasst. -Auch zu sehen ist der Autor / sind die Autoren der Klasse, um bei Fragen diese kontaktieren zu können. +Hier werden alle Klassen mit deren öffentliche Methoden (**public** und **protected**) und den vorgesehenen Eigenschaften (meist nur **private**) festgehalten. **Alle Anfragen aufgrund von Architekturänderungen erst an mich weitergeben, damit ich dies mit den jeweiligen Autoren besprechen kann!** Die Autoren sollen nur Fragen zu bisher vorhandenen Methoden erhalten. -### Erklärung +### Wichtige Infos + +- **Die Provinz-ID und somit auch die Indexe der Arrays beginnen dafür erst bei 1!** + +### Erklärungen Die englischen Begriffe *World* und *Actor* stehen für die gegebenen Oberklassen von Greenfoot. Alle Methoden sind als "public" zu sehen und werden hauptsächlich von anderen Klassen aufgerufen. +#### Abkürzungen + +- **GUI** ([Graphical User Interface](https://de.wikipedia.org/wiki/Grafische_Benutzeroberfl%C3%A4che)): Beschreibt die Möglichkeit, durch welche ein Benutzer gewöhnlicherweise mit Programmen interagieren kann. + ### Generell - Allgemein wird vom Konstruktor erwartet, dass er alle feste Eigenschaften einer Klasse in der Reihenfolge, wie hier in den Listen vorzufinden, und als die angegebenen Typen annimmt und korrekt speichert. Es kann aber auch spezifische Konstruktoren geben. ### Tipps -- Alle Klassen, die als Actor agieren, müssen teilweise mit ihrer Welt interagieren. Um diese richtig gleich richtig entgegen nehmen zu können und auf die Features zugreifen zu können, kann euch folgender Code Snippet helfen. Einfach einfügen und **getWorld()** wird euch besser helfen können. +- Alle Klassen, die als Actor agieren und **nur** in der auf der *GeneralMap* beziehungsweise der Unterklassen dieser Klasse eingesetzt werden, müssen teilweise mit dieser Welt interagieren. Um die aktuelle Welt sofort im richtigen Typ zu bekommen, damit auf unsere Funktionen zugegriffen werden können, kann euch folgender Code Snippet helfen. Einfach in die Klassen einfügen einfügen und **getWorld** () wird euch besser helfen können. @Override public GeneralMap getWorld() { return (GeneralMap) super.getWorld(); } -- Schaut bitte in die *Utils*-Klasse hinein, diese kann euch den Code übersichtlicher gestalten, da häufige Methoden in dieser gebündelt werden sollen. - -### Explizite Eigenschaften - -Explizite Eigenschaften sind speziell Eigenschaften, die von der Klasse selbst gehalten werden und bevorzugt auch nur von ihr festgehalten werden. - -Beispiel: - -Ein Spieler besitzt zwar Provinzen, nur ist dies eine Eigenschaft der Provinz und nicht vom Spieler. -Der Spieler kann mithilfe der Welt dann herausfinden, welche Provinzen ihm gehören. +- Schaut bitte in die *Utils*-Klasse hinein, diese kann euch den Code übersichtlicher gestalten, da häufige und allgemein umsetzbare Aufgaben über diese einheitlich abgearbeitet werden sollen. -## Inhalt +## Klassenverzeichnis ### Worlds @@ -58,11 +55,11 @@ Der Spieler kann mithilfe der Welt dann herausfinden, welche Provinzen ihm gehö ### Actors -- *Province* (von Achim) +- *Province* - *Player* -- *Dice* (Würfel) +- *Dice* -### Sonstige Actors (GUI Objekte) +### GUI Objekte - *GUI_Interface* - *Label* @@ -76,7 +73,9 @@ Der Spieler kann mithilfe der Welt dann herausfinden, welche Provinzen ihm gehö ## GameOptions -Eine *World*, welche das Optionsmenü vor dem Start eines Spiels anzeigt. Diese erstellt dann eine Weltkarte über **generateMap()** und übergibt diese Greenfoot als neue *World*. +Eine *World*, welche das Optionsmenü vor dem Start eines Spiels anzeigt. Diese erstellt dann eine Weltkarte über *void* **generateMap** () und übergibt diese Greenfoot als neue *World*. + +Da diese Klasse keine Aufrufe von anderen Klassen erfahren sollte, ist hier gar nichts, bis auf den späteren Nutzen, den sie erfüllen soll, (und den Namen) definiert. --- @@ -86,28 +85,29 @@ Alle spezifischen Maps erben von dieser Oberklasse. Diese Klasse ist für Greenfoot die aktive *World* im laufenden Spiel und auch für die Anzeigen links/rechts/unten verantwortlich. Die erbenden Unterklassen legen dann das Hintergrundbild, die Provinzen, und weitere spezifische Eigenschaften der Karten dar. Diese Oberklasse kümmert sich dabei um die Anzeigen, die Spielmechanik und die Speicherung der Spieler und Provinzen. +Auch, wenn diese Klasse einen Konstruktor besitzt, ist dieser nur für die Unterklassen, also für die spezifischen Maps, gedacht. -### Spezifischer Konstruktor +### Konstruktor Für diese Klasse wird der Konstruktor nicht direkt von den Eigenschaften festgelegt, sondern muss folgende Argumente annehmen: -1. Spielerliste mit den Namen **String[]** +1. Spielerliste mit den Namen *String[]* 2. ... -### Explizite Eigenschaften +### Vorgesehene Eigenschaften -- Spielerliste (**Player[]**, der Index ist die Spieler ID, *anfangend bei 0*) -- Provinzliste (**Province[]**, der Index ist die Provinz ID, *anfangend bei 0*) -- aktueller Spieler (**int**) +- Spielerliste (*Player[]*, der Index entspricht der Spieler ID, *anfangend bei 0*) +- Provinzliste (*Province[]*, der Index entspricht der Provinz ID, *anfangend bei 1*) +- aktueller Spieler (*int*) -### Zusätzliche Methoden +### Public Methoden -- **static GeneralMap generateMap(int mapID, ...)** +- static *GeneralMap* **generateMap** ( *int* mapID, ...) -- **int getPlayerCount()** -- **String getPlayerName()** -- **String getPlayerName(int)** -- **int getPlayerStars()** +- *int* **getPlayerCount** () +- *String* **getPlayerName** () +- *String* **getPlayerName** ( *int* playerID ) +- *int* **getPlayerStars** () - *int* **getProvinceOwner** ( *int* ) - *int[]* **getProvinceOwners** () @@ -139,11 +139,7 @@ Gibt ein Array mit allen Provinzen (deren ID als Indexen) und den Spieler IDs al #### getProvinceEntityCount() -Gibt die Anzahl der Einheiten aus einer bestimmten Provinz zurück. Bei falschen Indexen muss eine 0 zurückgegeben werden. - -#### getProvincesEntityCounts() - -Zählt die Einheiten aus mehreren Provinzen zusammen und gibt die Summe davon aus. Diese Methode +Gibt die Anzahl der Einheiten von einer bestimmten Provinz zurück. Bei falschen Indexen muss eine 0 zurückgegeben werden. --- @@ -158,25 +154,24 @@ Die Konstruktoren der Unterklassen rufen erst mit den gegebenen Argumenten den * --- ## Province +*extends Actor* -Wird verwaltet von Achim. Speichert Informationen zu den einzelnen Provinzen ab und stellt diese später auch als *Actor* dar. -### Explizite Eigenschaften +### Konstrukturparameter -- Provinznummer (über Konstruktor festgelegt, **int**) -- Kontinentnummer (über Konstruktor festgelegt, **int**) -- X/Y-Position auf der Karte (über Konstruktor festgelegt; **int**,**int**) -- Anzeigename (über Konstruktor festgelegt, **String**) -- Sterne (über Konstruktor festgelegt, **int**) -- Angrenzende Provinzen (über Konstruktor als **int[]** festgelegt, als **boolean[]** gespeichert) -- Besitzer -- Einheitenanzahl +- Provinznummer *int* +- Kontinentnummer *int* +- X-Position auf der Karte *int* +- Y-Position auf der Karte *int* +- Anzeigename *String* +- Sterne *int* +- Angrenzende Provinzen *int[]* (als *boolean[]* gespeichert) #### Provinz-ID und Kontinent-ID -- Stellt die ID der Provinz dar und ist mit **int getID()** abrufbar. -- Stellt die ID des Kontinentes dar und ist mit **int getContinentID()** abrufbar. +- Stellt die ID der Provinz dar und ist mit *int* **getID** () abrufbar. +- Stellt die ID des Kontinentes dar und ist mit *int* **getContinentID** () abrufbar. #### Position @@ -187,23 +182,28 @@ Sind nach dem Erstellen der Provinz nicht mehr abrufbar. Dies ist der Name, der auf der Karte und bei Events im Zusammenhang mit dieser Provinz angezeigt wird. -Kann über **String getDisplayName()** abgerufen werden, falls benötigt. +Kann über *String* **getDisplayName** () abgerufen werden, falls benötigt. #### Sterne Dieser Wert wird für die zufällige Verteilung von Einheiten benötigt (laut Achim). -Über **int getStars()** soll dieser Wert abrufbar sein. +Über *int* **getStars** () soll dieser Wert abrufbar sein. #### Angrenzende Provinzen -Dies ist ein Array von allen Provinzen, die es gibt (Provinznummer als Index), diese jeweils mit einem **Boolean**-Wert, der festlegt, ob ein Kampf oder ein Weitergeben von Einheiten möglich ist. +Dies ist ein Array von allen Provinzen, die es gibt (Provinznummer als Index), diese jeweils mit einem *boolean*-Wert, der festlegt, ob ein Kampf oder ein Weitergeben von Einheiten möglich ist. boolean[] nearProvinces; -Dem Konstruktor kann stattdessen auch ein **int[]** mit allen angrenzenden Provinzen als Werte übergeben werden, dieses wird dann automatisch konvertiert. +Dem Konstruktor kann stattdessen auch ein *int[]* mit allen angrenzenden Provinzen als Werte übergeben werden, dieses wird dann automatisch konvertiert. -Über die Methode **boolean isProvinceNear(int)** kann man sich die Einträge einzeln als Booleans ausgeben lassen. +Über die Methode *boolean* **isProvinceNear** ( *int* ) kann man sich die Einträge einzeln als Booleans ausgeben lassen. + +### Zusätzliche Eigenschaften + +- Besitzer +- Einheitenanzahl #### Besitzer @@ -215,10 +215,10 @@ Die Methode **boolean setOwner(int)** speichert einen neuen Besitzer ab. Sie gib Diese Eigenschaft speichert, wie viele Einheiten auf diesem Feld stehen (natürlich welche, die dem Besitzer gehören). -Die Methoden **int getEntityCount()**, **int addToEntities(int)**, **int removeFromEntities(int)** und **int setEntityCount(int)** sollten genügend Möglichkeiten für Änderungen bieten. +Die Methoden *int* **getEntityCount** (), *int* **addToEntities** ( *int* ), *int* **removeFromEntities** ( *int* ) und *int* **setEntityCount** ( *int* ) sollten genügend Möglichkeiten für Änderungen bieten. Alle Methoden geben nach ihrem Aufruf den nun aktuellen Wert zurück. -### Zusätzliche Methoden +### Public Methoden - **redrawProvince()** @@ -229,13 +229,14 @@ Wird von der Karte oder von internen Methoden aufgerurfen, um alle sichtbaren Ei --- ## Player +*extends Actor* -Stellt die Spieler da, speichert Informationen zu diesen ab. Wird von der Weltkarte als *Actor* behandelt. +Stellt die Spieler da, speichert Informationen zu diesen ab. ### Explizite Eigenschaften -- Spielernummer (über Konstruktor festgelegt, **int**) -- Anzeigename (über Konstruktor festgelegt, **String**) +- Spielernummer (über Konstruktor festgelegt, *int*) +- Anzeigename (über Konstruktor festgelegt, *String*) - Sternanzahl - Statistiken 1. Eroberte Provinzen @@ -261,27 +262,27 @@ Ist der lesbare Name des Spielers, damit nicht nur "Spieler 1", ... usw. zu sehe Die Anzahl der Sterne, die ein Spieler besitzt und gegebenenfalls dann in Einheiten umtauschen kann. -**int getStars()**, **int addToStars(int)**, **int removeFromStars(int)**, **int setStars(int)** sind zum Bearbeiten des Werts da. Auch sie geben danach den nun aktuellen Wert zurück. +*int* **getStars** (), *int* **addToStars** ( *int* ), *int* **removeFromStars** ( *int* ), *int* **setStars** ( *int* ) sind zum Bearbeiten des Werts da. Auch sie geben danach den nun aktuellen Wert zurück. -**boolean canStarsRemoved(int)** gibt zurück, ob der Spieler diese Anzahl an Sternen verwenden kann (Vereinfachung). +*boolean* **canStarsRemoved** ( *int* ) gibt zurück, ob der Spieler diese Anzahl an Sternen verwenden kann (als Vereinfachung). #### Statistik -Die Statistik soll Events festhalten, um nach einem Spiel verschiedene Werte einsehen zu können. Diese werden von der Welt mit speziellen Funktionen erhöht. Zurückgegeben sollen diese als **int[]**-Array in der Reihenfolge, wie sie oben in der Liste auftretten. Es wird auch vorgeschlagen, sie so zu speichern. +Die Statistik soll Events festhalten, um nach einem Spiel verschiedene Werte einsehen zu können. Diese werden von der Welt mit speziellen Funktionen erhöht. Zurückgegeben sollen diese als *int[]*-Array in der Reihenfolge, wie sie oben in der Liste auftretten. Es wird auch vorgeschlagen, sie so zu speichern. -**int[] getStatistics()** gibt diese Liste zurück, damit sie von der Welt angezeigt werden kann. +*int[]* **getStatistics()** gibt diese Liste zurück, damit sie von der Welt angezeigt werden kann. -**gotProvince()**, **lostProvince()**, **gotEntities(int)**, **lostEntity()** +**gotProvince** (), **lostProvince** (), **gotEntities** ( *int* ), **lostEntity** () ### Zusätzliche Methoden -- **boolean[] getMyProvinces()** -- **int getProvinceCount()** -- **redrawPlayer()** +- *boolean[]* **getMyProvinces** () +- *int* **getProvinceCount** () +- *void* **redrawPlayer** () #### getMyProvinces() -Diese Methode hat die Aufgabe, eine Liste aller Provinzen zurückzugeben, wobei jede Provinz mit einem **boolean**-Wert gesagt bekommt, ob sie dem Spieler gehört oder nicht. +Diese Methode hat die Aufgabe, eine Liste aller Provinzen zurückzugeben, wobei jede Provinz mit einem *boolean*-Wert gesagt bekommt, ob sie dem Spieler gehört oder nicht. Diese Methode muss zwingend mit der Welt interagieren, um diese Informationen zu bekommen. @@ -296,8 +297,9 @@ Erzwingt das erneute Zeichnen des Player Objekts, um alle sichtbaren Eigenschaft --- ## Dice +*extends Actor* -Stellt einen Würfel als *Actor* dar (vergleichbar mit dem Würfel aus dem Spiel 10000). +Stellt einen Würfel als *Actor* dar (vergleichbar mit dem Würfel aus unserem Projekt Zehntausend). ### Eigenschaften @@ -309,7 +311,7 @@ Diese Zahl zeigt der Würfel gerade an und kann mit **int getNumber()** abgerufe ### Zusätzliche Methoden -- **int roll()** +- *int* **roll** () #### roll() @@ -318,20 +320,24 @@ Berechnet eine Zufallszahl von 1 bis 6, speichert diese ab und gibt sie auch so --- ## GUI_Interface +*extends Actor* + +Die Oberklasse für alle Interface-Objekte wie Buttons und Labels. Diese Klasse ist *abstract*. -Die Oberklasse für alle Interfaces. +### -Besitzt noch keine relevanten Eigenschaften +### Public Methoden --- ## Label +*extends GUI_Interface* Zeigt einen Text auf dem Bildschirm an. Zuvor wurde dieses Objekt "Text" genannt, "Label" ist der fachlichere Ausdruck dafür. ### Eigenschaften -- Anzeigetext (**String**; kann vom Konstruktor entgegen genommen werden, sonst ist der Standardtext "" zu sehen) +- Anzeigetext (*String*; kann vom Konstruktor entgegen genommen werden, sonst ist der Standardtext "" zu sehen) #### Anzeigetext @@ -341,6 +347,7 @@ Mit **String getText()** und **String setText(String)** bekommt Zugriff darauf. --- ## Button +*extends GUI_Interface* Die Hauptklasse für Buttons, wird durch Erbung spezifiziert. @@ -352,7 +359,7 @@ Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verklein ### copyArray() -Kopiert ein Array des Types **boolean**, **int** oder **String** mit identischer Größe. +Kopiert ein Array des Types *boolean*, *int* oder *String* mit identischer Größe. ### drawInsideRectangle() From 5ca406b58da5c73c0ed5a3722c78777db4b6b81c Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Wed, 1 Jun 2016 20:17:44 +0200 Subject: [PATCH 27/68] =?UTF-8?q?Initialisierungscode=20f=C3=BCr=20Provinz?= =?UTF-8?q?en=20verk=C3=BCrzt=20Der=20Code,=20der=20alle=20Provinzen=20ers?= =?UTF-8?q?tellt=20und=20diese=20der=20Welt=20hinzuf=C3=BCgt,=20wurde=20nu?= =?UTF-8?q?n=20wesentlich=20verk=C3=BCrzt,=20indem=20auf=20die=20Erstellun?= =?UTF-8?q?g=20einzelner=20Arrays=20f=C3=BCr=20die=20Nachbarn=20verzichtet?= =?UTF-8?q?=20wurde.=20Funktionell=20sollte=20diese=20=C3=84nderung=20aber?= =?UTF-8?q?=20nichts=20ver=C3=A4ndert=20haben,=20bis=20auf=20einen=20Gesch?= =?UTF-8?q?windigkeitsboost.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Map_World.java | 344 ++++++++----------------------------------------- 1 file changed, 51 insertions(+), 293 deletions(-) diff --git a/Map_World.java b/Map_World.java index bf36975..2a3e5fa 100644 --- a/Map_World.java +++ b/Map_World.java @@ -24,14 +24,14 @@ public class Map_World extends GeneralMap public Map_World() { super(1600,900,1); - Province[] provinces; - int[] neighbours; + Province[] provinces; /** * Hier werden später sämtliche Provinzen der Standard-Map erstellt. * Dies funktioniert folgendermassen: * ================================================================= * + * VERALTETER KOMMENTAR VON GruenerWal: * Im Folgenden wird nun jede Provinz einzeln erstellt: * |--- * nextProvinces = new int[]; @@ -41,6 +41,13 @@ public class Map_World extends GeneralMap * ---| * * ================================================================= + * + * NEUES FORMAT VON FELIX STUPP: + * Dieses kürzere Format ersetzt den langen Code und sorgt eventuell sogar für einen Geschwindigkeitsschub. Dabei sollte diesselbe Funktionalität erhalten bleiben. + * + * provinces[] = new Province(,,,,,"", new int[] { }); + * + * ================================================================= * Der Speicherplatz für provinces[0] bleibt leer, da es keine Provinz mit der ID 0 gibt! * * Und ja, ich weiss, dass das scheisse viel Schreibarbeit ist. @@ -57,307 +64,58 @@ public class Map_World extends GeneralMap // ACHTUNG! Gaaaaanz viel Code! // cID 1 - Nordamerika - neighbours = new int[3]; - neighbours[0] = 2; - neighbours[1] = 3; - neighbours[2] = 36; - provinces[1] = new Province(1,1,64,106,1,"Alaska",neighbours); - - neighbours = new int[4]; - neighbours[0] = 1; - neighbours[1] = 3; - neighbours[2] = 4; - neighbours[3] = 9; - provinces[2] = new Province(2,1,162,106,1,"NW-Territorien",neighbours); - - neighbours = new int[4]; - neighbours[0] = 1; - neighbours[1] = 2; - neighbours[2] = 4; - neighbours[3] = 5; - provinces[3] = new Province(3,1,53,170,1,"Alberta",neighbours); - - neighbours = new int[6]; - neighbours[0] = 2; - neighbours[1] = 3; - neighbours[2] = 5; - neighbours[3] = 6; - neighbours[4] = 7; - neighbours[5] = 9; - provinces[4] = new Province(4,1,223,177,2,"Ontario",neighbours); - - neighbours = new int[4]; - neighbours[0] = 3; - neighbours[1] = 4; - neighbours[2] = 6; - neighbours[3] = 8; - provinces[5] = new Province(5,1,160,236,2,"Weststaaten",neighbours); - - neighbours = new int[4]; - neighbours[0] = 4; - neighbours[1] = 5; - neighbours[2] = 7; - neighbours[3] = 8; - provinces[6] = new Province(6,1,232,273,2,"Oststaaten",neighbours); - - neighbours = new int[3]; - neighbours[0] = 4; - neighbours[1] = 6; - neighbours[2] = 9; - provinces[7] = new Province(7,1,300,180,2,"Quebec",neighbours); - - neighbours = new int[3]; - neighbours[0] = 5; - neighbours[1] = 6; - neighbours[2] = 17; - provinces[8] = new Province(8,1,181,347,1,"Mittelamerika",neighbours); - - neighbours = new int[4]; - neighbours[0] = 2; - neighbours[1] = 4; - neighbours[2] = 7; - neighbours[3] = 10; - provinces[9] = new Province(9,1,365,55,1,"Groenland",neighbours); + provinces[1] = new Province( 1 , 1 , 64 , 106 , 1 , "Alaska" , new int[] {2 , 3 , 36}); + provinces[2] = new Province( 2 , 1 , 162 , 106 , 1 , "NW-Territorien" , new int[] {1 , 3 , 4 , 9}); + provinces[3] = new Province( 3 , 1 , 53 , 170 , 1 , "Alberta" , new int[] {1 , 2 , 4 , 5}); + provinces[4] = new Province( 4 , 1 , 223 , 177 , 2 , "Ontario" , new int[] {2 , 3 , 5 , 6 , 7 , 9}); + provinces[5] = new Province( 5 , 1 , 160 , 236 , 2 , "Weststaaten" , new int[] {3 , 4 , 6 , 8}); + provinces[6] = new Province( 6 , 1 , 232 , 273 , 2 , "Oststaaten" , new int[] {4 , 5 , 7 , 8}); + provinces[7] = new Province( 7 , 1 , 300 , 180 , 2 , "Quebec" , new int[] {4 , 6 , 9}); + provinces[8] = new Province( 8 , 1 , 181 , 347 , 1 , "Mittelamerika" , new int[] {5 , 6 , 17}); + provinces[9] = new Province( 9 , 1 , 365 , 55 , 1 , "Groenland" , new int[] {2 , 4 , 7 , 10}); // cID 2 - Europa - - neighbours = new int[3]; - neighbours[0] = 9; - neighbours[1] = 11; - neighbours[2] = 12; - provinces[10] = new Province(10,2,454,142,1,"Island",neighbours); - - neighbours = new int[4]; - neighbours[0] = 10; - neighbours[1] = 12; - neighbours[2] = 14; - neighbours[3] = 15; - provinces[11] = new Province(11,2,424,221,2,"Grossbritannien",neighbours); - - neighbours = new int[4]; - neighbours[0] = 10; - neighbours[1] = 11; - neighbours[2] = 13; - neighbours[3] = 14; - provinces[12] = new Province(12,2,520,153,1,"Skandinavien",neighbours); - - neighbours = new int[6]; - neighbours[0] = 12; - neighbours[1] = 14; - neighbours[2] = 16; - neighbours[3] = 27; - neighbours[4] = 31; - neighbours[5] = 32; - provinces[13] = new Province(13,2,636,180,2,"Russland",neighbours); - - neighbours = new int[5]; - neighbours[0] = 11; - neighbours[1] = 12; - neighbours[2] = 13; - neighbours[3] = 15; - neighbours[4] = 16; - provinces[14] = new Province(14,2,528,232,2,"Nordeuropa",neighbours); - - neighbours = new int[4]; - neighbours[0] = 11; - neighbours[1] = 14; - neighbours[2] = 16; - neighbours[3] = 25; - provinces[15] = new Province(15,2,449,335,2,"Westeuropa",neighbours); - - neighbours = new int[6]; - neighbours[0] = 13; - neighbours[1] = 14; - neighbours[2] = 15; - neighbours[3] = 25; - neighbours[4] = 26; - neighbours[5] = 27; - provinces[16] = new Province(16,2,537,296,2,"Suedeuropa",neighbours); + provinces[10] = new Province(10 , 2 , 454 , 142 , 1 , "Island" , new int[] {9 , 11 , 12}); + provinces[11] = new Province(11 , 2 , 424 , 221 , 2 , "Grossbritannien" , new int[] {10 , 12 , 14 , 15}); + provinces[12] = new Province(12 , 2 , 520 , 153 , 1 , "Skandinavien" , new int[] {10 , 11 , 13 , 14}); + provinces[13] = new Province(13 , 2 , 636 , 180 , 2 , "Russland" , new int[] {12 , 14 , 16 , 27 , 31 , 32}); + provinces[14] = new Province(14 , 2 , 528 , 232 , 2 , "Nordeuropa" , new int[] {11 , 12 , 13 , 15 , 16}); + provinces[15] = new Province(15 , 2 , 449 , 335 , 2 , "Westeuropa" , new int[] {11 , 14 , 16 , 25}); + provinces[16] = new Province(16 , 2 , 537 , 296 , 2 , "Suedeuropa" , new int[] {13 , 14 , 15 , 25 , 26 , 27}); // cID 3 - Suedamerika - - neighbours = new int[3]; - neighbours[0] = 8; - neighbours[1] = 18; - neighbours[2] = 19; - provinces[17] = new Province(17,3,245,396,1,"Venezuela",neighbours); - - neighbours = new int[3]; - neighbours[0] = 17; - neighbours[1] = 19; - neighbours[2] = 20; - provinces[18] = new Province(18,3,255,498,1,"Peru",neighbours); - - neighbours = new int[4]; - neighbours[0] = 17; - neighbours[1] = 18; - neighbours[2] = 20; - neighbours[3] = 25; - provinces[19] = new Province(19,3,327,467,2,"Brasilien",neighbours); - - neighbours = new int[2]; - neighbours[0] = 18; - neighbours[1] = 19; - provinces[20] = new Province(20,3,274,572,1,"Argentinien",neighbours); + provinces[17] = new Province(17 , 3 , 245 , 396 , 1 , "Venezuela" , new int[] {8 , 18 , 19}); + provinces[18] = new Province(18 , 3 , 255 , 498 , 1 , "Peru" , new int[] {17 , 19 , 20}); + provinces[19] = new Province(19 , 3 , 327 , 467 , 2 , "Brasilien" , new int[] {17 , 18 , 20 , 25}); + provinces[20] = new Province(20 , 3 , 274 , 572 , 1 , "Argentinien" , new int[] {18 , 19}); // cID 4 - Afrika - - neighbours = new int[2]; - neighbours [0] = 24; - neighbours [1] = 22; - provinces[21] = new Province (21,4,680,630,1,"Madagaskar",neighbours); - - neighbours = new int[3]; - neighbours [0] = 21; - neighbours [1] = 23; - neighbours [2] = 24; - provinces[22] = new Province (22,4,580,624,1,"Südafrika",neighbours); - - neighbours = new int[3]; - neighbours [0] = 22; - neighbours [1] = 25; - neighbours [2] = 24; - provinces[23] = new Province (23,4,572,537,2,"Zentralafrika",neighbours); - - neighbours = new int[5]; - neighbours [0] = 21; - neighbours [1] = 22; - neighbours [2] = 25; - neighbours [3] = 23; - neighbours [4] = 26; - provinces[24] = new Province (24,4,632,500,2,"Ostafrika",neighbours); - addObject(provinces[24],632,500); - - neighbours = new int[5]; - neighbours [0] = 15; - neighbours [1] = 16; - neighbours [2] = 26; - neighbours [3] = 23; - neighbours [4] = 24; - provinces[25] = new Province (25,4,491,444,1,"Nordafrika",neighbours); - - neighbours = new int[4]; - neighbours [0] = 27; - neighbours [1] = 25; - neighbours [2] = 24; - neighbours [3] = 16; - provinces[26] = new Province (26,4,574,414,1,"Aegypten",neighbours); + provinces[21] = new Province(21 , 4 , 680 , 630 , 1 , "Madagaskar" , new int[] {24 , 22}); + provinces[22] = new Province(22 , 4 , 580 , 624 , 1 , "Südafrika" , new int[] {21 , 23 , 24}); + provinces[23] = new Province(23 , 4 , 572 , 537 , 2 , "Zentralafrika" , new int[] {22 , 25 , 24}); + provinces[24] = new Province(24 , 4 , 632 , 500 , 2 , "Ostafrika" , new int[] {21 , 22 , 25 , 23 , 26}); + provinces[25] = new Province(25 , 4 , 491 , 444 , 1 , "Nordafrika" , new int[] {15 , 16 , 26 , 23 , 24}); + provinces[26] = new Province(26 , 4 , 574 , 414 , 1 , "Aegypten" , new int[] {27 , 25 , 24 , 16}); // cID 5 - Asien - - neighbours = new int[6]; - neighbours [0] = 24; - neighbours [1] = 26; - neighbours [2] = 16; - neighbours [3] = 13; - neighbours [4] = 31; - neighbours [5] = 28; - provinces[27] = new Province (27,5,664,345,2,"Mittlerer Osten",neighbours); - - neighbours = new int[4]; - neighbours [0] = 29; - neighbours [1] = 31; - neighbours [2] = 27; - neighbours [3] = 30; - provinces[28] = new Province (28,5,784,370,2,"Indien",neighbours); - - neighbours = new int[6]; - neighbours [0] = 30; - neighbours [1] = 28; - neighbours [2] = 31; - neighbours [3] = 32; - neighbours [4] = 33; - neighbours [5] = 37; - provinces[29] = new Province (29,5,863,322,2,"China",neighbours); - - neighbours = new int[3]; - neighbours [0] = 29; - neighbours [1] = 39; - neighbours [2] = 28; - provinces[30] = new Province (30,5,867,400,1,"Südost Asien",neighbours); - - neighbours = new int[5]; - neighbours [0] = 29; - neighbours [1] = 28; - neighbours [2] = 27; - neighbours [3] = 13; - neighbours [4] = 32; - provinces[31] = new Province (31,5,724,262,1,"Afganistan",neighbours); - - neighbours = new int[4]; - neighbours [0] = 29; - neighbours [1] = 33; - neighbours [2] = 31; - neighbours [3] = 13; - provinces[32] = new Province (32,5,740,163,1,"Ural",neighbours); - - neighbours = new int[5]; - neighbours [0] = 34; - neighbours [1] = 35; - neighbours [2] = 37; - neighbours [3] = 29; - neighbours [4] = 32; - provinces[33] = new Province (33,5,802,128,1,"Sibirien",neighbours); - - neighbours = new int[3]; - neighbours [0] = 36; - neighbours [1] = 35; - neighbours [2] = 33; - provinces[34] = new Province (34,5,884,82,1,"Jakutien",neighbours); - - neighbours = new int[4]; - neighbours [0] = 34; - neighbours [1] = 36; - neighbours [2] = 37; - neighbours [3] = 33; - provinces[35] = new Province (35,5,867,176,2,"Irkutsk",neighbours); - - neighbours = new int[5]; - neighbours [0] = 1; - neighbours [1] = 38; - neighbours [2] = 37; - neighbours [3] = 35; - neighbours [4] = 34; - provinces[36] = new Province (36,5,973,89,1,"Kamtschatka",neighbours); - - neighbours = new int[5]; - neighbours [0] = 29; - neighbours [1] = 33; - neighbours [2] = 35; - neighbours [3] = 36; - neighbours [4] = 38; - provinces[37] = new Province (37,5,882,243,1,"Mongolei",neighbours); - - neighbours = new int[2]; - neighbours [0] = 37; - neighbours [1] = 36; - provinces[38] = new Province (38,5,994,249,2,"Japan",neighbours); + provinces[27] = new Province(27 , 5 , 664 , 345 , 2 , "Mittlerer Osten" , new int[] {24 , 26 , 16 , 23 , 31 , 28}); + provinces[28] = new Province(28 , 5 , 784 , 370 , 2 , "Indien" , new int[] {29 , 31 , 27 , 30}); + provinces[29] = new Province(29 , 5 , 863 , 322 , 2 , "China" , new int[] {30 , 28 , 31 , 32 , 33 , 37}); + provinces[30] = new Province(30 , 5 , 867 , 400 , 1 , "Südost Asien" , new int[] {29 , 39 , 28}); + provinces[31] = new Province(31 , 5 , 724 , 262 , 1 , "Afganistan" , new int[] {29 , 28 , 27 , 13 , 32}); + provinces[32] = new Province(32 , 5 , 740 , 163 , 1 , "Ural" , new int[] {29 , 33 , 31 , 13}); + provinces[33] = new Province(33 , 5 , 802 , 128 , 1 , "Sibirien" , new int[] {34 , 35 , 37 , 29 , 32}); + provinces[34] = new Province(34 , 5 , 884 , 82 , 1 , "Jakutien" , new int[] {36 , 35 , 33}); + provinces[35] = new Province(35 , 5 , 867 , 176 , 2 , "Irkutsk" , new int[] {34 , 36 , 37 , 33}); + provinces[36] = new Province(36 , 5 , 973 , 89 , 1 , "Kamtschatka" , new int[] {1 , 38 , 37 , 35 , 34}); + provinces[37] = new Province(37 , 5 , 882 , 243 , 1 , "Mongolei" , new int[] {29 , 33 , 35 , 36 , 38}); + provinces[38] = new Province(38 , 5 , 994 , 249 , 2 , "Japan" , new int[] {37 , 36}); // cID 6 - Ozeanien - - neighbours = new int[3]; - neighbours [0] = 30; - neighbours [1] = 40; - neighbours [2] = 42; - provinces[39] = new Province (39,6,889,519,1,"Indonesien",neighbours); - - neighbours = new int[3]; - neighbours [0] = 39; - neighbours [1] = 41; - neighbours [2] = 42; - provinces[40] = new Province (40,6,983,492,2,"Neuguinea",neighbours); - - neighbours = new int[2]; - neighbours [0] = 40; - neighbours [1] = 42; - provinces[41] = new Province (41,6,1000,595,1,"Ost Australien",neighbours); - - neighbours = new int[3]; - neighbours [0] = 40; - neighbours [1] = 41; - neighbours [2] = 39; - provinces[42] = new Province (42,6,934,628,1,"West Australien",neighbours); - + provinces[39] = new Province(39 , 6 , 889 , 519 , 1 , "Indonesien" , new int[] {30 , 40 , 42}); + provinces[40] = new Province(40 , 6 , 983 , 492 , 2 , "Neuguinea" , new int[] {39 , 41 , 42}); + provinces[41] = new Province(41 , 6 , 1000, 595 , 1 , "Ost Australien" , new int[] {40 , 42}); + provinces[42] = new Province(42 , 6 , 934 , 628 , 1 , "West Australien" , new int[] {40 , 41 , 39}); for (int c = 1; c <= provinceCount; c++) { From c8a0912ad0db3e7ab6e444737c29c423dd4a81cb Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Wed, 1 Jun 2016 22:00:52 +0200 Subject: [PATCH 28/68] =?UTF-8?q?Erweiterung=20Teil=203=20(noch=20nicht=20?= =?UTF-8?q?fertig)=20Diese=20Erweiterung=20der=20Architektur=20behandelt?= =?UTF-8?q?=20vorzugsweise=20generelle=20Erkl=C3=A4rungen=20und=20auch=20v?= =?UTF-8?q?iele=20Eintr=C3=A4ge=20bei=20der=20GeneralMap=20Klasse.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/architektur.md | 55 +++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index 30e2e9f..d35b51e 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -1,8 +1,8 @@ # Architekturplan Zweiundvierzig -**Version: 4** +**Version: 5** -**Letztes Update: 31.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Letztes Update: 01.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) @@ -17,32 +17,32 @@ Die Autoren sollen nur Fragen zu bisher vorhandenen Methoden erhalten. ### Wichtige Infos +- **Bitte kommentiert all eure Methoden nach dem Java-Standard, damit diese in der automatisch generierten Dokumentation auch mit einer kurzen Erklärung auftauchen.** - **Die Provinz-ID und somit auch die Indexe der Arrays beginnen dafür erst bei 1!** ### Erklärungen Die englischen Begriffe *World* und *Actor* stehen für die gegebenen Oberklassen von Greenfoot. -Alle Methoden sind als "public" zu sehen und werden hauptsächlich von anderen Klassen aufgerufen. +Alle Methoden sind meist als **public** zu sehen und werden hauptsächlich von anderen Klassen aufgerufen. #### Abkürzungen - **GUI** ([Graphical User Interface](https://de.wikipedia.org/wiki/Grafische_Benutzeroberfl%C3%A4che)): Beschreibt die Möglichkeit, durch welche ein Benutzer gewöhnlicherweise mit Programmen interagieren kann. -### Generell - -- Allgemein wird vom Konstruktor erwartet, dass er alle feste Eigenschaften einer Klasse in der Reihenfolge, wie hier in den Listen vorzufinden, und als die angegebenen Typen annimmt und korrekt speichert. Es kann aber auch spezifische Konstruktoren geben. - ### Tipps +- Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschrieben wird, müsst ihr nicht diesselben Parameterbezeichner verwenden, wie sie hier verwendet wurden. Falls aus diesem Bezeichner jedoch die Bedeutung des + - Alle Klassen, die als Actor agieren und **nur** in der auf der *GeneralMap* beziehungsweise der Unterklassen dieser Klasse eingesetzt werden, müssen teilweise mit dieser Welt interagieren. Um die aktuelle Welt sofort im richtigen Typ zu bekommen, damit auf unsere Funktionen zugegriffen werden können, kann euch folgender Code Snippet helfen. Einfach in die Klassen einfügen einfügen und **getWorld** () wird euch besser helfen können. @Override public GeneralMap getWorld() { return (GeneralMap) super.getWorld(); } +- Arbeitet bitte, wenn möglich, mit der *Utils*-Klasse, diese kann helfen den Code übersichtlicher und kürzer zu gestalten, da häufige und allgemein umsetzbare Aufgaben über diese einheitlich abgearbeitet werden sollen. Das Debuggen wird somit auch einfacher, sowohl für mich als auch für euch selbst. -- Schaut bitte in die *Utils*-Klasse hinein, diese kann euch den Code übersichtlicher gestalten, da häufige und allgemein umsetzbare Aufgaben über diese einheitlich abgearbeitet werden sollen. +- Ihr könnt auch ab und zu in die Dokumentationen der offiziellen Java-Bibliotheken schauen, falls ihr denkt, dass es bereits eine Methode geben sollte für den Vorgang, den ihr sonst selbst programmieren müsstet. ## Klassenverzeichnis @@ -85,24 +85,39 @@ Alle spezifischen Maps erben von dieser Oberklasse. Diese Klasse ist für Greenfoot die aktive *World* im laufenden Spiel und auch für die Anzeigen links/rechts/unten verantwortlich. Die erbenden Unterklassen legen dann das Hintergrundbild, die Provinzen, und weitere spezifische Eigenschaften der Karten dar. Diese Oberklasse kümmert sich dabei um die Anzeigen, die Spielmechanik und die Speicherung der Spieler und Provinzen. -Auch, wenn diese Klasse einen Konstruktor besitzt, ist dieser nur für die Unterklassen, also für die spezifischen Maps, gedacht. +Auch, wenn diese Klasse einen Konstruktor besitzt, ist dieser nur für die Unterklassen, also für die spezifischen Maps, als Vereinfachung gedacht. + +### Konstruktorparameter -### Konstruktor +1. Der Dateiname des Hintergrundbildes der Karte als *String* +2. Spielerliste mit den Namen als *String[]* -Für diese Klasse wird der Konstruktor nicht direkt von den Eigenschaften festgelegt, sondern muss folgende Argumente annehmen: +#### Hintergrundbild -1. Spielerliste mit den Namen *String[]* -2. ... +Dies soll von den Konstruktoren der spezifischen Maps weitergegeben werden. Der Dateiname ist dort jeweils angepasst und direkt im Code als Konstante angegebenen. Diese Oberklasse übernimmt dann alle Aktionen, um es im Hintergrund der GUI Grafik anzuzeigen. ### Vorgesehene Eigenschaften - Spielerliste (*Player[]*, der Index entspricht der Spieler ID, *anfangend bei 0*) -- Provinzliste (*Province[]*, der Index entspricht der Provinz ID, *anfangend bei 1*) -- aktueller Spieler (*int*) +- Provinzliste (*Province[]*, als **protected** definiert, der Index entspricht der Provinz ID, *anfangend bei 1*) -### Public Methoden +#### Spielerliste + +Diese Liste soll alle *Player*-Objekte für die Spieler enthalten, welche dann auch als Actor links von der Karte zu sehen sein sollten. + +#### Provinzliste + +Die Provinzliste enthält alle Provinzobjekte, die auf der Karte zu sehen sind. Diese wird erst vom Konstruktor der spezifischen Maps gefüllt. -- static *GeneralMap* **generateMap** ( *int* mapID, ...) +### Protected Methoden + +- *void* **addProvinceToMap** ( *Province* province ) + +#### addProvinceToMap() + +Diese Methode soll das Hinzufügen der Provinzen, sowohl in das Array, als auch an die richtige Position auf der *World* übernehmen. Sollte eine Provinz-ID zweimal verwendet werden sollen, wird diese Methode einen Fehler auslösen! + +### Public Methoden - *int* **getPlayerCount** () - *String* **getPlayerName** () @@ -113,10 +128,6 @@ Für diese Klasse wird der Konstruktor nicht direkt von den Eigenschaften festge - *int[]* **getProvinceOwners** () - *int* **getProvinceEntityCount** ( *int* playerID ) -#### generateMap() - -Diese statische Funktion generiert eine Map mit der gegebenen ID. Die **...**-Argumente sind dabei alle Argumente, die an dessen Konstruktor weitergegeben werden müssen. - #### getPlayerCount() Gibt die Anzahl der im Spiel vorhandenen Spieler aus. @@ -149,7 +160,7 @@ Alle Maps erben von *GeneralMap* ### Spezifischer Konstruktor -Die Konstruktoren der Unterklassen rufen erst mit den gegebenen Argumenten den *super*-Konstruktor auf, um danach die spezifischen Dinge festlegen zu können (Provinzen bspw.) +Die Konstruktoren der Unterklassen rufen erst mit den gegebenen Argumenten den *GeneralMap*-Konstruktor auf, um danach die spezifischen Dinge festlegen zu können (Provinzen beispielsweise). --- From 2b71462724ededff742d3aa2750b29219d21ad5e Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Thu, 2 Jun 2016 22:30:00 +0200 Subject: [PATCH 29/68] =?UTF-8?q?Erweiterung=20Teil=204=20(noch=20nicht=20?= =?UTF-8?q?fertig)=20Nun=20wurden=20erste=20Informationen=20f=C3=BCr=20die?= =?UTF-8?q?=20Spielstartgruppe=20hinzugef=C3=BCgt,=20falls=20hier=20noch?= =?UTF-8?q?=20Fragen=20vorhanden=20sein=20sollten,=20bitte=20melden.=20Au?= =?UTF-8?q?=C3=9Ferdem=20wurde=20noch=20die=20Versionsnummer=20des=20Dokum?= =?UTF-8?q?entes=20entfernt,=20da=20diese,=20meiner=20Meinung=20nach,=20ih?= =?UTF-8?q?ren=20Sinn=20verlor=20und=20eigentlich=20sowohl=20die=20Git=20C?= =?UTF-8?q?ommits=20als=20auch=20das=20Datum=20innerhalb=20des=20Dokumente?= =?UTF-8?q?s=20ausreichen=20sollten.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/architektur.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index d35b51e..8f246e6 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -1,8 +1,6 @@ # Architekturplan Zweiundvierzig -**Version: 5** - -**Letztes Update: 01.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Letztes Update: 02.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) @@ -48,10 +46,10 @@ Alle Methoden sind meist als **public** zu sehen und werden hauptsächlich von a ### Worlds +- World für den Spielstart - *GeneralMap* - Alle spezifischen Maps - *Map_World* (gesamte Weltkarte) -- *GameOptions* ### Actors @@ -71,11 +69,13 @@ Alle Methoden sind meist als **public** zu sehen und werden hauptsächlich von a --- -## GameOptions +## Spielstart + +Diese *World* hat die Aufgabe, zum einen den Titelbildschirm (mit einem schönen Hintergrundbild, welches später noch optional gezeichnet wird) des Spiels anzeigt, daraufhin ein Menü mit den Möglichkeiten, ein Spiel zu starten oder zu laden (der Button für das Laden eines Speicherstand's bleibt vorerst ohne Funktion, auch optional geplant). Beim Erstellen eines neuen Spiels soll man sowohl die Möglichkeit bekommen, die Eigenschaften der Spieler und die der Map auszuwählen. -Eine *World*, welche das Optionsmenü vor dem Start eines Spiels anzeigt. Diese erstellt dann eine Weltkarte über *void* **generateMap** () und übergibt diese Greenfoot als neue *World*. +Dies kann entweder in verschiedenen *World*'s gelöst werden, als auch in einer einzelnen. Dies bleibt euch zusammen mit dem Design diesem Menü überlassen. -Da diese Klasse keine Aufrufe von anderen Klassen erfahren sollte, ist hier gar nichts, bis auf den späteren Nutzen, den sie erfüllen soll, (und den Namen) definiert. +Ich schlage euch vor, die bereits von mir erstellen Steuerelemente *Label* und *Button* zu verwenden. Diese sollten die Arbeit für euch wesentlich erleichtern, genauso wie das Schreiben von neuen Steuerelementen, falls ihr bemerken sollte, dass ihr diese öfters braucht als einmal. Diese sollten dann auch selbst von der Oberklasse *GUI_Interface* erben. --- From e6484d2cf8d20d38fd7c5e4abd86303520ad3f6e Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 4 Jun 2016 13:38:29 +0200 Subject: [PATCH 30/68] =?UTF-8?q?GUI=5FInterface=20Fehler=20behoben=20Bei?= =?UTF-8?q?=20der=20Methode=20setSize()=20wurde=20ein=20Fehler=20bei=20der?= =?UTF-8?q?=20=C3=9Cberpr=C3=BCfung=20der=20Gr=C3=B6=C3=9Fe=20korrigiert.?= =?UTF-8?q?=20Bei=20der=20getBackColor()=20Methode=20wurde=20der=20Komment?= =?UTF-8?q?ar=20angepasst,=20dieser=20hatte=20noch=20'*'=20vor=20jeder=20Z?= =?UTF-8?q?eile=20statt=20einer=20Einr=C3=BCckung=20mit=20TABs.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GUI_Interface.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GUI_Interface.java b/GUI_Interface.java index 9574061..29fd7f0 100644 --- a/GUI_Interface.java +++ b/GUI_Interface.java @@ -5,7 +5,7 @@ import java.awt.Color; Oberklasse für sämtliche GUI Objekte, wie Labels und Buttons @author Felix Stupp - @version 13.05.2016 + @version 04.06.2016 */ public abstract class GUI_Interface extends Actor { @@ -47,7 +47,7 @@ public abstract class GUI_Interface extends Actor @param h Die neue Höhe */ public void setSize(int w, int h) { - if(w < 0 || h < 0) { + if(w < 1 || h < 1) { return; } sx = w; @@ -56,8 +56,8 @@ public abstract class GUI_Interface extends Actor } /** - * Gibt die aktuelle Hintergrundfarbe des Objektes zurück. - * @return Die aktuelle Hintergrundfarbe als System.awt.Color + Gibt die aktuelle Hintergrundfarbe des Objektes zurück. + @return Die aktuelle Hintergrundfarbe als System.awt.Color */ public Color getBackColor() { return backC; From fb8b12eac8c7fc488255f578038dd9ef3f4de4c4 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 4 Jun 2016 13:58:25 +0200 Subject: [PATCH 31/68] =?UTF-8?q?Erweiterung=20Teil=204=20(abgeschlossen)?= =?UTF-8?q?=20Hiermit=20werden=20s=C3=A4mtliche=20angek=C3=BCndigten=20?= =?UTF-8?q?=C3=84nderungen=20an=20der=20Architektur=20abgeschlossen.=20Par?= =?UTF-8?q?allel=20dazu=20wurde=20die=20Funktionsliste=20nun=20auch=20ange?= =?UTF-8?q?passt.=20Inhaltlich=20wurden=20folgende=20Methoden=20hinzugef?= =?UTF-8?q?=C3=BCgt:=20-=20GeneralMap.addProvinceToMap()=20Folgende=20Meth?= =?UTF-8?q?oden=20wurden=20entfernt:=20-=20GeneralMap.getProvincesEntityCo?= =?UTF-8?q?unts()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/architektur.md | 519 ++++++++++++++++++++++++++++++++------ planung/funktionsliste.md | 106 ++++---- 2 files changed, 489 insertions(+), 136 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index 8f246e6..a4141b2 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -1,47 +1,48 @@ # Architekturplan Zweiundvierzig -**Letztes Update: 02.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Letztes Update: 04.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) -[Hier zur übersichtlicheren Funktionsliste auf dem aktuellen Branch](funktionsliste.md) +[Hier zur übersichtlichen Funktionsliste auf dem aktuellen Branch](funktionsliste.md) Dieser Plan wird verfasst und regelmäßig gepflegt durch *Felix Stupp*. Das Alter der vorliegenden Version ist am Datum am Dateianfang zu erkennen. -Hier werden alle Klassen mit deren öffentliche Methoden (**public** und **protected**) und den vorgesehenen Eigenschaften (meist nur **private**) festgehalten. +## Erklärung zur Architektur -**Alle Anfragen aufgrund von Architekturänderungen erst an mich weitergeben, damit ich dies mit den jeweiligen Autoren besprechen kann!** -Die Autoren sollen nur Fragen zu bisher vorhandenen Methoden erhalten. +Hier werden alle Klassen mit deren öffentliche Methoden (**public** und **protected**) und den vorgesehenen Eigenschaften (nur **private**) festgehalten. + +**Alle Fragen zur Architektur oder auch Änderungsvorschläge gerne an mich weitergeben.** Ich werde dies dann behandeln und gegebenfalls auch Änderungen an der Architektur durchführen. ### Wichtige Infos - **Bitte kommentiert all eure Methoden nach dem Java-Standard, damit diese in der automatisch generierten Dokumentation auch mit einer kurzen Erklärung auftauchen.** - **Die Provinz-ID und somit auch die Indexe der Arrays beginnen dafür erst bei 1!** -### Erklärungen - -Die englischen Begriffe *World* und *Actor* stehen für die gegebenen Oberklassen von Greenfoot. +### Hinweise -Alle Methoden sind meist als **public** zu sehen und werden hauptsächlich von anderen Klassen aufgerufen. +- Die englischen Begriffe *World* und *Actor* stehen für die gegebenen Oberklassen von Greenfoot. +- Alle Methoden sind meist als **public** zu sehen und werden hauptsächlich von anderen Klassen aufgerufen. +- Die Kategorie **Privat Eigenschaften** wird nur aufgelistet, wenn die Klasse von mehreren Autoren geschrieben wird/wurde oder die Klasse noch geschrieben werden muss. -#### Abkürzungen +### Abkürzungen - **GUI** ([Graphical User Interface](https://de.wikipedia.org/wiki/Grafische_Benutzeroberfl%C3%A4che)): Beschreibt die Möglichkeit, durch welche ein Benutzer gewöhnlicherweise mit Programmen interagieren kann. ### Tipps -- Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschrieben wird, müsst ihr nicht diesselben Parameterbezeichner verwenden, wie sie hier verwendet wurden. Falls aus diesem Bezeichner jedoch die Bedeutung des - +- Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschrieben wird, müsst ihr nicht diesselben Parameterbezeichner verwenden, wie sie hier verwendet wurden. Falls aus diesem Bezeichner jedoch nicht mehr die Bedeutung des Parameters ausgeht, muss dies in einem Java-Documentation Kommentar erklärt werden. - Alle Klassen, die als Actor agieren und **nur** in der auf der *GeneralMap* beziehungsweise der Unterklassen dieser Klasse eingesetzt werden, müssen teilweise mit dieser Welt interagieren. Um die aktuelle Welt sofort im richtigen Typ zu bekommen, damit auf unsere Funktionen zugegriffen werden können, kann euch folgender Code Snippet helfen. Einfach in die Klassen einfügen einfügen und **getWorld** () wird euch besser helfen können. - - - @Override public GeneralMap getWorld() { - return (GeneralMap) super.getWorld(); - } +``` java +@Override public GeneralMap getWorld() { + return (GeneralMap) super.getWorld(); +} +``` - Arbeitet bitte, wenn möglich, mit der *Utils*-Klasse, diese kann helfen den Code übersichtlicher und kürzer zu gestalten, da häufige und allgemein umsetzbare Aufgaben über diese einheitlich abgearbeitet werden sollen. Das Debuggen wird somit auch einfacher, sowohl für mich als auch für euch selbst. - - Ihr könnt auch ab und zu in die Dokumentationen der offiziellen Java-Bibliotheken schauen, falls ihr denkt, dass es bereits eine Methode geben sollte für den Vorgang, den ihr sonst selbst programmieren müsstet. +--- + ## Klassenverzeichnis ### Worlds @@ -89,14 +90,20 @@ Auch, wenn diese Klasse einen Konstruktor besitzt, ist dieser nur für die Unter ### Konstruktorparameter -1. Der Dateiname des Hintergrundbildes der Karte als *String* -2. Spielerliste mit den Namen als *String[]* +Als ersten Parameter wird die *GeneralMap* den Dateinamen des Hintergrundbilds der Map als *String* erwarten, welches automatisch von der jeweiligen Map-Klasse übergeben wird. Die folgenden Parameter werden von allen Map-Klassen, inklusive der *GeneralMap*, erwartet. Die Unterklassen sollen hierbei alles 1:1 weitergeben. + +1. Spielerliste mit den Namen als *String[]* +2. Liste mit den jeweiligen "Farben" der Spieler als *int[]* #### Hintergrundbild Dies soll von den Konstruktoren der spezifischen Maps weitergegeben werden. Der Dateiname ist dort jeweils angepasst und direkt im Code als Konstante angegebenen. Diese Oberklasse übernimmt dann alle Aktionen, um es im Hintergrund der GUI Grafik anzuzeigen. -### Vorgesehene Eigenschaften +#### Spielerliste und "Farben"-Liste + +Die beiden Arrays sollen Grundinformationen zu den Spielern weitergeben. Weitere Informationen zu den "Farben" sind bei der *Player*-Klasse zu finden. + +### Private Eigenschaften - Spielerliste (*Player[]*, der Index entspricht der Spieler ID, *anfangend bei 0*) - Provinzliste (*Province[]*, als **protected** definiert, der Index entspricht der Provinz ID, *anfangend bei 1*) @@ -124,7 +131,7 @@ Diese Methode soll das Hinzufügen der Provinzen, sowohl in das Array, als auch - *String* **getPlayerName** ( *int* playerID ) - *int* **getPlayerStars** () -- *int* **getProvinceOwner** ( *int* ) +- *int* **getProvinceOwner** ( *int* provinceID ) - *int[]* **getProvinceOwners** () - *int* **getProvinceEntityCount** ( *int* playerID ) @@ -155,12 +162,13 @@ Gibt die Anzahl der Einheiten von einer bestimmten Provinz zurück. Bei falschen --- ## Spezifische Maps +*extends GeneralMap* -Alle Maps erben von *GeneralMap* +Diese Unterklassen enthalten Informationen wie das Hintergrundbild der jeweiligen Map als auch die Anordnung der Provinzen auf der Map. -### Spezifischer Konstruktor +### Konstruktorparameter -Die Konstruktoren der Unterklassen rufen erst mit den gegebenen Argumenten den *GeneralMap*-Konstruktor auf, um danach die spezifischen Dinge festlegen zu können (Provinzen beispielsweise). +Diese Konstruktorparameter müssen nur zu dieser weitergeleitet werden. Für weitere Informationen bitte bei der *GeneralMap* nachschlagen. --- @@ -169,20 +177,23 @@ Die Konstruktoren der Unterklassen rufen erst mit den gegebenen Argumenten den * Speichert Informationen zu den einzelnen Provinzen ab und stellt diese später auch als *Actor* dar. -### Konstrukturparameter +### Konstruktorparameter + +0. Provinznummer als *int* +0. Kontinentnummer als *int* +0. X-Position auf der Karte als *int* +0. Y-Position auf der Karte als *int* +0. Anzeigename als *String* +0. Sterne als *int* +0. Angrenzende Provinzen als *int[]* (als als *boolean[]* gespeichert) -- Provinznummer *int* -- Kontinentnummer *int* -- X-Position auf der Karte *int* -- Y-Position auf der Karte *int* -- Anzeigename *String* -- Sterne *int* -- Angrenzende Provinzen *int[]* (als *boolean[]* gespeichert) +#### Provinz-ID -#### Provinz-ID und Kontinent-ID +Stellt die ID der Provinz dar. -- Stellt die ID der Provinz dar und ist mit *int* **getID** () abrufbar. -- Stellt die ID des Kontinentes dar und ist mit *int* **getContinentID** () abrufbar. +#### Kontinent-ID + +Stellt die ID des Kontinentes dar. #### Position @@ -193,31 +204,34 @@ Sind nach dem Erstellen der Provinz nicht mehr abrufbar. Dies ist der Name, der auf der Karte und bei Events im Zusammenhang mit dieser Provinz angezeigt wird. -Kann über *String* **getDisplayName** () abgerufen werden, falls benötigt. - #### Sterne -Dieser Wert wird für die zufällige Verteilung von Einheiten benötigt (laut Achim). - -Über *int* **getStars** () soll dieser Wert abrufbar sein. +Dieser Wert wird für die zufällige Verteilung von Einheiten benötigt. Er ist fest für eine Provinz festgeschrieben. #### Angrenzende Provinzen Dies ist ein Array von allen Provinzen, die es gibt (Provinznummer als Index), diese jeweils mit einem *boolean*-Wert, der festlegt, ob ein Kampf oder ein Weitergeben von Einheiten möglich ist. +```java +boolean[] nearProvinces; +``` +Dem Konstruktor wird stattdessen ein *int[]* mit allen angrenzenden Provinzen als Werte übergeben werden, dieses wird dann automatisch konvertiert. - boolean[] nearProvinces; +### Private Eigenschaften -Dem Konstruktor kann stattdessen auch ein *int[]* mit allen angrenzenden Provinzen als Werte übergeben werden, dieses wird dann automatisch konvertiert. - -Über die Methode *boolean* **isProvinceNear** ( *int* ) kann man sich die Einträge einzeln als Booleans ausgeben lassen. - -### Zusätzliche Eigenschaften +- Provinznummer +- Kontinentnummer +- X/Y-Position auf der Karte +- Anzeigename +- Sterne +- Angrenzende Provinzen - Besitzer - Einheitenanzahl #### Besitzer +Diese Variable speichert den aktuellen Besitzer. + Über die Methode **int getOwner()** bekommt ihr den aktuellen Besitzer zurück (-1 = keiner, 0 = Spieler 1, ...). Die Methode **boolean setOwner(int)** speichert einen neuen Besitzer ab. Sie gibt den Erfolg des Setzens zurück, falls also die Zahl kleiner -1 oder größer gleich als die Spieleranzahl sein sollte, wird die Änderung nicht durchgeführt und es wird **false** zurückgegeben. @@ -226,14 +240,70 @@ Die Methode **boolean setOwner(int)** speichert einen neuen Besitzer ab. Sie gib Diese Eigenschaft speichert, wie viele Einheiten auf diesem Feld stehen (natürlich welche, die dem Besitzer gehören). -Die Methoden *int* **getEntityCount** (), *int* **addToEntities** ( *int* ), *int* **removeFromEntities** ( *int* ) und *int* **setEntityCount** ( *int* ) sollten genügend Möglichkeiten für Änderungen bieten. -Alle Methoden geben nach ihrem Aufruf den nun aktuellen Wert zurück. - ### Public Methoden -- **redrawProvince()** +- *int* **getID** () +- *int* **getContinentID** () +- *String* **getDisplayName** () +- *int* **getStars** () + +- *boolean* **isProvinceNear** ( *int* provinceID ) + +- *int* **getOwner** () +- *boolean* **setOwner** ( *int* playerID ) + +- *int* **getEntityCount** () +- *int* **addToEntities** ( *int* entityCountToAdd ) +- *int* **removeFromEntities** ( *int* entityCountToRemove ) +- *int* **setEntityCount** ( *int* newEntityCount) + +- *void* **redrawProvince** () + +#### getID() + +Gibt die Provinz-ID dieser Provinz zurück. + +#### getContinentID() + +Gibt die Kontinent-ID dieser Provinz zurück. + +#### getDisplayName() + +Gibt den Anzeigenamen dieser Provinz zurück. + +#### getStars() + +Gibt die hinterlegte Anzahl an Sternen dieser Provinz zurück. + +#### isProvinceNear() + +Gibt zurück, ob die angebenene Provinz mit dieser Provinz benachbart ist, umn beispielsweise Einheiten verschieben zu können. + +#### getOwner() + +Gibt die Spieler-ID des aktuellen Besitzer der Provinz als *int* zurück. **-1** bedeutet, dass diese Provinz aktuell keinen Besitzer hat. + +#### setOwner() + +Legt einen neuen Besitzer für diese Provinz fest. Bei Erfolg gibt die Methode **true** zurück. Sollte die ID für keinen Spieler stehen, wird die Methode **false** zurückgeben und nichts an dem gespeicherten Wert ändern. + +#### getEntityCount() + +Gibt die aktuelle Einheitenanzahl auf dieser Provinz zurück. + +#### addToEntities() + +Addiert die gegebene Anzahl der Einheiten auf die gespeicherte Anzahl drauf, speichert den neuen Wert ab und gibt diesen zurück. + +#### removeFromEntities() + +Subtrahiert die gegebene Anzahl der Einheiten von die gespeicherte Anzahl ab, speichert den neuen Wert ab und gibt diesen zurück. Bei einem neuen Wert von unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. -#### redrawProvince +#### setEntityCount() + +Setzt einen neuen festen Wert für die Einheitenanzahl fest und gibt diesen wieder zurück. Bei gegebenen Werten unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. + +#### redrawProvince() Wird von der Karte oder von internen Methoden aufgerurfen, um alle sichtbaren Eigenschaften erneut zu zeichnen. @@ -244,53 +314,117 @@ Wird von der Karte oder von internen Methoden aufgerurfen, um alle sichtbaren Ei Stellt die Spieler da, speichert Informationen zu diesen ab. -### Explizite Eigenschaften +### Konstruktorparameter -- Spielernummer (über Konstruktor festgelegt, *int*) -- Anzeigename (über Konstruktor festgelegt, *String*) -- Sternanzahl -- Statistiken - 1. Eroberte Provinzen - 2. Verlorene Provinzen - 3. Einflussmaximum (maximale Provinzenanzahl, nach einem Zug zu überprüfen) - 4. Bekommene Einheiten - 5. Verlorene Einheiten - 6. Maximale Einheitenanzahl (nach einem Zug zu überprüfen) +0. Spieler-ID als *int* +0. Anzeigename als *String* +0. "Farbe" als *int* #### Spielernummer -Wird bei der Welt intern benötigt und stellt die Position im Menü und in den Arrays an. - -**int getID()** gibt diese wieder zurück. +Wird bei der Welt intern benötigt und stellt die Position im Menü und in den Arrays dar. #### Anzeigename Ist der lesbare Name des Spielers, damit nicht nur "Spieler 1", ... usw. zu sehen ist. -**String getDisplayName()** gibt diesen zurück. +#### "Farbe" + +Dies soll die "Farbe" eines Spielers festlegen. *Falls euch ein besserer Name für diese Eigenschaft einfällt, bitte mir weitergeben.* + +### Private Eigenschaften + +- Spielernummer +- Anzeigename +- "Farbe" + +- Sternanzahl +- Statistiken #### Sternanzahl Die Anzahl der Sterne, die ein Spieler besitzt und gegebenenfalls dann in Einheiten umtauschen kann. -*int* **getStars** (), *int* **addToStars** ( *int* ), *int* **removeFromStars** ( *int* ), *int* **setStars** ( *int* ) sind zum Bearbeiten des Werts da. Auch sie geben danach den nun aktuellen Wert zurück. +#### Statistik -*boolean* **canStarsRemoved** ( *int* ) gibt zurück, ob der Spieler diese Anzahl an Sternen verwenden kann (als Vereinfachung). +Die Statistik soll Events festhalten, um nach einem Spiel verschiedene Werte einsehen zu können. Diese werden von der Welt durch spezielle Funktionen erhöht. Die Reihenfolge, in der die Statistiken angegeben werden, ist wie folgt festgelegt: -#### Statistik +1. Eroberte Provinzen +2. Verlorene Provinzen +3. Einflussmaximum (maximale Provinzenanzahl, nach einem Zug zu überprüfen) +4. Bekommene Einheiten +5. Verlorene Einheiten +6. Maximale Einheitenanzahl (nach einem Zug zu überprüfen) -Die Statistik soll Events festhalten, um nach einem Spiel verschiedene Werte einsehen zu können. Diese werden von der Welt mit speziellen Funktionen erhöht. Zurückgegeben sollen diese als *int[]*-Array in der Reihenfolge, wie sie oben in der Liste auftretten. Es wird auch vorgeschlagen, sie so zu speichern. +### Public Methoden -*int[]* **getStatistics()** gibt diese Liste zurück, damit sie von der Welt angezeigt werden kann. +- *int* **getID** () +- *String* **getDisplayName** () -**gotProvince** (), **lostProvince** (), **gotEntities** ( *int* ), **lostEntity** () +- *int* **getStars** () +- *int* **addToStars** ( *int* starsToAdd ) +- *int* **removeFromStars** ( *int* starsToRemove ) +- *int* **setStars** ( *int* newStarsCount ) +- *boolean* **canStarsRemoved** ( *int* requiredStarsCount ) -### Zusätzliche Methoden +- *int[]* **getStatistics** () + - *void* **gotProvince** () + - *void* **lostProvince** () + - *void* **gotEntities** ( *int* addedEntities ) + - *void* **lostEntity** () - *boolean[]* **getMyProvinces** () - *int* **getProvinceCount** () - *void* **redrawPlayer** () +#### getID() + +Gibt die Spieler-ID dieses Spielers zurück. + +#### getDisplayName() + +Gibt den Anzeigenamen des Spielers zurück. + +#### getStars() + +Gibt die aktuelle Anzahl der Sterne, die der Spieler besitzt, zurück. + +#### addToStars() + +Addiert die gegebene Anzahl der Sterne auf die gespeicherte Anzahl drauf, speichert den neuen Wert ab und gibt diesen zurück. + +#### removeFromStars() + +Subtrahiert die gegebene Anzahl der Sterne von die gespeicherte Anzahl ab, speichert den neuen Wert ab und gibt diesen zurück. Bei einem neuen Wert von unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. + +#### setStars() + +Setzt einen neuen festen Wert für die Sternenanzahl fest und gibt diesen wieder zurück. Bei gegebenen Werten unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. + +#### canStarsRemoved() + +Prüft, ob die gegebenene Anzahl an Sternen von dem Spieler abgezogen werden könnte. Falls ja, wird **true** zurückgegebenen, sonst **false** + +#### getStatistics() + +Gibt in derselben Reihenfolge wie für die Statistik angegeben die aktuelllen Werte zurück als *int[]*-Array + +#### gotProvince() + +Wird von der Welt aufgerufen, sobald dieser Spieler eine Provinz erobert hat. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um 1. + +#### lostProvinze() + +Wird von der Welt aufgerufen, sobald dieser Spieler eine Provinz verloren hat. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um 1. + +#### gotEntities() + +Wird von der Welt aufgerufen, sobald dieser Spieler Einheiten dazubekommt. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um die gegebenene Anzahl. + +#### lostEntity() + +Wird von der Welt aufgerufen, sobald dieser Spieler im Kampf eine Einheit verliert. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um 1. + #### getMyProvinces() Diese Methode hat die Aufgabe, eine Liste aller Provinzen zurückzugeben, wobei jede Provinz mit einem *boolean*-Wert gesagt bekommt, ob sie dem Spieler gehört oder nicht. @@ -312,7 +446,7 @@ Erzwingt das erneute Zeichnen des Player Objekts, um alle sichtbaren Eigenschaft Stellt einen Würfel als *Actor* dar (vergleichbar mit dem Würfel aus unserem Projekt Zehntausend). -### Eigenschaften +### Private Eigenschaften - Augenzahl @@ -333,12 +467,68 @@ Berechnet eine Zufallszahl von 1 bis 6, speichert diese ab und gibt sie auch so ## GUI_Interface *extends Actor* -Die Oberklasse für alle Interface-Objekte wie Buttons und Labels. Diese Klasse ist *abstract*. +Die Oberklasse für alle Interface-Objekte wie Buttons und Labels. Diese Klasse ist als *abstract* definiert. Diese Klasse besitzt als *abstract* definierte Methoden, welche zwingend von den erbendenen Klassen ersetzt werden muss. + +### Protected Eigenschaften + +- *int* **sx** +- *int* **sy** + +#### sx + +Gibt die Breite des Objektes an (Größe in X-Richtung, **S**ize**X**). Nur für Methoden der erbenden Objekte selbst gedacht. + +#### sy -### +Gibt die Höhe des Objektes an (Größe in Y-Richtung, **S**ize**Y**). Nur für Methoden der erbenden Objekte selbst gedacht. ### Public Methoden +- *int* **getWidth** () +- *int* **getHeight** () +- *void* **setSize** ( *int* width , *int* height ) + +- *java.awt.Color* **getBackColor** () +- *boolean* **setBackColor** ( *java.awt.Color* newBackColor) +- *java.awt.Color* **getForeColor** () +- *boolean* **setForeColor** ( *java.awt.Color* newForeColor) + +#### getWidth() + +Gibt die Breite des Objektes zurück. + +#### getHeight() + +Gibt die Höhe des Objektes zurück. + +#### setSize() + +Ändert die Größe des Objektes. Eventuell wird das Objekt diese Größenänderung nicht übernehmen wollen (siehe *autoSize* Eigenschaften bei diesen, falls vorhanden). + +#### getBackColor() + +Gibt die aktuelle Hintergrundfarbe des Objektes zurück. + +#### setBackColor() + +Legt eine neue Hintergrundfarbe für dieses Objekt fest. + +#### getForeColor() + +Gibt die aktuelle Vordergrundfarbe (meist Textfarbe) des Objektes zurück. + +#### setForeColor() + +Legt eine neue Vordergrundfarbe (meist Textfarbe) für dieses Objekt fest. + +### Abstract Public Methoden + +- *void* redraw() + +#### redraw() + +Durch diese Methode soll die erneute Zeichnung des Objektes verlangen können. Viele der **set**-Methoden rufen daher bei einer erfolgreichen Änderung diese Methode auf. + --- ## Label @@ -346,27 +536,188 @@ Die Oberklasse für alle Interface-Objekte wie Buttons und Labels. Diese Klasse Zeigt einen Text auf dem Bildschirm an. Zuvor wurde dieses Objekt "Text" genannt, "Label" ist der fachlichere Ausdruck dafür. -### Eigenschaften +### Konstruktorparameter -- Anzeigetext (*String*; kann vom Konstruktor entgegen genommen werden, sonst ist der Standardtext "" zu sehen) +0. Anzeigetext als *String* +0. Textgröße als *int* #### Anzeigetext -Dieser Text wird von dem Actor aus zu sehen sein. -Mit **String getText()** und **String setText(String)** bekommt Zugriff darauf. +Gibt den Text an, den das Label darstellen soll. + +#### Textgröße + +Gibt die Textgröße an, in der das Label den Anzeigetext darstellen soll. + +### Private Eigenschaften + +- Anzeigetext +- Textgröße + +- Automatische Größenanpassung + +#### Automatische Größenanpassung + +Diese Eigenschaft des Labels legt fest, ob es seine Größe dynamisch an den darzustellenden Text automatisch anpassen soll. Dies kann euch die Arbeit mit diesem erleichtern, kann aber auch zu Problemen bei der Darstellung mehrerer Objekte nebeneinander erschweren, da diese sich eventuell überlappen könnten. + +### Public Methoden + +- *boolean* **getAutoSize** () +- *void* **setAutoSize** ( *boolean* newValue ) +- *int* **getTextSize** () +- *boolean* **setTextSize** ( *int* newSize ) +- *String* **getText** () +- *boolean* **setText** ( *String* newText ) + +- *void* **redraw** () + +#### getAutoSize() + +Gibt an, ob das Label seine Größe automatisch an den Inhalt anpasst. + +#### setAutoSize() + +Legt fest, ob das Label seine Größe automatisch an den Inhalt anpassen soll. Falls die Eigenschaft damit aktiviert werden sollte, erfolgt automatisch ein Aufruf der **redraw**-Methode. + +#### getTextSize() + +Gibt die aktuelle Textgröße zurück. + +#### setTextSize() + +Legt eine neue Textgröße fest. + +#### getText() + +Gibt den aktuellen Anzeigetext zurück. + +#### setText() + +Legt einen neuen Anzeigetext zurück. + +#### redraw() + +Erneuert die Darstellung des Labels mit seinem Anzeigetext auf der Welt. Hiermit wird gegebenfalls auch die Größe des Labels automatisch angepasst. --- ## Button *extends GUI_Interface* -Die Hauptklasse für Buttons, wird durch Erbung spezifiziert. +Stellt einen Button mit einem Text dar. Dieses Objekt kann dazu ein Event auslösen, sobald darauf geklickt wurde. + +### Konstruktorparameter + +Hier gibt es mehrere Möglichkeiten, eine Instanz der Klasse *Button* zu erstellen: + +0. Anzeigetext als *String* +0. Textgröße als *int* + +1. EventHandler als *ButtonEvent* + +2. Anzeigetext als *String* +2. Textgröße als *int* +2. EventHandler als *ButtonEvent* + +#### Anzeigetext + +Gibt den Text an, den das Label darstellen soll. + +#### Textgröße + +Gibt die Textgröße an, in der das Label den Anzeigetext darstellen soll. + +#### EventHandler + +Hierfür muss die Instanz einer Klasse übergeben werden, welche das Interface *ButtonEvent* implementiert und damit eine Funktion namens *void* **buttonClicked** ( *Button* button ) besitzt. Folgend ein Beispiel für eine Klassendefinition, die eine Methode mit diesem Namen besitzt, die dann von dem Button aufgerufen wird, sobald dieser angeklickt wurde. + +```java +public class TestClass implements ButtonEvent { + Button button1 = new Button("Button 1",10,self); + Button button1 = new Button("Button 2",10,self); + public void buttonClicked(Button b) { + // Hier steht nun, was passieren soll, wenn IRGENDEIN Button angeklickt wird, der eine Instanz von dieser Klasse als EventHandler zugewiesen bekommen hat. + if(b == button1) { + // mein erster Button + } else if(b == button2) { + // mein zweiter Button + } + } +} +``` + +### Private Eigenschaften + +- Anzeigetext +- Textgröße +- EventHandler + +- Automatische Größenanpassung + +#### Automatische Größenanpassung + +Diese Eigenschaft des Buttons legt fest, ob es seine Größe dynamisch an den darzustellenden Text automatisch anpassen soll. Dies kann euch die Arbeit mit diesem erleichtern, kann aber auch zu Problemen bei der Darstellung mehrerer Objekte nebeneinander erschweren, da diese sich eventuell überlappen könnten. + +### Public Methoden + +- *boolean* **getAutoSize** () +- *void* **setAutoSize** ( *boolean* newValue ) +- *int* **getTextSize** () +- *boolean* **setTextSize** ( *int* newSize ) +- *String* **getText** () +- *boolean* **setText** ( *String* newText ) + +- *ButtonEvent* **getHandler** () +- *void* **setHandler** ( *ButtonEvent* newEventHandler ) +- *void* **removeHandler** () + +- *void* **redraw** () + +#### getAutoSize() + +Gibt an, ob der Button seine Größe automatisch an den Inhalt anpasst. + +#### setAutoSize() + +Legt fest, ob der Button seine Größe automatisch an den Inhalt anpassen soll. Falls die Eigenschaft damit aktiviert werden sollte, erfolgt automatisch ein Aufruf der **redraw**-Methode. + +#### getTextSize() + +Gibt die aktuelle Textgröße zurück. + +#### setTextSize() + +Legt eine neue Textgröße fest. + +#### getText() + +Gibt den aktuellen Anzeigetext zurück. + +#### setText() + +Legt einen neuen Anzeigetext zurück. + +#### getHandler() + +Gibt den aktuellen EventHandler des Buttons zurück. Falls keiner vorhanden ist, wird **null** zurückgegeben. + +#### setHandler() + +Legt einen neuen EventHandler für den Button fest. Der alte EventHandler wird damit überschrieben. + +#### removeHandler() + +Deaktiviert den aktuellen EventHandler, damit keine Events mehr ausgelöst werden können. + +#### redraw() + +Erneuert die Darstellung des Buttons mit seinem Anzeigetext auf der Welt. Hiermit wird gegebenfalls auch die Größe des Buttons automatisch angepasst. --- ## Utils -Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verkleinern und besser lesbar gestalten soll. Ergänzungen in Form von eigenen Funktionen dürfen **selbst** eingebracht werden. +Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verkleinern und besser lesbar gestalten soll. Ergänzungen in Form von eigenen Funktionen dürfen **selbst** eingebracht werden. Alle Methoden dieser Klasse sollen *public* sein. ### copyArray() @@ -374,4 +725,4 @@ Kopiert ein Array des Types *boolean*, *int* oder *String* mit identischer Grö ### drawInsideRectangle() -Zeichnet innerhalb eines **GreenfootImage** ein Rechteck gefüllt mit der angegebenen Farbe. Es besitzt zu allen Seiten den gegebenen Abstand zum Rand des Image. +Zeichnet innerhalb eines **GreenfootImage** ein Rechteck gefüllt mit der angegebenen Farbe. Es besitzt zu allen Seiten den gegebenen Abstand zum Rand des Image. \ No newline at end of file diff --git a/planung/funktionsliste.md b/planung/funktionsliste.md index b1966bf..17c20bf 100644 --- a/planung/funktionsliste.md +++ b/planung/funktionsliste.md @@ -1,73 +1,72 @@ # Funktionsliste Zweiundvierzig -**Version: 3** - -**Stand: 13.05.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Letztes Update: 04.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) [Hier zum gesamten Architekturplan auf dem aktuellen Branch](architektur.md) -Hier einfach eine grobe Übersicht über alle Funktionen, die jede Klasse als Public / Protected besitzen soll beziehungsweise bereits besitzt. -Weitere Informationen zu den Funktionen findet ihr in der Architektur oder, falls die Funktion bereits vorhanden ist, in der Dokumentation, die von Greenfoot automatisch erstellt wird (durch die InCode Dokumentation). +Hier einfach eine grobe Übersicht über alle Methoden und eventuellen Variabled, die jede Klasse als *public* oder *protected* besitzen soll beziehungsweise bereits besitzt. +Weitere Informationen zu den Methoden findet ihr in der Architektur oder, falls die Methoden bereits vorhanden ist, in der Dokumentation, die von Greenfoot automatisch erstellt wird (durch die InCode Dokumentation). + +Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschrieben wird, müsst ihr nicht diesselben Parameterbezeichner verwenden, wie sie hier verwendet wurden. Falls aus diesem Bezeichner jedoch nicht mehr die Bedeutung des Parameters ausgeht, muss dies in einem Java-Documentation Kommentar erklärt werden. -Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Funktionen im Code präsent habt. +Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methodenn im Code präsent habt. ## GeneralMap -- static *GeneralMap* **generateMap** ( *int* mapID, ... ) +- *GeneralMap* ( *String* backgroundImage, *String[]* playerList, *int[]* colorList ) + +- protected *void* **addProvinceToMap** ( *Province* province ) - *int* **getPlayerCount** () - *String* **getPlayerName** () -- *String* **getPlayerName** ( *int* ) +- *String* **getPlayerName** ( *int* playerID ) - *int* **getPlayerStars** () -- *int* **getProvinceOwner** ( *int* ) +- *int* **getProvinceOwner** ( *int* provinceID ) - *int[]* **getProvinceOwners** () -- *int* **getProvinceEntityCount** ( *int* ) -- *int* **getProvincesEntityCounts** ( *int[]* ) -- *int* **getProvincesEntityCounts** ( *boolean[]* ) -- *int* **getProvincesEntityCounts** ( *int* ) +- *int* **getProvinceEntityCount** ( *int* playerID ) ## Province -- *Province* ( *int*, *int*, *int*, *int*, *int*, *String*, *int[]* ) -- *Province* ( *int*, *int*, *int*, *int*, *int*, *String*, *boolean[]* ) +- *Province* ( *int* provinceID, *int* continentID, *int* xPos, *int* yPos, *String* displayName, *int* stars, *int[]* neighbourProvinces ) - *int* **getID** () - *int* **getContinentID** () - *String* **getDisplayName** () -- *boolean* **isProvinceNear** ( *int* ) - - *int* **getStars** () +- *boolean* **isProvinceNear** ( *int* provinceID ) + - *int* **getOwner** () -- *void* **setOwner** ( *int* ) +- *boolean* **setOwner** ( *int* playerID ) - *int* **getEntityCount** () -- *int* **addToEntities** ( *int* ) -- *int* **removeFromEntities** ( *int* ) -- *int* **setEntityCount** ( *int* ) +- *int* **addToEntities** ( *int* entityCountToAdd ) +- *int* **removeFromEntities** ( *int* entityCountToRemove ) +- *int* **setEntityCount** ( *int* newEntityCount) - *void* **redrawProvince** () ## Player -- *Player* ( *int*, *String* ) +- *Player* ( *int* playerID, *String* displayName, *int* playerColor ) -- *int* getID () +- *int* **getID** () - *String* **getDisplayName** () + - *int* **getStars** () -- *int* **addToStars** ( *int* ) -- *int* **removeFromStars** ( *int* ) -- *int* **setStars** ( *int* ) -- *boolean* **canStarsRemoved**( *int* ) +- *int* **addToStars** ( *int* starsToAdd ) +- *int* **removeFromStars** ( *int* starsToRemove ) +- *int* **setStars** ( *int* newStarsCount ) +- *boolean* **canStarsRemoved** ( *int* requiredStarsCount ) - *int[]* **getStatistics** () -- *void* **gotProvince** () -- *void* **lostProvince** () -- *void* **gotEntities** ( *int* ) -- *void* **lostEntity** () + - *void* **gotProvince** () + - *void* **lostProvince** () + - *void* **gotEntities** ( *int* addedEntities ) + - *void* **lostEntity** () - *boolean[]* **getMyProvinces** () - *int* **getProvinceCount** () @@ -83,45 +82,48 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Funktio ## GUI_Interface +- protected *int* **sx** +- protected *int* **sy** + - *int* **getWidth** () - *int* **getHeight** () -- *void* **setSize** ( *int*, *int* ) +- *void* **setSize** ( *int* width , *int* height ) -- *System.awt.Color* **getBackColor** () -- *boolean* **setBackColor** ( *System.awt.Color* ) -- *System.awt.Color* **getForeColor** () -- *boolean* **setForeColor** ( *System.awt.Color* ) +- *java.awt.Color* **getBackColor** () +- *boolean* **setBackColor** ( *java.awt.Color* newBackColor) +- *java.awt.Color* **getForeColor** () +- *boolean* **setForeColor** ( *java.awt.Color* newForeColor) - abstract *void* **redraw** () ## Label (erweitert GUI_Interface) -- *Label* ( *String*, *int* ) +- *Label* ( *String* text, *int* textSize ) - *boolean* **getAutoSize** () -- *boolean* **setAutoSize** ( *boolean* ) - +- *void* **setAutoSize** ( *boolean* newValue ) - *int* **getTextSize** () -- *boolean* **setTextSize** ( *int* ) - +- *boolean* **setTextSize** ( *int* newSize ) - *String* **getText** () -- *boolean* **setText** ( *String* ) +- *boolean* **setText** ( *String* newText ) + +- *void* **redraw** () ## Button (erweitert GUI_Interface) -- *Button* ( *String*, *int* ) -- *Button* ( *ButtonEvent* ) -- *Button* ( *String*, *int*, *ButtonEvent* ) +- *Button* ( *String* text, *int* textSize ) +- *Button* ( *ButtonEvent* eventHandler ) +- *Button* ( *String* text, *int* textSize, *ButtonEvent* eventHandler ) - *boolean* **getAutoSize** () -- *boolean* **setAutoSize** ( *boolean* ) - +- *void* **setAutoSize** ( *boolean* newValue ) - *int* **getTextSize** () -- *boolean* **setTextSize** ( *int* ) - +- *boolean* **setTextSize** ( *int* newSize ) - *String* **getText** () -- *boolean* **setText** ( *String* ) +- *boolean* **setText** ( *String* newText ) - *ButtonEvent* **getHandler** () -- *void* **setHandler** ( *ButtonEvent* ) -- *void* **removeHandler** () \ No newline at end of file +- *void* **setHandler** ( *ButtonEvent* newEventHandler ) +- *void* **removeHandler** () + +- *void* **redraw** () \ No newline at end of file From e9c7d667e7df65f8d165dfed13cb41a439b30b78 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 4 Jun 2016 14:01:27 +0200 Subject: [PATCH 32/68] =?UTF-8?q?Architektur=20Fehler=20bei=20Liste=20korr?= =?UTF-8?q?igiert=20Beim=20Button=20f=C3=BCr=20die=20Konstruktoren=20wurde?= =?UTF-8?q?n=20die=20verschiedenen=20Listen=20von=20dem=20Interpreter=20f?= =?UTF-8?q?=C3=BCr=20Markdown=20Dateien=20als=20eine=20einzige=20Liste=20i?= =?UTF-8?q?nterpretiert=20und=20so=20auch=20angezeigt.=20Dies=20wurde=20nu?= =?UTF-8?q?n=20durch=20=C3=9Cberschriften=20der=20Listen=20unterbunden.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/architektur.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index a4141b2..6968328 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -610,14 +610,17 @@ Stellt einen Button mit einem Text dar. Dieses Objekt kann dazu ein Event auslö Hier gibt es mehrere Möglichkeiten, eine Instanz der Klasse *Button* zu erstellen: -0. Anzeigetext als *String* -0. Textgröße als *int* +Methode 1: +1. Anzeigetext als *String* +2. Textgröße als *int* +Methode 2: 1. EventHandler als *ButtonEvent* -2. Anzeigetext als *String* +Methode 3: +1. Anzeigetext als *String* 2. Textgröße als *int* -2. EventHandler als *ButtonEvent* +3. EventHandler als *ButtonEvent* #### Anzeigetext From 72eebab3aa78ab9a5bbac49a505608eee9706059 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 4 Jun 2016 14:07:03 +0200 Subject: [PATCH 33/68] =?UTF-8?q?Architektur:=20Fehlende=20Funktion=20hinz?= =?UTF-8?q?ugef=C3=BCgt=20Bei=20der=20Klasse=20*Province*=20wurde=20nun=20?= =?UTF-8?q?die=20Methode=20**hasClicked**=20noch=20eingetragen.=20Diese=20?= =?UTF-8?q?ist=20f=C3=BCr=20die=20beiden=20Gruppen=20gedacht,=20die=20abfr?= =?UTF-8?q?agen=20m=C3=BCssen,=20ob=20bestimmte=20Provinzen=20angeklickt?= =?UTF-8?q?=20wurden.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/architektur.md | 6 ++++++ planung/funktionsliste.md | 2 ++ 2 files changed, 8 insertions(+) diff --git a/planung/architektur.md b/planung/architektur.md index 6968328..3713161 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -257,6 +257,8 @@ Diese Eigenschaft speichert, wie viele Einheiten auf diesem Feld stehen (natürl - *int* **removeFromEntities** ( *int* entityCountToRemove ) - *int* **setEntityCount** ( *int* newEntityCount) +- *boolean* **hasClicked** () + - *void* **redrawProvince** () #### getID() @@ -303,6 +305,10 @@ Subtrahiert die gegebene Anzahl der Einheiten von die gespeicherte Anzahl ab, sp Setzt einen neuen festen Wert für die Einheitenanzahl fest und gibt diesen wieder zurück. Bei gegebenen Werten unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. +#### hasClicked() + +Gibt zurück, ob seid dem letzten Aufruf dieser Methode diese Provinz von der Maus angeklickt wurde. + #### redrawProvince() Wird von der Karte oder von internen Methoden aufgerurfen, um alle sichtbaren Eigenschaften erneut zu zeichnen. diff --git a/planung/funktionsliste.md b/planung/funktionsliste.md index 17c20bf..7176b47 100644 --- a/planung/funktionsliste.md +++ b/planung/funktionsliste.md @@ -47,6 +47,8 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *int* **removeFromEntities** ( *int* entityCountToRemove ) - *int* **setEntityCount** ( *int* newEntityCount) +- *boolean* **hasClicked** () + - *void* **redrawProvince** () ## Player From 7fc1952bdac189c6e4d5084e489669e1b6334572 Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 4 Jun 2016 17:12:41 +0200 Subject: [PATCH 34/68] ArmySchubser V1 - Schubst Einheiten umher, leider noch nicht erfolgreich --- ArmySchubser.java | 99 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 72 insertions(+), 27 deletions(-) diff --git a/ArmySchubser.java b/ArmySchubser.java index af0d55f..5f18a68 100644 --- a/ArmySchubser.java +++ b/ArmySchubser.java @@ -1,27 +1,72 @@ -import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) -import greenfoot.MouseInfo.*; - -/** - * Schubst Einheiten. - * - * @author MaxiJohl, GruenerWal - * @version 0.0.1 - */ -public class ArmySchubser extends Map_World -{ - - /** - * Constructor for objects of class ArmySchubser. - * - */ - public ArmySchubser() - { - // Hi. - } - - public void act() - { - MouseInfo m = Greenfoot.getMouseInfo(); - Actor startProvince = m.getActor(); - } -} +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import greenfoot.MouseInfo.*; +import javax.swing.JOptionPane; + +/** + * Schubst Einheiten umher. + * + * @author MaxiJohl, GruenerWal + * @version 0.1.0 + */ +public class ArmySchubser extends Map_World +{ + + /** + * Constructor for objects of class ArmySchubser. + * + */ + public ArmySchubser() + { + // Hi. + } + + /* + public void act() + { + MouseInfo m = Greenfoot.getMouseInfo(); + Actor mouseActor = m.getActor(); + + if (mouseActor.getClass().equals(Province.class)) + { + Actor firstProvince = mouseActor; + } + } + */ + + public void act() { + Province firstProvince = null; + Province secondProvince = null; + + for ( int i = 0; i <= provinceCount; i++) + { + if (provinces[i].hasClicked() == true) + { + provinces[i] = firstProvince; + break; + } + } + + for ( int i = 0; i <= provinceCount; i++) + { + if (provinces[i].hasClicked() == true && provinces[i] != firstProvince) + { + provinces[i] = secondProvince; + break; + } + } + + String toMove = JOptionPane.showInputDialog(null, "Wieviele Einheiten willst du verschieben?"); + Integer entitiesToMove = Integer.valueOf(toMove); + + if ( (firstProvince.getEntityCount() - entitiesToMove) > 0 && firstProvince.isProvinceNear(secondProvince.getID()) == true ) + { + firstProvince.removeFromEntities(entitiesToMove); + secondProvince.addToEntities(entitiesToMove); + } + + else + { + System.out.println("Du hast nicht genügend Einheiten, um die gewünschte Anzahl von " + firstProvince.getDisplayName() + " nach " + secondProvince.getDisplayName() + " zu verschieben, Köhler."); + } + } +} From e26f927c933039a6666d85ca5655826e6a8c4a8f Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 4 Jun 2016 17:14:24 +0200 Subject: [PATCH 35/68] ArmySchubser V1.1 - Schubst erneut Einheiten umher, leider nach wie vor ohne Erfolg --- ArmySchubser.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/ArmySchubser.java b/ArmySchubser.java index 5f18a68..4691f74 100644 --- a/ArmySchubser.java +++ b/ArmySchubser.java @@ -6,7 +6,7 @@ import javax.swing.JOptionPane; * Schubst Einheiten umher. * * @author MaxiJohl, GruenerWal - * @version 0.1.0 + * @version 0.1.1 */ public class ArmySchubser extends Map_World { @@ -20,20 +20,8 @@ public class ArmySchubser extends Map_World // Hi. } - /* - public void act() + public void act() { - MouseInfo m = Greenfoot.getMouseInfo(); - Actor mouseActor = m.getActor(); - - if (mouseActor.getClass().equals(Province.class)) - { - Actor firstProvince = mouseActor; - } - } - */ - - public void act() { Province firstProvince = null; Province secondProvince = null; From 6513d2a8125b2173262d614c2f7e5db3d216c9c5 Mon Sep 17 00:00:00 2001 From: Lumberjack42 Date: Tue, 7 Jun 2016 08:26:51 +0200 Subject: [PATCH 36/68] Add files via upload Hallo --- Player.class | Bin 0 -> 3881 bytes Player.ctxt | 12 ++++ Player.java | 198 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 210 insertions(+) create mode 100644 Player.class create mode 100644 Player.ctxt create mode 100644 Player.java diff --git a/Player.class b/Player.class new file mode 100644 index 0000000000000000000000000000000000000000..21ca86e5e4d1a771b87b98f9d8066d685d8fd0ba GIT binary patch literal 3881 zcmZ`*`*Ryt75-LQY4upYl-NllJ5@s-w(8i>mXb6NYR7pP>^NYPkkpi{rLDZNwCk=` zP8?`UOG_zj(-NRS873u^2_0U2Bo0G6JO&tM_#60*{{lLN@9eG~u~pCb+`IRld+s^k zch0%`=SP3|BY+3+dI~$SsKJu)LK2_Al8Ca1iU?bTBVt*^<04!URS{nN;jOg8zZ7a% zN#Y_dX;@7mg9`~+p5ay%D3c1JMzN?MVo@ZPU1#N-u~=51$@FxIGtu>^8+nAv$>njgYI&DU zR~F7uujF{As7hP>N|c>y{nJ*EnYv)C7^7vwE{)E5u4R`FP^V;iXB@Z8`#J}QrjDDo z=^Eu}W0`yE5vOP>=$f)@^JJ~EV7hb0LYXU>DW_nRPaCc!-{GR_En0LeF?FhJteP&* z#}8Vz7ryvyBQ($LP=G1aTM~Vt}3eny{+Nw0P3r-b^1q zCW_er#1sLXbHWc=;Vsc+mzGu6uo-0sw+c%PFmyXnHN8+<9h{U)qg-Lsu32$b%ww)o zsT-@-76>e3?50}+vt<{|BTmhxx^jvC7ZvDtLYNfdM6Jr?(=eC z2a5_)LYco!NYWMKQd2caqyiQKT&7p+F8Fqag#Rwusgo|Z2Aao%qzD!WiLYpSQ(<-l z>m7`VfqGWevkIX_f}y)+(KRjxoGREv{7bHB+K)MoH|i%2iB8QrHMd|Mvm`mvf$oUV zq_g(8lxn7xjsrNVV;6So*dt<4#E^)*h*vM0}sb z@wy*iT*GTReuy72FDGibMWgEF6!e70bEdm!ls(fPQLsC>!C3NYX1Uz%g1^35@_5Ar zjuOJUF}vo{;P%kqaIRR(Eg81WYm9Q$$=Oz6QEu$6-)Jmcw#-G-78F0NtOgMjJ&iNzLj$=eJkK<-2!T{xi z{JM{$!ZDG*4du^>yzOg#hBEH2>)6M+9_U~{9^#k6tUpL8=ijE?D93T0kLIJdpo)lz zh>OrfB=X(y4^p>~%y;KMP;Vh6i)j&he)twT@>y!XLn{%;%@3l3G7A-*NTQ3f8=KIB zt$d6IINQY-_M(@*_ffx}z6@Xt+kH=Sfj6P2^b3cGjzl<)!;C+|`DgKP==~^1*^A|G zBK~Vm0tbT7ceI2aYlJ>VLqX`Rhdb8ewx`YE2#&P9SzUkgaNENyzu;zNKgki$Z+2}) z=kL+IRJd|5t6oD#Hg*k(Z2S!(PMBj^O+FLy8I#X$ed+(cS^12vB7q5N4&&SK|D z-@E8}ADOeau_?284ZZzq=*w*3WDQ%_a97LjHZIB`QOLGa;89Uf@3bH^M}3+fBC+yw zCe38r#+AE?@eosMgp@r%lJ=9-F+z5Xjc1mzKhD`z9LIb3T!ZRksBm>Rc_SJjM`^r8 zEg}5`S33~@5Ze?rsiyvmRW9zS!^mu?vws@{&GeIBGr&ov-%J}G6io8|AOps!DY_|1 zU_r2j$-v4iVwm%-^aYxskMi5=^S+M?rW*EsN@Rj!qN!~0Q2$R@CH*vg1AAML-`)c3 z-JBEszD%w`LEVo4Oh*q7bmxDLf#HD>y1-QHki^ndW|j7ARJrlLe{(q* zlTGb9H|0a-Ga{q}0*80A<^hXtUm!?JtoaIS+@U*5>~B>%TVqmO@&m}z2OT+_;;sO9 zA`B%)jW6Jf^f<+;pXIrTpA0=vKZ34dPQ#a!yZ(ciuyPt_LOzesobZ_z-{SKl+4D2& z)8YwQe6oembOXFJzU+e+!P!QJ?WaNMFTO!-enj19@M#)+#y1!=*}B09&Ncix!{EfP zjQEup$zEs1$t>%;7r@r(1MnQJJW>099JI%MrXnR;+fB5}2ha+qY zg*G=Q*FS83YJ0fYVBr9bNUlbs2iMom-?;I2|9H?0qagtDCQAh?-D8B!+~5T}%z7`9 NZM;zM81Ids^nckys#5>} literal 0 HcmV?d00001 diff --git a/Player.ctxt b/Player.ctxt new file mode 100644 index 0000000..457b370 --- /dev/null +++ b/Player.ctxt @@ -0,0 +1,12 @@ +#BlueJ class context +comment0.params= +comment0.target=int\ getStars() +comment1.params= +comment1.target=void\ addToStars() +comment2.params= +comment2.target=void\ add() +comment3.params=set +comment3.target=int\ setStars(int) +comment4.params=sub +comment4.target=int\ removeFromStars(int) +numComments=5 diff --git a/Player.java b/Player.java new file mode 100644 index 0000000..2fa05c0 --- /dev/null +++ b/Player.java @@ -0,0 +1,198 @@ +import greenfoot.*; + +/** + * Write a description of class Player here. + * + * @author (Genosse Betakevin und Genosse Julien) + * @version (version 666) + */ +public class Player extends Actor +{ + @Override public GeneralMap getWorld(){ + return (GeneralMap) super.getWorld(); + } + int stars=0; + int add=0; + int id=0; + int provZahl=0; + int provVgl=0; + int [] stats = new int [6]; + boolean [] pBesitzer = new boolean [42]; + boolean gotProv = false; + boolean lostProv = false; + + private String n; + //definiert die ID und Namens Variable + public Player( int identity,String name) + { + n = name; + id = identity; + } + //gibt die Spieler ID zurück + public int getID() + { + return id; + } + // gibt den Spielernamen zurück + public String getDisplayName () + { + return n; + } + //gibt die Sternenanzahl zurück + private int getStars () + { + return stars; + } + // erhöht die Sternenzahl um eine random ausgewählte Anzahl von 1-3 + private void addToStars () + { + + int rand; + int pre; + rand = (int)(1+6*Math.random()); + if (rand == 1 || rand == 2|| rand == 3) + { + add = 1; + } + if (rand == 4|| rand == 5) + { + add = 2; + } + if (rand == 6) + { + add = 3; + } + if (gotProv== true) + { + pre = stars; + stars+=add; + System.out.println("Deine vorherige Sternenanzahl betrug " + pre + "."); + System.out.println("Du hast " + add + " Sterne erhalten."); + System.out.println("Deine aktuelle Sternenanzahl beträgt " + stars + "."); + + } + } + //eine Methode um addToStars zu testen + public void add () + { + addToStars(); + } + //eine für das Testen gedachte Methode, die die Anzahl der Sterne auf ein gewünschtes Maß setzt + public int setStars (int set) + { + stars = set; + return stars; + } + //eine Methode, die das Abziehen von Sternen testet und, wenn das Ergebnis >= 0 ist, die Sternenanzahl um eine gewählte Anzahl verringert + public int removeFromStars(int sub) + { + int s; + + s = stars - sub; + if (s>=0) + { + stars = s; + } + else + { + System.out.println ("Du hast nur " + stars + " Sterne, du kannst also nicht " + sub + " Sterne abziehen"); + } + return stars; + } + + public int getProvinceCount () + { + GeneralMap w= getWorld(); + int[] provinces = w.getProvinceOwners(); + for (int x=0; x<=42; x++ ) + { + if ( provinces [x] ==id) + { + provZahl++; + + } + } + if(stats[2] < provZahl) + { + stats[2]=provZahl; + + } + return provZahl; + } + + private void gotEntities(int gotEnt) + { + stats[3]+= gotEnt; + } + private void lostEntity() + { + stats[4]+=1; + } + private void maxEntities(int entNumber) + { + if (stats[5]< entNumber) + { + stats[5]=entNumber; + } + } + private boolean[] getMyProvinces() + { + GeneralMap w= getWorld(); + int[] provinces = w.getProvinceOwners(); + for (int x=0; x<=42; x++) + { + if (provinces[x]== id) + { + pBesitzer[x]=true; + } + else + { + pBesitzer[x]=false; + } + + } + return pBesitzer; + } + + private void gotlostProvince() + { + if (provVgl== provZahl) + { + gotProv = false; + lostProv =false; + + } + if(provVgl< provZahl) + { + gotProv = true; + lostProv = false; + stats[0]+=1; + } + if (provVgl > provZahl) + { + gotProv = false; + lostProv = true; + stats[1]+=1; + } + provVgl = provZahl; + } + + public boolean getGotProvince () + { + return gotProv; + } + + public boolean getLostProvince() + { + return lostProv; + } + private int[] getStatistics() + { + return stats; + } + private void redrawPlayer() + { + //Platzhalter + int x=0; + } +} From 045384db567ec463ac8309934a6bfb385447103d Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Tue, 7 Jun 2016 09:14:08 +0200 Subject: [PATCH 37/68] =?UTF-8?q?Button=20angepasst=20Autosize=20Eigenscha?= =?UTF-8?q?ft=20ist=20jetzt=20nun=20standardm=C3=A4=C3=9Fig=20auf=20"false?= =?UTF-8?q?"=20gesetzt,=20da=20dies=20selten=20gebraucht=20wird.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Button.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Button.java b/Button.java index d74127e..0c0975a 100644 --- a/Button.java +++ b/Button.java @@ -10,7 +10,7 @@ import java.awt.Color; */ public class Button extends GUI_Interface { - private boolean autoSize = true; + private boolean autoSize = false; private int textSize = 32; // as default text size private String text = ""; From 595b31110165b0dbb52ed9053950b6691817f77e Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Tue, 7 Jun 2016 18:40:40 +0200 Subject: [PATCH 38/68] =?UTF-8?q?Projektanpassung=20an=20Architektur=20#1?= =?UTF-8?q?=20Die=20meisten=20Methoden=20in=20der=20GeneralMap=20wurden=20?= =?UTF-8?q?kommentiert=20und=20verbessert,=20au=C3=9Ferdem=20bekam=20Gener?= =?UTF-8?q?alMap=20endlich=20nun=20wichtige=20Variablen=20dazu.=20Bei=20de?= =?UTF-8?q?r=20Province=20Klasse=20wurde=20ein=20Import-Fehler=20nun=20end?= =?UTF-8?q?g=C3=BCltig=20behoben.=20Die=20Klassen=20Spieleranzahl,=20Spiel?= =?UTF-8?q?optionen=20und=20Weltenauswahl=20wurden=20nun=20entfernt,=20da?= =?UTF-8?q?=20bei=20der=20neuen=20Aufgabenteilung=20diese=20unn=C3=B6tig?= =?UTF-8?q?=20wurden.=20Sie=20enthielten=20kaum=20Code,=20welcher=20aber?= =?UTF-8?q?=20f=C3=BCr=20massig=20Fehler=20sorgte.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GeneralMap.java | 187 +++++++++++++++++++++++---------------------- Province.java | 1 + Spieleranzahl.java | 32 -------- Spieloptionen.java | 21 ----- Weltenauswahl.java | 19 ----- 5 files changed, 97 insertions(+), 163 deletions(-) delete mode 100644 Spieleranzahl.java delete mode 100644 Spieloptionen.java delete mode 100644 Weltenauswahl.java diff --git a/GeneralMap.java b/GeneralMap.java index 27b1f87..4736d2b 100644 --- a/GeneralMap.java +++ b/GeneralMap.java @@ -7,98 +7,103 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) * @author GruenerWal, MaxiJohl * @version 0.2.0 */ -public class GeneralMap extends World +public abstract class GeneralMap extends World { - /** - * Felder, im Moment nur Anzahl der Provinzen - * Später evtl. weitere Werte wie Schwierigkeit denkbar - */ + /* + Felder, im Moment nur Anzahl der Provinzen + Später evtl. weitere Werte wie Schwierigkeit denkbar + */ - protected int provinzen; - - /** Konstruktor für nicht weiter definierte Map, sollte im Moment nicht benutzt werden. - * Später als Konstruktor für Default-Map denkbar. - */ - public GeneralMap(int x, int y, int p) - { - /** - * Erstellt eine leere Karte mit den übergebenen Eigenschaften - * @param x X-Ausdehnung der Welt - * @param y Y-Ausdehnung - * @param p Kantenlänge der Felder in Pixeln - */ - super(1600, 900, 1); - //addObject(new Menue_Button(),100,38); - //addObject(new Roll_Button(),84,835); - //addObject(new Roll_Button(),1513,835); - } - - static GeneralMap generateMap(int mapID) - { - //Platzhalter - return null; - } - - int getPlayerCount() - { - //Platzhalter - return 4; - } - - String getPlayerName() - { - //Platzhalter - return null; - } - - String getPlayerName(int plID) - { - //Platzhalter - return null; - } - - int getPlayerStars() - { - //Platzhalter - return 0; - } - - int getProvinceOwner(int prID) - { - //Platzhalter - return 0; - } - - int[] getProvinceOwners() - { - //Platzhalter; viel Arbeit :3 - int[] provinceOwners = new int[1]; - provinceOwners[0] = 0; - return provinceOwners; - } - - int getProvinceEntityCount(int prID) - { - //Platzhalter - return 0; - } - - int getProvincesEntityCounts(int[] prArr) - { - //Platzhalter - return 0; - } - - int getProvincesEntityCounts(boolean[] prArr) - { - //Platzhalter - return 0; - } - - int getProvincesEntityCounts(int plID) - { - //Platzhalter - return 0; - } + protected Province[] provinces; + protected Player[] players; + + protected int currentPlayer = 0; + + /** + Erstellt eine GeneralMap mit allen Eigenschaften und initialisiert die Arrays für Provinzen und Spieler. + @param backImage Das Hintergrundbild, welches von dieser Klasse geladen und dargestellt wird. + @param playerList Die Liste mit den Namen der Spieler + @param colorList Die Liste mit den Farben der Spieler + */ + public GeneralMap(String backImage, String[] playerList, int[] colorList) + { + + } + + /** + Gibt die Anzahl der vorhandenen Spieler aus. + */ + public int getPlayerCount() + { + return playerList.length; + } + + /** + Gibt den Namen des aktuellen Spielers aus. + @return Der Name des aktuellen Spielers + */ + public String getPlayerName() + { + return players[currentPlayer].getDisplayName(); + } + + /** + Gibt den Namen des Spielers aus, dem dessen ID gehört. + @param plID Die ID des zu findenden Spielers + @return Der Name des Spielers + */ + public String getPlayerName(int plID) + { + return players[plID].getDisplayName(); + } + + /** + Gibt die Anzahl der Sterne des aktuellen Spielers zurück. + @return Die Anzahl der Sterne des aktuellen Spielers + */ + public int getPlayerStars() + { + return players[currentPlayer].getStars(); + } + + /** + Gibt die ID des Spielers zurück, dem die gefragte Provinz gehört. + @param prID Die gefragte Provinz + */ + public int getProvinceOwner(int prID) + { + if(prID < 1 || prID > provinces.length) { + return -1; + } + return provinces[prID].getOwner(); + } + + /** + Gibt eine Liste mit allen Provinzen und deren Besitzern zurück. + @return Array mit der Provinz-ID als Index und dem Besitzer als Wert + */ + public int[] getProvinceOwners() + { + int[] prOwners = new int[provinces.length]; + for (int i = 1; i > provinces.length; i++) { + prOwners[i] = provinces.getOwner(); + } + return pwOwners; + } + + /** + Zählt die Anzahl der Einheiten von allen Provinzen zusammen, die einem bestimmten Spieler gehört. + @param playerID Die ID des Spielers, für den die Einheiten gezählt werden sollen. + @return Die Anzahl der Einheiten, die dem Spieler gehören. + */ + public int getProvinceEntityCount(int playerID) + { + int c = 0; + for (int i = 1; i > provinces.length; i++) { + if(provinces[i].getOwner() == playerID) { + c = c + provinces[i].getEntityCount(); + } + } + } } diff --git a/Province.java b/Province.java index f458acc..6d0996a 100644 --- a/Province.java +++ b/Province.java @@ -1,4 +1,5 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import java.awt.Color; /** * Write a description of class Province here. diff --git a/Spieleranzahl.java b/Spieleranzahl.java deleted file mode 100644 index 15730ea..0000000 --- a/Spieleranzahl.java +++ /dev/null @@ -1,32 +0,0 @@ -import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) - -/** - * Write a description of class Spieleranzahl here. - * - * @author (your name) - * @version (a version number or a date) - */ -public class Spieleranzahl extends Spieloptionen -{ - - /** - * Constructor for objects of class Spieleranzahl. - * - */ - public Spieleranzahl() - { - addObject (new Button(), 100, 300); - } - - public void act() - { - if (handler.buttonClicked(this)); - { - int s; - if (s > 3) - { - int s = Spieleranzahl; - } - } - } -} diff --git a/Spieloptionen.java b/Spieloptionen.java deleted file mode 100644 index 161a488..0000000 --- a/Spieloptionen.java +++ /dev/null @@ -1,21 +0,0 @@ -import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) - -/** - * Write a description of class Spieloptionen here. - * - * @author (your name) - * @version (a version number or a date) - */ -public class Spieloptionen extends World -{ - - /** - * Constructor for objects of class Spieloptionen. - * - */ - public Spieloptionen() - { - // Create a new world with 600x400 cells with a cell size of 1x1 pixels. - super(600, 400, 1); - } -} diff --git a/Weltenauswahl.java b/Weltenauswahl.java deleted file mode 100644 index f2458d9..0000000 --- a/Weltenauswahl.java +++ /dev/null @@ -1,19 +0,0 @@ -import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) - -/** - * Write a description of class Weltenauswahl here. - * - * @author (your name) - * @version (a version number or a date) - */ -public class Weltenauswahl extends Spieloptionen -{ - - /** - * Constructor for objects of class Weltenauswahl. - * - */ - public Weltenauswahl() - { - } -} From dd0fda34465f192b07bb390680aef80604ecbf88 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Fri, 10 Jun 2016 17:54:28 +0200 Subject: [PATCH 39/68] Delete Player.class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die kompilierten Versionen der Dateien müssen nicht unnötigerweise auf GitHub liegen. --- Player.class | Bin 3881 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Player.class diff --git a/Player.class b/Player.class deleted file mode 100644 index 21ca86e5e4d1a771b87b98f9d8066d685d8fd0ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3881 zcmZ`*`*Ryt75-LQY4upYl-NllJ5@s-w(8i>mXb6NYR7pP>^NYPkkpi{rLDZNwCk=` zP8?`UOG_zj(-NRS873u^2_0U2Bo0G6JO&tM_#60*{{lLN@9eG~u~pCb+`IRld+s^k zch0%`=SP3|BY+3+dI~$SsKJu)LK2_Al8Ca1iU?bTBVt*^<04!URS{nN;jOg8zZ7a% zN#Y_dX;@7mg9`~+p5ay%D3c1JMzN?MVo@ZPU1#N-u~=51$@FxIGtu>^8+nAv$>njgYI&DU zR~F7uujF{As7hP>N|c>y{nJ*EnYv)C7^7vwE{)E5u4R`FP^V;iXB@Z8`#J}QrjDDo z=^Eu}W0`yE5vOP>=$f)@^JJ~EV7hb0LYXU>DW_nRPaCc!-{GR_En0LeF?FhJteP&* z#}8Vz7ryvyBQ($LP=G1aTM~Vt}3eny{+Nw0P3r-b^1q zCW_er#1sLXbHWc=;Vsc+mzGu6uo-0sw+c%PFmyXnHN8+<9h{U)qg-Lsu32$b%ww)o zsT-@-76>e3?50}+vt<{|BTmhxx^jvC7ZvDtLYNfdM6Jr?(=eC z2a5_)LYco!NYWMKQd2caqyiQKT&7p+F8Fqag#Rwusgo|Z2Aao%qzD!WiLYpSQ(<-l z>m7`VfqGWevkIX_f}y)+(KRjxoGREv{7bHB+K)MoH|i%2iB8QrHMd|Mvm`mvf$oUV zq_g(8lxn7xjsrNVV;6So*dt<4#E^)*h*vM0}sb z@wy*iT*GTReuy72FDGibMWgEF6!e70bEdm!ls(fPQLsC>!C3NYX1Uz%g1^35@_5Ar zjuOJUF}vo{;P%kqaIRR(Eg81WYm9Q$$=Oz6QEu$6-)Jmcw#-G-78F0NtOgMjJ&iNzLj$=eJkK<-2!T{xi z{JM{$!ZDG*4du^>yzOg#hBEH2>)6M+9_U~{9^#k6tUpL8=ijE?D93T0kLIJdpo)lz zh>OrfB=X(y4^p>~%y;KMP;Vh6i)j&he)twT@>y!XLn{%;%@3l3G7A-*NTQ3f8=KIB zt$d6IINQY-_M(@*_ffx}z6@Xt+kH=Sfj6P2^b3cGjzl<)!;C+|`DgKP==~^1*^A|G zBK~Vm0tbT7ceI2aYlJ>VLqX`Rhdb8ewx`YE2#&P9SzUkgaNENyzu;zNKgki$Z+2}) z=kL+IRJd|5t6oD#Hg*k(Z2S!(PMBj^O+FLy8I#X$ed+(cS^12vB7q5N4&&SK|D z-@E8}ADOeau_?284ZZzq=*w*3WDQ%_a97LjHZIB`QOLGa;89Uf@3bH^M}3+fBC+yw zCe38r#+AE?@eosMgp@r%lJ=9-F+z5Xjc1mzKhD`z9LIb3T!ZRksBm>Rc_SJjM`^r8 zEg}5`S33~@5Ze?rsiyvmRW9zS!^mu?vws@{&GeIBGr&ov-%J}G6io8|AOps!DY_|1 zU_r2j$-v4iVwm%-^aYxskMi5=^S+M?rW*EsN@Rj!qN!~0Q2$R@CH*vg1AAML-`)c3 z-JBEszD%w`LEVo4Oh*q7bmxDLf#HD>y1-QHki^ndW|j7ARJrlLe{(q* zlTGb9H|0a-Ga{q}0*80A<^hXtUm!?JtoaIS+@U*5>~B>%TVqmO@&m}z2OT+_;;sO9 zA`B%)jW6Jf^f<+;pXIrTpA0=vKZ34dPQ#a!yZ(ciuyPt_LOzesobZ_z-{SKl+4D2& z)8YwQe6oembOXFJzU+e+!P!QJ?WaNMFTO!-enj19@M#)+#y1!=*}B09&Ncix!{EfP zjQEup$zEs1$t>%;7r@r(1MnQJJW>099JI%MrXnR;+fB5}2ha+qY zg*G=Q*FS83YJ0fYVBr9bNUlbs2iMom-?;I2|9H?0qagtDCQAh?-D8B!+~5T}%z7`9 NZM;zM81Ids^nckys#5>} From f9f4fd89a5b647ceffc150628762a835b71d6f1a Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Fri, 10 Jun 2016 17:55:22 +0200 Subject: [PATCH 40/68] Delete Player.ctxt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Diese Datei wird nur von Greenfoot während der Laufzeit erstellt und verwendet. Die reine Quellcode Datei als *.java reicht vollkommen aus. --- Player.ctxt | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 Player.ctxt diff --git a/Player.ctxt b/Player.ctxt deleted file mode 100644 index 457b370..0000000 --- a/Player.ctxt +++ /dev/null @@ -1,12 +0,0 @@ -#BlueJ class context -comment0.params= -comment0.target=int\ getStars() -comment1.params= -comment1.target=void\ addToStars() -comment2.params= -comment2.target=void\ add() -comment3.params=set -comment3.target=int\ setStars(int) -comment4.params=sub -comment4.target=int\ removeFromStars(int) -numComments=5 From bb152733c3678634ce1925f9f0568da62fa5fb2c Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Mon, 13 Jun 2016 19:29:26 +0200 Subject: [PATCH 41/68] Dice Entwicklung Anfang Eine erste Version der Dice Klasse, Anpassung der Architektur an abweichende Informationen erfolgt noch. --- Dice.java | 77 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 15 deletions(-) diff --git a/Dice.java b/Dice.java index 08b5c8a..f8e2342 100644 --- a/Dice.java +++ b/Dice.java @@ -1,19 +1,66 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** - * Write a description of class Dice here. - * - * @author (your name) - * @version (a version number or a date) + Stellt einen Würfel (von 1-6) dar, welcher in der Welt sichtbar dargestellt werden soll. + + @author Felix Stupp + @version 13.06.2016 */ -public class Dice extends Actor -{ - /** - * Act - do whatever the Dice wants to do. This method is called whenever - * the 'Act' or 'Run' button gets pressed in the environment. - */ - public void act() - { - // Add your action code here. - } -} +public class Dice extends GUI_Interface { + + private int number = 0; + + /** + Erstellt einen Würfel mit dem Startwert 0 (für noch nicht verwendet). + */ + public Dice() { + redraw(); + } + + /** + Erstellt einen Würfel mit einem bestimmten Startwert, welcher sofort sichtbar ist. + */ + public Dice(int startNumber) { + number = startNumber; + redraw(); + } + + /** + Gibt die aktuelle Zahl, die der Würfel anzeigt, aus. Gibt die Methode 0 zurück, heißt dies, dass der Würfel noch nicht gewürfelt wurde. + @return Die aktuelle Augenzahl oder 0 + */ + public int getNumber() { + return number; + } + + /** + Legt die Größe des Würfels als Quadrat fest. + */ + public void setSizeAsSquare(int l) { + setSize(l,l); + } + + /** + Würfelt den Würfel, erneuert die Darstellung und gibt die neue Augenzahl zurück. + */ + public int roll() { + number = (int) (Math.floor(Math.random()*6)+1) + redraw(); + return number; + } + + /** + Erneuert die Darstellung des Würfels. + */ + public void redraw() { + // einheitliche Größe X und Y + int eX = (int) Math.Round(sx/7); + int eY = (int) Math.Round(sy/7); + // Punktgröße X und Y + int pX = eX*2; + int pY = eY*2; + GreenfootImage i = new GreenfootImage(sx,sy); + + } + +} \ No newline at end of file From f3f88e8ac2adaabeac32d64549814d6b793d17bb Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Mon, 13 Jun 2016 20:02:26 +0200 Subject: [PATCH 42/68] =?UTF-8?q?Dice=20in=20der=20Architektur=20angepasst?= =?UTF-8?q?=20Vererbung=20von=20"GUI=5FInterface"=20eingetragen=20Weiteren?= =?UTF-8?q?=20Konstruktor=20hinzuge=C3=BCgt=20Neue=20Methoden=20"redraw"?= =?UTF-8?q?=20&=20"setSizeAsSquare"=20eingetragen=20Beschreibungen=20bishe?= =?UTF-8?q?riger=20Methoden=20erneuert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/architektur.md | 82 ++++++++++++++++++++++++++------------- planung/funktionsliste.md | 29 ++++++++------ 2 files changed, 73 insertions(+), 38 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index 3713161..1a11e57 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -56,13 +56,13 @@ Hier werden alle Klassen mit deren öffentliche Methoden (**public** und **prote - *Province* - *Player* -- *Dice* ### GUI Objekte - *GUI_Interface* -- *Label* -- *Button* + - *Label* + - *Button* + - *Dice* ### Sonstige @@ -447,29 +447,6 @@ Erzwingt das erneute Zeichnen des Player Objekts, um alle sichtbaren Eigenschaft --- -## Dice -*extends Actor* - -Stellt einen Würfel als *Actor* dar (vergleichbar mit dem Würfel aus unserem Projekt Zehntausend). - -### Private Eigenschaften - -- Augenzahl - -#### Augenzahl - -Diese Zahl zeigt der Würfel gerade an und kann mit **int getNumber()** abgerufen werden. - -### Zusätzliche Methoden - -- *int* **roll** () - -#### roll() - -Berechnet eine Zufallszahl von 1 bis 6, speichert diese ab und gibt sie auch so gleich zurück. Ändert auch die Anzeige des Würfels. - ---- - ## GUI_Interface *extends Actor* @@ -724,6 +701,59 @@ Erneuert die Darstellung des Buttons mit seinem Anzeigetext auf der Welt. Hiermi --- +## Dice +*extends GUI_Interface* + +### Konstruktorparameter + +Methode 1: **keine Parameter** + +Methode 2: +1. Startwert für die gespeicherte Augenzahl als *int* + +#### Startwert + +Dieser Wert wird im Voraus beim Dice hinterlegt, damit er diese direkt anzeigen kann. Wird dieser Wert nicht angegeben, wird als Augenzahl **0** hinterlegt, stehend für: noch nicht gewürfelt. + +### Private Eigenschaften + +- Augenzahl + +#### Augenzahl + +Der Wert, der beim letzten Würfeln gewürfelt wurde. Dieser Wert wird vom Würfel auch visuell dargestellt. + +### Public Methoden + +- *int* **getNumber** () + +- *void* **setSizeAsSquare** ( *int* length ) + +- *int* **roll** () + +- *void* **redraw** () + +#### getNumber() + +Gibt die aktuell gespeicherte und somit auch visuell sichtbare Augenzahl zurück. + +#### setSizeAsSquare() + +Legt die Größe des Würfels als Quadraht fest. Nur beim Verhältnis 1:1 von Länge:Breite kann eine verzerrungsfreie Darstellung garantiert werden. Vergleichbar mit folgender Zeile: +```java +dice.setSize(length,length) +``` + +#### roll() + +Würfelt den Würfel, speichert die neue Augenzahl ab und erneurt die visuelle Darstellung des Dice. + +#### redraw() + +Erneuert die visuelle Darstellung des Dice. + +--- + ## Utils Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verkleinern und besser lesbar gestalten soll. Ergänzungen in Form von eigenen Funktionen dürfen **selbst** eingebracht werden. Alle Methoden dieser Klasse sollen *public* sein. diff --git a/planung/funktionsliste.md b/planung/funktionsliste.md index 7176b47..826e918 100644 --- a/planung/funktionsliste.md +++ b/planung/funktionsliste.md @@ -13,7 +13,7 @@ Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschriebe Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methodenn im Code präsent habt. -## GeneralMap +## GeneralMap (erweitert World) - *GeneralMap* ( *String* backgroundImage, *String[]* playerList, *int[]* colorList ) @@ -28,7 +28,7 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *int[]* **getProvinceOwners** () - *int* **getProvinceEntityCount** ( *int* playerID ) -## Province +## Province (erweitert Actor) - *Province* ( *int* provinceID, *int* continentID, *int* xPos, *int* yPos, *String* displayName, *int* stars, *int[]* neighbourProvinces ) @@ -51,7 +51,7 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *void* **redrawProvince** () -## Player +## Player (erweitert Actor) - *Player* ( *int* playerID, *String* displayName, *int* playerColor ) @@ -74,15 +74,7 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *int* **getProvinceCount** () - *void* **redrawPlayer** () -## Dice - -- *Dice* () - -- *int* **getNumber** () - -- *int* **roll** () - -## GUI_Interface +## GUI_Interface (erweitert Actor) - protected *int* **sx** - protected *int* **sy** @@ -128,4 +120,17 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *void* **setHandler** ( *ButtonEvent* newEventHandler ) - *void* **removeHandler** () +- *void* **redraw** () + +## Dice (erweitert GUI_Interface) + +- *Dice* () +- *Dice* ( *int* startNumber ) + +- *int* **getNumber** () + +- *void* **setSizeAsSquare** () + +- *int* **roll** () + - *void* **redraw** () \ No newline at end of file From 02c69ee90accca4d2587a80d89e351a2dc43bb3a Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Mon, 13 Jun 2016 20:03:46 +0200 Subject: [PATCH 43/68] =?UTF-8?q?Architektur=20verbessert=20Fehlenden=20Pa?= =?UTF-8?q?rameter=20in=20der=20Funktionsliste=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/funktionsliste.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planung/funktionsliste.md b/planung/funktionsliste.md index 826e918..2817706 100644 --- a/planung/funktionsliste.md +++ b/planung/funktionsliste.md @@ -129,7 +129,7 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *int* **getNumber** () -- *void* **setSizeAsSquare** () +- *void* **setSizeAsSquare** ( *int* length ) - *int* **roll** () From a19ba5443dce593acb004081f017f2254cd16201 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Mon, 13 Jun 2016 20:38:30 +0200 Subject: [PATCH 44/68] Dice erweitert um Grafikengine Der Dice sollte nun in der Lage sein, seine aktuelle Augenzahl grafisch darzustellen. --- Dice.java | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/Dice.java b/Dice.java index f8e2342..2cf51a8 100644 --- a/Dice.java +++ b/Dice.java @@ -49,18 +49,40 @@ public class Dice extends GUI_Interface { return number; } + /** + Zeichnet auf dem gegebenen GreenfootImage ein Oval an der gegebenen Stelle multipliziert mit der einheitlichen Größe. + */ + private void fO(GreenfootImage i, int eX, int eY, int x, int y) { + i.fillOval(eX*x,eY*y,eX*2,eY*2) + } + /** Erneuert die Darstellung des Würfels. */ public void redraw() { - // einheitliche Größe X und Y - int eX = (int) Math.Round(sx/7); - int eY = (int) Math.Round(sy/7); - // Punktgröße X und Y - int pX = eX*2; - int pY = eY*2; + // einheitliche Größe X und Y (ein Vierzehntel der gesamten Breite und Höhe) + int eX = (int) Math.Round(sx/8); + int eY = (int) Math.Round(sy/8); + // Vereinfachung für die Augenzahl + int a = number; GreenfootImage i = new GreenfootImage(sx,sy); - + i.setColor(new java.awt.Color(0,0,0,0)); + i.clear(); + i.setColor(backC); + i.fillShape(0,0,sx,sy,eX/2,eY/2); + i.setColor(foreC); + if(a==1||a==3||a==5) { //Mittlerer Punkt + fO(i,eX,eY,3,3); + } else if(a>1) { //Punkte links-oben und rechts-unten + fO(i,eX,eY,1,1); + fO(i,eX,eY,5,5); + } else if(a>3) { //Punkte links-unten und rechts-oben + fO(i,eX,eY,1,5); + fO(i,eX,eY,5,1); + } else if(a>5) { //Punkte links-mitte und rechts-mitte + fO(i,eX,eY,1,3); + fO(i,eX,eY,5,3); + } + setImage(i); } - } \ No newline at end of file From a761c7755281ebb58fbb48de1a496043ce4805a5 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Mon, 13 Jun 2016 20:39:50 +0200 Subject: [PATCH 45/68] =?UTF-8?q?Dice=20Fehler=20verbessert=20Fehlende=20S?= =?UTF-8?q?emikolons=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dice.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dice.java b/Dice.java index 2cf51a8..a2c0b6e 100644 --- a/Dice.java +++ b/Dice.java @@ -44,7 +44,7 @@ public class Dice extends GUI_Interface { Würfelt den Würfel, erneuert die Darstellung und gibt die neue Augenzahl zurück. */ public int roll() { - number = (int) (Math.floor(Math.random()*6)+1) + number = (int) (Math.floor(Math.random()*6)+1); redraw(); return number; } @@ -53,7 +53,7 @@ public class Dice extends GUI_Interface { Zeichnet auf dem gegebenen GreenfootImage ein Oval an der gegebenen Stelle multipliziert mit der einheitlichen Größe. */ private void fO(GreenfootImage i, int eX, int eY, int x, int y) { - i.fillOval(eX*x,eY*y,eX*2,eY*2) + i.fillOval(eX*x,eY*y,eX*2,eY*2); } /** From 4f09f512ef9ffb0b538a44e9fa033ea823269e55 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Mon, 13 Jun 2016 21:31:24 +0200 Subject: [PATCH 46/68] =?UTF-8?q?Debug=20Session=20Fehlerbehebungen=20Gene?= =?UTF-8?q?ralMap=2030:=20Konstruktor=20erweitert=2038:=20playerList=20zu?= =?UTF-8?q?=20players=2089:=20provinces[i]=2091:=20pw=20zu=20pr=20107:=20r?= =?UTF-8?q?eturn=20Statement=20hinzugef=C3=BCgt=20Map=5FWorld=2025:=20Kons?= =?UTF-8?q?truktorparamter=20hinzugef=C3=BCgt=20und=20weitergeleitet=2026:?= =?UTF-8?q?=20Konstruktor=20Aufruf=20entfernen=2027:=20Internes=20Array=20?= =?UTF-8?q?nach=20au=C3=9Fen=20verlagert=2029:=20Kommentartyp=20angepasst?= =?UTF-8?q?=2032:=20Kommentar=20verk=C3=BCrzt=20Dice=2064=20&=2065:=20Roun?= =?UTF-8?q?d=20zu=20round=2072:=20Konstruktoraufruf=20von=20java.awt.geom.?= =?UTF-8?q?RoundRectangle2D.Double=2073=20&=2076=20&=2079=20&=2082:=20else?= =?UTF-8?q?=20entfernt=20Player=2025:=20color-Eigenschaft=20als=20private?= =?UTF-8?q?=20Variable=20und=20als=20Konstruktorparameter=20eingef=C3=BChr?= =?UTF-8?q?t=2042=20&=2049=20&=20123=20&=20127=20&=20138=20&=20189:=20Meth?= =?UTF-8?q?oden=20von=20private=20zu=20public=20ArmySchubser=2018:=20Konst?= =?UTF-8?q?ruktorparamter=20hinzugef=C3=BCgt=20und=20weitergeleitet=2028?= =?UTF-8?q?=20&=2037:=20For-Anfang=20auf=201=20erh=C3=B6ht=20GUI=5FInterfa?= =?UTF-8?q?ce=2015=20&=2018:=20Standardgr=C3=B6=C3=9Fe=20erh=C3=B6ht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ArmySchubser.java | 7 ++++--- Dice.java | 13 +++++++------ GUI_Interface.java | 4 ++-- GeneralMap.java | 13 +++++++++---- Map_World.java | 20 +++----------------- Player.java | 16 +++++++++------- 6 files changed, 34 insertions(+), 39 deletions(-) diff --git a/ArmySchubser.java b/ArmySchubser.java index 4691f74..3ba98bf 100644 --- a/ArmySchubser.java +++ b/ArmySchubser.java @@ -15,8 +15,9 @@ public class ArmySchubser extends Map_World * Constructor for objects of class ArmySchubser. * */ - public ArmySchubser() + public ArmySchubser(String[] playerList, int[] colorList) { + super(playerList,colorList); // Hi. } @@ -25,7 +26,7 @@ public class ArmySchubser extends Map_World Province firstProvince = null; Province secondProvince = null; - for ( int i = 0; i <= provinceCount; i++) + for ( int i = 1; i <= provinceCount; i++) { if (provinces[i].hasClicked() == true) { @@ -34,7 +35,7 @@ public class ArmySchubser extends Map_World } } - for ( int i = 0; i <= provinceCount; i++) + for ( int i = 1; i <= provinceCount; i++) { if (provinces[i].hasClicked() == true && provinces[i] != firstProvince) { diff --git a/Dice.java b/Dice.java index a2c0b6e..d4cd8a3 100644 --- a/Dice.java +++ b/Dice.java @@ -61,25 +61,26 @@ public class Dice extends GUI_Interface { */ public void redraw() { // einheitliche Größe X und Y (ein Vierzehntel der gesamten Breite und Höhe) - int eX = (int) Math.Round(sx/8); - int eY = (int) Math.Round(sy/8); + int eX = (int) Math.round(sx/8); + int eY = (int) Math.round(sy/8); // Vereinfachung für die Augenzahl int a = number; GreenfootImage i = new GreenfootImage(sx,sy); i.setColor(new java.awt.Color(0,0,0,0)); i.clear(); i.setColor(backC); - i.fillShape(0,0,sx,sy,eX/2,eY/2); + i.fillShape(new java.awt.geom.RoundRectangle2D.Double(0,0,sx,sy,eX/2,eY/2)); i.setColor(foreC); + // das "else" fehlt absichtlich if(a==1||a==3||a==5) { //Mittlerer Punkt fO(i,eX,eY,3,3); - } else if(a>1) { //Punkte links-oben und rechts-unten + } if(a>1) { //Punkte links-oben und rechts-unten fO(i,eX,eY,1,1); fO(i,eX,eY,5,5); - } else if(a>3) { //Punkte links-unten und rechts-oben + } if(a>3) { //Punkte links-unten und rechts-oben fO(i,eX,eY,1,5); fO(i,eX,eY,5,1); - } else if(a>5) { //Punkte links-mitte und rechts-mitte + } if(a>5) { //Punkte links-mitte und rechts-mitte fO(i,eX,eY,1,3); fO(i,eX,eY,5,3); } diff --git a/GUI_Interface.java b/GUI_Interface.java index 29fd7f0..8b2262e 100644 --- a/GUI_Interface.java +++ b/GUI_Interface.java @@ -12,11 +12,11 @@ public abstract class GUI_Interface extends Actor /** Die Breite des Objektes */ - protected int sx = 1; + protected int sx = 20; /** Die Höhe des Objektes */ - protected int sy = 1; + protected int sy = 20; /** Die Hintergrundfarbe des Objektes */ diff --git a/GeneralMap.java b/GeneralMap.java index 4736d2b..01ce194 100644 --- a/GeneralMap.java +++ b/GeneralMap.java @@ -27,7 +27,11 @@ public abstract class GeneralMap extends World */ public GeneralMap(String backImage, String[] playerList, int[] colorList) { - + super(1600,900,1); + players = new Player[playerList.length]; + for (int i = 0; i < playerList.length; i++) { + players[i] = new Player(i,playerList[i],colorList[i]); + } } /** @@ -35,7 +39,7 @@ public abstract class GeneralMap extends World */ public int getPlayerCount() { - return playerList.length; + return players.length; } /** @@ -86,9 +90,9 @@ public abstract class GeneralMap extends World { int[] prOwners = new int[provinces.length]; for (int i = 1; i > provinces.length; i++) { - prOwners[i] = provinces.getOwner(); + prOwners[i] = provinces[i].getOwner(); } - return pwOwners; + return prOwners; } /** @@ -104,6 +108,7 @@ public abstract class GeneralMap extends World c = c + provinces[i].getEntityCount(); } } + return c; } } diff --git a/Map_World.java b/Map_World.java index 2a3e5fa..e3f39db 100644 --- a/Map_World.java +++ b/Map_World.java @@ -21,28 +21,14 @@ public class Map_World extends GeneralMap * konstruiert eine GeneralMap mit den Ausmassen 1600 auf 900 Pixel. */ - public Map_World() + public Map_World(String[] playerList, int[] colorList) { - super(1600,900,1); - Province[] provinces; - - /** + super("",playerList,colorList); + /* * Hier werden später sämtliche Provinzen der Standard-Map erstellt. * Dies funktioniert folgendermassen: * ================================================================= * - * VERALTETER KOMMENTAR VON GruenerWal: - * Im Folgenden wird nun jede Provinz einzeln erstellt: - * |--- - * nextProvinces = new int[]; - * - * provinces[] = new Province(,,,,,"",nextProvinces); - * addObject(provinces[],,); - * ---| - * - * ================================================================= - * - * NEUES FORMAT VON FELIX STUPP: * Dieses kürzere Format ersetzt den langen Code und sorgt eventuell sogar für einen Geschwindigkeitsschub. Dabei sollte diesselbe Funktionalität erhalten bleiben. * * provinces[] = new Province(,,,,,"", new int[] { }); diff --git a/Player.java b/Player.java index 2fa05c0..3d5d2fe 100644 --- a/Player.java +++ b/Player.java @@ -22,11 +22,13 @@ public class Player extends Actor boolean lostProv = false; private String n; + private int c; //definiert die ID und Namens Variable - public Player( int identity,String name) + public Player( int identity,String name, int color) { n = name; id = identity; + c = color; } //gibt die Spieler ID zurück public int getID() @@ -39,12 +41,12 @@ public class Player extends Actor return n; } //gibt die Sternenanzahl zurück - private int getStars () + public int getStars () { return stars; } // erhöht die Sternenzahl um eine random ausgewählte Anzahl von 1-3 - private void addToStars () + public void addToStars () { int rand; @@ -120,11 +122,11 @@ public class Player extends Actor return provZahl; } - private void gotEntities(int gotEnt) + public void gotEntities(int gotEnt) { stats[3]+= gotEnt; } - private void lostEntity() + public void lostEntity() { stats[4]+=1; } @@ -135,7 +137,7 @@ public class Player extends Actor stats[5]=entNumber; } } - private boolean[] getMyProvinces() + public boolean[] getMyProvinces() { GeneralMap w= getWorld(); int[] provinces = w.getProvinceOwners(); @@ -186,7 +188,7 @@ public class Player extends Actor { return lostProv; } - private int[] getStatistics() + public int[] getStatistics() { return stats; } From 8ab61027ceff873f0bc627fa0da036f1b59d2e5d Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Tue, 14 Jun 2016 08:59:25 +0200 Subject: [PATCH 47/68] =?UTF-8?q?Dice=20grafisch=20angepasst=20Abgerundete?= =?UTF-8?q?=20Ecken=20vergr=C3=B6=C3=9Fert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dice.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dice.java b/Dice.java index d4cd8a3..a67d05b 100644 --- a/Dice.java +++ b/Dice.java @@ -69,7 +69,7 @@ public class Dice extends GUI_Interface { i.setColor(new java.awt.Color(0,0,0,0)); i.clear(); i.setColor(backC); - i.fillShape(new java.awt.geom.RoundRectangle2D.Double(0,0,sx,sy,eX/2,eY/2)); + i.fillShape(new java.awt.geom.RoundRectangle2D.Double(0,0,sx,sy,eX,eY)); i.setColor(foreC); // das "else" fehlt absichtlich if(a==1||a==3||a==5) { //Mittlerer Punkt From 1ee7463a33a0ec3c24d70f3a72af7d4407c6dbab Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Tue, 14 Jun 2016 09:00:54 +0200 Subject: [PATCH 48/68] =?UTF-8?q?DicesList=20eingef=C3=BChrt=20Diese=20neu?= =?UTF-8?q?e=20abstrakte=20Klasse=20generiert=20eine=20Liste=20von=20W?= =?UTF-8?q?=C3=BCrfeln,=20welche=20hintereinander=20dargestellt=20werden.?= =?UTF-8?q?=20Die=20Unterklassen=20DefenderDices=20&=20OffenderDices=20pas?= =?UTF-8?q?sen=20jeweils=20nur=20noch=20die=20Farbe=20der=20W=C3=BCrfel=20?= =?UTF-8?q?an.=20Entsprechende=20Eintr=C3=A4ge=20in=20die=20Architektur=20?= =?UTF-8?q?folgen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DefenderDices.java | 16 +++++++++++++ DicesList.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++ OffenderDices.java | 16 +++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 DefenderDices.java create mode 100644 DicesList.java create mode 100644 OffenderDices.java diff --git a/DefenderDices.java b/DefenderDices.java new file mode 100644 index 0000000..d4fd927 --- /dev/null +++ b/DefenderDices.java @@ -0,0 +1,16 @@ +import greenfoot.*; +import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) + +/** + Erstellt eine gegebene Anzahl an DefenderDice's, welche dann nebeneinander eingereiht werden. + + @author Felix Stupp + @version 14.06.2016 +*/ +public class DefenderDices extends DicesList { + + public DefenderDices(int count) { + genDices(count, 2, new Color(0,0,0), (new Color(255,255,255)); + } + +} diff --git a/DicesList.java b/DicesList.java new file mode 100644 index 0000000..cb0fdfa --- /dev/null +++ b/DicesList.java @@ -0,0 +1,60 @@ +import greenfoot.*; +import java.awt.Color; +import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) + +/** + Erstellt eine gegebene Anzahl an Dices's, welche dann nebeneinander eingereiht werden. + + @author Felix Stupp + @version 14.06.2016 +*/ +public abstract class DicesList extends Actor { + + private final static int SQUARESIZE = 100; // Anpassbar + private Dice[] dices; + + public DicesList() { + setImage(new GreenfootImage(2,2)); + } + + protected void genDices(int count, int max, Color bC, Color fC) { + if(count < 1) { + count = 1; + } else if (count > max) { + count = max; + } + for(int i = 1; i < count; i++) { + Dice d = new Dice(); + d.setBackColor(bC); + d.setForeColor(fC); + d.setSizeAsSquare(SQUARESIZE); + dices[i] = d; + } + } + + protected void addedToWorld(World w) { + for(int i = 0; i < dices.length; i++) { + w.addObject(dices[i],w.getX()+(SQUARESIZE*(6/5)*i),w.getY()); + } + //w.removeObject(this); // Zeile auskommentieren, wenn die Debug-Phase vorbei ist. + } + + public int[] getNumbers() { + int[] n = new int[dices.length]; + for(int i = 0; i < dices.length; i++) { + n[i] = dices[i].getNumber(); + } + Arrays.sort(n); + return n; + } + + public int[] roll() { + int[] n = new int[dices.length]; + for(int i = 0; i < dices.length; i++) { + n[i] = dices[i].roll(); + } + Arrays.sort(n); + return n; + } + +} diff --git a/OffenderDices.java b/OffenderDices.java new file mode 100644 index 0000000..e2123d5 --- /dev/null +++ b/OffenderDices.java @@ -0,0 +1,16 @@ +import greenfoot.*; +import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) + +/** + Erstellt eine gegebene Anzahl an OffenderDice's, welche dann nebeneinander eingereiht werden. + + @author Felix Stupp + @version 14.06.2016 +*/ +public class OffenderDices extends DicesList { + + public OffenderDices(int count) { + genDices(count, 3, new Color(255,0,0), (new Color(255,255,255)); + } + +} From 4c0119737dc7004f0084c33fc495bcfd6a72ec01 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Wed, 15 Jun 2016 19:37:03 +0200 Subject: [PATCH 49/68] Architektur Inhaltsangabe angepasst Die Extra Kategorie "GUI Objekte" wurde entfernt, da an der Vererbung von *GUI_Interface* eindeutig erkennbar sein sollte, welche Art von Actoren sich als GUI Objekte eignen. --- planung/architektur.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index 1a11e57..e63d545 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -57,8 +57,6 @@ Hier werden alle Klassen mit deren öffentliche Methoden (**public** und **prote - *Province* - *Player* -### GUI Objekte - - *GUI_Interface* - *Label* - *Button* From 93c0ccc2055d5bc6676c5ba829b0f776dec62d08 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Wed, 15 Jun 2016 20:49:02 +0200 Subject: [PATCH 50/68] =?UTF-8?q?DicesList=20und=20Unterklassen=20verbesse?= =?UTF-8?q?rt=20Die=20Methode=20**genDices**=20wurde=20direkt=20in=20den?= =?UTF-8?q?=20Konstruktor=20der=20*DicesList*=20integriert.=20Es=20wurde?= =?UTF-8?q?=20ein=20Kompilierungsfehler=20bei=20der=20*DicesList*=20verbes?= =?UTF-8?q?sert.=20Die=20Sortierung=20der=20Augenzahlen=20wurde=20nun=20zu?= =?UTF-8?q?=20absteigend=20ge=C3=A4ndert,=20die=20Funktionsweise=20hierf?= =?UTF-8?q?=C3=BCr=20wurde=20in=20die=20*Utils*=20Klasse=20ausgelagert.=20?= =?UTF-8?q?*DicesList*=20bekam=20die=20Methode=20**removeAll**=20dazu.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DefenderDices.java | 4 ++-- DicesList.java | 25 ++++++++++++++----------- OffenderDices.java | 4 ++-- Utils.java | 18 ++++++++++++++---- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/DefenderDices.java b/DefenderDices.java index d4fd927..a13634f 100644 --- a/DefenderDices.java +++ b/DefenderDices.java @@ -5,12 +5,12 @@ import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and Mouse Erstellt eine gegebene Anzahl an DefenderDice's, welche dann nebeneinander eingereiht werden. @author Felix Stupp - @version 14.06.2016 + @version 15.06.2016 */ public class DefenderDices extends DicesList { public DefenderDices(int count) { - genDices(count, 2, new Color(0,0,0), (new Color(255,255,255)); + super(count, 2, new Color(0,0,0), (new Color(255,255,255)); } } diff --git a/DicesList.java b/DicesList.java index cb0fdfa..934a74d 100644 --- a/DicesList.java +++ b/DicesList.java @@ -1,23 +1,18 @@ import greenfoot.*; -import java.awt.Color; -import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** Erstellt eine gegebene Anzahl an Dices's, welche dann nebeneinander eingereiht werden. @author Felix Stupp - @version 14.06.2016 + @version 15.06.2016 */ public abstract class DicesList extends Actor { private final static int SQUARESIZE = 100; // Anpassbar private Dice[] dices; - public DicesList() { + public DicesList(int count, int max, java.awt.Color bC, java.awt.Color fC) { setImage(new GreenfootImage(2,2)); - } - - protected void genDices(int count, int max, Color bC, Color fC) { if(count < 1) { count = 1; } else if (count > max) { @@ -30,11 +25,11 @@ public abstract class DicesList extends Actor { d.setSizeAsSquare(SQUARESIZE); dices[i] = d; } - } + } protected void addedToWorld(World w) { for(int i = 0; i < dices.length; i++) { - w.addObject(dices[i],w.getX()+(SQUARESIZE*(6/5)*i),w.getY()); + w.addObject(dices[i],getX()+(SQUARESIZE*(6/5)*i),getY()); } //w.removeObject(this); // Zeile auskommentieren, wenn die Debug-Phase vorbei ist. } @@ -44,7 +39,7 @@ public abstract class DicesList extends Actor { for(int i = 0; i < dices.length; i++) { n[i] = dices[i].getNumber(); } - Arrays.sort(n); + Utils.sortDesc(n); return n; } @@ -53,8 +48,16 @@ public abstract class DicesList extends Actor { for(int i = 0; i < dices.length; i++) { n[i] = dices[i].roll(); } - Arrays.sort(n); + Utils.sortDesc(n); return n; } + public void removeAll() { + for(int i = 0; i < dices.length; i++) { + dices[i].getWorld().removeObject(dices[i]); + } + getWorld().removeObject(this); + dices = new Dice[0]; + } + } diff --git a/OffenderDices.java b/OffenderDices.java index e2123d5..bcc7542 100644 --- a/OffenderDices.java +++ b/OffenderDices.java @@ -5,12 +5,12 @@ import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and Mouse Erstellt eine gegebene Anzahl an OffenderDice's, welche dann nebeneinander eingereiht werden. @author Felix Stupp - @version 14.06.2016 + @version 15.06.2016 */ public class OffenderDices extends DicesList { public OffenderDices(int count) { - genDices(count, 3, new Color(255,0,0), (new Color(255,255,255)); + super(count, 3, new Color(255,0,0), (new Color(255,255,255)); } } diff --git a/Utils.java b/Utils.java index 5081b61..87a34cd 100644 --- a/Utils.java +++ b/Utils.java @@ -1,11 +1,12 @@ import greenfoot.*; import java.awt.Color; +import java.util.*; /** - * Diese Klasse enthält nur statische Funktionen, welche für euch als Unterstützung gedacht sind. Damit könnt ihr dann hoffentlich viele Code-Zeilen sparen. :) - * - * @author Zocker1999_NET - * @version 1 + Diese Klasse enthält nur statische Funktionen, welche für euch als Unterstützung gedacht sind. Damit könnt ihr dann hoffentlich viele Code-Zeilen sparen. :) + + @author Zocker1999_NET + @version 15.06.2016 */ public final class Utils { @@ -59,4 +60,13 @@ public final class Utils { i.fillRect(b,b,sx-(2*b),sy-(2*b)); } + /** + Sortiert ein int[]-Array absteigend. + @param a Das zu sortierende Array + */ + public static void sortDesc(int[] a) { + Arrays.sort(a); + Collection.sort(a,Collections.reverseOrder()); + } + } From 5d2b6a5caf37f3cd9dffbcf1cb778d5abb1c1c7c Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Wed, 15 Jun 2016 20:53:31 +0200 Subject: [PATCH 51/68] Architektur erweitert Die *DicesList* Klasse und deren Unterklassen wurden aufgenommen. Die Erweiterung der *Utils*-Klasse wurde aufgenommen. Bei der Funktionsliste wurde das Wort "erweitert" durch "extends" ersetzt. --- planung/architektur.md | 114 ++++++++++++++++++++++++++++++++++++-- planung/funktionsliste.md | 47 ++++++++++++---- 2 files changed, 146 insertions(+), 15 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index e63d545..4864cc6 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -1,6 +1,6 @@ # Architekturplan Zweiundvierzig -**Letztes Update: 04.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Letztes Update: 15.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) @@ -62,6 +62,10 @@ Hier werden alle Klassen mit deren öffentliche Methoden (**public** und **prote - *Button* - *Dice* +- *DicesList* + - *OffenderDices* + - *DefenderDices* + ### Sonstige - *Utils* @@ -445,6 +449,92 @@ Erzwingt das erneute Zeichnen des Player Objekts, um alle sichtbaren Eigenschaft --- +## DicesList +*extends Actor* + +Erstellt die gegebene Anzahl an Würfeln nebeneinander und bietet die gemeinsame Verwaltung dieser. Diese Klasse ist nur als *abstract* Oberklasse zu *OffenderDices* & *DefenderDices* gedacht und ist daher selbst nicht verwendbar, dennoch sich hier alle Methoden, die ihr braucht, definiert. Die Unterklassen legen nur die Farbe der Würfel und die maximale Anzahl fest. + +### Verwendung + +Nachdem ihr euch für eine Unterklasse entschieden habt, erstellt ihr eine neue Instanz von dieser und übergibt ihr die Anzahl der Würfel, die ihr darstellen wollt (diese Zahl kann größer als die erlaubte Anzahl an Würfel sein, dies wird **automatisch korrigiert**, beim Angreifer auf 3, beim Verteidiger auf 2). Bei zu kleinen Zahlen wird auf 1 korrigiert. +```java +DicesList offenders = new OffenderDices(5); // Wird korrigiert auf '3' +DicesList defenders = new DefenderDices(-3); // Wird korrigiert auf '1' +``` +Die nun erstellte Instanz solltet ihr einer Welt hinzufügen, um die Würfel sehen zu können. Achtet dabei auf die Position, die ihr der Welt übergibt. +```java +addObject(offenders,200,800); +``` +Nun könnt ihr mit den Methoden **getNumbers** und **roll** alle Würfel parallel steuern. +```java +int[] zahlenAng = offenders.roll(); +int[] zahlenVer = defenders.getNumbers(); +if(zahlenAng[1] > zahlenVer[1]) { + // Angreifer gewinnt +} else { + // Verteidiger gewinnt +} +``` +Solltet ihr die Würfel nicht mehr brauchen und ihr möchtet sie entfernen, reicht ein simpler Aufruf von **removeAll**. +```java +offenders.removeAll(); +offenders = null; // muss nicht sein, gehört aber zum sauberen Programmieren dazu +``` + +### Konstruktorparameter + +1. Anzahl der Würfel als *int* (Weiterleitung des Konstruktors von den Unterklassen) +2. Maximale Anzahl als *int* (fester Wert der Unterklasse) +3. Hintergundfarbe als *java.awt.Color* (fester Wert der Unterklasse) +4. Vordergrundfarbe als *java.awt.Color* (fester Wert der Unterklasse) + +### Protected Methoden + +- *void* **addedToWorld** ( *World* world ) + +#### addedToWorld() + +Diese Methode wird von Greenfoot selbst aufgerufen, sobald dieser Actor einer Welt hinzugefügt wurde und kümmert sich folgend darum, seine eigenen Würfel auch der Welt hinzuzufügen an derselben Position. + +### Public Methoden + +- *int[]* **getNumbers** () +- *int[]* **roll** () + +- *void* **removeAll** () + +#### getNumbers() + +Gibt die Augenzahlen aller Würfel in sortierter Reihenfolge (absteigend) aus. + +#### roll() + +Würfelt alle Würfel erneut und gibt die neuen Augenzahlen in sortierter Reihenfolge (absteigend) aus. + +#### removeAll() + +Entfernt alle Würfel aus ihrer Welt und löscht anschließend die Liste. Die Instanz ist danach nicht mehr zu verwenden. + +## OffendersDices +*extends DicesList* + +Erstellt eine Liste von Würfeln mit roter Hintergrundfarbe. Es sind maximal 3 Würfel erlaubt. Zur Verwendung, siehe *DicesList*. + +### Konstruktorparamter + +1. Anzahl der Würfel als *int* (wird korrigiert; siehe *DicesList*-Konstruktor) + +## DefenderDices +*extends DicesList* + +Erstellt eine Liste von Würfeln mit schwarzer Hintergrundfarbe. Es sind maximal 2 Würfel erlaubt. Zur Verwendung, siehe *DicesList*. + +### Konstruktorparamter + +1. Anzahl der Würfel als *int* (wird korrigiert; siehe *DicesList*-Konstruktor) + +--- + ## GUI_Interface *extends Actor* @@ -754,12 +844,26 @@ Erneuert die visuelle Darstellung des Dice. ## Utils -Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verkleinern und besser lesbar gestalten soll. Ergänzungen in Form von eigenen Funktionen dürfen **selbst** eingebracht werden. Alle Methoden dieser Klasse sollen *public* sein. +Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verkleinern und besser lesbar gestalten soll. Ergänzungen in Form von eigenen Funktionen dürfen **selbst** eingebracht werden. Alle Methoden dieser Klasse sollen *public* und *static* sein. -### copyArray() +### Static Methoden + +- *boolean[]* **copyArray** ( *boolean[]* array ) +- *int[]* **copyArray** ( *int[]* array ) +- *String[]* **copyArray** ( *String[]* array ) + +- *void* **drawInsideRectangle** ( *GreenfootImage* i, *Color* c, *int* b ) + +- *void* **sortDesc** ( **int[]** array ) + +#### copyArray() Kopiert ein Array des Types *boolean*, *int* oder *String* mit identischer Größe. -### drawInsideRectangle() +#### drawInsideRectangle() + +Zeichnet innerhalb eines *GreenfootImage* ein Rechteck gefüllt mit der angegebenen Farbe. Es besitzt zu allen Seiten den gegebenen Abstand zum Rand des Image. + +#### sortDesc() -Zeichnet innerhalb eines **GreenfootImage** ein Rechteck gefüllt mit der angegebenen Farbe. Es besitzt zu allen Seiten den gegebenen Abstand zum Rand des Image. \ No newline at end of file +Sortiert ein *int[]*-Array absteigend. \ No newline at end of file diff --git a/planung/funktionsliste.md b/planung/funktionsliste.md index 2817706..09b9f2d 100644 --- a/planung/funktionsliste.md +++ b/planung/funktionsliste.md @@ -1,6 +1,6 @@ # Funktionsliste Zweiundvierzig -**Letztes Update: 04.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) +**Letztes Update: 15.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) [Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) @@ -11,9 +11,9 @@ Weitere Informationen zu den Methoden findet ihr in der Architektur oder, falls Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschrieben wird, müsst ihr nicht diesselben Parameterbezeichner verwenden, wie sie hier verwendet wurden. Falls aus diesem Bezeichner jedoch nicht mehr die Bedeutung des Parameters ausgeht, muss dies in einem Java-Documentation Kommentar erklärt werden. -Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methodenn im Code präsent habt. +Dies könnt auch als Checkliste verwenden, um zu sehen, ob ihr bereits alle Methodenn im Code präsent habt. -## GeneralMap (erweitert World) +## GeneralMap (extends World) - *GeneralMap* ( *String* backgroundImage, *String[]* playerList, *int[]* colorList ) @@ -28,7 +28,7 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *int[]* **getProvinceOwners** () - *int* **getProvinceEntityCount** ( *int* playerID ) -## Province (erweitert Actor) +## Province (extends Actor) - *Province* ( *int* provinceID, *int* continentID, *int* xPos, *int* yPos, *String* displayName, *int* stars, *int[]* neighbourProvinces ) @@ -51,7 +51,7 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *void* **redrawProvince** () -## Player (erweitert Actor) +## Player (extends Actor) - *Player* ( *int* playerID, *String* displayName, *int* playerColor ) @@ -74,7 +74,24 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *int* **getProvinceCount** () - *void* **redrawPlayer** () -## GUI_Interface (erweitert Actor) +## DicesList (extends Actor) + +- *DicesList* ( *int* count, *int* maxCount, *java.awt.Color* backColor, *java.awt.Color* foreColor ) + +- *int[]* **getNumbers** () +- *int[]* **roll** () + +- *void* **removeAll** () + +## OffenderDices (extends Actor) + +- *OffenderDices* ( *int* count ) + +## DefenderDices (extends Actor) + +- *DefenderDices* ( *int* count ) + +## GUI_Interface (extends Actor) - protected *int* **sx** - protected *int* **sy** @@ -90,7 +107,7 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - abstract *void* **redraw** () -## Label (erweitert GUI_Interface) +## Label (extends GUI_Interface) - *Label* ( *String* text, *int* textSize ) @@ -103,7 +120,7 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *void* **redraw** () -## Button (erweitert GUI_Interface) +## Button (extends GUI_Interface) - *Button* ( *String* text, *int* textSize ) - *Button* ( *ButtonEvent* eventHandler ) @@ -122,7 +139,7 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *void* **redraw** () -## Dice (erweitert GUI_Interface) +## Dice (extends GUI_Interface) - *Dice* () - *Dice* ( *int* startNumber ) @@ -133,4 +150,14 @@ Dies könnt auch als Checkliste nehmen, um zu sehen, ob ihr bereits alle Methode - *int* **roll** () -- *void* **redraw** () \ No newline at end of file +- *void* **redraw** () + +## Utils + +- static *boolean[]* **copyArray** ( *boolean[]* array ) +- static *int[]* **copyArray** ( *int[]* array ) +- static *String[]* **copyArray** ( *String[]* array ) + +- static *void* **drawInsideRectangle** ( *GreenfootImage* i, *Color* c, *int* b ) + +- static *void* **sortDesc** ( **int[]** array ) \ No newline at end of file From 107e2256e1a135ef8cee37c6dcc36da5be65e2fa Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Fri, 17 Jun 2016 23:17:29 +0200 Subject: [PATCH 52/68] =?UTF-8?q?Hinweise=20zu=20betroffenen=20Klassen=20h?= =?UTF-8?q?inzugef=C3=BCgt=20Die=20hier=20aufgef=C3=BChrten=20Klassen=20so?= =?UTF-8?q?llen=20mit=20Erreichen=20des=20Beta-Meilensteins=20aus=20dem=20?= =?UTF-8?q?Projekt=20entfernt=20werden.=20Die=20Begr=C3=BCndungen=20sind?= =?UTF-8?q?=20in=20den=20jeweiligen=20Dateien=20direkt=20am=20Anfang=20zu?= =?UTF-8?q?=20entnehmen.=20Teilweise=20wird=20Code=20aus=20den=20Klassen?= =?UTF-8?q?=20in=20Andere=20transferiert.=20Sollte=20f=C3=BCr=20Teile=20de?= =?UTF-8?q?s=20Codes=20oder=20f=C3=BCr=20den=20gesamten=20Code=20wieder=20?= =?UTF-8?q?eine=20Verwendung=20bestehen,=20wird=20die=20Entfernung=20wiede?= =?UTF-8?q?r=20ausgesetzt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ArmySchubser.java | 7 +++++++ Dice_Defender.java | 6 ++++++ Dice_Offender.java | 6 ++++++ Menue_Button.java | 6 ++++++ Roll_Button.java | 6 ++++++ 5 files changed, 31 insertions(+) diff --git a/ArmySchubser.java b/ArmySchubser.java index 3ba98bf..86fd947 100644 --- a/ArmySchubser.java +++ b/ArmySchubser.java @@ -1,3 +1,10 @@ +/* + Hinweis zum Verbleib der Klasse: + Diese Klasse wird nach ihrer Fertigstellung in die GeneralMap integriert. + Dabei wird der Code der act()-Methode innerhalb einer If-Abfrage bei bestimmten States ausgeführt. + Sonstige Methoden werden im Original belassen, sofern keine Überschneidungen bei den Bezeichnern vorhanden sind. +*/ + import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import greenfoot.MouseInfo.*; import javax.swing.JOptionPane; diff --git a/Dice_Defender.java b/Dice_Defender.java index 17f5f5e..6b155b2 100644 --- a/Dice_Defender.java +++ b/Dice_Defender.java @@ -1,3 +1,9 @@ +/* + Hinweis zum Verbleib der Klasse: + Diese Klasse soll, da sie zurzeit weder vollständig, noch in Verwendung, noch in der Architektur definiert ist, zum Beta-Meilenstein entfernt werden. + Sollte die Klasse jedoch zuvor noch Verwendung finden, wird sie nach Absprache mit den jeweiligen Autoren/Benutzern in die Architektur aufgenommen. +*/ + import greenfoot.*; import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) diff --git a/Dice_Offender.java b/Dice_Offender.java index 69b1d11..241baf8 100644 --- a/Dice_Offender.java +++ b/Dice_Offender.java @@ -1,3 +1,9 @@ +/* + Hinweis zum Verbleib der Klasse: + Diese Klasse soll, da sie zurzeit weder vollständig, noch in Verwendung, noch in der Architektur definiert ist, zum Beta-Meilenstein entfernt werden. + Sollte die Klasse jedoch zuvor noch Verwendung finden, wird sie nach Absprache mit den jeweiligen Autoren/Benutzern in die Architektur aufgenommen. +*/ + import greenfoot.*; import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) diff --git a/Menue_Button.java b/Menue_Button.java index cb538aa..c0734ff 100644 --- a/Menue_Button.java +++ b/Menue_Button.java @@ -1,3 +1,9 @@ +/* + Hinweis zum Verbleib der Klasse: + Diese Klasse soll, da sie zurzeit weder vollständig, noch in Verwendung, noch in der Architektur definiert ist, zum Beta-Meilenstein entfernt werden. + Sollte die Klasse jedoch zuvor noch Verwendung finden, wird sie nach Absprache mit den jeweiligen Autoren/Benutzern in die Architektur aufgenommen. +*/ + import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** diff --git a/Roll_Button.java b/Roll_Button.java index 46b6d7d..c056483 100644 --- a/Roll_Button.java +++ b/Roll_Button.java @@ -1,3 +1,9 @@ +/* + Hinweis zum Verbleib der Klasse: + Diese Klasse soll, da sie zurzeit weder vollständig, noch in Verwendung, noch in der Architektur definiert ist, zum Beta-Meilenstein entfernt werden. + Sollte die Klasse jedoch zuvor noch Verwendung finden, wird sie nach Absprache mit den jeweiligen Autoren/Benutzern in die Architektur aufgenommen. +*/ + import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** From ce83de8e8e3bb028f124152809e654ed2f6c9c86 Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 18 Jun 2016 12:36:38 +0200 Subject: [PATCH 53/68] ArmySchubser-Aktualisierung Neuer Armyschubser --- ArmySchubser.java | 57 ++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/ArmySchubser.java b/ArmySchubser.java index 4691f74..fd2a5f2 100644 --- a/ArmySchubser.java +++ b/ArmySchubser.java @@ -6,10 +6,13 @@ import javax.swing.JOptionPane; * Schubst Einheiten umher. * * @author MaxiJohl, GruenerWal - * @version 0.1.1 + * @version 0.2.0 */ + public class ArmySchubser extends Map_World { + Province firstProvince = null; + Province secondProvince = null; /** * Constructor for objects of class ArmySchubser. @@ -22,39 +25,47 @@ public class ArmySchubser extends Map_World public void act() { - Province firstProvince = null; - Province secondProvince = null; - - for ( int i = 0; i <= provinceCount; i++) + if (firstProvince == null) { - if (provinces[i].hasClicked() == true) + for ( int i = 1; i <= provinceCount; i++) { - provinces[i] = firstProvince; - break; + if (provinces[i].hasClicked() == true) + { + provinces[i] = firstProvince; + break; + } } } - for ( int i = 0; i <= provinceCount; i++) + if (firstProvince != null) { - if (provinces[i].hasClicked() == true && provinces[i] != firstProvince) + for ( int i = 0; i <= provinceCount; i++) { - provinces[i] = secondProvince; - break; + if (provinces[i].hasClicked() == true && provinces[i] != firstProvince) + { + provinces[i] = secondProvince; + break; + } } - } - String toMove = JOptionPane.showInputDialog(null, "Wieviele Einheiten willst du verschieben?"); - Integer entitiesToMove = Integer.valueOf(toMove); + String toMoveString = JOptionPane.showInputDialog(null, "Wieviele Einheiten willst du verschieben?"); + Integer entitiesToMove = Integer.valueOf(toMoveString); - if ( (firstProvince.getEntityCount() - entitiesToMove) > 0 && firstProvince.isProvinceNear(secondProvince.getID()) == true ) - { - firstProvince.removeFromEntities(entitiesToMove); - secondProvince.addToEntities(entitiesToMove); - } + if ( (firstProvince.getEntityCount() - entitiesToMove) > 0 && firstProvince.isProvinceNear(secondProvince.getID()) == true ) + { + firstProvince.removeFromEntities(entitiesToMove); + secondProvince.addToEntities(entitiesToMove); + } - else - { - System.out.println("Du hast nicht genügend Einheiten, um die gewünschte Anzahl von " + firstProvince.getDisplayName() + " nach " + secondProvince.getDisplayName() + " zu verschieben, Köhler."); + if ( (firstProvince.getEntityCount() - entitiesToMove) <= 0 ) + { + JOptionPane.showMessageDialog(null,"Du hast nicht genügend Einheiten, um die gewünschte Anzahl von " + firstProvince.getDisplayName() + " nach " + secondProvince.getDisplayName() + " zu verschieben, Köhler."); + } + + if ( firstProvince.isProvinceNear(secondProvince.getID()) == false ) + { + JOptionPane.showMessageDialog(null,"Die Provinzen müssen nebeneinander liegen, wenn du Einheiten verschieben willst."); + } } } } From 776beb06d06ddd8641e2d259a2c5cd4cb9c71eaa Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 18 Jun 2016 12:58:30 +0200 Subject: [PATCH 54/68] Verschieben der Grafiken in den passenden Ordner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Flaggen für die einzelnen Spieler wurden nun in den "/images" Ordner verschoben, um die Sortierung der Dateien zu verbessern. --- BlaueArmee.jpg => images/BlaueArmee.jpg | Bin GelbeArmee.jpg => images/GelbeArmee.jpg | Bin GrüneArmee.jpg => images/GrüneArmee.jpg | Bin LilaArmee.jpg => images/LilaArmee.jpg | Bin RoteArmee .jpg => images/RoteArmee.jpg | Bin SchwarzeArmee.jpg => images/SchwarzeArmee.jpg | Bin 6 files changed, 0 insertions(+), 0 deletions(-) rename BlaueArmee.jpg => images/BlaueArmee.jpg (100%) rename GelbeArmee.jpg => images/GelbeArmee.jpg (100%) rename GrüneArmee.jpg => images/GrüneArmee.jpg (100%) rename LilaArmee.jpg => images/LilaArmee.jpg (100%) rename RoteArmee .jpg => images/RoteArmee.jpg (100%) rename SchwarzeArmee.jpg => images/SchwarzeArmee.jpg (100%) diff --git a/BlaueArmee.jpg b/images/BlaueArmee.jpg similarity index 100% rename from BlaueArmee.jpg rename to images/BlaueArmee.jpg diff --git a/GelbeArmee.jpg b/images/GelbeArmee.jpg similarity index 100% rename from GelbeArmee.jpg rename to images/GelbeArmee.jpg diff --git a/GrüneArmee.jpg b/images/GrüneArmee.jpg similarity index 100% rename from GrüneArmee.jpg rename to images/GrüneArmee.jpg diff --git a/LilaArmee.jpg b/images/LilaArmee.jpg similarity index 100% rename from LilaArmee.jpg rename to images/LilaArmee.jpg diff --git a/RoteArmee .jpg b/images/RoteArmee.jpg similarity index 100% rename from RoteArmee .jpg rename to images/RoteArmee.jpg diff --git a/SchwarzeArmee.jpg b/images/SchwarzeArmee.jpg similarity index 100% rename from SchwarzeArmee.jpg rename to images/SchwarzeArmee.jpg From cc483290284df41a1fca8f52cd90aa05dbde4e0c Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 18 Jun 2016 15:59:32 +0200 Subject: [PATCH 55/68] ArmySchubser-Aktualisierung ArmySchubser nochmal aktualisiert --- ArmySchubser.java | 93 ++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/ArmySchubser.java b/ArmySchubser.java index fd2a5f2..9acd1d3 100644 --- a/ArmySchubser.java +++ b/ArmySchubser.java @@ -6,66 +6,85 @@ import javax.swing.JOptionPane; * Schubst Einheiten umher. * * @author MaxiJohl, GruenerWal - * @version 0.2.0 + * @version 0.3.0 */ public class ArmySchubser extends Map_World -{ - Province firstProvince = null; - Province secondProvince = null; +{ + static Province savedProvince = null; /** - * Constructor for objects of class ArmySchubser. + * Konstruktor für ArmySchubser. * + * NICHT BENUTZEN! + * Sämtliche benötigten Methoden sind static! */ - public ArmySchubser() + private ArmySchubser() { // Hi. } - public void act() + /** + * Nimmt zwei Provinzen entgegen, und fragt, wieviele Einheiten vom ersten zum zweiten Eintrag verschoben werden sollen. + * Überprüft, ob eine Verschiebung möglich ist und führt sie bei Erfolg aus. + */ + public static void moveEntities(Province sourceProvince, Province destinationProvince) { - if (firstProvince == null) + String toMoveString = JOptionPane.showInputDialog(null, "Wieviele Einheiten willst du verschieben?"); + Integer entitiesToMove = Integer.valueOf(toMoveString); + + if ( (sourceProvince.getEntityCount() - entitiesToMove) > 0) { - for ( int i = 1; i <= provinceCount; i++) - { - if (provinces[i].hasClicked() == true) - { - provinces[i] = firstProvince; - break; - } - } + sourceProvince.removeFromEntities(entitiesToMove); + destinationProvince.addToEntities(entitiesToMove); } - if (firstProvince != null) + if ( (sourceProvince.getEntityCount() - entitiesToMove) <= 0 ) { - for ( int i = 0; i <= provinceCount; i++) - { - if (provinces[i].hasClicked() == true && provinces[i] != firstProvince) - { - provinces[i] = secondProvince; - break; - } - } + JOptionPane.showMessageDialog(null,"Du hast nicht genügend Einheiten, um die gewünschte Anzahl von " + sourceProvince.getDisplayName() + " nach " + destinationProvince.getDisplayName() + " zu verschieben, Köhler."); + } + } - String toMoveString = JOptionPane.showInputDialog(null, "Wieviele Einheiten willst du verschieben?"); - Integer entitiesToMove = Integer.valueOf(toMoveString); + /** + * Speichert ein gegebene Provinz als savedProvince ein, insofern dieser Platz nicht bereits belegt ist. + * Ist er das, so wird überprüft, ob eine neue, an savedProvince angrenzende Provinz angeklickt wurde. + * Ist dies der Fall, werden beide Provinzen an moveEntities übergeben. + */ + public static void useProvincesToMove(Province givenProvince) + { + if (savedProvince == null) + { + savedProvince = givenProvince; + } - if ( (firstProvince.getEntityCount() - entitiesToMove) > 0 && firstProvince.isProvinceNear(secondProvince.getID()) == true ) + if (savedProvince != null && givenProvince != savedProvince) + { + if (givenProvince.isProvinceNear(savedProvince.getID()) == true) { - firstProvince.removeFromEntities(entitiesToMove); - secondProvince.addToEntities(entitiesToMove); + moveEntities(savedProvince,givenProvince); } + } + } - if ( (firstProvince.getEntityCount() - entitiesToMove) <= 0 ) - { - JOptionPane.showMessageDialog(null,"Du hast nicht genügend Einheiten, um die gewünschte Anzahl von " + firstProvince.getDisplayName() + " nach " + secondProvince.getDisplayName() + " zu verschieben, Köhler."); - } - - if ( firstProvince.isProvinceNear(secondProvince.getID()) == false ) + /** + * Überprüft, ob eine Provinz angeklickt wurde. + * Wenn ja, wird diese als clickedProvince eingespeichert und useProvincesToMove aufgerufen. + * + * Kommt nachher in die GeneralMap! + */ + public void act() + { + Province clickedProvince = null; + + for ( int i = 1; i <= provinceCount; i++) + { + if (provinces[i].hasClicked() == true) { - JOptionPane.showMessageDialog(null,"Die Provinzen müssen nebeneinander liegen, wenn du Einheiten verschieben willst."); + clickedProvince = provinces[i]; + useProvincesToMove(clickedProvince); + break; } } } } + From 06a95c59d21f8747fee2258512967880edfb0450 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 18 Jun 2016 17:35:51 +0200 Subject: [PATCH 56/68] =?UTF-8?q?Fehlerverbesserung=20DicesList=20Unterkla?= =?UTF-8?q?ssen=20Hier=20fehlte=20jeweils=20eine=20Klammer.=20Aus=20Debug-?= =?UTF-8?q?Gr=C3=BCnden=20wird=20dies=20=C3=BCber=20diesen=20Branch=20beho?= =?UTF-8?q?ben.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DefenderDices.java | 2 +- OffenderDices.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DefenderDices.java b/DefenderDices.java index a13634f..25fbf96 100644 --- a/DefenderDices.java +++ b/DefenderDices.java @@ -10,7 +10,7 @@ import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and Mouse public class DefenderDices extends DicesList { public DefenderDices(int count) { - super(count, 2, new Color(0,0,0), (new Color(255,255,255)); + super(count, 2, new Color(0,0,0), (new Color(255,255,255))); } } diff --git a/OffenderDices.java b/OffenderDices.java index bcc7542..83cc8cf 100644 --- a/OffenderDices.java +++ b/OffenderDices.java @@ -10,7 +10,7 @@ import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and Mouse public class OffenderDices extends DicesList { public OffenderDices(int count) { - super(count, 3, new Color(255,0,0), (new Color(255,255,255)); + super(count, 3, new Color(255,0,0), (new Color(255,255,255))); } } From 7684cfe224a8cd852f743c1604098b32b0f0f079 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 18 Jun 2016 17:38:04 +0200 Subject: [PATCH 57/68] =?UTF-8?q?Fehlerverbesserung=20DefenderDices=20&=20?= =?UTF-8?q?OffenderDices=20Anpassung=20auf=20diesem=20Branch=20aufgrund=20?= =?UTF-8?q?von=20Debugen=20der=20hierauf=20durchgef=C3=BChrten=20Aufgabe.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DefenderDices.java | 1 + OffenderDices.java | 1 + 2 files changed, 2 insertions(+) diff --git a/DefenderDices.java b/DefenderDices.java index 25fbf96..b3a5c4a 100644 --- a/DefenderDices.java +++ b/DefenderDices.java @@ -1,5 +1,6 @@ import greenfoot.*; import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import java.awt.Color; /** Erstellt eine gegebene Anzahl an DefenderDice's, welche dann nebeneinander eingereiht werden. diff --git a/OffenderDices.java b/OffenderDices.java index 83cc8cf..a7ac781 100644 --- a/OffenderDices.java +++ b/OffenderDices.java @@ -1,5 +1,6 @@ import greenfoot.*; import java.util.Arrays; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import java.awt.Color; /** Erstellt eine gegebene Anzahl an OffenderDice's, welche dann nebeneinander eingereiht werden. From 848634216a1b8231177b23806e166388af7f6d58 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 18 Jun 2016 17:40:37 +0200 Subject: [PATCH 58/68] Fehlerverbesserung Utils --- Utils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Utils.java b/Utils.java index 87a34cd..be2eb67 100644 --- a/Utils.java +++ b/Utils.java @@ -66,7 +66,7 @@ public final class Utils { */ public static void sortDesc(int[] a) { Arrays.sort(a); - Collection.sort(a,Collections.reverseOrder()); + Collections.sort(a,Collections.reverseOrder()); } } From cdb305f82363c17aebbe520746b581b78618a777 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 18 Jun 2016 17:43:41 +0200 Subject: [PATCH 59/68] Fehlerverbesserung Utils 2 Sortierung des Arrays angepasst --- Utils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Utils.java b/Utils.java index be2eb67..a535725 100644 --- a/Utils.java +++ b/Utils.java @@ -66,7 +66,7 @@ public final class Utils { */ public static void sortDesc(int[] a) { Arrays.sort(a); - Collections.sort(a,Collections.reverseOrder()); + Arrays.sort(a,Collections.reverseOrder()); } } From f0abd1d54a97d82ad1765c1abe550ba1a86d1b48 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 18 Jun 2016 17:55:49 +0200 Subject: [PATCH 60/68] =?UTF-8?q?Fehlerverbesserung=20Utils=203=20Nach=20l?= =?UTF-8?q?angem=20Ausprobieren=20wurde=20nun=20endlich=20eine=20M=C3=B6gl?= =?UTF-8?q?ichkeit=20gefunden,=20ein=20int-Array=20absteigend=20zu=20sorti?= =?UTF-8?q?eren.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Utils.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Utils.java b/Utils.java index a535725..cb9680a 100644 --- a/Utils.java +++ b/Utils.java @@ -17,7 +17,7 @@ public final class Utils { */ public static boolean[] copyArray(boolean[] a) { boolean[] b = new boolean[a.length]; - for(int i = 0; i >= a.length; i++) { + for(int i = 0; i < a.length; i++) { b[i] = a[i]; } return b; @@ -29,7 +29,7 @@ public final class Utils { */ public static int[] copyArray(int[] a) { int[] b = new int[a.length]; - for(int i = 0; i >= a.length; i++) { + for(int i = 0; i < a.length; i++) { b[i] = a[i]; } return b; @@ -41,7 +41,7 @@ public final class Utils { */ public static String[] copyArray(String[] a) { String[] b = new String[a.length]; - for(int i = 0; i >= a.length; i++) { + for(int i = 0; i < a.length; i++) { b[i] = a[i]; } return b; @@ -66,7 +66,10 @@ public final class Utils { */ public static void sortDesc(int[] a) { Arrays.sort(a); - Arrays.sort(a,Collections.reverseOrder()); + int[] b = copyArray(a); + for(int i = (a.length - 1); i >= 0; i--) { + a[i] = b[i]; + } } } From d2cffa57dd6f67a4d5a2e2023edafea9f7d0bf3d Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 18 Jun 2016 18:06:50 +0200 Subject: [PATCH 61/68] ArmySchubser-Aktualisierung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ArmySchubser aktualisiert, die fehlende Funktionalität sollte nun nicht mehr an uns liegen. --- ArmySchubser.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/ArmySchubser.java b/ArmySchubser.java index 03a4510..d9dbcd7 100644 --- a/ArmySchubser.java +++ b/ArmySchubser.java @@ -1,10 +1,3 @@ -/* - Hinweis zum Verbleib der Klasse: - Diese Klasse wird nach ihrer Fertigstellung in die GeneralMap integriert. - Dabei wird der Code der act()-Methode innerhalb einer If-Abfrage bei bestimmten States ausgeführt. - Sonstige Methoden werden im Original belassen, sofern keine Überschneidungen bei den Bezeichnern vorhanden sind. -*/ - import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import greenfoot.MouseInfo.*; import javax.swing.JOptionPane; @@ -26,9 +19,8 @@ public class ArmySchubser extends Map_World * NICHT BENUTZEN! * Sämtliche benötigten Methoden sind static! */ - public ArmySchubser(String[] playerList, int[] colorList) + private ArmySchubser() { - super(playerList,colorList); // Hi. } @@ -71,6 +63,11 @@ public class ArmySchubser extends Map_World { moveEntities(savedProvince,givenProvince); } + + else + { + savedProvince = null; + } } } From 7afedb588aaabfacc06256899b2b9515f7f2785e Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sat, 18 Jun 2016 18:23:19 +0200 Subject: [PATCH 62/68] Debugen des ArmySchubsers Es wurde ein Fehler in der Province Klasse festgestellt, der mit den Nachbarprovinzen zu tun hat. Dies wurde nun hier gefixt. Damit ist der ArmySchubser bis auf ein paar fehlenden Verbesserungen prinzipiell fertig. --- ArmySchubser.java | 4 ++-- Province.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ArmySchubser.java b/ArmySchubser.java index d9dbcd7..307b18e 100644 --- a/ArmySchubser.java +++ b/ArmySchubser.java @@ -19,9 +19,9 @@ public class ArmySchubser extends Map_World * NICHT BENUTZEN! * Sämtliche benötigten Methoden sind static! */ - private ArmySchubser() + public ArmySchubser(String[] playerList, int[] colorList) { - // Hi. + super(playerList,colorList); } /** diff --git a/Province.java b/Province.java index dc6f639..4814fe3 100644 --- a/Province.java +++ b/Province.java @@ -48,13 +48,13 @@ public class Province extends Actor displayName = s1; // Der Teil, der sich um die Konvertierung des int-Array in ein boolean-Array kümmert. int maxNum = 0; - for(int i = 0; i >= ia1.length; i++) { + for(int i = 0; i < ia1.length; i++) { if(maxNum < ia1[i]) { maxNum = ia1[i]; } } - nextProvinces = new boolean[ia1.length]; - for(int i = 0; i >= ia1.length; i++) { + nextProvinces = new boolean[maxNum+1]; + for(int i = 0; i < ia1.length; i++) { if(ia1[i] >= 0) { nextProvinces[ia1[i]] = true; } From 86772bed539f88e0678c6b2f0db7ea2da045c239 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sun, 19 Jun 2016 20:08:45 +0200 Subject: [PATCH 63/68] =?UTF-8?q?Dokument-Kommentar=20angepasst=20*=20Auto?= =?UTF-8?q?renliste=20erweitert=20*=20Versionsnummer=20erh=C3=B6ht=20*=20S?= =?UTF-8?q?chreibweise=20ge=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GeneralMap.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/GeneralMap.java b/GeneralMap.java index 01ce194..d07a948 100644 --- a/GeneralMap.java +++ b/GeneralMap.java @@ -1,11 +1,11 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) -/** - * Oberklasse für verschiedene Maps; - * neue Maps werden als Unterklasse dieser Klasse eingefügt. - * - * @author GruenerWal, MaxiJohl - * @version 0.2.0 +/** + Oberklasse für verschiedene Maps; + neue Maps werden als Unterklasse dieser Klasse eingefügt. + + @author GruenerWal, MaxiJohl, Felix Stupp + @version 0.3.0 */ public abstract class GeneralMap extends World { From bbf3bf4e316b0115dfa18d5b26fb59bd6f333a3a Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sun, 19 Jun 2016 20:32:23 +0200 Subject: [PATCH 64/68] =?UTF-8?q?Architektur=20und=20Funktionsliste=20ange?= =?UTF-8?q?passt=20Die=20im=20Code=20bereits=20vorhandenen=20und=20genutzt?= =?UTF-8?q?en=20Methoden=20**getXPos**=20und=20**getYPos**=20der=20*Provin?= =?UTF-8?q?ce*,=20welche=20in=20der=20Architektur=20bisher=20noch=20fehlte?= =?UTF-8?q?n,=20wurden=20nun=20hinzugef=C3=BCgt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planung/architektur.md | 14 ++++++++++++-- planung/funktionsliste.md | 4 +++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/planung/architektur.md b/planung/architektur.md index 4864cc6..775a38c 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -243,7 +243,9 @@ Die Methode **boolean setOwner(int)** speichert einen neuen Besitzer ab. Sie gib Diese Eigenschaft speichert, wie viele Einheiten auf diesem Feld stehen (natürlich welche, die dem Besitzer gehören). ### Public Methoden - + +- *int* **getXPos** () +- *int* **getYPos** () - *int* **getID** () - *int* **getContinentID** () - *String* **getDisplayName** () @@ -261,7 +263,15 @@ Diese Eigenschaft speichert, wie viele Einheiten auf diesem Feld stehen (natürl - *boolean* **hasClicked** () -- *void* **redrawProvince** () +- *void* **redrawProvince** () + +#### getXPos() + +Gibt die in der Provinz hinterlegte X-Position zurück. + +#### getYPos() + +Gibt die in der Provinz hinterlegte Y-Position zurück. #### getID() diff --git a/planung/funktionsliste.md b/planung/funktionsliste.md index 09b9f2d..a5b91ce 100644 --- a/planung/funktionsliste.md +++ b/planung/funktionsliste.md @@ -31,7 +31,9 @@ Dies könnt auch als Checkliste verwenden, um zu sehen, ob ihr bereits alle Meth ## Province (extends Actor) - *Province* ( *int* provinceID, *int* continentID, *int* xPos, *int* yPos, *String* displayName, *int* stars, *int[]* neighbourProvinces ) - + +- *int* **getXPos** () +- *int* **getYPos** () - *int* **getID** () - *int* **getContinentID** () - *String* **getDisplayName** () From 49635709e095266ee5a3c8661e69aca41e696261 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sun, 19 Jun 2016 20:35:08 +0200 Subject: [PATCH 65/68] Format der Dokument-Kommentare angepasst --- Map_World.java | 54 +++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Map_World.java b/Map_World.java index e3f39db..b3745e3 100644 --- a/Map_World.java +++ b/Map_World.java @@ -1,45 +1,45 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) -/** - * Klasse der Standard-Welt - * (Also die normale Weltkarte mit allen Kontinenten) - * - * @author GruenerWal, MaxiJohl - * @version 0.3.0 +/** + Klasse der Standard-Welt + (Also die normale Weltkarte mit allen Kontinenten) + + @author GruenerWal, MaxiJohl + @version 0.3.0 */ public class Map_World extends GeneralMap { - /** - * Anzahl der Provinzen. + /** + Anzahl der Provinzen. */ int provinceCount = 42; - /** - * Konstruktor der Weltkarte; - * konstruiert eine GeneralMap mit den Ausmassen 1600 auf 900 Pixel. + /** + Konstruktor der Weltkarte; + konstruiert eine GeneralMap mit den Ausmassen 1600 auf 900 Pixel. */ public Map_World(String[] playerList, int[] colorList) { super("",playerList,colorList); - /* - * Hier werden später sämtliche Provinzen der Standard-Map erstellt. - * Dies funktioniert folgendermassen: - * ================================================================= - * - * Dieses kürzere Format ersetzt den langen Code und sorgt eventuell sogar für einen Geschwindigkeitsschub. Dabei sollte diesselbe Funktionalität erhalten bleiben. - * - * provinces[] = new Province(,,,,,"", new int[] { }); - * - * ================================================================= - * Der Speicherplatz für provinces[0] bleibt leer, da es keine Provinz mit der ID 0 gibt! - * - * Und ja, ich weiss, dass das scheisse viel Schreibarbeit ist. - * Aber da muss man durch, wir habens auch hinbekommen :P - * - * ~GruenerWal + /* + Hier werden später sämtliche Provinzen der Standard-Map erstellt. + Dies funktioniert folgendermassen: + ================================================================= + + Dieses kürzere Format ersetzt den langen Code und sorgt eventuell sogar für einen Geschwindigkeitsschub. Dabei sollte diesselbe Funktionalität erhalten bleiben. + + provinces[] = new Province(,,,,,"", new int[] { }); + + ================================================================= + Der Speicherplatz für provinces[0] bleibt leer, da es keine Provinz mit der ID 0 gibt! + + Und ja, ich weiss, dass das scheisse viel Schreibarbeit ist. + Aber da muss man durch, wir habens auch hinbekommen :P + + ~GruenerWal */ // Festlegung der Provinz-Anzahl From 6d9c86271bb910403bc8281e7441328f267232d5 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sun, 19 Jun 2016 20:39:24 +0200 Subject: [PATCH 66/68] =?UTF-8?q?Province=20Offset=20Einrichtung=20-=20*Ge?= =?UTF-8?q?neralMap*:=20Hinzuf=C3=BCgen=20der=20Konstanten=20und=20der=20M?= =?UTF-8?q?ethode=20**initProvinces**=20-=20*Map=5FWorld*:=20Umstellung=20?= =?UTF-8?q?auf=20Verwendung=20der=20neuen=20Methode=20-=20Architektur:=20D?= =?UTF-8?q?okumentation=20der=20neuen=20Methode=20hinzugef=C3=BCgt,=20dabe?= =?UTF-8?q?i=20wurde=20die=20Methode=20**addProvinceToMap**=20gestrichen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GeneralMap.java | 245 +++--- Map_World.java | 179 ++-- planung/architektur.md | 1736 ++++++++++++++++++------------------- planung/funktionsliste.md | 324 +++---- 4 files changed, 1254 insertions(+), 1230 deletions(-) diff --git a/GeneralMap.java b/GeneralMap.java index d07a948..707becf 100644 --- a/GeneralMap.java +++ b/GeneralMap.java @@ -1,114 +1,141 @@ -import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) - +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) + /** Oberklasse für verschiedene Maps; neue Maps werden als Unterklasse dieser Klasse eingefügt. @author GruenerWal, MaxiJohl, Felix Stupp - @version 0.3.0 - */ -public abstract class GeneralMap extends World -{ - /* - Felder, im Moment nur Anzahl der Provinzen - Später evtl. weitere Werte wie Schwierigkeit denkbar - */ - - protected Province[] provinces; - protected Player[] players; - - protected int currentPlayer = 0; - - /** - Erstellt eine GeneralMap mit allen Eigenschaften und initialisiert die Arrays für Provinzen und Spieler. - @param backImage Das Hintergrundbild, welches von dieser Klasse geladen und dargestellt wird. - @param playerList Die Liste mit den Namen der Spieler - @param colorList Die Liste mit den Farben der Spieler - */ - public GeneralMap(String backImage, String[] playerList, int[] colorList) - { - super(1600,900,1); - players = new Player[playerList.length]; - for (int i = 0; i < playerList.length; i++) { - players[i] = new Player(i,playerList[i],colorList[i]); - } - } - - /** - Gibt die Anzahl der vorhandenen Spieler aus. - */ - public int getPlayerCount() - { - return players.length; - } - - /** - Gibt den Namen des aktuellen Spielers aus. - @return Der Name des aktuellen Spielers - */ - public String getPlayerName() - { - return players[currentPlayer].getDisplayName(); - } - - /** - Gibt den Namen des Spielers aus, dem dessen ID gehört. - @param plID Die ID des zu findenden Spielers - @return Der Name des Spielers - */ - public String getPlayerName(int plID) - { - return players[plID].getDisplayName(); - } - - /** - Gibt die Anzahl der Sterne des aktuellen Spielers zurück. - @return Die Anzahl der Sterne des aktuellen Spielers - */ - public int getPlayerStars() - { - return players[currentPlayer].getStars(); - } - - /** - Gibt die ID des Spielers zurück, dem die gefragte Provinz gehört. - @param prID Die gefragte Provinz - */ - public int getProvinceOwner(int prID) - { - if(prID < 1 || prID > provinces.length) { - return -1; - } - return provinces[prID].getOwner(); - } - - /** - Gibt eine Liste mit allen Provinzen und deren Besitzern zurück. - @return Array mit der Provinz-ID als Index und dem Besitzer als Wert - */ - public int[] getProvinceOwners() - { - int[] prOwners = new int[provinces.length]; - for (int i = 1; i > provinces.length; i++) { - prOwners[i] = provinces[i].getOwner(); - } - return prOwners; - } - - /** - Zählt die Anzahl der Einheiten von allen Provinzen zusammen, die einem bestimmten Spieler gehört. - @param playerID Die ID des Spielers, für den die Einheiten gezählt werden sollen. - @return Die Anzahl der Einheiten, die dem Spieler gehören. - */ - public int getProvinceEntityCount(int playerID) - { - int c = 0; - for (int i = 1; i > provinces.length; i++) { - if(provinces[i].getOwner() == playerID) { - c = c + provinces[i].getEntityCount(); - } - } - return c; - } - -} + @version 0.3.0 +*/ +public abstract class GeneralMap extends World +{ + /* + Felder, im Moment nur Anzahl der Provinzen + Später evtl. weitere Werte wie Schwierigkeit denkbar + */ + + private final int X_OFFSET = 0; // Verschiebt die Provinzen nach rechts + private final int Y_OFFSET = 0; // Verschiebt die Provinzen nach unten + + /* + Die einzelnen Positionen der Provinzen wird mit SCALE_VALUE/10000 multipliziert. + Dies ist nützlich, wenn die Karte beispielsweise nur noch 80% der Originalgröße bei ihrer Darstellung groß ist. + Bei diesem Beispiel wäre hier, neben dem Offset oben, der Wert 8000 einzutragen. + + Die vorherige Erhöhung des Skalars ist mit der höheren Genauigkeit bei der Arbeit mit dem int-Basistyp zu erklären. + */ + private final int SCALE_VALUE = 10000; // SCALE_VALUE/10000 wird verwendet + + protected Province[] provinces; + protected Player[] players; + + protected int currentPlayer = 0; + + /** + Erstellt eine GeneralMap mit allen Eigenschaften und initialisiert die Arrays für Provinzen und Spieler. + @param backImage Das Hintergrundbild, welches von dieser Klasse geladen und dargestellt wird. + @param playerList Die Liste mit den Namen der Spieler + @param colorList Die Liste mit den Farben der Spieler + */ + public GeneralMap(String backImage, String[] playerList, int[] colorList) + { + super(1600,900,1); + players = new Player[playerList.length]; + for (int i = 0; i < playerList.length; i++) { + players[i] = new Player(i,playerList[i],colorList[i]); + } + } + + /** + Fügt alle Provinzen aus dem Array der Welt an der entsprechden Stelle zu. + */ + protected void initProvinces() { + for(int i = 1; i < provinces.length; i++) { + Province p = provinces[i]; + int s = SCALE_VALUE/10000; + int x = p.getX(); + int y = p.getY(); + x = (x * s) + X_OFFSET; + y = (y * s) + y_OFFSET; + addObject(p,x,y); + } + } + + /** + Gibt die Anzahl der vorhandenen Spieler aus. + */ + public int getPlayerCount() + { + return players.length; + } + + /** + Gibt den Namen des aktuellen Spielers aus. + @return Der Name des aktuellen Spielers + */ + public String getPlayerName() + { + return players[currentPlayer].getDisplayName(); + } + + /** + Gibt den Namen des Spielers aus, dem dessen ID gehört. + @param plID Die ID des zu findenden Spielers + @return Der Name des Spielers + */ + public String getPlayerName(int plID) + { + return players[plID].getDisplayName(); + } + + /** + Gibt die Anzahl der Sterne des aktuellen Spielers zurück. + @return Die Anzahl der Sterne des aktuellen Spielers + */ + public int getPlayerStars() + { + return players[currentPlayer].getStars(); + } + + /** + Gibt die ID des Spielers zurück, dem die gefragte Provinz gehört. + @param prID Die gefragte Provinz + */ + public int getProvinceOwner(int prID) + { + if(prID < 1 || prID > provinces.length) { + return -1; + } + return provinces[prID].getOwner(); + } + + /** + Gibt eine Liste mit allen Provinzen und deren Besitzern zurück. + @return Array mit der Provinz-ID als Index und dem Besitzer als Wert + */ + public int[] getProvinceOwners() + { + int[] prOwners = new int[provinces.length]; + for (int i = 1; i > provinces.length; i++) { + prOwners[i] = provinces[i].getOwner(); + } + return prOwners; + } + + /** + Zählt die Anzahl der Einheiten von allen Provinzen zusammen, die einem bestimmten Spieler gehört. + @param playerID Die ID des Spielers, für den die Einheiten gezählt werden sollen. + @return Die Anzahl der Einheiten, die dem Spieler gehören. + */ + public int getProvinceEntityCount(int playerID) + { + int c = 0; + for (int i = 1; i > provinces.length; i++) { + if(provinces[i].getOwner() == playerID) { + c = c + provinces[i].getEntityCount(); + } + } + return c; + } + +} diff --git a/Map_World.java b/Map_World.java index b3745e3..a090e8a 100644 --- a/Map_World.java +++ b/Map_World.java @@ -1,30 +1,30 @@ -import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) - +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) + /** Klasse der Standard-Welt (Also die normale Weltkarte mit allen Kontinenten) @author GruenerWal, MaxiJohl - @version 0.3.0 - */ - -public class Map_World extends GeneralMap -{ - /** - Anzahl der Provinzen. - */ - - int provinceCount = 42; - - /** + @version 0.3.0 + */ + +public class Map_World extends GeneralMap +{ + /** + Anzahl der Provinzen. + */ + + int provinceCount = 42; + + /** Konstruktor der Weltkarte; - konstruiert eine GeneralMap mit den Ausmassen 1600 auf 900 Pixel. - */ - - public Map_World(String[] playerList, int[] colorList) - { - super("",playerList,colorList); - /* + konstruiert eine GeneralMap mit den Ausmassen 1600 auf 900 Pixel. + */ + + public Map_World(String[] playerList, int[] colorList) + { + super("",playerList,colorList); + /* Hier werden später sämtliche Provinzen der Standard-Map erstellt. Dies funktioniert folgendermassen: ================================================================= @@ -39,73 +39,70 @@ public class Map_World extends GeneralMap Und ja, ich weiss, dass das scheisse viel Schreibarbeit ist. Aber da muss man durch, wir habens auch hinbekommen :P - ~GruenerWal - */ - - // Festlegung der Provinz-Anzahl - - provinces = new Province[provinceCount + 1]; - - // Implementierung sämtlicher Provinzen - // ACHTUNG! Gaaaaanz viel Code! - - // cID 1 - Nordamerika - provinces[1] = new Province( 1 , 1 , 64 , 106 , 1 , "Alaska" , new int[] {2 , 3 , 36}); - provinces[2] = new Province( 2 , 1 , 162 , 106 , 1 , "NW-Territorien" , new int[] {1 , 3 , 4 , 9}); - provinces[3] = new Province( 3 , 1 , 53 , 170 , 1 , "Alberta" , new int[] {1 , 2 , 4 , 5}); - provinces[4] = new Province( 4 , 1 , 223 , 177 , 2 , "Ontario" , new int[] {2 , 3 , 5 , 6 , 7 , 9}); - provinces[5] = new Province( 5 , 1 , 160 , 236 , 2 , "Weststaaten" , new int[] {3 , 4 , 6 , 8}); - provinces[6] = new Province( 6 , 1 , 232 , 273 , 2 , "Oststaaten" , new int[] {4 , 5 , 7 , 8}); - provinces[7] = new Province( 7 , 1 , 300 , 180 , 2 , "Quebec" , new int[] {4 , 6 , 9}); - provinces[8] = new Province( 8 , 1 , 181 , 347 , 1 , "Mittelamerika" , new int[] {5 , 6 , 17}); - provinces[9] = new Province( 9 , 1 , 365 , 55 , 1 , "Groenland" , new int[] {2 , 4 , 7 , 10}); - - // cID 2 - Europa - provinces[10] = new Province(10 , 2 , 454 , 142 , 1 , "Island" , new int[] {9 , 11 , 12}); - provinces[11] = new Province(11 , 2 , 424 , 221 , 2 , "Grossbritannien" , new int[] {10 , 12 , 14 , 15}); - provinces[12] = new Province(12 , 2 , 520 , 153 , 1 , "Skandinavien" , new int[] {10 , 11 , 13 , 14}); - provinces[13] = new Province(13 , 2 , 636 , 180 , 2 , "Russland" , new int[] {12 , 14 , 16 , 27 , 31 , 32}); - provinces[14] = new Province(14 , 2 , 528 , 232 , 2 , "Nordeuropa" , new int[] {11 , 12 , 13 , 15 , 16}); - provinces[15] = new Province(15 , 2 , 449 , 335 , 2 , "Westeuropa" , new int[] {11 , 14 , 16 , 25}); - provinces[16] = new Province(16 , 2 , 537 , 296 , 2 , "Suedeuropa" , new int[] {13 , 14 , 15 , 25 , 26 , 27}); - - // cID 3 - Suedamerika - provinces[17] = new Province(17 , 3 , 245 , 396 , 1 , "Venezuela" , new int[] {8 , 18 , 19}); - provinces[18] = new Province(18 , 3 , 255 , 498 , 1 , "Peru" , new int[] {17 , 19 , 20}); - provinces[19] = new Province(19 , 3 , 327 , 467 , 2 , "Brasilien" , new int[] {17 , 18 , 20 , 25}); - provinces[20] = new Province(20 , 3 , 274 , 572 , 1 , "Argentinien" , new int[] {18 , 19}); - - // cID 4 - Afrika - provinces[21] = new Province(21 , 4 , 680 , 630 , 1 , "Madagaskar" , new int[] {24 , 22}); - provinces[22] = new Province(22 , 4 , 580 , 624 , 1 , "Südafrika" , new int[] {21 , 23 , 24}); - provinces[23] = new Province(23 , 4 , 572 , 537 , 2 , "Zentralafrika" , new int[] {22 , 25 , 24}); - provinces[24] = new Province(24 , 4 , 632 , 500 , 2 , "Ostafrika" , new int[] {21 , 22 , 25 , 23 , 26}); - provinces[25] = new Province(25 , 4 , 491 , 444 , 1 , "Nordafrika" , new int[] {15 , 16 , 26 , 23 , 24}); - provinces[26] = new Province(26 , 4 , 574 , 414 , 1 , "Aegypten" , new int[] {27 , 25 , 24 , 16}); - - // cID 5 - Asien - provinces[27] = new Province(27 , 5 , 664 , 345 , 2 , "Mittlerer Osten" , new int[] {24 , 26 , 16 , 23 , 31 , 28}); - provinces[28] = new Province(28 , 5 , 784 , 370 , 2 , "Indien" , new int[] {29 , 31 , 27 , 30}); - provinces[29] = new Province(29 , 5 , 863 , 322 , 2 , "China" , new int[] {30 , 28 , 31 , 32 , 33 , 37}); - provinces[30] = new Province(30 , 5 , 867 , 400 , 1 , "Südost Asien" , new int[] {29 , 39 , 28}); - provinces[31] = new Province(31 , 5 , 724 , 262 , 1 , "Afganistan" , new int[] {29 , 28 , 27 , 13 , 32}); - provinces[32] = new Province(32 , 5 , 740 , 163 , 1 , "Ural" , new int[] {29 , 33 , 31 , 13}); - provinces[33] = new Province(33 , 5 , 802 , 128 , 1 , "Sibirien" , new int[] {34 , 35 , 37 , 29 , 32}); - provinces[34] = new Province(34 , 5 , 884 , 82 , 1 , "Jakutien" , new int[] {36 , 35 , 33}); - provinces[35] = new Province(35 , 5 , 867 , 176 , 2 , "Irkutsk" , new int[] {34 , 36 , 37 , 33}); - provinces[36] = new Province(36 , 5 , 973 , 89 , 1 , "Kamtschatka" , new int[] {1 , 38 , 37 , 35 , 34}); - provinces[37] = new Province(37 , 5 , 882 , 243 , 1 , "Mongolei" , new int[] {29 , 33 , 35 , 36 , 38}); - provinces[38] = new Province(38 , 5 , 994 , 249 , 2 , "Japan" , new int[] {37 , 36}); - - // cID 6 - Ozeanien - provinces[39] = new Province(39 , 6 , 889 , 519 , 1 , "Indonesien" , new int[] {30 , 40 , 42}); - provinces[40] = new Province(40 , 6 , 983 , 492 , 2 , "Neuguinea" , new int[] {39 , 41 , 42}); - provinces[41] = new Province(41 , 6 , 1000, 595 , 1 , "Ost Australien" , new int[] {40 , 42}); - provinces[42] = new Province(42 , 6 , 934 , 628 , 1 , "West Australien" , new int[] {40 , 41 , 39}); - - for (int c = 1; c <= provinceCount; c++) - { - addObject(provinces[c],provinces[c].getXPos(),provinces[c].getYPos()); - } - } -} + ~GruenerWal + */ + + // Festlegung der Provinz-Anzahl + + provinces = new Province[provinceCount + 1]; + + // Implementierung sämtlicher Provinzen + // ACHTUNG! Gaaaaanz viel Code! + + // cID 1 - Nordamerika + provinces[1] = new Province( 1 , 1 , 64 , 106 , 1 , "Alaska" , new int[] {2 , 3 , 36}); + provinces[2] = new Province( 2 , 1 , 162 , 106 , 1 , "NW-Territorien" , new int[] {1 , 3 , 4 , 9}); + provinces[3] = new Province( 3 , 1 , 53 , 170 , 1 , "Alberta" , new int[] {1 , 2 , 4 , 5}); + provinces[4] = new Province( 4 , 1 , 223 , 177 , 2 , "Ontario" , new int[] {2 , 3 , 5 , 6 , 7 , 9}); + provinces[5] = new Province( 5 , 1 , 160 , 236 , 2 , "Weststaaten" , new int[] {3 , 4 , 6 , 8}); + provinces[6] = new Province( 6 , 1 , 232 , 273 , 2 , "Oststaaten" , new int[] {4 , 5 , 7 , 8}); + provinces[7] = new Province( 7 , 1 , 300 , 180 , 2 , "Quebec" , new int[] {4 , 6 , 9}); + provinces[8] = new Province( 8 , 1 , 181 , 347 , 1 , "Mittelamerika" , new int[] {5 , 6 , 17}); + provinces[9] = new Province( 9 , 1 , 365 , 55 , 1 , "Groenland" , new int[] {2 , 4 , 7 , 10}); + + // cID 2 - Europa + provinces[10] = new Province(10 , 2 , 454 , 142 , 1 , "Island" , new int[] {9 , 11 , 12}); + provinces[11] = new Province(11 , 2 , 424 , 221 , 2 , "Grossbritannien" , new int[] {10 , 12 , 14 , 15}); + provinces[12] = new Province(12 , 2 , 520 , 153 , 1 , "Skandinavien" , new int[] {10 , 11 , 13 , 14}); + provinces[13] = new Province(13 , 2 , 636 , 180 , 2 , "Russland" , new int[] {12 , 14 , 16 , 27 , 31 , 32}); + provinces[14] = new Province(14 , 2 , 528 , 232 , 2 , "Nordeuropa" , new int[] {11 , 12 , 13 , 15 , 16}); + provinces[15] = new Province(15 , 2 , 449 , 335 , 2 , "Westeuropa" , new int[] {11 , 14 , 16 , 25}); + provinces[16] = new Province(16 , 2 , 537 , 296 , 2 , "Suedeuropa" , new int[] {13 , 14 , 15 , 25 , 26 , 27}); + + // cID 3 - Suedamerika + provinces[17] = new Province(17 , 3 , 245 , 396 , 1 , "Venezuela" , new int[] {8 , 18 , 19}); + provinces[18] = new Province(18 , 3 , 255 , 498 , 1 , "Peru" , new int[] {17 , 19 , 20}); + provinces[19] = new Province(19 , 3 , 327 , 467 , 2 , "Brasilien" , new int[] {17 , 18 , 20 , 25}); + provinces[20] = new Province(20 , 3 , 274 , 572 , 1 , "Argentinien" , new int[] {18 , 19}); + + // cID 4 - Afrika + provinces[21] = new Province(21 , 4 , 680 , 630 , 1 , "Madagaskar" , new int[] {24 , 22}); + provinces[22] = new Province(22 , 4 , 580 , 624 , 1 , "Südafrika" , new int[] {21 , 23 , 24}); + provinces[23] = new Province(23 , 4 , 572 , 537 , 2 , "Zentralafrika" , new int[] {22 , 25 , 24}); + provinces[24] = new Province(24 , 4 , 632 , 500 , 2 , "Ostafrika" , new int[] {21 , 22 , 25 , 23 , 26}); + provinces[25] = new Province(25 , 4 , 491 , 444 , 1 , "Nordafrika" , new int[] {15 , 16 , 26 , 23 , 24}); + provinces[26] = new Province(26 , 4 , 574 , 414 , 1 , "Aegypten" , new int[] {27 , 25 , 24 , 16}); + + // cID 5 - Asien + provinces[27] = new Province(27 , 5 , 664 , 345 , 2 , "Mittlerer Osten" , new int[] {24 , 26 , 16 , 23 , 31 , 28}); + provinces[28] = new Province(28 , 5 , 784 , 370 , 2 , "Indien" , new int[] {29 , 31 , 27 , 30}); + provinces[29] = new Province(29 , 5 , 863 , 322 , 2 , "China" , new int[] {30 , 28 , 31 , 32 , 33 , 37}); + provinces[30] = new Province(30 , 5 , 867 , 400 , 1 , "Südost Asien" , new int[] {29 , 39 , 28}); + provinces[31] = new Province(31 , 5 , 724 , 262 , 1 , "Afganistan" , new int[] {29 , 28 , 27 , 13 , 32}); + provinces[32] = new Province(32 , 5 , 740 , 163 , 1 , "Ural" , new int[] {29 , 33 , 31 , 13}); + provinces[33] = new Province(33 , 5 , 802 , 128 , 1 , "Sibirien" , new int[] {34 , 35 , 37 , 29 , 32}); + provinces[34] = new Province(34 , 5 , 884 , 82 , 1 , "Jakutien" , new int[] {36 , 35 , 33}); + provinces[35] = new Province(35 , 5 , 867 , 176 , 2 , "Irkutsk" , new int[] {34 , 36 , 37 , 33}); + provinces[36] = new Province(36 , 5 , 973 , 89 , 1 , "Kamtschatka" , new int[] {1 , 38 , 37 , 35 , 34}); + provinces[37] = new Province(37 , 5 , 882 , 243 , 1 , "Mongolei" , new int[] {29 , 33 , 35 , 36 , 38}); + provinces[38] = new Province(38 , 5 , 994 , 249 , 2 , "Japan" , new int[] {37 , 36}); + + // cID 6 - Ozeanien + provinces[39] = new Province(39 , 6 , 889 , 519 , 1 , "Indonesien" , new int[] {30 , 40 , 42}); + provinces[40] = new Province(40 , 6 , 983 , 492 , 2 , "Neuguinea" , new int[] {39 , 41 , 42}); + provinces[41] = new Province(41 , 6 , 1000, 595 , 1 , "Ost Australien" , new int[] {40 , 42}); + provinces[42] = new Province(42 , 6 , 934 , 628 , 1 , "West Australien" , new int[] {40 , 41 , 39}); + + initProvinces(); + } +} diff --git a/planung/architektur.md b/planung/architektur.md index 775a38c..7bb1dba 100644 --- a/planung/architektur.md +++ b/planung/architektur.md @@ -1,268 +1,268 @@ -# Architekturplan Zweiundvierzig - -**Letztes Update: 15.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) - -[Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) - -[Hier zur übersichtlichen Funktionsliste auf dem aktuellen Branch](funktionsliste.md) - -Dieser Plan wird verfasst und regelmäßig gepflegt durch *Felix Stupp*. Das Alter der vorliegenden Version ist am Datum am Dateianfang zu erkennen. - -## Erklärung zur Architektur - -Hier werden alle Klassen mit deren öffentliche Methoden (**public** und **protected**) und den vorgesehenen Eigenschaften (nur **private**) festgehalten. - -**Alle Fragen zur Architektur oder auch Änderungsvorschläge gerne an mich weitergeben.** Ich werde dies dann behandeln und gegebenfalls auch Änderungen an der Architektur durchführen. - -### Wichtige Infos - -- **Bitte kommentiert all eure Methoden nach dem Java-Standard, damit diese in der automatisch generierten Dokumentation auch mit einer kurzen Erklärung auftauchen.** -- **Die Provinz-ID und somit auch die Indexe der Arrays beginnen dafür erst bei 1!** - -### Hinweise - -- Die englischen Begriffe *World* und *Actor* stehen für die gegebenen Oberklassen von Greenfoot. -- Alle Methoden sind meist als **public** zu sehen und werden hauptsächlich von anderen Klassen aufgerufen. -- Die Kategorie **Privat Eigenschaften** wird nur aufgelistet, wenn die Klasse von mehreren Autoren geschrieben wird/wurde oder die Klasse noch geschrieben werden muss. - -### Abkürzungen - -- **GUI** ([Graphical User Interface](https://de.wikipedia.org/wiki/Grafische_Benutzeroberfl%C3%A4che)): Beschreibt die Möglichkeit, durch welche ein Benutzer gewöhnlicherweise mit Programmen interagieren kann. - -### Tipps - -- Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschrieben wird, müsst ihr nicht diesselben Parameterbezeichner verwenden, wie sie hier verwendet wurden. Falls aus diesem Bezeichner jedoch nicht mehr die Bedeutung des Parameters ausgeht, muss dies in einem Java-Documentation Kommentar erklärt werden. -- Alle Klassen, die als Actor agieren und **nur** in der auf der *GeneralMap* beziehungsweise der Unterklassen dieser Klasse eingesetzt werden, müssen teilweise mit dieser Welt interagieren. Um die aktuelle Welt sofort im richtigen Typ zu bekommen, damit auf unsere Funktionen zugegriffen werden können, kann euch folgender Code Snippet helfen. Einfach in die Klassen einfügen einfügen und **getWorld** () wird euch besser helfen können. -``` java -@Override public GeneralMap getWorld() { - return (GeneralMap) super.getWorld(); -} -``` -- Arbeitet bitte, wenn möglich, mit der *Utils*-Klasse, diese kann helfen den Code übersichtlicher und kürzer zu gestalten, da häufige und allgemein umsetzbare Aufgaben über diese einheitlich abgearbeitet werden sollen. Das Debuggen wird somit auch einfacher, sowohl für mich als auch für euch selbst. -- Ihr könnt auch ab und zu in die Dokumentationen der offiziellen Java-Bibliotheken schauen, falls ihr denkt, dass es bereits eine Methode geben sollte für den Vorgang, den ihr sonst selbst programmieren müsstet. - ---- - -## Klassenverzeichnis - -### Worlds - -- World für den Spielstart -- *GeneralMap* -- Alle spezifischen Maps - - *Map_World* (gesamte Weltkarte) - -### Actors - -- *Province* -- *Player* - -- *GUI_Interface* - - *Label* - - *Button* - - *Dice* - -- *DicesList* - - *OffenderDices* - - *DefenderDices* - -### Sonstige - -- *Utils* - ---- - -## Spielstart - -Diese *World* hat die Aufgabe, zum einen den Titelbildschirm (mit einem schönen Hintergrundbild, welches später noch optional gezeichnet wird) des Spiels anzeigt, daraufhin ein Menü mit den Möglichkeiten, ein Spiel zu starten oder zu laden (der Button für das Laden eines Speicherstand's bleibt vorerst ohne Funktion, auch optional geplant). Beim Erstellen eines neuen Spiels soll man sowohl die Möglichkeit bekommen, die Eigenschaften der Spieler und die der Map auszuwählen. - -Dies kann entweder in verschiedenen *World*'s gelöst werden, als auch in einer einzelnen. Dies bleibt euch zusammen mit dem Design diesem Menü überlassen. - -Ich schlage euch vor, die bereits von mir erstellen Steuerelemente *Label* und *Button* zu verwenden. Diese sollten die Arbeit für euch wesentlich erleichtern, genauso wie das Schreiben von neuen Steuerelementen, falls ihr bemerken sollte, dass ihr diese öfters braucht als einmal. Diese sollten dann auch selbst von der Oberklasse *GUI_Interface* erben. - ---- - -## GeneralMap - -Alle spezifischen Maps erben von dieser Oberklasse. -Diese Klasse ist für Greenfoot die aktive *World* im laufenden Spiel und auch für die Anzeigen links/rechts/unten verantwortlich. -Die erbenden Unterklassen legen dann das Hintergrundbild, die Provinzen, und weitere spezifische Eigenschaften der Karten dar. -Diese Oberklasse kümmert sich dabei um die Anzeigen, die Spielmechanik und die Speicherung der Spieler und Provinzen. -Auch, wenn diese Klasse einen Konstruktor besitzt, ist dieser nur für die Unterklassen, also für die spezifischen Maps, als Vereinfachung gedacht. - -### Konstruktorparameter - -Als ersten Parameter wird die *GeneralMap* den Dateinamen des Hintergrundbilds der Map als *String* erwarten, welches automatisch von der jeweiligen Map-Klasse übergeben wird. Die folgenden Parameter werden von allen Map-Klassen, inklusive der *GeneralMap*, erwartet. Die Unterklassen sollen hierbei alles 1:1 weitergeben. - -1. Spielerliste mit den Namen als *String[]* -2. Liste mit den jeweiligen "Farben" der Spieler als *int[]* - -#### Hintergrundbild - -Dies soll von den Konstruktoren der spezifischen Maps weitergegeben werden. Der Dateiname ist dort jeweils angepasst und direkt im Code als Konstante angegebenen. Diese Oberklasse übernimmt dann alle Aktionen, um es im Hintergrund der GUI Grafik anzuzeigen. - -#### Spielerliste und "Farben"-Liste - -Die beiden Arrays sollen Grundinformationen zu den Spielern weitergeben. Weitere Informationen zu den "Farben" sind bei der *Player*-Klasse zu finden. - -### Private Eigenschaften - -- Spielerliste (*Player[]*, der Index entspricht der Spieler ID, *anfangend bei 0*) -- Provinzliste (*Province[]*, als **protected** definiert, der Index entspricht der Provinz ID, *anfangend bei 1*) - -#### Spielerliste - -Diese Liste soll alle *Player*-Objekte für die Spieler enthalten, welche dann auch als Actor links von der Karte zu sehen sein sollten. - -#### Provinzliste - -Die Provinzliste enthält alle Provinzobjekte, die auf der Karte zu sehen sind. Diese wird erst vom Konstruktor der spezifischen Maps gefüllt. - -### Protected Methoden - -- *void* **addProvinceToMap** ( *Province* province ) - -#### addProvinceToMap() - -Diese Methode soll das Hinzufügen der Provinzen, sowohl in das Array, als auch an die richtige Position auf der *World* übernehmen. Sollte eine Provinz-ID zweimal verwendet werden sollen, wird diese Methode einen Fehler auslösen! - -### Public Methoden - -- *int* **getPlayerCount** () -- *String* **getPlayerName** () -- *String* **getPlayerName** ( *int* playerID ) -- *int* **getPlayerStars** () - -- *int* **getProvinceOwner** ( *int* provinceID ) -- *int[]* **getProvinceOwners** () -- *int* **getProvinceEntityCount** ( *int* playerID ) - -#### getPlayerCount() - -Gibt die Anzahl der im Spiel vorhandenen Spieler aus. - -#### getPlayerName() - -Gibt den Namen des gegebenen Spielers aus. Muss Fehler durch falschen Indexen ausweichen. Falls kein Wert oder ein ungültiger übergeben wird, soll stattdessen der Name des aktuellen Spielers zurückgegeben werden. - -#### getPlayerStars() - -Diese Funktion soll die Anzahl der Sterne des aktuellen Spielers zurückgeben. - -#### getProvinceOwner() - -Gibt die Spieler ID von dem Spieler aus, dem die Provinz gehört. Bei falschen Indexen muss eine -1 (kein Spieler) zurückgegeben werden. - -#### getProvinceOwners() - -Gibt ein Array mit allen Provinzen (deren ID als Indexen) und den Spieler IDs als Wert aus. - -#### getProvinceEntityCount() - -Gibt die Anzahl der Einheiten von einer bestimmten Provinz zurück. Bei falschen Indexen muss eine 0 zurückgegeben werden. - ---- - -## Spezifische Maps -*extends GeneralMap* - -Diese Unterklassen enthalten Informationen wie das Hintergrundbild der jeweiligen Map als auch die Anordnung der Provinzen auf der Map. - -### Konstruktorparameter - -Diese Konstruktorparameter müssen nur zu dieser weitergeleitet werden. Für weitere Informationen bitte bei der *GeneralMap* nachschlagen. - ---- - -## Province -*extends Actor* - -Speichert Informationen zu den einzelnen Provinzen ab und stellt diese später auch als *Actor* dar. - -### Konstruktorparameter - -0. Provinznummer als *int* -0. Kontinentnummer als *int* -0. X-Position auf der Karte als *int* -0. Y-Position auf der Karte als *int* -0. Anzeigename als *String* -0. Sterne als *int* -0. Angrenzende Provinzen als *int[]* (als als *boolean[]* gespeichert) - -#### Provinz-ID - -Stellt die ID der Provinz dar. - -#### Kontinent-ID - -Stellt die ID des Kontinentes dar. - -#### Position - -Diese zwei Werte legen fest, wo die sichtbaren Eigenschaften der Provinz angezeigt werden sollen. -Sind nach dem Erstellen der Provinz nicht mehr abrufbar. - -#### Anzeigename - -Dies ist der Name, der auf der Karte und bei Events im Zusammenhang mit dieser Provinz angezeigt wird. - -#### Sterne - -Dieser Wert wird für die zufällige Verteilung von Einheiten benötigt. Er ist fest für eine Provinz festgeschrieben. - -#### Angrenzende Provinzen - -Dies ist ein Array von allen Provinzen, die es gibt (Provinznummer als Index), diese jeweils mit einem *boolean*-Wert, der festlegt, ob ein Kampf oder ein Weitergeben von Einheiten möglich ist. -```java -boolean[] nearProvinces; -``` -Dem Konstruktor wird stattdessen ein *int[]* mit allen angrenzenden Provinzen als Werte übergeben werden, dieses wird dann automatisch konvertiert. - -### Private Eigenschaften - -- Provinznummer -- Kontinentnummer -- X/Y-Position auf der Karte -- Anzeigename -- Sterne -- Angrenzende Provinzen - -- Besitzer -- Einheitenanzahl - -#### Besitzer - -Diese Variable speichert den aktuellen Besitzer. - -Über die Methode **int getOwner()** bekommt ihr den aktuellen Besitzer zurück (-1 = keiner, 0 = Spieler 1, ...). - -Die Methode **boolean setOwner(int)** speichert einen neuen Besitzer ab. Sie gibt den Erfolg des Setzens zurück, falls also die Zahl kleiner -1 oder größer gleich als die Spieleranzahl sein sollte, wird die Änderung nicht durchgeführt und es wird **false** zurückgegeben. - -#### Einheitenanzahl - -Diese Eigenschaft speichert, wie viele Einheiten auf diesem Feld stehen (natürlich welche, die dem Besitzer gehören). - -### Public Methoden +# Architekturplan Zweiundvierzig + +**Letztes Update: 15.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) + +[Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/architektur.md) + +[Hier zur übersichtlichen Funktionsliste auf dem aktuellen Branch](funktionsliste.md) + +Dieser Plan wird verfasst und regelmäßig gepflegt durch *Felix Stupp*. Das Alter der vorliegenden Version ist am Datum am Dateianfang zu erkennen. + +## Erklärung zur Architektur + +Hier werden alle Klassen mit deren öffentliche Methoden (**public** und **protected**) und den vorgesehenen Eigenschaften (nur **private**) festgehalten. + +**Alle Fragen zur Architektur oder auch Änderungsvorschläge gerne an mich weitergeben.** Ich werde dies dann behandeln und gegebenfalls auch Änderungen an der Architektur durchführen. + +### Wichtige Infos + +- **Bitte kommentiert all eure Methoden nach dem Java-Standard, damit diese in der automatisch generierten Dokumentation auch mit einer kurzen Erklärung auftauchen.** +- **Die Provinz-ID und somit auch die Indexe der Arrays beginnen dafür erst bei 1!** + +### Hinweise + +- Die englischen Begriffe *World* und *Actor* stehen für die gegebenen Oberklassen von Greenfoot. +- Alle Methoden sind meist als **public** zu sehen und werden hauptsächlich von anderen Klassen aufgerufen. +- Die Kategorie **Privat Eigenschaften** wird nur aufgelistet, wenn die Klasse von mehreren Autoren geschrieben wird/wurde oder die Klasse noch geschrieben werden muss. + +### Abkürzungen + +- **GUI** ([Graphical User Interface](https://de.wikipedia.org/wiki/Grafische_Benutzeroberfl%C3%A4che)): Beschreibt die Möglichkeit, durch welche ein Benutzer gewöhnlicherweise mit Programmen interagieren kann. + +### Tipps + +- Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschrieben wird, müsst ihr nicht diesselben Parameterbezeichner verwenden, wie sie hier verwendet wurden. Falls aus diesem Bezeichner jedoch nicht mehr die Bedeutung des Parameters ausgeht, muss dies in einem Java-Documentation Kommentar erklärt werden. +- Alle Klassen, die als Actor agieren und **nur** in der auf der *GeneralMap* beziehungsweise der Unterklassen dieser Klasse eingesetzt werden, müssen teilweise mit dieser Welt interagieren. Um die aktuelle Welt sofort im richtigen Typ zu bekommen, damit auf unsere Funktionen zugegriffen werden können, kann euch folgender Code Snippet helfen. Einfach in die Klassen einfügen einfügen und **getWorld** () wird euch besser helfen können. +``` java +@Override public GeneralMap getWorld() { + return (GeneralMap) super.getWorld(); +} +``` +- Arbeitet bitte, wenn möglich, mit der *Utils*-Klasse, diese kann helfen den Code übersichtlicher und kürzer zu gestalten, da häufige und allgemein umsetzbare Aufgaben über diese einheitlich abgearbeitet werden sollen. Das Debuggen wird somit auch einfacher, sowohl für mich als auch für euch selbst. +- Ihr könnt auch ab und zu in die Dokumentationen der offiziellen Java-Bibliotheken schauen, falls ihr denkt, dass es bereits eine Methode geben sollte für den Vorgang, den ihr sonst selbst programmieren müsstet. + +--- + +## Klassenverzeichnis + +### Worlds + +- World für den Spielstart +- *GeneralMap* +- Alle spezifischen Maps + - *Map_World* (gesamte Weltkarte) + +### Actors + +- *Province* +- *Player* + +- *GUI_Interface* + - *Label* + - *Button* + - *Dice* + +- *DicesList* + - *OffenderDices* + - *DefenderDices* + +### Sonstige + +- *Utils* + +--- + +## Spielstart + +Diese *World* hat die Aufgabe, zum einen den Titelbildschirm (mit einem schönen Hintergrundbild, welches später noch optional gezeichnet wird) des Spiels anzeigt, daraufhin ein Menü mit den Möglichkeiten, ein Spiel zu starten oder zu laden (der Button für das Laden eines Speicherstand's bleibt vorerst ohne Funktion, auch optional geplant). Beim Erstellen eines neuen Spiels soll man sowohl die Möglichkeit bekommen, die Eigenschaften der Spieler und die der Map auszuwählen. + +Dies kann entweder in verschiedenen *World*'s gelöst werden, als auch in einer einzelnen. Dies bleibt euch zusammen mit dem Design diesem Menü überlassen. + +Ich schlage euch vor, die bereits von mir erstellen Steuerelemente *Label* und *Button* zu verwenden. Diese sollten die Arbeit für euch wesentlich erleichtern, genauso wie das Schreiben von neuen Steuerelementen, falls ihr bemerken sollte, dass ihr diese öfters braucht als einmal. Diese sollten dann auch selbst von der Oberklasse *GUI_Interface* erben. + +--- + +## GeneralMap + +Alle spezifischen Maps erben von dieser Oberklasse. +Diese Klasse ist für Greenfoot die aktive *World* im laufenden Spiel und auch für die Anzeigen links/rechts/unten verantwortlich. +Die erbenden Unterklassen legen dann das Hintergrundbild, die Provinzen, und weitere spezifische Eigenschaften der Karten dar. +Diese Oberklasse kümmert sich dabei um die Anzeigen, die Spielmechanik und die Speicherung der Spieler und Provinzen. +Auch, wenn diese Klasse einen Konstruktor besitzt, ist dieser nur für die Unterklassen, also für die spezifischen Maps, als Vereinfachung gedacht. + +### Konstruktorparameter + +Als ersten Parameter wird die *GeneralMap* den Dateinamen des Hintergrundbilds der Map als *String* erwarten, welches automatisch von der jeweiligen Map-Klasse übergeben wird. Die folgenden Parameter werden von allen Map-Klassen, inklusive der *GeneralMap*, erwartet. Die Unterklassen sollen hierbei alles 1:1 weitergeben. + +1. Spielerliste mit den Namen als *String[]* +2. Liste mit den jeweiligen "Farben" der Spieler als *int[]* + +#### Hintergrundbild + +Dies soll von den Konstruktoren der spezifischen Maps weitergegeben werden. Der Dateiname ist dort jeweils angepasst und direkt im Code als Konstante angegebenen. Diese Oberklasse übernimmt dann alle Aktionen, um es im Hintergrund der GUI Grafik anzuzeigen. + +#### Spielerliste und "Farben"-Liste + +Die beiden Arrays sollen Grundinformationen zu den Spielern weitergeben. Weitere Informationen zu den "Farben" sind bei der *Player*-Klasse zu finden. + +### Private Eigenschaften + +- Spielerliste (*Player[]*, der Index entspricht der Spieler ID, *anfangend bei 0*) +- Provinzliste (*Province[]*, als **protected** definiert, der Index entspricht der Provinz ID, *anfangend bei 1*) + +#### Spielerliste + +Diese Liste soll alle *Player*-Objekte für die Spieler enthalten, welche dann auch als Actor links von der Karte zu sehen sein sollten. + +#### Provinzliste + +Die Provinzliste enthält alle Provinzobjekte, die auf der Karte zu sehen sind. Diese wird erst vom Konstruktor der spezifischen Maps gefüllt. + +### Protected Methoden + +- *void* **initProvinces** () + +#### initProvinces() + +Diese Methode soll das Hinzufügen der Provinzen an die richtige Position auf der *World* übernehmen (nicht ins Array). Diese Methode sucht sich alle Provinzen aus dem Array *Province[]* **provinces**. + +### Public Methoden + +- *int* **getPlayerCount** () +- *String* **getPlayerName** () +- *String* **getPlayerName** ( *int* playerID ) +- *int* **getPlayerStars** () + +- *int* **getProvinceOwner** ( *int* provinceID ) +- *int[]* **getProvinceOwners** () +- *int* **getProvinceEntityCount** ( *int* playerID ) + +#### getPlayerCount() + +Gibt die Anzahl der im Spiel vorhandenen Spieler aus. + +#### getPlayerName() + +Gibt den Namen des gegebenen Spielers aus. Muss Fehler durch falschen Indexen ausweichen. Falls kein Wert oder ein ungültiger übergeben wird, soll stattdessen der Name des aktuellen Spielers zurückgegeben werden. + +#### getPlayerStars() + +Diese Funktion soll die Anzahl der Sterne des aktuellen Spielers zurückgeben. + +#### getProvinceOwner() + +Gibt die Spieler ID von dem Spieler aus, dem die Provinz gehört. Bei falschen Indexen muss eine -1 (kein Spieler) zurückgegeben werden. + +#### getProvinceOwners() + +Gibt ein Array mit allen Provinzen (deren ID als Indexen) und den Spieler IDs als Wert aus. + +#### getProvinceEntityCount() + +Gibt die Anzahl der Einheiten von einer bestimmten Provinz zurück. Bei falschen Indexen muss eine 0 zurückgegeben werden. + +--- + +## Spezifische Maps +*extends GeneralMap* + +Diese Unterklassen enthalten Informationen wie das Hintergrundbild der jeweiligen Map als auch die Anordnung der Provinzen auf der Map. + +### Konstruktorparameter + +Diese Konstruktorparameter müssen nur zu dieser weitergeleitet werden. Für weitere Informationen bitte bei der *GeneralMap* nachschlagen. + +--- + +## Province +*extends Actor* + +Speichert Informationen zu den einzelnen Provinzen ab und stellt diese später auch als *Actor* dar. + +### Konstruktorparameter + +0. Provinznummer als *int* +0. Kontinentnummer als *int* +0. X-Position auf der Karte als *int* +0. Y-Position auf der Karte als *int* +0. Anzeigename als *String* +0. Sterne als *int* +0. Angrenzende Provinzen als *int[]* (als als *boolean[]* gespeichert) + +#### Provinz-ID + +Stellt die ID der Provinz dar. + +#### Kontinent-ID + +Stellt die ID des Kontinentes dar. + +#### Position + +Diese zwei Werte legen fest, wo die sichtbaren Eigenschaften der Provinz angezeigt werden sollen. +Sind nach dem Erstellen der Provinz nicht mehr abrufbar. + +#### Anzeigename + +Dies ist der Name, der auf der Karte und bei Events im Zusammenhang mit dieser Provinz angezeigt wird. + +#### Sterne + +Dieser Wert wird für die zufällige Verteilung von Einheiten benötigt. Er ist fest für eine Provinz festgeschrieben. + +#### Angrenzende Provinzen + +Dies ist ein Array von allen Provinzen, die es gibt (Provinznummer als Index), diese jeweils mit einem *boolean*-Wert, der festlegt, ob ein Kampf oder ein Weitergeben von Einheiten möglich ist. +```java +boolean[] nearProvinces; +``` +Dem Konstruktor wird stattdessen ein *int[]* mit allen angrenzenden Provinzen als Werte übergeben werden, dieses wird dann automatisch konvertiert. + +### Private Eigenschaften + +- Provinznummer +- Kontinentnummer +- X/Y-Position auf der Karte +- Anzeigename +- Sterne +- Angrenzende Provinzen + +- Besitzer +- Einheitenanzahl + +#### Besitzer + +Diese Variable speichert den aktuellen Besitzer. + +Über die Methode **int getOwner()** bekommt ihr den aktuellen Besitzer zurück (-1 = keiner, 0 = Spieler 1, ...). + +Die Methode **boolean setOwner(int)** speichert einen neuen Besitzer ab. Sie gibt den Erfolg des Setzens zurück, falls also die Zahl kleiner -1 oder größer gleich als die Spieleranzahl sein sollte, wird die Änderung nicht durchgeführt und es wird **false** zurückgegeben. + +#### Einheitenanzahl + +Diese Eigenschaft speichert, wie viele Einheiten auf diesem Feld stehen (natürlich welche, die dem Besitzer gehören). + +### Public Methoden - *int* **getXPos** () -- *int* **getYPos** () -- *int* **getID** () -- *int* **getContinentID** () -- *String* **getDisplayName** () -- *int* **getStars** () - -- *boolean* **isProvinceNear** ( *int* provinceID ) - -- *int* **getOwner** () -- *boolean* **setOwner** ( *int* playerID ) - -- *int* **getEntityCount** () -- *int* **addToEntities** ( *int* entityCountToAdd ) -- *int* **removeFromEntities** ( *int* entityCountToRemove ) -- *int* **setEntityCount** ( *int* newEntityCount) - -- *boolean* **hasClicked** () - +- *int* **getYPos** () +- *int* **getID** () +- *int* **getContinentID** () +- *String* **getDisplayName** () +- *int* **getStars** () + +- *boolean* **isProvinceNear** ( *int* provinceID ) + +- *int* **getOwner** () +- *boolean* **setOwner** ( *int* playerID ) + +- *int* **getEntityCount** () +- *int* **addToEntities** ( *int* entityCountToAdd ) +- *int* **removeFromEntities** ( *int* entityCountToRemove ) +- *int* **setEntityCount** ( *int* newEntityCount) + +- *boolean* **hasClicked** () + - *void* **redrawProvince** () #### getXPos() @@ -271,609 +271,609 @@ Gibt die in der Provinz hinterlegte X-Position zurück. #### getYPos() -Gibt die in der Provinz hinterlegte Y-Position zurück. - -#### getID() - -Gibt die Provinz-ID dieser Provinz zurück. - -#### getContinentID() - -Gibt die Kontinent-ID dieser Provinz zurück. - -#### getDisplayName() - -Gibt den Anzeigenamen dieser Provinz zurück. - -#### getStars() - -Gibt die hinterlegte Anzahl an Sternen dieser Provinz zurück. - -#### isProvinceNear() - -Gibt zurück, ob die angebenene Provinz mit dieser Provinz benachbart ist, umn beispielsweise Einheiten verschieben zu können. - -#### getOwner() - -Gibt die Spieler-ID des aktuellen Besitzer der Provinz als *int* zurück. **-1** bedeutet, dass diese Provinz aktuell keinen Besitzer hat. - -#### setOwner() - -Legt einen neuen Besitzer für diese Provinz fest. Bei Erfolg gibt die Methode **true** zurück. Sollte die ID für keinen Spieler stehen, wird die Methode **false** zurückgeben und nichts an dem gespeicherten Wert ändern. - -#### getEntityCount() - -Gibt die aktuelle Einheitenanzahl auf dieser Provinz zurück. - -#### addToEntities() - -Addiert die gegebene Anzahl der Einheiten auf die gespeicherte Anzahl drauf, speichert den neuen Wert ab und gibt diesen zurück. - -#### removeFromEntities() - -Subtrahiert die gegebene Anzahl der Einheiten von die gespeicherte Anzahl ab, speichert den neuen Wert ab und gibt diesen zurück. Bei einem neuen Wert von unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. - -#### setEntityCount() - -Setzt einen neuen festen Wert für die Einheitenanzahl fest und gibt diesen wieder zurück. Bei gegebenen Werten unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. - -#### hasClicked() - -Gibt zurück, ob seid dem letzten Aufruf dieser Methode diese Provinz von der Maus angeklickt wurde. - -#### redrawProvince() - -Wird von der Karte oder von internen Methoden aufgerurfen, um alle sichtbaren Eigenschaften erneut zu zeichnen. - ---- - -## Player -*extends Actor* - -Stellt die Spieler da, speichert Informationen zu diesen ab. - -### Konstruktorparameter - -0. Spieler-ID als *int* -0. Anzeigename als *String* -0. "Farbe" als *int* - -#### Spielernummer - -Wird bei der Welt intern benötigt und stellt die Position im Menü und in den Arrays dar. - -#### Anzeigename - -Ist der lesbare Name des Spielers, damit nicht nur "Spieler 1", ... usw. zu sehen ist. - -#### "Farbe" - -Dies soll die "Farbe" eines Spielers festlegen. *Falls euch ein besserer Name für diese Eigenschaft einfällt, bitte mir weitergeben.* - -### Private Eigenschaften - -- Spielernummer -- Anzeigename -- "Farbe" - -- Sternanzahl -- Statistiken - -#### Sternanzahl - -Die Anzahl der Sterne, die ein Spieler besitzt und gegebenenfalls dann in Einheiten umtauschen kann. - -#### Statistik - -Die Statistik soll Events festhalten, um nach einem Spiel verschiedene Werte einsehen zu können. Diese werden von der Welt durch spezielle Funktionen erhöht. Die Reihenfolge, in der die Statistiken angegeben werden, ist wie folgt festgelegt: - -1. Eroberte Provinzen -2. Verlorene Provinzen -3. Einflussmaximum (maximale Provinzenanzahl, nach einem Zug zu überprüfen) -4. Bekommene Einheiten -5. Verlorene Einheiten -6. Maximale Einheitenanzahl (nach einem Zug zu überprüfen) - -### Public Methoden - -- *int* **getID** () -- *String* **getDisplayName** () - -- *int* **getStars** () -- *int* **addToStars** ( *int* starsToAdd ) -- *int* **removeFromStars** ( *int* starsToRemove ) -- *int* **setStars** ( *int* newStarsCount ) -- *boolean* **canStarsRemoved** ( *int* requiredStarsCount ) - -- *int[]* **getStatistics** () - - *void* **gotProvince** () - - *void* **lostProvince** () - - *void* **gotEntities** ( *int* addedEntities ) - - *void* **lostEntity** () - -- *boolean[]* **getMyProvinces** () -- *int* **getProvinceCount** () -- *void* **redrawPlayer** () - -#### getID() - -Gibt die Spieler-ID dieses Spielers zurück. - -#### getDisplayName() - -Gibt den Anzeigenamen des Spielers zurück. - -#### getStars() - -Gibt die aktuelle Anzahl der Sterne, die der Spieler besitzt, zurück. - -#### addToStars() - -Addiert die gegebene Anzahl der Sterne auf die gespeicherte Anzahl drauf, speichert den neuen Wert ab und gibt diesen zurück. - -#### removeFromStars() - -Subtrahiert die gegebene Anzahl der Sterne von die gespeicherte Anzahl ab, speichert den neuen Wert ab und gibt diesen zurück. Bei einem neuen Wert von unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. - -#### setStars() - -Setzt einen neuen festen Wert für die Sternenanzahl fest und gibt diesen wieder zurück. Bei gegebenen Werten unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. - -#### canStarsRemoved() - -Prüft, ob die gegebenene Anzahl an Sternen von dem Spieler abgezogen werden könnte. Falls ja, wird **true** zurückgegebenen, sonst **false** - -#### getStatistics() - -Gibt in derselben Reihenfolge wie für die Statistik angegeben die aktuelllen Werte zurück als *int[]*-Array - -#### gotProvince() - -Wird von der Welt aufgerufen, sobald dieser Spieler eine Provinz erobert hat. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um 1. - -#### lostProvinze() - -Wird von der Welt aufgerufen, sobald dieser Spieler eine Provinz verloren hat. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um 1. - -#### gotEntities() - -Wird von der Welt aufgerufen, sobald dieser Spieler Einheiten dazubekommt. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um die gegebenene Anzahl. - -#### lostEntity() - -Wird von der Welt aufgerufen, sobald dieser Spieler im Kampf eine Einheit verliert. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um 1. - -#### getMyProvinces() - -Diese Methode hat die Aufgabe, eine Liste aller Provinzen zurückzugeben, wobei jede Provinz mit einem *boolean*-Wert gesagt bekommt, ob sie dem Spieler gehört oder nicht. - -Diese Methode muss zwingend mit der Welt interagieren, um diese Informationen zu bekommen. - -#### getProvinceCount() - -Gibt die Anzahl der Provinzen, die der Spieler hat, zurück. Gut für die Statistik und die Anzeigen. - -#### redrawPlayer() - -Erzwingt das erneute Zeichnen des Player Objekts, um alle sichtbaren Eigenschaften erneut zu zeichnen. - ---- - -## DicesList -*extends Actor* - -Erstellt die gegebene Anzahl an Würfeln nebeneinander und bietet die gemeinsame Verwaltung dieser. Diese Klasse ist nur als *abstract* Oberklasse zu *OffenderDices* & *DefenderDices* gedacht und ist daher selbst nicht verwendbar, dennoch sich hier alle Methoden, die ihr braucht, definiert. Die Unterklassen legen nur die Farbe der Würfel und die maximale Anzahl fest. - -### Verwendung - -Nachdem ihr euch für eine Unterklasse entschieden habt, erstellt ihr eine neue Instanz von dieser und übergibt ihr die Anzahl der Würfel, die ihr darstellen wollt (diese Zahl kann größer als die erlaubte Anzahl an Würfel sein, dies wird **automatisch korrigiert**, beim Angreifer auf 3, beim Verteidiger auf 2). Bei zu kleinen Zahlen wird auf 1 korrigiert. -```java -DicesList offenders = new OffenderDices(5); // Wird korrigiert auf '3' -DicesList defenders = new DefenderDices(-3); // Wird korrigiert auf '1' -``` -Die nun erstellte Instanz solltet ihr einer Welt hinzufügen, um die Würfel sehen zu können. Achtet dabei auf die Position, die ihr der Welt übergibt. -```java -addObject(offenders,200,800); -``` -Nun könnt ihr mit den Methoden **getNumbers** und **roll** alle Würfel parallel steuern. -```java -int[] zahlenAng = offenders.roll(); -int[] zahlenVer = defenders.getNumbers(); -if(zahlenAng[1] > zahlenVer[1]) { - // Angreifer gewinnt -} else { - // Verteidiger gewinnt -} -``` -Solltet ihr die Würfel nicht mehr brauchen und ihr möchtet sie entfernen, reicht ein simpler Aufruf von **removeAll**. -```java -offenders.removeAll(); -offenders = null; // muss nicht sein, gehört aber zum sauberen Programmieren dazu -``` - -### Konstruktorparameter - -1. Anzahl der Würfel als *int* (Weiterleitung des Konstruktors von den Unterklassen) -2. Maximale Anzahl als *int* (fester Wert der Unterklasse) -3. Hintergundfarbe als *java.awt.Color* (fester Wert der Unterklasse) -4. Vordergrundfarbe als *java.awt.Color* (fester Wert der Unterklasse) - -### Protected Methoden - -- *void* **addedToWorld** ( *World* world ) - -#### addedToWorld() - -Diese Methode wird von Greenfoot selbst aufgerufen, sobald dieser Actor einer Welt hinzugefügt wurde und kümmert sich folgend darum, seine eigenen Würfel auch der Welt hinzuzufügen an derselben Position. - -### Public Methoden - -- *int[]* **getNumbers** () -- *int[]* **roll** () - -- *void* **removeAll** () - -#### getNumbers() - -Gibt die Augenzahlen aller Würfel in sortierter Reihenfolge (absteigend) aus. - -#### roll() - -Würfelt alle Würfel erneut und gibt die neuen Augenzahlen in sortierter Reihenfolge (absteigend) aus. - -#### removeAll() - -Entfernt alle Würfel aus ihrer Welt und löscht anschließend die Liste. Die Instanz ist danach nicht mehr zu verwenden. - -## OffendersDices -*extends DicesList* - -Erstellt eine Liste von Würfeln mit roter Hintergrundfarbe. Es sind maximal 3 Würfel erlaubt. Zur Verwendung, siehe *DicesList*. - -### Konstruktorparamter - -1. Anzahl der Würfel als *int* (wird korrigiert; siehe *DicesList*-Konstruktor) - -## DefenderDices -*extends DicesList* - -Erstellt eine Liste von Würfeln mit schwarzer Hintergrundfarbe. Es sind maximal 2 Würfel erlaubt. Zur Verwendung, siehe *DicesList*. - -### Konstruktorparamter - -1. Anzahl der Würfel als *int* (wird korrigiert; siehe *DicesList*-Konstruktor) - ---- - -## GUI_Interface -*extends Actor* - -Die Oberklasse für alle Interface-Objekte wie Buttons und Labels. Diese Klasse ist als *abstract* definiert. Diese Klasse besitzt als *abstract* definierte Methoden, welche zwingend von den erbendenen Klassen ersetzt werden muss. - -### Protected Eigenschaften - -- *int* **sx** -- *int* **sy** - -#### sx - -Gibt die Breite des Objektes an (Größe in X-Richtung, **S**ize**X**). Nur für Methoden der erbenden Objekte selbst gedacht. - -#### sy - -Gibt die Höhe des Objektes an (Größe in Y-Richtung, **S**ize**Y**). Nur für Methoden der erbenden Objekte selbst gedacht. - -### Public Methoden - -- *int* **getWidth** () -- *int* **getHeight** () -- *void* **setSize** ( *int* width , *int* height ) - -- *java.awt.Color* **getBackColor** () -- *boolean* **setBackColor** ( *java.awt.Color* newBackColor) -- *java.awt.Color* **getForeColor** () -- *boolean* **setForeColor** ( *java.awt.Color* newForeColor) - -#### getWidth() - -Gibt die Breite des Objektes zurück. - -#### getHeight() - -Gibt die Höhe des Objektes zurück. - -#### setSize() - -Ändert die Größe des Objektes. Eventuell wird das Objekt diese Größenänderung nicht übernehmen wollen (siehe *autoSize* Eigenschaften bei diesen, falls vorhanden). - -#### getBackColor() - -Gibt die aktuelle Hintergrundfarbe des Objektes zurück. - -#### setBackColor() - -Legt eine neue Hintergrundfarbe für dieses Objekt fest. - -#### getForeColor() - -Gibt die aktuelle Vordergrundfarbe (meist Textfarbe) des Objektes zurück. - -#### setForeColor() - -Legt eine neue Vordergrundfarbe (meist Textfarbe) für dieses Objekt fest. - -### Abstract Public Methoden - -- *void* redraw() - -#### redraw() - -Durch diese Methode soll die erneute Zeichnung des Objektes verlangen können. Viele der **set**-Methoden rufen daher bei einer erfolgreichen Änderung diese Methode auf. - ---- - -## Label -*extends GUI_Interface* - -Zeigt einen Text auf dem Bildschirm an. Zuvor wurde dieses Objekt "Text" genannt, "Label" ist der fachlichere Ausdruck dafür. - -### Konstruktorparameter - -0. Anzeigetext als *String* -0. Textgröße als *int* - -#### Anzeigetext - -Gibt den Text an, den das Label darstellen soll. - -#### Textgröße - -Gibt die Textgröße an, in der das Label den Anzeigetext darstellen soll. - -### Private Eigenschaften - -- Anzeigetext -- Textgröße - -- Automatische Größenanpassung - -#### Automatische Größenanpassung - -Diese Eigenschaft des Labels legt fest, ob es seine Größe dynamisch an den darzustellenden Text automatisch anpassen soll. Dies kann euch die Arbeit mit diesem erleichtern, kann aber auch zu Problemen bei der Darstellung mehrerer Objekte nebeneinander erschweren, da diese sich eventuell überlappen könnten. - -### Public Methoden - -- *boolean* **getAutoSize** () -- *void* **setAutoSize** ( *boolean* newValue ) -- *int* **getTextSize** () -- *boolean* **setTextSize** ( *int* newSize ) -- *String* **getText** () -- *boolean* **setText** ( *String* newText ) - -- *void* **redraw** () - -#### getAutoSize() - -Gibt an, ob das Label seine Größe automatisch an den Inhalt anpasst. - -#### setAutoSize() - -Legt fest, ob das Label seine Größe automatisch an den Inhalt anpassen soll. Falls die Eigenschaft damit aktiviert werden sollte, erfolgt automatisch ein Aufruf der **redraw**-Methode. - -#### getTextSize() - -Gibt die aktuelle Textgröße zurück. - -#### setTextSize() - -Legt eine neue Textgröße fest. - -#### getText() - -Gibt den aktuellen Anzeigetext zurück. - -#### setText() - -Legt einen neuen Anzeigetext zurück. - -#### redraw() - -Erneuert die Darstellung des Labels mit seinem Anzeigetext auf der Welt. Hiermit wird gegebenfalls auch die Größe des Labels automatisch angepasst. - ---- - -## Button -*extends GUI_Interface* - -Stellt einen Button mit einem Text dar. Dieses Objekt kann dazu ein Event auslösen, sobald darauf geklickt wurde. - -### Konstruktorparameter - -Hier gibt es mehrere Möglichkeiten, eine Instanz der Klasse *Button* zu erstellen: - -Methode 1: -1. Anzeigetext als *String* -2. Textgröße als *int* - -Methode 2: -1. EventHandler als *ButtonEvent* - -Methode 3: -1. Anzeigetext als *String* -2. Textgröße als *int* -3. EventHandler als *ButtonEvent* - -#### Anzeigetext - -Gibt den Text an, den das Label darstellen soll. - -#### Textgröße - -Gibt die Textgröße an, in der das Label den Anzeigetext darstellen soll. - -#### EventHandler - -Hierfür muss die Instanz einer Klasse übergeben werden, welche das Interface *ButtonEvent* implementiert und damit eine Funktion namens *void* **buttonClicked** ( *Button* button ) besitzt. Folgend ein Beispiel für eine Klassendefinition, die eine Methode mit diesem Namen besitzt, die dann von dem Button aufgerufen wird, sobald dieser angeklickt wurde. - -```java -public class TestClass implements ButtonEvent { - Button button1 = new Button("Button 1",10,self); - Button button1 = new Button("Button 2",10,self); - public void buttonClicked(Button b) { - // Hier steht nun, was passieren soll, wenn IRGENDEIN Button angeklickt wird, der eine Instanz von dieser Klasse als EventHandler zugewiesen bekommen hat. - if(b == button1) { - // mein erster Button - } else if(b == button2) { - // mein zweiter Button - } - } -} -``` - -### Private Eigenschaften - -- Anzeigetext -- Textgröße -- EventHandler - -- Automatische Größenanpassung - -#### Automatische Größenanpassung - -Diese Eigenschaft des Buttons legt fest, ob es seine Größe dynamisch an den darzustellenden Text automatisch anpassen soll. Dies kann euch die Arbeit mit diesem erleichtern, kann aber auch zu Problemen bei der Darstellung mehrerer Objekte nebeneinander erschweren, da diese sich eventuell überlappen könnten. - -### Public Methoden - -- *boolean* **getAutoSize** () -- *void* **setAutoSize** ( *boolean* newValue ) -- *int* **getTextSize** () -- *boolean* **setTextSize** ( *int* newSize ) -- *String* **getText** () -- *boolean* **setText** ( *String* newText ) - -- *ButtonEvent* **getHandler** () -- *void* **setHandler** ( *ButtonEvent* newEventHandler ) -- *void* **removeHandler** () - -- *void* **redraw** () - -#### getAutoSize() - -Gibt an, ob der Button seine Größe automatisch an den Inhalt anpasst. - -#### setAutoSize() - -Legt fest, ob der Button seine Größe automatisch an den Inhalt anpassen soll. Falls die Eigenschaft damit aktiviert werden sollte, erfolgt automatisch ein Aufruf der **redraw**-Methode. - -#### getTextSize() - -Gibt die aktuelle Textgröße zurück. - -#### setTextSize() - -Legt eine neue Textgröße fest. - -#### getText() - -Gibt den aktuellen Anzeigetext zurück. - -#### setText() - -Legt einen neuen Anzeigetext zurück. - -#### getHandler() - -Gibt den aktuellen EventHandler des Buttons zurück. Falls keiner vorhanden ist, wird **null** zurückgegeben. - -#### setHandler() - -Legt einen neuen EventHandler für den Button fest. Der alte EventHandler wird damit überschrieben. - -#### removeHandler() - -Deaktiviert den aktuellen EventHandler, damit keine Events mehr ausgelöst werden können. - -#### redraw() - -Erneuert die Darstellung des Buttons mit seinem Anzeigetext auf der Welt. Hiermit wird gegebenfalls auch die Größe des Buttons automatisch angepasst. - ---- - -## Dice -*extends GUI_Interface* - -### Konstruktorparameter - -Methode 1: **keine Parameter** - -Methode 2: -1. Startwert für die gespeicherte Augenzahl als *int* - -#### Startwert - -Dieser Wert wird im Voraus beim Dice hinterlegt, damit er diese direkt anzeigen kann. Wird dieser Wert nicht angegeben, wird als Augenzahl **0** hinterlegt, stehend für: noch nicht gewürfelt. - -### Private Eigenschaften - -- Augenzahl - -#### Augenzahl - -Der Wert, der beim letzten Würfeln gewürfelt wurde. Dieser Wert wird vom Würfel auch visuell dargestellt. - -### Public Methoden - -- *int* **getNumber** () - -- *void* **setSizeAsSquare** ( *int* length ) - -- *int* **roll** () - -- *void* **redraw** () - -#### getNumber() - -Gibt die aktuell gespeicherte und somit auch visuell sichtbare Augenzahl zurück. - -#### setSizeAsSquare() - -Legt die Größe des Würfels als Quadraht fest. Nur beim Verhältnis 1:1 von Länge:Breite kann eine verzerrungsfreie Darstellung garantiert werden. Vergleichbar mit folgender Zeile: -```java -dice.setSize(length,length) -``` - -#### roll() - -Würfelt den Würfel, speichert die neue Augenzahl ab und erneurt die visuelle Darstellung des Dice. - -#### redraw() - -Erneuert die visuelle Darstellung des Dice. - ---- - -## Utils - -Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verkleinern und besser lesbar gestalten soll. Ergänzungen in Form von eigenen Funktionen dürfen **selbst** eingebracht werden. Alle Methoden dieser Klasse sollen *public* und *static* sein. - -### Static Methoden - -- *boolean[]* **copyArray** ( *boolean[]* array ) -- *int[]* **copyArray** ( *int[]* array ) -- *String[]* **copyArray** ( *String[]* array ) - -- *void* **drawInsideRectangle** ( *GreenfootImage* i, *Color* c, *int* b ) - -- *void* **sortDesc** ( **int[]** array ) - -#### copyArray() - -Kopiert ein Array des Types *boolean*, *int* oder *String* mit identischer Größe. - -#### drawInsideRectangle() - -Zeichnet innerhalb eines *GreenfootImage* ein Rechteck gefüllt mit der angegebenen Farbe. Es besitzt zu allen Seiten den gegebenen Abstand zum Rand des Image. - -#### sortDesc() - +Gibt die in der Provinz hinterlegte Y-Position zurück. + +#### getID() + +Gibt die Provinz-ID dieser Provinz zurück. + +#### getContinentID() + +Gibt die Kontinent-ID dieser Provinz zurück. + +#### getDisplayName() + +Gibt den Anzeigenamen dieser Provinz zurück. + +#### getStars() + +Gibt die hinterlegte Anzahl an Sternen dieser Provinz zurück. + +#### isProvinceNear() + +Gibt zurück, ob die angebenene Provinz mit dieser Provinz benachbart ist, umn beispielsweise Einheiten verschieben zu können. + +#### getOwner() + +Gibt die Spieler-ID des aktuellen Besitzer der Provinz als *int* zurück. **-1** bedeutet, dass diese Provinz aktuell keinen Besitzer hat. + +#### setOwner() + +Legt einen neuen Besitzer für diese Provinz fest. Bei Erfolg gibt die Methode **true** zurück. Sollte die ID für keinen Spieler stehen, wird die Methode **false** zurückgeben und nichts an dem gespeicherten Wert ändern. + +#### getEntityCount() + +Gibt die aktuelle Einheitenanzahl auf dieser Provinz zurück. + +#### addToEntities() + +Addiert die gegebene Anzahl der Einheiten auf die gespeicherte Anzahl drauf, speichert den neuen Wert ab und gibt diesen zurück. + +#### removeFromEntities() + +Subtrahiert die gegebene Anzahl der Einheiten von die gespeicherte Anzahl ab, speichert den neuen Wert ab und gibt diesen zurück. Bei einem neuen Wert von unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. + +#### setEntityCount() + +Setzt einen neuen festen Wert für die Einheitenanzahl fest und gibt diesen wieder zurück. Bei gegebenen Werten unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. + +#### hasClicked() + +Gibt zurück, ob seid dem letzten Aufruf dieser Methode diese Provinz von der Maus angeklickt wurde. + +#### redrawProvince() + +Wird von der Karte oder von internen Methoden aufgerurfen, um alle sichtbaren Eigenschaften erneut zu zeichnen. + +--- + +## Player +*extends Actor* + +Stellt die Spieler da, speichert Informationen zu diesen ab. + +### Konstruktorparameter + +0. Spieler-ID als *int* +0. Anzeigename als *String* +0. "Farbe" als *int* + +#### Spielernummer + +Wird bei der Welt intern benötigt und stellt die Position im Menü und in den Arrays dar. + +#### Anzeigename + +Ist der lesbare Name des Spielers, damit nicht nur "Spieler 1", ... usw. zu sehen ist. + +#### "Farbe" + +Dies soll die "Farbe" eines Spielers festlegen. *Falls euch ein besserer Name für diese Eigenschaft einfällt, bitte mir weitergeben.* + +### Private Eigenschaften + +- Spielernummer +- Anzeigename +- "Farbe" + +- Sternanzahl +- Statistiken + +#### Sternanzahl + +Die Anzahl der Sterne, die ein Spieler besitzt und gegebenenfalls dann in Einheiten umtauschen kann. + +#### Statistik + +Die Statistik soll Events festhalten, um nach einem Spiel verschiedene Werte einsehen zu können. Diese werden von der Welt durch spezielle Funktionen erhöht. Die Reihenfolge, in der die Statistiken angegeben werden, ist wie folgt festgelegt: + +1. Eroberte Provinzen +2. Verlorene Provinzen +3. Einflussmaximum (maximale Provinzenanzahl, nach einem Zug zu überprüfen) +4. Bekommene Einheiten +5. Verlorene Einheiten +6. Maximale Einheitenanzahl (nach einem Zug zu überprüfen) + +### Public Methoden + +- *int* **getID** () +- *String* **getDisplayName** () + +- *int* **getStars** () +- *int* **addToStars** ( *int* starsToAdd ) +- *int* **removeFromStars** ( *int* starsToRemove ) +- *int* **setStars** ( *int* newStarsCount ) +- *boolean* **canStarsRemoved** ( *int* requiredStarsCount ) + +- *int[]* **getStatistics** () + - *void* **gotProvince** () + - *void* **lostProvince** () + - *void* **gotEntities** ( *int* addedEntities ) + - *void* **lostEntity** () + +- *boolean[]* **getMyProvinces** () +- *int* **getProvinceCount** () +- *void* **redrawPlayer** () + +#### getID() + +Gibt die Spieler-ID dieses Spielers zurück. + +#### getDisplayName() + +Gibt den Anzeigenamen des Spielers zurück. + +#### getStars() + +Gibt die aktuelle Anzahl der Sterne, die der Spieler besitzt, zurück. + +#### addToStars() + +Addiert die gegebene Anzahl der Sterne auf die gespeicherte Anzahl drauf, speichert den neuen Wert ab und gibt diesen zurück. + +#### removeFromStars() + +Subtrahiert die gegebene Anzahl der Sterne von die gespeicherte Anzahl ab, speichert den neuen Wert ab und gibt diesen zurück. Bei einem neuen Wert von unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. + +#### setStars() + +Setzt einen neuen festen Wert für die Sternenanzahl fest und gibt diesen wieder zurück. Bei gegebenen Werten unter 0 wird dies nicht abspeichert, aber dennoch wird der noch aktuellen Wert zurückgeben. + +#### canStarsRemoved() + +Prüft, ob die gegebenene Anzahl an Sternen von dem Spieler abgezogen werden könnte. Falls ja, wird **true** zurückgegebenen, sonst **false** + +#### getStatistics() + +Gibt in derselben Reihenfolge wie für die Statistik angegeben die aktuelllen Werte zurück als *int[]*-Array + +#### gotProvince() + +Wird von der Welt aufgerufen, sobald dieser Spieler eine Provinz erobert hat. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um 1. + +#### lostProvinze() + +Wird von der Welt aufgerufen, sobald dieser Spieler eine Provinz verloren hat. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um 1. + +#### gotEntities() + +Wird von der Welt aufgerufen, sobald dieser Spieler Einheiten dazubekommt. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um die gegebenene Anzahl. + +#### lostEntity() + +Wird von der Welt aufgerufen, sobald dieser Spieler im Kampf eine Einheit verliert. Diese Methode erhöht dann den entsprechenden Wert in der Statistik um 1. + +#### getMyProvinces() + +Diese Methode hat die Aufgabe, eine Liste aller Provinzen zurückzugeben, wobei jede Provinz mit einem *boolean*-Wert gesagt bekommt, ob sie dem Spieler gehört oder nicht. + +Diese Methode muss zwingend mit der Welt interagieren, um diese Informationen zu bekommen. + +#### getProvinceCount() + +Gibt die Anzahl der Provinzen, die der Spieler hat, zurück. Gut für die Statistik und die Anzeigen. + +#### redrawPlayer() + +Erzwingt das erneute Zeichnen des Player Objekts, um alle sichtbaren Eigenschaften erneut zu zeichnen. + +--- + +## DicesList +*extends Actor* + +Erstellt die gegebene Anzahl an Würfeln nebeneinander und bietet die gemeinsame Verwaltung dieser. Diese Klasse ist nur als *abstract* Oberklasse zu *OffenderDices* & *DefenderDices* gedacht und ist daher selbst nicht verwendbar, dennoch sich hier alle Methoden, die ihr braucht, definiert. Die Unterklassen legen nur die Farbe der Würfel und die maximale Anzahl fest. + +### Verwendung + +Nachdem ihr euch für eine Unterklasse entschieden habt, erstellt ihr eine neue Instanz von dieser und übergibt ihr die Anzahl der Würfel, die ihr darstellen wollt (diese Zahl kann größer als die erlaubte Anzahl an Würfel sein, dies wird **automatisch korrigiert**, beim Angreifer auf 3, beim Verteidiger auf 2). Bei zu kleinen Zahlen wird auf 1 korrigiert. +```java +DicesList offenders = new OffenderDices(5); // Wird korrigiert auf '3' +DicesList defenders = new DefenderDices(-3); // Wird korrigiert auf '1' +``` +Die nun erstellte Instanz solltet ihr einer Welt hinzufügen, um die Würfel sehen zu können. Achtet dabei auf die Position, die ihr der Welt übergibt. +```java +addObject(offenders,200,800); +``` +Nun könnt ihr mit den Methoden **getNumbers** und **roll** alle Würfel parallel steuern. +```java +int[] zahlenAng = offenders.roll(); +int[] zahlenVer = defenders.getNumbers(); +if(zahlenAng[1] > zahlenVer[1]) { + // Angreifer gewinnt +} else { + // Verteidiger gewinnt +} +``` +Solltet ihr die Würfel nicht mehr brauchen und ihr möchtet sie entfernen, reicht ein simpler Aufruf von **removeAll**. +```java +offenders.removeAll(); +offenders = null; // muss nicht sein, gehört aber zum sauberen Programmieren dazu +``` + +### Konstruktorparameter + +1. Anzahl der Würfel als *int* (Weiterleitung des Konstruktors von den Unterklassen) +2. Maximale Anzahl als *int* (fester Wert der Unterklasse) +3. Hintergundfarbe als *java.awt.Color* (fester Wert der Unterklasse) +4. Vordergrundfarbe als *java.awt.Color* (fester Wert der Unterklasse) + +### Protected Methoden + +- *void* **addedToWorld** ( *World* world ) + +#### addedToWorld() + +Diese Methode wird von Greenfoot selbst aufgerufen, sobald dieser Actor einer Welt hinzugefügt wurde und kümmert sich folgend darum, seine eigenen Würfel auch der Welt hinzuzufügen an derselben Position. + +### Public Methoden + +- *int[]* **getNumbers** () +- *int[]* **roll** () + +- *void* **removeAll** () + +#### getNumbers() + +Gibt die Augenzahlen aller Würfel in sortierter Reihenfolge (absteigend) aus. + +#### roll() + +Würfelt alle Würfel erneut und gibt die neuen Augenzahlen in sortierter Reihenfolge (absteigend) aus. + +#### removeAll() + +Entfernt alle Würfel aus ihrer Welt und löscht anschließend die Liste. Die Instanz ist danach nicht mehr zu verwenden. + +## OffendersDices +*extends DicesList* + +Erstellt eine Liste von Würfeln mit roter Hintergrundfarbe. Es sind maximal 3 Würfel erlaubt. Zur Verwendung, siehe *DicesList*. + +### Konstruktorparamter + +1. Anzahl der Würfel als *int* (wird korrigiert; siehe *DicesList*-Konstruktor) + +## DefenderDices +*extends DicesList* + +Erstellt eine Liste von Würfeln mit schwarzer Hintergrundfarbe. Es sind maximal 2 Würfel erlaubt. Zur Verwendung, siehe *DicesList*. + +### Konstruktorparamter + +1. Anzahl der Würfel als *int* (wird korrigiert; siehe *DicesList*-Konstruktor) + +--- + +## GUI_Interface +*extends Actor* + +Die Oberklasse für alle Interface-Objekte wie Buttons und Labels. Diese Klasse ist als *abstract* definiert. Diese Klasse besitzt als *abstract* definierte Methoden, welche zwingend von den erbendenen Klassen ersetzt werden muss. + +### Protected Eigenschaften + +- *int* **sx** +- *int* **sy** + +#### sx + +Gibt die Breite des Objektes an (Größe in X-Richtung, **S**ize**X**). Nur für Methoden der erbenden Objekte selbst gedacht. + +#### sy + +Gibt die Höhe des Objektes an (Größe in Y-Richtung, **S**ize**Y**). Nur für Methoden der erbenden Objekte selbst gedacht. + +### Public Methoden + +- *int* **getWidth** () +- *int* **getHeight** () +- *void* **setSize** ( *int* width , *int* height ) + +- *java.awt.Color* **getBackColor** () +- *boolean* **setBackColor** ( *java.awt.Color* newBackColor) +- *java.awt.Color* **getForeColor** () +- *boolean* **setForeColor** ( *java.awt.Color* newForeColor) + +#### getWidth() + +Gibt die Breite des Objektes zurück. + +#### getHeight() + +Gibt die Höhe des Objektes zurück. + +#### setSize() + +Ändert die Größe des Objektes. Eventuell wird das Objekt diese Größenänderung nicht übernehmen wollen (siehe *autoSize* Eigenschaften bei diesen, falls vorhanden). + +#### getBackColor() + +Gibt die aktuelle Hintergrundfarbe des Objektes zurück. + +#### setBackColor() + +Legt eine neue Hintergrundfarbe für dieses Objekt fest. + +#### getForeColor() + +Gibt die aktuelle Vordergrundfarbe (meist Textfarbe) des Objektes zurück. + +#### setForeColor() + +Legt eine neue Vordergrundfarbe (meist Textfarbe) für dieses Objekt fest. + +### Abstract Public Methoden + +- *void* redraw() + +#### redraw() + +Durch diese Methode soll die erneute Zeichnung des Objektes verlangen können. Viele der **set**-Methoden rufen daher bei einer erfolgreichen Änderung diese Methode auf. + +--- + +## Label +*extends GUI_Interface* + +Zeigt einen Text auf dem Bildschirm an. Zuvor wurde dieses Objekt "Text" genannt, "Label" ist der fachlichere Ausdruck dafür. + +### Konstruktorparameter + +0. Anzeigetext als *String* +0. Textgröße als *int* + +#### Anzeigetext + +Gibt den Text an, den das Label darstellen soll. + +#### Textgröße + +Gibt die Textgröße an, in der das Label den Anzeigetext darstellen soll. + +### Private Eigenschaften + +- Anzeigetext +- Textgröße + +- Automatische Größenanpassung + +#### Automatische Größenanpassung + +Diese Eigenschaft des Labels legt fest, ob es seine Größe dynamisch an den darzustellenden Text automatisch anpassen soll. Dies kann euch die Arbeit mit diesem erleichtern, kann aber auch zu Problemen bei der Darstellung mehrerer Objekte nebeneinander erschweren, da diese sich eventuell überlappen könnten. + +### Public Methoden + +- *boolean* **getAutoSize** () +- *void* **setAutoSize** ( *boolean* newValue ) +- *int* **getTextSize** () +- *boolean* **setTextSize** ( *int* newSize ) +- *String* **getText** () +- *boolean* **setText** ( *String* newText ) + +- *void* **redraw** () + +#### getAutoSize() + +Gibt an, ob das Label seine Größe automatisch an den Inhalt anpasst. + +#### setAutoSize() + +Legt fest, ob das Label seine Größe automatisch an den Inhalt anpassen soll. Falls die Eigenschaft damit aktiviert werden sollte, erfolgt automatisch ein Aufruf der **redraw**-Methode. + +#### getTextSize() + +Gibt die aktuelle Textgröße zurück. + +#### setTextSize() + +Legt eine neue Textgröße fest. + +#### getText() + +Gibt den aktuellen Anzeigetext zurück. + +#### setText() + +Legt einen neuen Anzeigetext zurück. + +#### redraw() + +Erneuert die Darstellung des Labels mit seinem Anzeigetext auf der Welt. Hiermit wird gegebenfalls auch die Größe des Labels automatisch angepasst. + +--- + +## Button +*extends GUI_Interface* + +Stellt einen Button mit einem Text dar. Dieses Objekt kann dazu ein Event auslösen, sobald darauf geklickt wurde. + +### Konstruktorparameter + +Hier gibt es mehrere Möglichkeiten, eine Instanz der Klasse *Button* zu erstellen: + +Methode 1: +1. Anzeigetext als *String* +2. Textgröße als *int* + +Methode 2: +1. EventHandler als *ButtonEvent* + +Methode 3: +1. Anzeigetext als *String* +2. Textgröße als *int* +3. EventHandler als *ButtonEvent* + +#### Anzeigetext + +Gibt den Text an, den das Label darstellen soll. + +#### Textgröße + +Gibt die Textgröße an, in der das Label den Anzeigetext darstellen soll. + +#### EventHandler + +Hierfür muss die Instanz einer Klasse übergeben werden, welche das Interface *ButtonEvent* implementiert und damit eine Funktion namens *void* **buttonClicked** ( *Button* button ) besitzt. Folgend ein Beispiel für eine Klassendefinition, die eine Methode mit diesem Namen besitzt, die dann von dem Button aufgerufen wird, sobald dieser angeklickt wurde. + +```java +public class TestClass implements ButtonEvent { + Button button1 = new Button("Button 1",10,self); + Button button1 = new Button("Button 2",10,self); + public void buttonClicked(Button b) { + // Hier steht nun, was passieren soll, wenn IRGENDEIN Button angeklickt wird, der eine Instanz von dieser Klasse als EventHandler zugewiesen bekommen hat. + if(b == button1) { + // mein erster Button + } else if(b == button2) { + // mein zweiter Button + } + } +} +``` + +### Private Eigenschaften + +- Anzeigetext +- Textgröße +- EventHandler + +- Automatische Größenanpassung + +#### Automatische Größenanpassung + +Diese Eigenschaft des Buttons legt fest, ob es seine Größe dynamisch an den darzustellenden Text automatisch anpassen soll. Dies kann euch die Arbeit mit diesem erleichtern, kann aber auch zu Problemen bei der Darstellung mehrerer Objekte nebeneinander erschweren, da diese sich eventuell überlappen könnten. + +### Public Methoden + +- *boolean* **getAutoSize** () +- *void* **setAutoSize** ( *boolean* newValue ) +- *int* **getTextSize** () +- *boolean* **setTextSize** ( *int* newSize ) +- *String* **getText** () +- *boolean* **setText** ( *String* newText ) + +- *ButtonEvent* **getHandler** () +- *void* **setHandler** ( *ButtonEvent* newEventHandler ) +- *void* **removeHandler** () + +- *void* **redraw** () + +#### getAutoSize() + +Gibt an, ob der Button seine Größe automatisch an den Inhalt anpasst. + +#### setAutoSize() + +Legt fest, ob der Button seine Größe automatisch an den Inhalt anpassen soll. Falls die Eigenschaft damit aktiviert werden sollte, erfolgt automatisch ein Aufruf der **redraw**-Methode. + +#### getTextSize() + +Gibt die aktuelle Textgröße zurück. + +#### setTextSize() + +Legt eine neue Textgröße fest. + +#### getText() + +Gibt den aktuellen Anzeigetext zurück. + +#### setText() + +Legt einen neuen Anzeigetext zurück. + +#### getHandler() + +Gibt den aktuellen EventHandler des Buttons zurück. Falls keiner vorhanden ist, wird **null** zurückgegeben. + +#### setHandler() + +Legt einen neuen EventHandler für den Button fest. Der alte EventHandler wird damit überschrieben. + +#### removeHandler() + +Deaktiviert den aktuellen EventHandler, damit keine Events mehr ausgelöst werden können. + +#### redraw() + +Erneuert die Darstellung des Buttons mit seinem Anzeigetext auf der Welt. Hiermit wird gegebenfalls auch die Größe des Buttons automatisch angepasst. + +--- + +## Dice +*extends GUI_Interface* + +### Konstruktorparameter + +Methode 1: **keine Parameter** + +Methode 2: +1. Startwert für die gespeicherte Augenzahl als *int* + +#### Startwert + +Dieser Wert wird im Voraus beim Dice hinterlegt, damit er diese direkt anzeigen kann. Wird dieser Wert nicht angegeben, wird als Augenzahl **0** hinterlegt, stehend für: noch nicht gewürfelt. + +### Private Eigenschaften + +- Augenzahl + +#### Augenzahl + +Der Wert, der beim letzten Würfeln gewürfelt wurde. Dieser Wert wird vom Würfel auch visuell dargestellt. + +### Public Methoden + +- *int* **getNumber** () + +- *void* **setSizeAsSquare** ( *int* length ) + +- *int* **roll** () + +- *void* **redraw** () + +#### getNumber() + +Gibt die aktuell gespeicherte und somit auch visuell sichtbare Augenzahl zurück. + +#### setSizeAsSquare() + +Legt die Größe des Würfels als Quadraht fest. Nur beim Verhältnis 1:1 von Länge:Breite kann eine verzerrungsfreie Darstellung garantiert werden. Vergleichbar mit folgender Zeile: +```java +dice.setSize(length,length) +``` + +#### roll() + +Würfelt den Würfel, speichert die neue Augenzahl ab und erneurt die visuelle Darstellung des Dice. + +#### redraw() + +Erneuert die visuelle Darstellung des Dice. + +--- + +## Utils + +Eine finale Klasse mit vielen kleinen Methoden, die den restlichen Code verkleinern und besser lesbar gestalten soll. Ergänzungen in Form von eigenen Funktionen dürfen **selbst** eingebracht werden. Alle Methoden dieser Klasse sollen *public* und *static* sein. + +### Static Methoden + +- *boolean[]* **copyArray** ( *boolean[]* array ) +- *int[]* **copyArray** ( *int[]* array ) +- *String[]* **copyArray** ( *String[]* array ) + +- *void* **drawInsideRectangle** ( *GreenfootImage* i, *Color* c, *int* b ) + +- *void* **sortDesc** ( **int[]** array ) + +#### copyArray() + +Kopiert ein Array des Types *boolean*, *int* oder *String* mit identischer Größe. + +#### drawInsideRectangle() + +Zeichnet innerhalb eines *GreenfootImage* ein Rechteck gefüllt mit der angegebenen Farbe. Es besitzt zu allen Seiten den gegebenen Abstand zum Rand des Image. + +#### sortDesc() + Sortiert ein *int[]*-Array absteigend. \ No newline at end of file diff --git a/planung/funktionsliste.md b/planung/funktionsliste.md index a5b91ce..5e63337 100644 --- a/planung/funktionsliste.md +++ b/planung/funktionsliste.md @@ -1,165 +1,165 @@ -# Funktionsliste Zweiundvierzig - -**Letztes Update: 15.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) - -[Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) - -[Hier zum gesamten Architekturplan auf dem aktuellen Branch](architektur.md) - -Hier einfach eine grobe Übersicht über alle Methoden und eventuellen Variabled, die jede Klasse als *public* oder *protected* besitzen soll beziehungsweise bereits besitzt. -Weitere Informationen zu den Methoden findet ihr in der Architektur oder, falls die Methoden bereits vorhanden ist, in der Dokumentation, die von Greenfoot automatisch erstellt wird (durch die InCode Dokumentation). - -Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschrieben wird, müsst ihr nicht diesselben Parameterbezeichner verwenden, wie sie hier verwendet wurden. Falls aus diesem Bezeichner jedoch nicht mehr die Bedeutung des Parameters ausgeht, muss dies in einem Java-Documentation Kommentar erklärt werden. - -Dies könnt auch als Checkliste verwenden, um zu sehen, ob ihr bereits alle Methodenn im Code präsent habt. - -## GeneralMap (extends World) - -- *GeneralMap* ( *String* backgroundImage, *String[]* playerList, *int[]* colorList ) - -- protected *void* **addProvinceToMap** ( *Province* province ) - -- *int* **getPlayerCount** () -- *String* **getPlayerName** () -- *String* **getPlayerName** ( *int* playerID ) -- *int* **getPlayerStars** () - -- *int* **getProvinceOwner** ( *int* provinceID ) -- *int[]* **getProvinceOwners** () -- *int* **getProvinceEntityCount** ( *int* playerID ) - -## Province (extends Actor) - -- *Province* ( *int* provinceID, *int* continentID, *int* xPos, *int* yPos, *String* displayName, *int* stars, *int[]* neighbourProvinces ) +# Funktionsliste Zweiundvierzig + +**Letztes Update: 15.06.2016** (TT.MM.JJJJ / DD.MM.YYYY) + +[Hier die offizielle Version vom Master-Branch sehen](https://github.com/HGE-IT-Course-2016/zweiundvierzig/blob/master/planung/funktionsliste.md) + +[Hier zum gesamten Architekturplan auf dem aktuellen Branch](architektur.md) + +Hier einfach eine grobe Übersicht über alle Methoden und eventuellen Variabled, die jede Klasse als *public* oder *protected* besitzen soll beziehungsweise bereits besitzt. +Weitere Informationen zu den Methoden findet ihr in der Architektur oder, falls die Methoden bereits vorhanden ist, in der Dokumentation, die von Greenfoot automatisch erstellt wird (durch die InCode Dokumentation). + +Falls euere Aufgabe die Umsetzung einer Methode ist, die hier bereits beschrieben wird, müsst ihr nicht diesselben Parameterbezeichner verwenden, wie sie hier verwendet wurden. Falls aus diesem Bezeichner jedoch nicht mehr die Bedeutung des Parameters ausgeht, muss dies in einem Java-Documentation Kommentar erklärt werden. + +Dies könnt auch als Checkliste verwenden, um zu sehen, ob ihr bereits alle Methodenn im Code präsent habt. + +## GeneralMap (extends World) + +- *GeneralMap* ( *String* backgroundImage, *String[]* playerList, *int[]* colorList ) + +- protected *void* **initProvinces** () + +- *int* **getPlayerCount** () +- *String* **getPlayerName** () +- *String* **getPlayerName** ( *int* playerID ) +- *int* **getPlayerStars** () + +- *int* **getProvinceOwner** ( *int* provinceID ) +- *int[]* **getProvinceOwners** () +- *int* **getProvinceEntityCount** ( *int* playerID ) + +## Province (extends Actor) + +- *Province* ( *int* provinceID, *int* continentID, *int* xPos, *int* yPos, *String* displayName, *int* stars, *int[]* neighbourProvinces ) - *int* **getXPos** () -- *int* **getYPos** () -- *int* **getID** () -- *int* **getContinentID** () -- *String* **getDisplayName** () -- *int* **getStars** () - -- *boolean* **isProvinceNear** ( *int* provinceID ) - -- *int* **getOwner** () -- *boolean* **setOwner** ( *int* playerID ) - -- *int* **getEntityCount** () -- *int* **addToEntities** ( *int* entityCountToAdd ) -- *int* **removeFromEntities** ( *int* entityCountToRemove ) -- *int* **setEntityCount** ( *int* newEntityCount) - -- *boolean* **hasClicked** () - -- *void* **redrawProvince** () - -## Player (extends Actor) - -- *Player* ( *int* playerID, *String* displayName, *int* playerColor ) - -- *int* **getID** () -- *String* **getDisplayName** () - -- *int* **getStars** () -- *int* **addToStars** ( *int* starsToAdd ) -- *int* **removeFromStars** ( *int* starsToRemove ) -- *int* **setStars** ( *int* newStarsCount ) -- *boolean* **canStarsRemoved** ( *int* requiredStarsCount ) - -- *int[]* **getStatistics** () - - *void* **gotProvince** () - - *void* **lostProvince** () - - *void* **gotEntities** ( *int* addedEntities ) - - *void* **lostEntity** () - -- *boolean[]* **getMyProvinces** () -- *int* **getProvinceCount** () -- *void* **redrawPlayer** () - -## DicesList (extends Actor) - -- *DicesList* ( *int* count, *int* maxCount, *java.awt.Color* backColor, *java.awt.Color* foreColor ) - -- *int[]* **getNumbers** () -- *int[]* **roll** () - -- *void* **removeAll** () - -## OffenderDices (extends Actor) - -- *OffenderDices* ( *int* count ) - -## DefenderDices (extends Actor) - -- *DefenderDices* ( *int* count ) - -## GUI_Interface (extends Actor) - -- protected *int* **sx** -- protected *int* **sy** - -- *int* **getWidth** () -- *int* **getHeight** () -- *void* **setSize** ( *int* width , *int* height ) - -- *java.awt.Color* **getBackColor** () -- *boolean* **setBackColor** ( *java.awt.Color* newBackColor) -- *java.awt.Color* **getForeColor** () -- *boolean* **setForeColor** ( *java.awt.Color* newForeColor) - -- abstract *void* **redraw** () - -## Label (extends GUI_Interface) - -- *Label* ( *String* text, *int* textSize ) - -- *boolean* **getAutoSize** () -- *void* **setAutoSize** ( *boolean* newValue ) -- *int* **getTextSize** () -- *boolean* **setTextSize** ( *int* newSize ) -- *String* **getText** () -- *boolean* **setText** ( *String* newText ) - -- *void* **redraw** () - -## Button (extends GUI_Interface) - -- *Button* ( *String* text, *int* textSize ) -- *Button* ( *ButtonEvent* eventHandler ) -- *Button* ( *String* text, *int* textSize, *ButtonEvent* eventHandler ) - -- *boolean* **getAutoSize** () -- *void* **setAutoSize** ( *boolean* newValue ) -- *int* **getTextSize** () -- *boolean* **setTextSize** ( *int* newSize ) -- *String* **getText** () -- *boolean* **setText** ( *String* newText ) - -- *ButtonEvent* **getHandler** () -- *void* **setHandler** ( *ButtonEvent* newEventHandler ) -- *void* **removeHandler** () - -- *void* **redraw** () - -## Dice (extends GUI_Interface) - -- *Dice* () -- *Dice* ( *int* startNumber ) - -- *int* **getNumber** () - -- *void* **setSizeAsSquare** ( *int* length ) - -- *int* **roll** () - -- *void* **redraw** () - -## Utils - -- static *boolean[]* **copyArray** ( *boolean[]* array ) -- static *int[]* **copyArray** ( *int[]* array ) -- static *String[]* **copyArray** ( *String[]* array ) - -- static *void* **drawInsideRectangle** ( *GreenfootImage* i, *Color* c, *int* b ) - +- *int* **getYPos** () +- *int* **getID** () +- *int* **getContinentID** () +- *String* **getDisplayName** () +- *int* **getStars** () + +- *boolean* **isProvinceNear** ( *int* provinceID ) + +- *int* **getOwner** () +- *boolean* **setOwner** ( *int* playerID ) + +- *int* **getEntityCount** () +- *int* **addToEntities** ( *int* entityCountToAdd ) +- *int* **removeFromEntities** ( *int* entityCountToRemove ) +- *int* **setEntityCount** ( *int* newEntityCount) + +- *boolean* **hasClicked** () + +- *void* **redrawProvince** () + +## Player (extends Actor) + +- *Player* ( *int* playerID, *String* displayName, *int* playerColor ) + +- *int* **getID** () +- *String* **getDisplayName** () + +- *int* **getStars** () +- *int* **addToStars** ( *int* starsToAdd ) +- *int* **removeFromStars** ( *int* starsToRemove ) +- *int* **setStars** ( *int* newStarsCount ) +- *boolean* **canStarsRemoved** ( *int* requiredStarsCount ) + +- *int[]* **getStatistics** () + - *void* **gotProvince** () + - *void* **lostProvince** () + - *void* **gotEntities** ( *int* addedEntities ) + - *void* **lostEntity** () + +- *boolean[]* **getMyProvinces** () +- *int* **getProvinceCount** () +- *void* **redrawPlayer** () + +## DicesList (extends Actor) + +- *DicesList* ( *int* count, *int* maxCount, *java.awt.Color* backColor, *java.awt.Color* foreColor ) + +- *int[]* **getNumbers** () +- *int[]* **roll** () + +- *void* **removeAll** () + +## OffenderDices (extends Actor) + +- *OffenderDices* ( *int* count ) + +## DefenderDices (extends Actor) + +- *DefenderDices* ( *int* count ) + +## GUI_Interface (extends Actor) + +- protected *int* **sx** +- protected *int* **sy** + +- *int* **getWidth** () +- *int* **getHeight** () +- *void* **setSize** ( *int* width , *int* height ) + +- *java.awt.Color* **getBackColor** () +- *boolean* **setBackColor** ( *java.awt.Color* newBackColor) +- *java.awt.Color* **getForeColor** () +- *boolean* **setForeColor** ( *java.awt.Color* newForeColor) + +- abstract *void* **redraw** () + +## Label (extends GUI_Interface) + +- *Label* ( *String* text, *int* textSize ) + +- *boolean* **getAutoSize** () +- *void* **setAutoSize** ( *boolean* newValue ) +- *int* **getTextSize** () +- *boolean* **setTextSize** ( *int* newSize ) +- *String* **getText** () +- *boolean* **setText** ( *String* newText ) + +- *void* **redraw** () + +## Button (extends GUI_Interface) + +- *Button* ( *String* text, *int* textSize ) +- *Button* ( *ButtonEvent* eventHandler ) +- *Button* ( *String* text, *int* textSize, *ButtonEvent* eventHandler ) + +- *boolean* **getAutoSize** () +- *void* **setAutoSize** ( *boolean* newValue ) +- *int* **getTextSize** () +- *boolean* **setTextSize** ( *int* newSize ) +- *String* **getText** () +- *boolean* **setText** ( *String* newText ) + +- *ButtonEvent* **getHandler** () +- *void* **setHandler** ( *ButtonEvent* newEventHandler ) +- *void* **removeHandler** () + +- *void* **redraw** () + +## Dice (extends GUI_Interface) + +- *Dice* () +- *Dice* ( *int* startNumber ) + +- *int* **getNumber** () + +- *void* **setSizeAsSquare** ( *int* length ) + +- *int* **roll** () + +- *void* **redraw** () + +## Utils + +- static *boolean[]* **copyArray** ( *boolean[]* array ) +- static *int[]* **copyArray** ( *int[]* array ) +- static *String[]* **copyArray** ( *String[]* array ) + +- static *void* **drawInsideRectangle** ( *GreenfootImage* i, *Color* c, *int* b ) + - static *void* **sortDesc** ( **int[]** array ) \ No newline at end of file From aa59110993cc7a0b2b99cad303d8517c47393b0a Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sun, 19 Jun 2016 21:13:57 +0200 Subject: [PATCH 67/68] =?UTF-8?q?Fehlerbehebungen=20Offset=20-=20SCALE=5FV?= =?UTF-8?q?ALUE=20ist=20nun=20eine=20Kommazahl=20als=20double,=20dies=20ha?= =?UTF-8?q?t=20sich=20eher=20angeboten,=20um=20Fehler=20zu=20vermeiden=20-?= =?UTF-8?q?=20**getX**=20und=20**getY**=20waren=20hierf=C3=BCr=20die=20fal?= =?UTF-8?q?schen=20Methoden=20zum=20Abfragen=20der=20hinterlegten=20Positi?= =?UTF-8?q?on=20(sie=20geben=20n=C3=A4mlich=20die=20aktuelle=20Position=20?= =?UTF-8?q?des=20Actors=20zur=C3=BCck,=20was=20bisher=20noch=20nicht=20geh?= =?UTF-8?q?t=20an=20dieser=20Stelle,=20da=20die=20Provinzen=20noch=20nicht?= =?UTF-8?q?=20einer=20Welt=20hinzugef=C3=BCgt=20wurden)=20-=20Expliziter?= =?UTF-8?q?=20Cast=20f=C3=BCr=20das=20Umwandeln=20in=20die=20verschiedenen?= =?UTF-8?q?=20Typen=20fehlte=20noch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GeneralMap.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/GeneralMap.java b/GeneralMap.java index 707becf..9fca0a4 100644 --- a/GeneralMap.java +++ b/GeneralMap.java @@ -1,4 +1,5 @@ import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import java.lang.Math; /** Oberklasse für verschiedene Maps; @@ -20,11 +21,9 @@ public abstract class GeneralMap extends World /* Die einzelnen Positionen der Provinzen wird mit SCALE_VALUE/10000 multipliziert. Dies ist nützlich, wenn die Karte beispielsweise nur noch 80% der Originalgröße bei ihrer Darstellung groß ist. - Bei diesem Beispiel wäre hier, neben dem Offset oben, der Wert 8000 einzutragen. - - Die vorherige Erhöhung des Skalars ist mit der höheren Genauigkeit bei der Arbeit mit dem int-Basistyp zu erklären. + Bei diesem Beispiel wäre hier, neben dem Offset oben, der Wert 0.8 einzutragen. */ - private final int SCALE_VALUE = 10000; // SCALE_VALUE/10000 wird verwendet + private final double SCALE_VALUE = 0.8; protected Province[] provinces; protected Player[] players; @@ -52,11 +51,10 @@ public abstract class GeneralMap extends World protected void initProvinces() { for(int i = 1; i < provinces.length; i++) { Province p = provinces[i]; - int s = SCALE_VALUE/10000; - int x = p.getX(); - int y = p.getY(); - x = (x * s) + X_OFFSET; - y = (y * s) + y_OFFSET; + int x = p.getXPos(); + int y = p.getYPos(); + x = ((int) Math.floor(x * SCALE_VALUE)) + X_OFFSET; + y = ((int) Math.floor(y * SCALE_VALUE)) + Y_OFFSET; addObject(p,x,y); } } From a6ce6e63258e072a39ba28cbbedb0babd50bf292 Mon Sep 17 00:00:00 2001 From: Zocker1999NET Date: Sun, 19 Jun 2016 21:18:27 +0200 Subject: [PATCH 68/68] =?UTF-8?q?Abschluss=20der=20Arbeiten=20an=20dem=20O?= =?UTF-8?q?ffset=20-=20**SCALE=5FVALUE**=20wurde=20wieder=20auf=201=20erh?= =?UTF-8?q?=C3=B6ht=20-=20In=20der=20Methode=20**initProvinces**=20wurden?= =?UTF-8?q?=20die=20Befehle=20nun=20so=20kompakt=20und=20performant=20wie?= =?UTF-8?q?=20m=C3=B6glich=20gestaltet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GeneralMap.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/GeneralMap.java b/GeneralMap.java index 9fca0a4..28de775 100644 --- a/GeneralMap.java +++ b/GeneralMap.java @@ -23,7 +23,7 @@ public abstract class GeneralMap extends World Dies ist nützlich, wenn die Karte beispielsweise nur noch 80% der Originalgröße bei ihrer Darstellung groß ist. Bei diesem Beispiel wäre hier, neben dem Offset oben, der Wert 0.8 einzutragen. */ - private final double SCALE_VALUE = 0.8; + private final double SCALE_VALUE = 1; protected Province[] provinces; protected Player[] players; @@ -50,12 +50,7 @@ public abstract class GeneralMap extends World */ protected void initProvinces() { for(int i = 1; i < provinces.length; i++) { - Province p = provinces[i]; - int x = p.getXPos(); - int y = p.getYPos(); - x = ((int) Math.floor(x * SCALE_VALUE)) + X_OFFSET; - y = ((int) Math.floor(y * SCALE_VALUE)) + Y_OFFSET; - addObject(p,x,y); + addObject(provinces[i],((int) Math.floor(provinces[i].getXPos() * SCALE_VALUE)) + X_OFFSET,((int) Math.floor(provinces[i].getYPos() * SCALE_VALUE)) + Y_OFFSET); } }