From 8067508eb3c6fc73728e50ab126d0025662c264a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Fri, 5 Aug 2022 16:42:58 +0800 Subject: [PATCH 01/22] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/map.py | 21 +++++++++++++-------- source/component/plant.py | 3 +-- source/state/level.py | 21 ++++++++------------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/source/component/map.py b/source/component/map.py index ce01487..206905a 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -360,16 +360,21 @@ LEVEL_MAP_DATA = ( LITTLE_GAME_MAP_DATA = ( # 第0关 测试 { - c.BACKGROUND_TYPE: 6, + c.BACKGROUND_TYPE: 3, c.GAME_TITLE: "隐藏测试关卡", - c.CHOOSEBAR_TYPE: c.CHOOSEBAR_BOWLING, - c.SHOVEL: 0, + c.CHOOSEBAR_TYPE: c.CHOOSEBAR_MOVE, + c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, - c.INCLUDED_ZOMBIES: ( c.POLE_VAULTING_ZOMBIE,), - c.NUM_FLAGS:1, - c.CARD_POOL: { c.WALLNUTBOWLING: 0, - c.REDWALLNUTBOWLING: 0, - c.GIANTWALLNUT:100,} + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.NEWSPAPER_ZOMBIE, + c.ZOMBONI, c.FOOTBALL_ZOMBIE, + c.CONEHEAD_ZOMBIE, c.BUCKETHEAD_ZOMBIE), + c.NUM_FLAGS:4, + c.CARD_POOL: { c.LILYPAD: 300, + c.STARFRUIT: 400, + c.PUMPKINHEAD: 100, + c.SEASHROOM: 100, + c.SPIKEWEED: 100, + } }, # 第1关 坚果保龄球 { diff --git a/source/component/plant.py b/source/component/plant.py index db01a8f..d3bf123 100755 --- a/source/component/plant.py +++ b/source/component/plant.py @@ -195,8 +195,7 @@ class StarBullet(Bullet): self.rect.x += 7 self.rect.y += 7 elif self.direction == c.STAR_UPWARD: - # 实际上不知道为什么向上飞的看起来要快一些,所以拟合的时候把速度调小了一点 - self.rect.y -= 9 + self.rect.y -= 10 elif self.direction == c.STAR_DOWNWARD: self.rect.y += 10 else: diff --git a/source/state/level.py b/source/state/level.py index 6091cf6..cf3013e 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -1547,6 +1547,14 @@ class Level(tool.State): self.showAllContentOfMenu(surface) # 以后可能需要插入一个预备的状态(预览显示僵尸、返回战场) elif self.state == c.PLAY: + if self.has_shovel: + # 画铲子 + surface.blit(self.shovel_box, self.shovel_box_rect) + surface.blit(self.shovel, self.shovel_rect) + # 画小菜单 + surface.blit(self.little_menu, self.little_menu_rect) + + self.menubar.draw(surface) for i in range(self.map_y_len): self.plant_groups[i].draw(surface) self.zombie_groups[i].draw(surface) @@ -1556,19 +1564,6 @@ class Level(tool.State): if self.cars[i]: self.cars[i].draw(surface) self.head_group.draw(surface) - - # 浓雾模式的雾 - #if self.background_type == c.BACKGROUND_FOG: - # pg.draw.rect(surface, c.LIGHTGRAY, (400, 0, 400, 600)) - - if self.has_shovel: - # 画铲子 - surface.blit(self.shovel_box, self.shovel_box_rect) - surface.blit(self.shovel, self.shovel_rect) - # 画小菜单 - surface.blit(self.little_menu, self.little_menu_rect) - - self.menubar.draw(surface) self.sun_group.draw(surface) if self.drag_plant: From 139b5d3ef8214f4c85fb5ee98e9ddc9e996191da Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Sat, 6 Aug 2022 13:44:28 +0800 Subject: [PATCH 02/22] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=9F=B3=E9=A2=91?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=89=8D=E7=9A=84=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/music/intro.opus | Bin 200976 -> 200096 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/music/intro.opus b/resources/music/intro.opus index 19c4028de89774f323fbe5fb50f48bc74cf38f10..406d72165424065a1a3a75e552319bfb97f4619d 100644 GIT binary patch delta 4739 zcmYk=d3+An8VB&45hA2SkV|UGJMU~~=ACyr*-2y)BzR+qSaVTJg_aVOXceWkFCPp> z8*2NwMeT#3T3$CTwUp~dt9q?nsI_YEbzAp2ozD9<{`iTHZ=Q4Job$|ivuIu1n##DO zuEU0vL@`l+e)(o?+)V$v?AiI2i<8_u{T{*h1@o)cM?Zi5yjIup@#A_78aD0)_{X9_ z6Ux%Eyn&sAA2BVoL)1k@Q9*y)?U|c1NTWuL5*j2nZrDg)9)tDcwRW0c#9Xe${ZTV2 z^d|kuwx|JlAm&LS5qPP+>i4RWUK)?h59_T!=KT0MF@F**-5x0|5)EX0{#y-*m?aC6 z?r@zMWQ5+nEbThhvl4kdr6e_=p6986@Bj1ibpCTx?e7+(Tx(mK3gXIYMHAbS=I+ zort2)K?!tB>8P_Eu_+f`L}rhU51farRni&QRq8-azWe%BlJ4^dI;E%iJL{$0v02#d zDLmxv`Od&Xz32>VQWx^y=bF?d9@(!dDi#%ebU$pKDxHbUwf&|!1Je@d3~UkyxrN!% zhA6V2c{%Kr^%Fy}$-cZ0nZFHP?~u@!5kfapn}H*`l7b9B<^&1n=&y{%=9<^GA+vJy z#qeC_&`H}>>Or>t@2ua5BnXnoOOm8NsKDmL2?LSIPaGMp(vD8rCiNl5GQj{*uo~>> zm8Cp=`ZR1Vp87Sc{>!lgq6Q53y;#awJ&pFJL#o93=_1{OLH zAq{|>t=KOS>}FY>6*yksvILvK#RbT`v}BP(v?#S6`_sFZ6H$=bWXk@OfKDp0 zIqJPl$b7jnF1#*;J|~+rggg@HJ%kiuk0MHvQlPimfX(vt+mShPL;vtx?nX!>Aj4ms zl0`hQ`idqfZhh)DY#!TEiOikbG>3#X(MM}nX$*P(>g>s+gD3{EN0708z{2J)d!Wi4 z%jFPlD1EdxNrZem>gB^k5wVn+15W=ogw1+~b|N$G@F8dVp=A1KZSptBTZh!sL?M2U ztY87_BadP8#8KE|9~`?Eu5uwlngD73(Qkc;;`7Qms-!A<`)X`1JhKv+71hteRSdcs zc9o`(4`)uQPyDK?C|JaWx_SYdW50!i{L+PdhiD~qHEfau*&=DuHX=)$$hFJzi+b@7 z*j)SFGGxBr{Ao;i2 zu|)OCvWf+%P=DbuHv2q$ADOw2e|DxHnn4%PuF@QG>&?~Yi8lyigHl-k={YvNzpqAn zlF&(qXnAx2ZPEfVds1Q^$yEfL?U8e3V^1u?*0mV48(G(5QGugE|BI-Wpk`fN(Tl*~ zJhChbqH!z%l-dAIL)Nndl<6pKA605#TrESj;(mecvoNtQ3GC&s>1d&;)_7_ z?Sxh$E58W66|U8sZXa6-kY62Yew75EmLS2SH?*Fh4wj%{$Qs)dT@7!)Zz4(r)#df< zVj^Kl%JacdGM@AYRnia5K^7i>?mJ3bO81>zOM{FZ=G|`A%?rk~GEgrLML}el zWoWabLS553#@T*6sZ2Mp`pmCKN>}PU0u5SY$Zd!c6V7r(gL%Y z`HCoFBew$7>hWj>vc^=P<>6XKB1!>O-M?Wbak0s6j(77NjpBlS{}&Mn-evX!m_N}ot>;2NwYy2GtqEl70pIn9Tmz+rs$8$iwb$Nv`GPBIiBr6 zU#~`B5vayR~fE&9q)S~=b6w(>)s`NT{k0t`;dkT{od zWfQ2EHli|QC2U4(9TigOPPbJ6a?IvguzNkQIi%KJkI`orD02sz3$=Ek(T>utM-%~- z{o~eJM8mwmak(zeSo$%jU-zN6k#*!_bih%eb@Y7LwNfC1@gscjs+D9p8|oRZDp1o7 z(^W31LXEpIe?+CodVCG-57#Q9r^;5DkQp;#4wHgR zkxh0HmN$YwgW7(FcG1Z{qsRp>hMp>0WkKGq*tndyd6Caamy%h-{S=h(7>z+z&!k*iM}?-)vuM|94Y{k^+1n%~jdQ!) z0`E4yj0II(n;C?x=dnyqcwVjOS+rF)WX_Ed5`oht2-!Y3%bzy@l^xHFLe`T8%q~ZT z9z|3RDD~!z5k!)*M7SOayx~m(wW$g7DzXM9F~c0C?W8BzuGI$e{4MWEk{4h(xLWX% z@e&K_XfiVyS&Lbwo1;P_=?S(~E@bQ@yok8n9LHyhB5#z+psq^H0A$UVnaFxc^aR^V zgEZdwq6zV0MUgx*yd5qRQ0)WERAePK z%xYv^Y0cbnMyRc(=iaWB4_Td>L`W)~Q)i#zG3K=cbt0eHfUHm3F*U>MRZ7pjt=d8k z9GqQ1vNSOV3-rA_xihGL2AMU;+TNM@I$SG}o_kxhgN(j)AwazC(^#GpIM!&{3)GAr zbY8{1n3IkQor$RSpvszb=|?0eBL`K9H>w7JYTlojhpa~fm`TnEwFR_W*tH5E6YHjx z!3R2?hYLE-8<&QGDlcP7kQG0iSr)Fw%t%8tEEmucuy#*Pi3o~~zBA?v#h zO!)1fy+S*at-3(299Wu8+(hKL0tHstwGGreTbOsCV{c>5*K|I%bF?$rsw-qw&!lby zu27m9@caD6<2|4}yP56ClJ+wHaz?0KiKuR%ng?d|C!So7C@CVR8QTxi5q`qJjp*t@ zCVcw}RnmTD*D8kGTDN*JQ6zZpb;-c2vHB>eJD)QKvd$c328V0)rv1!T-68da2_xXQ z1TM|xbFrLpi!SukRqH7fY`81--iZuAYcCEgUKdJIm(WmBM_ql1I}>8CD}9xfxFGjox2_o5JeURQ6NMq#eSurg5fUUigI1cE!3Ng zxFU*1WiF#0&9a}nrs1BNnQM}!shMjg-{&|DH~Qn_J+J%bIWu$4Gl!~|w^&%yA~>tC zu#bk;{QGk>v``}d466Lxu_#z?B%dkxynXZsPrMr&8=0)prNudUg~cslFe7hVL5Emd z%$EGebh&FcaT*N~(e_jcW9peD&6e9iIn{9R{Pt zGiTf`8x{0;-th9gRMGGZFy|j zcE85ox>x&`8buhYZCfz!`cdzXr=_)YapZHyJSzO^s`F1K#9jX6>G^G2$&72$nH{Tc z`~J1&%r)F@`v~cwOn%w)SHCWxNA}pY*!)9Ie=;z8@c3&heV_Yn+|byrR|bsSKQ?qv zMyK(W4fL$?P1`k&#HBD;8hkpWQ+Dv4tZUSq$7^e&eu1%ZV|)|q^R3jptwnx6cx_vA z`w9$>KYC*9z!qog7ET>tNC`d`y-x>&RSn-88t->0KbR!GGUZo%Vt}!kMb4aj@xYV^ zBX5p+?|Iy%5E!eC>ZVO=Yc9II>qyR|=G7C*;cGGboj03rox3A*^Z3eX4|>A4is!sf zH#>IsR%1%*SU0~mwH(Hl4a$3G|Huz)cQ<_N=-0bocik}=^(#x-JR4M^Y=X;+j&{2wKrJ-wbtCMey2)q>{-9g+n24}(Pcjj z&K$R7Y{A^n-{wmL?rO_7JHC#D!Tb4p8qOMCzEOY5*7!^2k54CP-M^-s`=-0a6m)d$ zfupCd9sBED_}Vhf_22QMikcC1hjR9|@**Xi4S#HI_tU}0L1NZzsf^6`*K;%f3O%r@ zVBP8i)pxzt{vQmDc{OI}q~1}>L-KN(Z+U;pLnEbl9fJlS_C^{;Uur3H}P>kTHNuvJUs?(HjRxsGNN z&+AP+W&f6QSowB;!yXxh z(&c4*8Y|l!7gXa4Co@uv4`lrO$9~AoI0S8adJJ+poKBm}qCP(IhPVf+(fsT&S}=D^RmO2Ns@~f_wRpXM#RVa0uL-yTLz8<;HbrrPHc89ZPbO%SK zd@1D-BZp)@Q;nt%xeCSjLRQCq@({WI%n-B|v%@M{1x}Rxvyy$}n!dAD<7!2&LNP5M z%MR_FhujnU!hJKF5^V;-W|sNfX{`KY;3ulleD5)&T~GOI!eHe7VW6N*jd2JD6EDQe zGxOK7a!Juws&UOCSFY4)1z9b(I*i=uMS_+$nRw2~^SrDZewmRoiU+DjlSHmuF|8qY z2fMS8TVD)w6RhbyY-T=5{<35^D-S9AQ8liY9`gp6i!GKh$lbY2&>Etl2FGzWxzp50 zR^C0UR5hBNCs)>~Mq?*;OELbC3G{|qS2Wf6lspxs&YO^4&#BYM-LYQKI;>Vv6gZ)~{OZKtjGTJDX>Yr- z$Wu{FFyxYgk7eWzJr6yEH*kh-9UYu}>q0UkmtI-YRL7S*6~%-==AE5=6}dC6z&a2( zQ?lJ=waLw|ZD8bA4OOaf9rBpBz|il1e-`#>gP^tA%x0@#;=9YzZRjDEhs#u>nNFUh zQYRGBQPg-2xxF3=T3b3Y^H5BX5B+(cmFd4%tHu>io}^;hLkd-2!@9osLeM6NCZV&% zoM4vMygbh0uf3^lD$+dnpfEs(T$O8)w8)zhw8(0+n9ZDt!y_3gmBmymYMRPi+sFz~ zYK22)|8eCAk}k9amg$5a(U#%B(_2%qEN0tMw^XJXO%{Q|A|Nl_KiLLJzXSoZie@pz z850|Y@3o^6SUfSDI;1j}NY;VEbdYDpjHpIZuW(?n!qbt}YPI789p&ePSDC5(D$_K0 zm>yW$wyxz!Dm4Rh3U<5IY7s=7XQ7s}xJMMVSY@snvVxRq2FP}4@7_mJcoZ;bM8(?<+|P^ z>qucH$g$aI36i|KlSx7~6Aw=SA5EjmSiHCwRoGPRoQHA1GAc6}Bz@S6Oj6+aBs=UZ z{5+ew#$Ya&nxit;Lb3vtYCL3h?8-GrdesjYCm8j5o!)4|oBLCLGWdQTm98>P23dp( z6Ci(kv@04(hw^}loJkM_vq^{J22r0g*jYpkQJIS+>ri24NNWDjy-4yY0@hy8#U_g! zC*aCq)ItUqkELd*Otas^L}10uvV4%#b1bk3UAW$0)Ej%?XT?+{gD*{@n%)Jjsbm2w z)hv)Do!3Z6+BykXq)w;P>pO>Aai=os27`yqpoTV8iwh^}^&byb$VJ8T*C8o+1~8q$ zs7pie2F7P*QdtZhHIJICGS}m9qFyr_WdCs!uOTUQ9x#h&fnE(q7kpn{EQ^^A)t#SkFC>r6RC0inK;u7jQR9ivSsLVB-tb2tyAV1p}(GIGu0A_;u z@iDw10=HR3onvrhEmfd04Num+!kmybNrRgssd+6h-U7>n?_{&!s`blF2X!TT;ypQ%iw-T1kxGtlpEA82G6+TX|Eb@vda|K5pw#oA+wRx{|+#{ zku%0e^Wi$|eU}Pm@vukKn5Jsqc~~4UL)mx{mhvND9G9T8>5T?6{`oJ;#Nw=%|GATs z$>vn5b%M-IcvD7_=_Rnp4hDUM-elC{eg9BFEH*Zy^O~wflg+8H&X5b@ZVpG%OK%!B zj!thfb+*Iqp3Ttl41S{}JyKZt*`{h8)vP9kTfE9W=I)Scjs@9jZ0)=&jlx99_g`{x_z&a*!@q&rGySpXP%~)KSMtjaZ zexwyBtQ+L|eT(5GJR*%;TS^C=(O@#@aCA@lM+WC+|L5B3JuC&-&>aiELXsmJ7!QTa z=~mu|FZ8C5Gx%XHJx`saYYyokO0`tT)?53PBk4#kFq6?}gmb;oh|AuiC$qTQAi9sr zG%2KmD6Bi=?Y9emKvKvcVBH)Jrybdnc`Oa4moRwZFuGo4E)D4*3QL3Z`v`ggiz7K4lE$O3bjZD7DQA$h zVm2_2hyOZ68B93!WBMtB=T^`YnyUTbVHv=NY?xn#q`V4XCL_lSCY`~6=|wc`?$V|I zxs#uhex+2)gnVo9OITbPOM#`w+u#Hay$c_yqA`PySJNw-stqCiN?~t9npb{z97$`d zf$0%vG^C2~xIe6+;nmT%j-H`1O$6yz3d@2#Ha)2bNwzv*aNJ6?IvsWg{^@i2VzV7v zXwRP(KYLU!P`$n12|?2N&7dp^7LFG=Ln7X^l|Bh`+(kE?ois~Hms5&mLv|f@GZyB! z3z*2md-3fUL5GL#rs1TvcONaOb9D6~T~1-WAxAP-1CX?IA26Y=o$b(Bat2 zq)o=$q;pl~N+QisVedjV_P?Boq*gb9StDZ{Hk;il;Dx`^OISSi9_@L({o`SMf$ Date: Sat, 6 Aug 2022 13:45:48 +0800 Subject: [PATCH 03/22] =?UTF-8?q?=E7=82=B9=E5=87=BB=E5=86=92=E9=99=A9?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=90=8E=E6=9A=82=E5=81=9C=E6=99=AE=E9=80=9A?= =?UTF-8?q?=E9=9F=B3=E4=B9=90=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/state/mainmenu.py | 1 + 1 file changed, 1 insertion(+) diff --git a/source/state/mainmenu.py b/source/state/mainmenu.py index 5fc70ef..1da7f3b 100644 --- a/source/state/mainmenu.py +++ b/source/state/mainmenu.py @@ -124,6 +124,7 @@ class Menu(tool.State): self.adventure_timer = self.adventure_start = self.current_time self.persist[c.GAME_MODE] = c.MODE_ADVENTURE # 播放进入音效 + pg.mixer.music.stop() c.SOUND_EVILLAUGH.play() c.SOUND_LOSE.play() From 506900d21c0ba02083647d616f41292b7e40d659 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Sat, 6 Aug 2022 13:50:30 +0800 Subject: [PATCH 04/22] =?UTF-8?q?=E5=87=8F=E5=B0=91=E9=9F=B3=E4=B9=90?= =?UTF-8?q?=E5=89=8D=E9=97=B4=E9=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/music/intro.opus | Bin 200096 -> 199996 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/music/intro.opus b/resources/music/intro.opus index 406d72165424065a1a3a75e552319bfb97f4619d..ddfd16be001892fe94448efeb1426f17759a2d2b 100644 GIT binary patch delta 4346 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 From e010251b00b1ed60e2aebb302740c83634c93c8a Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Sat, 6 Aug 2022 15:36:47 +0800 Subject: [PATCH 05/22] =?UTF-8?q?=E5=B9=B3=E8=A1=A1=E9=9A=BE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/state/level.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/state/level.py b/source/state/level.py index cf3013e..9a41d24 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -126,7 +126,7 @@ class Level(tool.State): zombie_list.append(c.FLAG_ZOMBIE) zombie_volume -= c.CREATE_ZOMBIE_DICT[c.FLAG_ZOMBIE][0] - # 传送带模式应当增大僵尸容量 + # 保龄球模式应当增大僵尸容量 if (self.bar_type != c.CHOOSEBAR_STATIC): zombie_volume += 2 @@ -265,7 +265,7 @@ class Level(tool.State): c.SOUND_ZOMBIE_COMING.play() return if (self.wave_num % 10 != 9): - if ((current_time - self.wave_time >= 25000 + random.randint(0, 6000)) or (self.bar_type != c.CHOOSEBAR_STATIC and current_time - self.wave_time >= 12500 + random.randint(0, 3000))): + if ((current_time - self.wave_time >= 25000 + random.randint(0, 6000)) or (self.bar_type == c.CHOOSEBAR_BOWLING and current_time - self.wave_time >= 12500 + random.randint(0, 3000))): self.wave_num += 1 self.wave_time = current_time self.wave_zombies = self.waves[self.wave_num - 1] From 98463e524b5e051b8b017b6aec2028c38237013a Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Sat, 6 Aug 2022 15:39:39 +0800 Subject: [PATCH 06/22] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A2=93=E7=A2=91?= =?UTF-8?q?=E5=90=9E=E5=99=AC=E8=80=85=E5=8F=AF=E4=BB=A5=E7=A7=8D=E6=A4=8D?= =?UTF-8?q?=E5=9C=A8=E5=A2=93=E7=A2=91=E5=90=9E=E5=99=AC=E8=80=85=E4=B8=8A?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/map.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/component/map.py b/source/component/map.py index 206905a..93003e1 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -55,7 +55,7 @@ class Map(): else: return False if plant_name == c.GRAVEBUSTER: - if (c.GRAVE in self.map[map_y][map_x][c.MAP_PLANT]): + if (c.GRAVE in self.map[map_y][map_x][c.MAP_PLANT] and (plant_name not in self.map[map_y][map_x][c.MAP_PLANT])): return True else: return False @@ -420,9 +420,9 @@ LITTLE_GAME_MAP_DATA = ( c.NUM_FLAGS:3, c.CARD_POOL: { c.PUFFSHROOM: 100, c.SCAREDYSHROOM: 100, - c.ICESHROOM: 100, + c.ICESHROOM: 70, c.HYPNOSHROOM: 100, - c.DOOMSHROOM: 100, + c.DOOMSHROOM: 50, c.GRAVEBUSTER: 100, c.FUMESHROOM: 200}, c.GRADE_GRAVES:3 From 1c96110e289b3bc0c140f21e4d777d8b2878bce4 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Mon, 8 Aug 2022 09:05:41 +0800 Subject: [PATCH 07/22] =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pypvz.py | 2 +- source/constants.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pypvz.py b/pypvz.py index 89e0b5a..f56f05e 100755 --- a/pypvz.py +++ b/pypvz.py @@ -11,7 +11,7 @@ from source import tool from source import constants as c from source.state import mainmenu, screen, level -if __name__=="__main__": +if __name__ == "__main__": # 日志设置 if not os.path.exists(os.path.dirname(c.USERLOG_PATH)): os.makedirs(os.path.dirname(c.USERLOG_PATH)) diff --git a/source/constants.py b/source/constants.py index 987710d..7579e88 100755 --- a/source/constants.py +++ b/source/constants.py @@ -9,12 +9,14 @@ else: # 非Windows系统存储路径 USERDATA_PATH = os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "userdata.json")) USERLOG_PATH = os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "run.log")) -# 窗口图标 -ORIGINAL_LOGO = os.path.join(os.path.dirname(os.path.dirname(__file__)), "pypvz-exec-logo.png") # 游戏图片资源路径 PATH_IMG_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "resources", "graphics") # 游戏音乐文件夹路径 PATH_MUSIC_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "resources","music") +# 窗口图标 +ORIGINAL_LOGO = os.path.join(os.path.dirname(os.path.dirname(__file__)), "pypvz-exec-logo.png") +# 字体路径 +FONT_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), "resources", "DroidSansFallback.ttf") # 窗口标题 ORIGINAL_CAPTION = "pypvz" @@ -29,8 +31,6 @@ SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 SCREEN_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT) -# 字体路径 -FONT_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), "resources", "DroidSansFallback.ttf") # 选卡数量 # 最大数量 @@ -231,7 +231,7 @@ CARD_MOVE_TIME = 60 CAR = "car" SUN = "Sun" -# plant子类非植物对象 +# plant子类非植物对象(这里的是不包括阳光、子弹的拟植物对象) NON_PLANT_OBJECTS = { HOLE := "Hole", ICEFROZENPLOT := "IceFrozenPlot", From 6edaf34d116184d7db60f8b03596b89d8266dc53 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Mon, 8 Aug 2022 10:38:45 +0800 Subject: [PATCH 08/22] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/tool.py | 68 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/source/tool.py b/source/tool.py index 29014a6..5bf0dd9 100755 --- a/source/tool.py +++ b/source/tool.py @@ -1,9 +1,11 @@ +import logging import os import json from abc import abstractmethod import pygame as pg from pygame.locals import * from . import constants as c +logger = logging.getLogger("main") # 状态机 抽象基类 class State(): @@ -66,33 +68,54 @@ class Control(): # 存在存档即导入 with open(c.USERDATA_PATH) as f: userdata = json.load(f) - self.game_info = {} - # 导入数据,保证了可运行性,但是放弃了数据向后兼容性,即假如某些变量在以后改名,在导入时可能会被重置 - need_to_rewrite = False - for key in c.INIT_USERDATA: - if key in userdata: - self.game_info[key] = userdata[key] - else: - self.game_info[key] = c.INIT_USERDATA[key] - need_to_rewrite = True - if need_to_rewrite: - with open(c.USERDATA_PATH, "w") as f: - savedata = json.dumps(self.game_info, sort_keys=True, indent=4) - f.write(savedata) - except: - if not os.path.exists(os.path.dirname(c.USERDATA_PATH)): - os.makedirs(os.path.dirname(c.USERDATA_PATH)) - with open(c.USERDATA_PATH, "w") as f: - savedata = json.dumps(c.INIT_USERDATA, sort_keys=True, indent=4) - f.write(savedata) - self.game_info = c.INIT_USERDATA.copy() # 内部全是不可变对象,浅拷贝即可 + except FileNotFoundError: + self.setupUserData() + except PermissionError: + logger.warning("用户存档文件不可读!本程序将自动设置存档文件为可读状态!\n") + # Python权限规则和Unix不一样,420表示unix的655,Windows自动忽略不支持项 + os.chmod(c.USERDATA_PATH, 420) + try: + with open(c.USERDATA_PATH) as f: + userdata = json.load(f) + except json.JSONDecodeError: + logger.warning("用户存档解码错误!现在将使用新建的初始化存档!\n") + self.setupUserData() + else: + self.applyUserData(userdata) + except json.JSONDecodeError: + logger.warning("用户存档解码错误!现在将使用新建的初始化存档!\n") + self.setupUserData() + else: # 未引发异常时执行的操作 + self.applyUserData(userdata) # 存档内不包含即时游戏时间信息,需要新建 self.game_info[c.CURRENT_TIME] = 0 # 50为目前的基础帧率,乘以倍率即是游戏帧率 self.fps = 50 * self.game_info[c.GAME_RATE] - + def setupUserData(self): + if not os.path.exists(os.path.dirname(c.USERDATA_PATH)): + os.makedirs(os.path.dirname(c.USERDATA_PATH)) + with open(c.USERDATA_PATH, "w") as f: + savedata = json.dumps(c.INIT_USERDATA, sort_keys=True, indent=4) + f.write(savedata) + self.game_info = c.INIT_USERDATA.copy() # 内部全是不可变对象,浅拷贝即可 + + def applyUserData(self, userdata): + self.game_info = {} + # 导入数据,保证了可运行性,但是放弃了数据向后兼容性,即假如某些变量在以后改名,在导入时可能会被重置 + need_to_rewrite = False + for key in c.INIT_USERDATA: + if key in userdata: + self.game_info[key] = userdata[key] + else: + self.game_info[key] = c.INIT_USERDATA[key] + need_to_rewrite = True + if need_to_rewrite: + with open(c.USERDATA_PATH, "w") as f: + savedata = json.dumps(self.game_info, sort_keys=True, indent=4) + f.write(savedata) + def setup_states(self, state_dict, start_state): self.state_dict = state_dict self.state_name = start_state @@ -137,8 +160,7 @@ class Control(): self.mouse_pos = pg.mouse.get_pos() self.mouse_click[0], _, self.mouse_click[1] = pg.mouse.get_pressed() # self.mouse_click[0]表示左键,self.mouse_click[1]表示右键 - print( f"点击位置: ({self.mouse_pos[0]:3}, {self.mouse_pos[1]:3})", - f"左右键点击情况: {self.mouse_click}") + print(f"点击位置: ({self.mouse_pos[0]:3}, {self.mouse_pos[1]:3}) 左右键点击情况: {self.mouse_click}") def run(self): From 7e93949f9128e4fb6cd4c1cfd829117065a6d723 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Mon, 8 Aug 2022 10:49:18 +0800 Subject: [PATCH 09/22] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/tool.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/source/tool.py b/source/tool.py index 5bf0dd9..221f5f2 100755 --- a/source/tool.py +++ b/source/tool.py @@ -62,7 +62,7 @@ class Control(): self.state_dict = {} self.state_name = None self.state = None - # 这里需要考虑多种情况,如文件不存在、文件不可读、文件不符合JSON语法要求,这些情况目前暂定统一进行新建文件操作 + # 这里需要考虑多种情况,如文件不存在、文件不可读、文件不符合JSON语法要求 # 因此仍然采用try-except实现而非if-else实现 try: # 存在存档即导入 @@ -71,19 +71,19 @@ class Control(): except FileNotFoundError: self.setupUserData() except PermissionError: - logger.warning("用户存档文件不可读!本程序将自动设置存档文件为可读状态!\n") + logger.warning("用户存档文件不可读!程序将自动设置存档文件为可读状态!\n") # Python权限规则和Unix不一样,420表示unix的655,Windows自动忽略不支持项 os.chmod(c.USERDATA_PATH, 420) try: with open(c.USERDATA_PATH) as f: userdata = json.load(f) except json.JSONDecodeError: - logger.warning("用户存档解码错误!现在将使用新建的初始化存档!\n") + logger.warning("用户存档解码错误!程序将新建初始存档!\n") self.setupUserData() else: self.applyUserData(userdata) except json.JSONDecodeError: - logger.warning("用户存档解码错误!现在将使用新建的初始化存档!\n") + logger.warning("用户存档解码错误!程序将新建初始存档!\n") self.setupUserData() else: # 未引发异常时执行的操作 self.applyUserData(userdata) @@ -95,7 +95,9 @@ class Control(): def setupUserData(self): if not os.path.exists(os.path.dirname(c.USERDATA_PATH)): - os.makedirs(os.path.dirname(c.USERDATA_PATH)) + os.makedirs(os.path.dirname(c.USERDATA_PATH)) + else: + logger.warning("已有游戏数据目录但未找到游戏存档文件,请检查存档是否丢失!程序将新建初始存档!\n") with open(c.USERDATA_PATH, "w") as f: savedata = json.dumps(c.INIT_USERDATA, sort_keys=True, indent=4) f.write(savedata) From f3b602a30e5b577f1e1d3f4baa940e1503128da4 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Mon, 8 Aug 2022 10:55:13 +0800 Subject: [PATCH 10/22] =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E6=AD=A7=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/tool.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/source/tool.py b/source/tool.py index 221f5f2..cb48806 100755 --- a/source/tool.py +++ b/source/tool.py @@ -33,8 +33,8 @@ class State(): # 工具:范围判断函数,用于判断点击 def inArea(self, rect, x, y): - if (x >= rect.x and x <= rect.right and - y >= rect.y and y <= rect.bottom): + if (rect.x <= x <= rect.right and + rect.y <= y <= rect.bottom): return True else: return False @@ -96,8 +96,6 @@ class Control(): def setupUserData(self): if not os.path.exists(os.path.dirname(c.USERDATA_PATH)): os.makedirs(os.path.dirname(c.USERDATA_PATH)) - else: - logger.warning("已有游戏数据目录但未找到游戏存档文件,请检查存档是否丢失!程序将新建初始存档!\n") with open(c.USERDATA_PATH, "w") as f: savedata = json.dumps(c.INIT_USERDATA, sort_keys=True, indent=4) f.write(savedata) From 44ccabd74de8e19b4c5dc2baa5207bec54fc6850 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Mon, 8 Aug 2022 12:12:36 +0800 Subject: [PATCH 11/22] =?UTF-8?q?=E6=8D=95=E6=8D=89=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=97=B6=E6=9D=83=E9=99=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/tool.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/tool.py b/source/tool.py index cb48806..6094bd9 100755 --- a/source/tool.py +++ b/source/tool.py @@ -68,6 +68,7 @@ class Control(): # 存在存档即导入 with open(c.USERDATA_PATH) as f: userdata = json.load(f) + self.applyUserData(userdata) # 写入时也可能发生权限问题,因此放到try语句中 except FileNotFoundError: self.setupUserData() except PermissionError: @@ -85,8 +86,6 @@ class Control(): except json.JSONDecodeError: logger.warning("用户存档解码错误!程序将新建初始存档!\n") self.setupUserData() - else: # 未引发异常时执行的操作 - self.applyUserData(userdata) # 存档内不包含即时游戏时间信息,需要新建 self.game_info[c.CURRENT_TIME] = 0 From 1c52ea88f4036a47717dc4307a2e3b4ecabaaf60 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Mon, 8 Aug 2022 12:21:13 +0800 Subject: [PATCH 12/22] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pypvz.py | 1 + source/tool.py | 15 +++------------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/pypvz.py b/pypvz.py index f56f05e..58be596 100755 --- a/pypvz.py +++ b/pypvz.py @@ -18,6 +18,7 @@ if __name__ == "__main__": logger = logging.getLogger("main") formatter = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s") fileHandler = RotatingFileHandler(c.USERLOG_PATH, "a", 1024*1024, 0, "utf-8") + os.chmod(c.USERLOG_PATH, 420) # 设置日志文件权限,Unix为644,Windows为可读、可写 fileHandler.setFormatter(formatter) streamHandler = logging.StreamHandler() streamHandler.setFormatter(formatter) diff --git a/source/tool.py b/source/tool.py index 6094bd9..6e3bc36 100755 --- a/source/tool.py +++ b/source/tool.py @@ -66,23 +66,14 @@ class Control(): # 因此仍然采用try-except实现而非if-else实现 try: # 存在存档即导入 + # 自动修复读写权限 + # Python权限规则和Unix不一样,420表示unix的644,Windows自动忽略不支持项 + os.chmod(c.USERDATA_PATH, 420) with open(c.USERDATA_PATH) as f: userdata = json.load(f) self.applyUserData(userdata) # 写入时也可能发生权限问题,因此放到try语句中 except FileNotFoundError: self.setupUserData() - except PermissionError: - logger.warning("用户存档文件不可读!程序将自动设置存档文件为可读状态!\n") - # Python权限规则和Unix不一样,420表示unix的655,Windows自动忽略不支持项 - os.chmod(c.USERDATA_PATH, 420) - try: - with open(c.USERDATA_PATH) as f: - userdata = json.load(f) - except json.JSONDecodeError: - logger.warning("用户存档解码错误!程序将新建初始存档!\n") - self.setupUserData() - else: - self.applyUserData(userdata) except json.JSONDecodeError: logger.warning("用户存档解码错误!程序将新建初始存档!\n") self.setupUserData() From 10711a5509c0dc2295918ef9a3c02235c9023eb9 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Mon, 8 Aug 2022 12:29:14 +0800 Subject: [PATCH 13/22] =?UTF-8?q?=E5=87=8F=E5=B0=91try=E5=8C=85=E6=8B=AC?= =?UTF-8?q?=E7=9A=84=E8=AF=AD=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/tool.py | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/source/tool.py b/source/tool.py index 6e3bc36..b370c71 100755 --- a/source/tool.py +++ b/source/tool.py @@ -62,21 +62,31 @@ class Control(): self.state_dict = {} self.state_name = None self.state = None - # 这里需要考虑多种情况,如文件不存在、文件不可读、文件不符合JSON语法要求 - # 因此仍然采用try-except实现而非if-else实现 try: # 存在存档即导入 - # 自动修复读写权限 - # Python权限规则和Unix不一样,420表示unix的644,Windows自动忽略不支持项 + # 先自动修复读写权限(Python权限规则和Unix不一样,420表示unix的644,Windows自动忽略不支持项) os.chmod(c.USERDATA_PATH, 420) with open(c.USERDATA_PATH) as f: userdata = json.load(f) - self.applyUserData(userdata) # 写入时也可能发生权限问题,因此放到try语句中 except FileNotFoundError: self.setupUserData() except json.JSONDecodeError: logger.warning("用户存档解码错误!程序将新建初始存档!\n") self.setupUserData() + else: # 没有引发异常才执行 + self.game_info = {} + # 导入数据,保证了可运行性,但是放弃了数据向后兼容性,即假如某些变量在以后改名,在导入时可能会被重置 + need_to_rewrite = False + for key in c.INIT_USERDATA: + if key in userdata: + self.game_info[key] = userdata[key] + else: + self.game_info[key] = c.INIT_USERDATA[key] + need_to_rewrite = True + if need_to_rewrite: + with open(c.USERDATA_PATH, "w") as f: + savedata = json.dumps(self.game_info, sort_keys=True, indent=4) + f.write(savedata) # 存档内不包含即时游戏时间信息,需要新建 self.game_info[c.CURRENT_TIME] = 0 @@ -91,21 +101,6 @@ class Control(): f.write(savedata) self.game_info = c.INIT_USERDATA.copy() # 内部全是不可变对象,浅拷贝即可 - def applyUserData(self, userdata): - self.game_info = {} - # 导入数据,保证了可运行性,但是放弃了数据向后兼容性,即假如某些变量在以后改名,在导入时可能会被重置 - need_to_rewrite = False - for key in c.INIT_USERDATA: - if key in userdata: - self.game_info[key] = userdata[key] - else: - self.game_info[key] = c.INIT_USERDATA[key] - need_to_rewrite = True - if need_to_rewrite: - with open(c.USERDATA_PATH, "w") as f: - savedata = json.dumps(self.game_info, sort_keys=True, indent=4) - f.write(savedata) - def setup_states(self, state_dict, start_state): self.state_dict = state_dict self.state_name = start_state From f37f05b72648af77e7725befc7c32db8dbed57ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 8 Aug 2022 16:27:48 +0800 Subject: [PATCH 14/22] =?UTF-8?q?=E6=94=B9=E7=94=A8=E6=8E=A8=E5=AF=BC?= =?UTF-8?q?=E5=BC=8F=E4=BB=A5=E4=BE=BFpylance=E6=98=8E=E7=A1=AE=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/menubar.py | 4 +--- source/constants.py | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/source/component/menubar.py b/source/component/menubar.py index 19acedd..c990700 100755 --- a/source/component/menubar.py +++ b/source/component/menubar.py @@ -22,9 +22,7 @@ def getSunValueImage(sun_value): return image def getCardPool(data): - card_pool = {} - for cardName in data: - card_pool[c.PLANT_CARD_INFO[c.PLANT_CARD_INDEX[cardName]]] = data[cardName] + card_pool = {c.PLANT_CARD_INFO[c.PLANT_CARD_INDEX[card_name]]: data[card_name] for card_name in data} return card_pool class Card(): diff --git a/source/constants.py b/source/constants.py index 7579e88..df09fea 100755 --- a/source/constants.py +++ b/source/constants.py @@ -376,9 +376,7 @@ PLANT_CARD_INFO = (# 元组 (植物名称, 卡片名称, 阳光, 冷却时间) ) # 卡片中的植物名称与索引序号的对应关系,指定名称以得到索引值 -PLANT_CARD_INDEX={} -for i, item in enumerate(PLANT_CARD_INFO): - PLANT_CARD_INDEX[item[PLANT_NAME_INDEX]] = i +PLANT_CARD_INDEX={item[PLANT_NAME_INDEX]: index for (index, item) in enumerate(PLANT_CARD_INFO)} # 指定了哪些卡可选(排除坚果保龄球特殊植物) CARDS_TO_CHOOSE = range(len(PLANT_CARD_INFO) - 3) From 2376922a77692c2f82425af3338933cd87f1b263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 8 Aug 2022 17:34:15 +0800 Subject: [PATCH 15/22] =?UTF-8?q?=E6=8C=87=E5=AE=9A=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/tool.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/tool.py b/source/tool.py index b370c71..30b6dc6 100755 --- a/source/tool.py +++ b/source/tool.py @@ -41,7 +41,7 @@ class State(): # 工具:用户数据保存函数 def saveUserData(self): - with open(c.USERDATA_PATH, "w") as f: + with open(c.USERDATA_PATH, "w", encoding="utf-8") as f: userdata = {} for i in self.game_info: if i in c.INIT_USERDATA: @@ -66,7 +66,7 @@ class Control(): # 存在存档即导入 # 先自动修复读写权限(Python权限规则和Unix不一样,420表示unix的644,Windows自动忽略不支持项) os.chmod(c.USERDATA_PATH, 420) - with open(c.USERDATA_PATH) as f: + with open(c.USERDATA_PATH, encoding="utf-8") as f: userdata = json.load(f) except FileNotFoundError: self.setupUserData() @@ -84,7 +84,7 @@ class Control(): self.game_info[key] = c.INIT_USERDATA[key] need_to_rewrite = True if need_to_rewrite: - with open(c.USERDATA_PATH, "w") as f: + with open(c.USERDATA_PATH, "w", encoding="utf-8") as f: savedata = json.dumps(self.game_info, sort_keys=True, indent=4) f.write(savedata) # 存档内不包含即时游戏时间信息,需要新建 @@ -96,7 +96,7 @@ class Control(): def setupUserData(self): if not os.path.exists(os.path.dirname(c.USERDATA_PATH)): os.makedirs(os.path.dirname(c.USERDATA_PATH)) - with open(c.USERDATA_PATH, "w") as f: + with open(c.USERDATA_PATH, "w", encoding="utf-8") as f: savedata = json.dumps(c.INIT_USERDATA, sort_keys=True, indent=4) f.write(savedata) self.game_info = c.INIT_USERDATA.copy() # 内部全是不可变对象,浅拷贝即可 From baeb003f5fee2d6f16ac24f2a31eb4a63870e02a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 8 Aug 2022 18:26:46 +0800 Subject: [PATCH 16/22] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/menubar.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/source/component/menubar.py b/source/component/menubar.py index c990700..9a17f63 100755 --- a/source/component/menubar.py +++ b/source/component/menubar.py @@ -83,7 +83,7 @@ class Card(): # 有关是否满足冷却与阳光条件的图片形式 time = current_time - self.frozen_timer if time < self.frozen_time: #cool down status - image = pg.Surface([self.rect.w, self.rect.h]) + image = pg.Surface((self.rect.w, self.rect.h)) # 黑底 # 在冷却时间不足且阳光也不足时,叠加两者效果显示,即同时改变透明度与图像覆盖 if self.sun_cost > sun_value: image.set_alpha(192) @@ -98,8 +98,11 @@ class Card(): image = self.orig_image.copy() image.set_alpha(192) elif self.clicked: - image = self.orig_image.copy() - image.set_alpha(128) + image = pg.Surface((self.rect.w, self.rect.h)) # 黑底 + chosen_image = self.orig_image.copy() + chosen_image.set_alpha(128) + + image.blit(chosen_image, (0,0), (0, 0, self.rect.w, self.rect.h)) else: image = self.orig_image return image @@ -355,14 +358,21 @@ class MoveCard(): # 新增卡片时显示图片 if self.rect.w < self.orig_rect.w: #create a part card image image = pg.Surface([self.rect.w, self.rect.h]) + if self.clicked: + self.orig_image.set_alpha(128) + else: + self.orig_image.set_alpha(255) image.blit(self.orig_image, (0, 0), (0, 0, self.rect.w, self.rect.h)) self.rect.w += 1 else: - image = self.orig_image - if self.clicked: - image.set_alpha(192) - else: - image.set_alpha(255) + if self.clicked: + image = pg.Surface([self.rect.w, self.rect.h]) # 黑底 + self.orig_image.set_alpha(128) + + image.blit(self.orig_image, (0,0), (0, 0, self.rect.w, self.rect.h)) + else: + self.orig_image.set_alpha(255) + image = self.orig_image return image def update(self, left_x, current_time): From 544560c49e301e41146c8e883e5563712218b9ba Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Mon, 8 Aug 2022 23:08:03 +0800 Subject: [PATCH 17/22] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/map.py | 42 +++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/source/component/map.py b/source/component/map.py index 93003e1..35beed4 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -10,27 +10,50 @@ class Map(): self.width = c.GRID_POOL_X_LEN self.height = c.GRID_POOL_Y_LEN self.grid_height_size = c.GRID_POOL_Y_SIZE - self.map = [[(self.initMapGrid(c.MAP_GRASS), self.initMapGrid(c.MAP_WATER))[y in {2, 3}] for x in range(self.width)] for y in range(self.height)] + self.map = [ [self.initMapGrid(c.MAP_WATER) if 2 <= y <= 3 + else self.initMapGrid(c.MAP_GRASS) + for x in range(self.width) + ] + for y in range(self.height) + ] elif self.background_type in c.ON_ROOF_BACKGROUNDS: self.width = c.GRID_ROOF_X_LEN self.height = c.GRID_ROOF_Y_LEN self.grid_height_size = c.GRID_ROOF_Y_SIZE - self.map = [[self.initMapGrid(c.MAP_TILE) for x in range(self.width)] for y in range(self.height)] + self.map = [ [self.initMapGrid(c.MAP_TILE) + for x in range(self.width) + ] + for y in range(self.height) + ] elif self.background_type == c.BACKGROUND_SINGLE: self.width = c.GRID_X_LEN self.height = c.GRID_Y_LEN self.grid_height_size = c.GRID_Y_SIZE - self.map = [[(self.initMapGrid(c.MAP_UNAVAILABLE), self.initMapGrid(c.MAP_GRASS))[y == 2] for x in range(self.width)] for y in range(self.height)] + self.map = [ [self.initMapGrid(c.MAP_GRASS) if y ==2 + else self.initMapGrid(c.MAP_UNAVAILABLE) + for x in range(self.width) + ] + for y in range(self.height) + ] elif self.background_type == c.BACKGROUND_TRIPLE: self.width = c.GRID_X_LEN self.height = c.GRID_Y_LEN self.grid_height_size = c.GRID_Y_SIZE - self.map = [[(self.initMapGrid(c.MAP_UNAVAILABLE), self.initMapGrid(c.MAP_GRASS))[y in {1, 2, 3}] for x in range(self.width)] for y in range(self.height)] + self.map = [ [self.initMapGrid(c.MAP_GRASS) if 1 <= y <= 3 + else self.initMapGrid(c.MAP_UNAVAILABLE) + for x in range(self.width) + ] + for y in range(self.height) + ] else: self.width = c.GRID_X_LEN self.height = c.GRID_Y_LEN self.grid_height_size = c.GRID_Y_SIZE - self.map = [[self.initMapGrid(c.MAP_GRASS) for x in range(self.width)] for y in range(self.height)] + self.map = [ [self.initMapGrid(c.MAP_GRASS) + for x in range(self.width) + ] + for y in range(self.height) + ] def isValid(self, map_x, map_y): if (map_x < 0 or map_x >= self.width or @@ -50,12 +73,14 @@ class Map(): def isAvailable(self, map_x, map_y, plant_name): # 咖啡豆和墓碑吞噬者的判别最为特殊 if plant_name == c.COFFEEBEAN: - if self.map[map_y][map_x][c.MAP_SLEEP] and (plant_name not in self.map[map_y][map_x][c.MAP_PLANT]): + if (self.map[map_y][map_x][c.MAP_SLEEP] + and (plant_name not in self.map[map_y][map_x][c.MAP_PLANT])): return True else: return False if plant_name == c.GRAVEBUSTER: - if (c.GRAVE in self.map[map_y][map_x][c.MAP_PLANT] and (plant_name not in self.map[map_y][map_x][c.MAP_PLANT])): + if (c.GRAVE in self.map[map_y][map_x][c.MAP_PLANT] + and (plant_name not in self.map[map_y][map_x][c.MAP_PLANT])): return True else: return False @@ -70,7 +95,8 @@ class Map(): elif (all((i in {"花盆(未实现)", c.PUMPKINHEAD}) for i in self.map[map_y][map_x][c.MAP_PLANT]) and (plant_name not in self.map[map_y][map_x][c.MAP_PLANT])): # 例外植物:集合中填花盆和南瓜头,只要这里没有这种植物就能种植 return True - elif (plant_name == c.PUMPKINHEAD) and (c.PUMPKINHEAD not in self.map[map_y][map_x][c.MAP_PLANT]): # 没有南瓜头就能种南瓜头 + elif ((plant_name == c.PUMPKINHEAD) + and (c.PUMPKINHEAD not in self.map[map_y][map_x][c.MAP_PLANT])): # 没有南瓜头就能种南瓜头 return True else: return False From 9e01c018e4701d6eacb3a6678cff78c630a15045 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Mon, 8 Aug 2022 23:59:17 +0800 Subject: [PATCH 18/22] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E7=BC=A0=E7=BB=95?= =?UTF-8?q?=E6=B5=B7=E8=8D=89=E6=94=BB=E5=87=BB=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/map.py | 6 ++++-- source/component/plant.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/source/component/map.py b/source/component/map.py index 35beed4..b4243d2 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -112,7 +112,8 @@ class Map(): return False else: return True - elif (plant_name == c.PUMPKINHEAD) and (c.PUMPKINHEAD not in self.map[map_y][map_x][c.MAP_PLANT]): # 有花盆且没有南瓜头就能种南瓜头 + elif ((plant_name == c.PUMPKINHEAD) + and (c.PUMPKINHEAD not in self.map[map_y][map_x][c.MAP_PLANT])): # 有花盆且没有南瓜头就能种南瓜头 return True else: return False @@ -136,7 +137,8 @@ class Map(): return False else: return True - elif (plant_name == c.PUMPKINHEAD) and (c.PUMPKINHEAD not in self.map[map_y][map_x][c.MAP_PLANT]): # 在睡莲上且没有南瓜头就能种南瓜头 + elif ((plant_name == c.PUMPKINHEAD) + and (c.PUMPKINHEAD not in self.map[map_y][map_x][c.MAP_PLANT])): # 在睡莲上且没有南瓜头就能种南瓜头 return True else: return False diff --git a/source/component/plant.py b/source/component/plant.py index d3bf123..8c85334 100755 --- a/source/component/plant.py +++ b/source/component/plant.py @@ -1474,7 +1474,7 @@ class TangleKlep(Plant): def canAttack(self, zombie): if zombie.state != c.DIE and (not zombie.losthead): # 这里碰撞应当比碰撞一般更容易,就设置成圆形或矩形模式,不宜采用mask - if pg.sprite.collide_circle_ratio(0.7)(zombie, self): + if pg.sprite.collide_rect_ratio(1)(zombie, self): return True return False From b7b69cec612fc49e5afb30344c5906b9d4cd2571 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Tue, 9 Aug 2022 05:46:06 +0800 Subject: [PATCH 19/22] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/menubar.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/component/menubar.py b/source/component/menubar.py index 9a17f63..52bd69b 100755 --- a/source/component/menubar.py +++ b/source/component/menubar.py @@ -56,8 +56,8 @@ class Card(): def checkMouseClick(self, mouse_pos): x, y = mouse_pos - if(x >= self.rect.x and x <= self.rect.right and - y >= self.rect.y and y <= self.rect.bottom): + if (self.rect.x <= x <= self.rect.right and + self.rect.y <= y <= self.rect.bottom): return True return False @@ -84,27 +84,27 @@ class Card(): time = current_time - self.frozen_timer if time < self.frozen_time: #cool down status image = pg.Surface((self.rect.w, self.rect.h)) # 黑底 - # 在冷却时间不足且阳光也不足时,叠加两者效果显示,即同时改变透明度与图像覆盖 - if self.sun_cost > sun_value: - image.set_alpha(192) - frozen_image = self.orig_image.copy() + frozen_image = self.orig_image frozen_image.set_alpha(128) frozen_height = (self.frozen_time - time)/self.frozen_time * self.rect.h image.blit(frozen_image, (0,0), (0, 0, self.rect.w, frozen_height)) + self.orig_image.set_alpha(192) image.blit(self.orig_image, (0,frozen_height), (0, frozen_height, self.rect.w, self.rect.h - frozen_height)) elif self.sun_cost > sun_value: #disable status - image = self.orig_image.copy() - image.set_alpha(192) + image = pg.Surface((self.rect.w, self.rect.h)) # 黑底 + self.orig_image.set_alpha(192) + image.blit(self.orig_image, (0,0), (0, 0, self.rect.w, self.rect.h)) elif self.clicked: image = pg.Surface((self.rect.w, self.rect.h)) # 黑底 - chosen_image = self.orig_image.copy() + chosen_image = self.orig_image chosen_image.set_alpha(128) image.blit(chosen_image, (0,0), (0, 0, self.rect.w, self.rect.h)) else: image = self.orig_image + image.set_alpha(255) return image def update(self, sun_value, current_time): From 08ec7e2d0015c57f341fe7a6f55e8016d2500c30 Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Tue, 9 Aug 2022 11:01:57 +0800 Subject: [PATCH 20/22] =?UTF-8?q?=E5=B9=B3=E8=A1=A1=E9=9A=BE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/map.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/component/map.py b/source/component/map.py index b4243d2..87b6d40 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -276,7 +276,8 @@ LEVEL_MAP_DATA = ( c.INIT_SUN_NAME: 50, c.SHOVEL: 1, c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, - c.INCLUDED_ZOMBIES: (c.NORMAL_ZOMBIE, c.CONEHEAD_ZOMBIE, c.POLE_VAULTING_ZOMBIE, c.BUCKETHEAD_ZOMBIE), + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.CONEHEAD_ZOMBIE, + c.POLE_VAULTING_ZOMBIE, c.BUCKETHEAD_ZOMBIE), c.NUM_FLAGS:3 }, # 第6关 目前夜晚第一关 @@ -473,7 +474,7 @@ LITTLE_GAME_MAP_DATA = ( c.SPIKEWEED: 100, c.SQUASH: 100, c.JALAPENO: 50, - c.THREEPEASHOOTER: 300,} + c.THREEPEASHOOTER: 400,} }, # 第5关 坚果保龄球2 { From 777e937d986d4ffe7bc7492c02275cc6a5df625b Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Tue, 9 Aug 2022 20:23:47 +0800 Subject: [PATCH 21/22] =?UTF-8?q?=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/component/plant.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/source/component/plant.py b/source/component/plant.py index 8c85334..a4e4a59 100755 --- a/source/component/plant.py +++ b/source/component/plant.py @@ -1279,18 +1279,20 @@ class TorchWood(Plant): def idling(self): for i in self.bullet_group: - if i.name == c.BULLET_PEA: - if i.passed_torchwood_x != self.rect.centerx: - if abs(i.rect.centerx - self.rect.centerx) <= 20: - self.bullet_group.add(Bullet(i.rect.x, i.rect.y, i.dest_y, - c.BULLET_FIREBALL, c.BULLET_DAMAGE_FIREBALL_BODY, effect=c.BULLET_EFFECT_UNICE, passed_torchwood_x=self.rect.centerx)) - i.kill() - elif i.name == c.BULLET_PEA_ICE: - if i.passed_torchwood_x != self.rect.centerx: - if abs(i.rect.centerx - self.rect.centerx) <= 20: - self.bullet_group.add(Bullet(i.rect.x, i.rect.y, i.dest_y, - c.BULLET_PEA, c.BULLET_DAMAGE_NORMAL, effect=None, passed_torchwood_x=self.rect.centerx)) - i.kill() + if (i.name == c.BULLET_PEA + and i.passed_torchwood_x != self.rect.centerx + and abs(i.rect.centerx - self.rect.centerx) <= 20): + self.bullet_group.add(Bullet(i.rect.x, i.rect.y, i.dest_y, + c.BULLET_FIREBALL, c.BULLET_DAMAGE_FIREBALL_BODY, + effect=c.BULLET_EFFECT_UNICE, passed_torchwood_x=self.rect.centerx)) + i.kill() + elif (i.name == c.BULLET_PEA_ICE + and i.passed_torchwood_x != self.rect.centerx + and abs(i.rect.centerx - self.rect.centerx)): + self.bullet_group.add(Bullet(i.rect.x, i.rect.y, i.dest_y, + c.BULLET_PEA, c.BULLET_DAMAGE_NORMAL, + effect=None, passed_torchwood_x=self.rect.centerx)) + i.kill() class StarFruit(Plant): def __init__(self, x, y, bullet_group, level): From 7c86e1929d53c56f7d26719dead98b546d5e5d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Wed, 10 Aug 2022 10:00:52 +0800 Subject: [PATCH 22/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=AF=E8=AF=BB?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pypvz.py | 2 +- source/constants.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pypvz.py b/pypvz.py index 58be596..dffe61c 100755 --- a/pypvz.py +++ b/pypvz.py @@ -17,7 +17,7 @@ if __name__ == "__main__": os.makedirs(os.path.dirname(c.USERLOG_PATH)) logger = logging.getLogger("main") formatter = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s") - fileHandler = RotatingFileHandler(c.USERLOG_PATH, "a", 1024*1024, 0, "utf-8") + fileHandler = RotatingFileHandler(c.USERLOG_PATH, "a", 1_000_000, 0, "utf-8") os.chmod(c.USERLOG_PATH, 420) # 设置日志文件权限,Unix为644,Windows为可读、可写 fileHandler.setFormatter(formatter) streamHandler = logging.StreamHandler() diff --git a/source/constants.py b/source/constants.py index df09fea..ceae9c5 100755 --- a/source/constants.py +++ b/source/constants.py @@ -480,7 +480,7 @@ FUME = "Fume" # 子弹伤害 BULLET_DAMAGE_NORMAL = 20 BULLET_DAMAGE_FIREBALL_BODY = 27 # 这是火球本体的伤害,注意不是40,本体(27) + 溅射(13)才是40 -BULLET_DAMAGE_FIREBALL_RANGE = 13 +BULLET_DAMAGE_FIREBALL_RANGE = 13 # 原版溅射伤害会随着僵尸数量增多而减少,这里相当于做了一个增强 # 子弹效果 BULLET_EFFECT_ICE = "ice" BULLET_EFFECT_UNICE = "unice"