From ef564338a6659c3ffbe91cc68034fb74571a501f Mon Sep 17 00:00:00 2001 From: hefanyang Date: Sun, 24 May 2026 08:39:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=8F=AF=E4=BB=A5=E8=BF=90?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- card_game/__pycache__/config.cpython-312.pyc | Bin 19926 -> 23314 bytes card_game/__pycache__/main.cpython-312.pyc | Bin 31320 -> 31864 bytes card_game/__pycache__/ui.cpython-312.pyc | Bin 52075 -> 52968 bytes card_game/config.py | 579 +++++++++++++++---- card_game/main.py | 6 + card_game/ui.py | 80 +-- 6 files changed, 522 insertions(+), 143 deletions(-) diff --git a/card_game/__pycache__/config.cpython-312.pyc b/card_game/__pycache__/config.cpython-312.pyc index 401d18935e601302ab0d39028e403a66d4ac493d..17799a97ce99e1a3ac549dbc248006e8c3a0ade7 100644 GIT binary patch delta 9264 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 delta 6734 zcmb7I33yZ2m6l{%wrp9JC0ml^-5AGUvzZcbXs8!3#t?(S;Dsc{=72F60|o;&DIyyQ z*~86_LdZhMLI^=28Os#UQFL}{q`ho@hk4s}NEJ=T%^pwTCS@gwamu;af z)K8n~dsIc0Gz(89mD5(*)@`O5stu+JGY#O`PMgJh$vFYqfoG=-7^Dg~&y>#)?Lt7a z7H|z+L*Iu_3x;c@-4vkm9y9I1fL8{SG2pd$u9Nn1*srG>s1o)Y5wGlfX)oO*?Uk^v zK|(iEchExnD4@ICLbuSZ(q$%G+GOUls67}*x6wv5Opl3f$8!hWDXS}oPq|F?u5Oc2 z+ud|G?bke1{pIiybkB(T@1=X`KIu~@p0N1>bU&U4q(bjO1$r^M2M^MN^bmYn&?8Q; zRkoKCJYe)8NI`m7`fw2k(WeUZ;Sr+`hv*PJD(&2-4ivD8I)ecVJ!ZH(PLI;3wA9!vl^CXyszx>7HT{tOnf?W( z{HsyQNAwZ>LfScze?uu@!xo_koi<|iwdAGLPsPXdG5u0{jBb>+o#_)ReL|noXQDni zXEJ?`=U4QZTvR@X6>@X`nik_ES}?0Rx?j*2^c#dk&Dn`(=nS0&FOTt;^d+4`xGLrE zb@nUzihe7-xS%#n(~4ceoA`G|VZW!})4xlfi`VaK`kMYAZCp|mDe~TG56+0A^TzfZ zreV53-^dkFTa)jUk%#n;^hf#+`UdOaw;wj6t^bMVPf#4U=Ood8;rTO!V=1_v{u|H# zU@*O|D!GrTl^=`m6N1DCfJ(WYS=k9;$LazLi`#Y}{UXQGsWf5iflM6)3X< zMe;edK%Jmh3Erw95$_~fEgvy{Do0TbouS1ztps8aQs z!87)HRd?O!jteExf=2`?|fBCKx^mUo1_5lj6x$!)x%dWK2gvX z8MUx9PD8Qb&vz)_jWf9vYLs_qGpwqNfSJZaV3ZgkE!YpOkS;M6rIa{C*23Ev`~(dX z@#gBwWIg;rk|zS1a=vBp*84RHJYzDTA~27*!Q$iw>TQ|=o-tK-5{GP_00e!MY2X0Q6Fg&<5fhL<3m|fNyi%9RqcVF` z=f4X*<8pw@Q&SmVCTQlUpB&)yslErEQ3a?NwYpKv)QY*(ZmkZCnuvSKsMUhzYF9_> zc4w>JfqCE=b%u9rZ}a6QzlE^rDa{AZs5ksuD8SoV`#35%u?#$ecdhb|9UFYi zpc?tS>$uu0oqAdD>I%jkHn;P_uLcNMBb%`{ z7!SUiPt`i02Urg%^#*Xg0H2~hL%RvwW?&1@Z)mrI+Xf5(+YRjwa65rPV93z!0(TAY zePFlL1~>~&Vh?aFa2=qMxE|aMbR6_XL$^0*YoAYZAm0Ss4D17L0dAGY`?g@BO!0PT z?f~ut?gH*MtgP7&2;iQ(%mKO=%zeQ90EZvN`vKrV;341u5H!Nyg7h$O5O@SQ1Uzb3 zKZEob@Hp@Ua2R;fuzmyS2=El}G+h9Fh63Ng3)6x=8%%7kr#amw@JAox-SQm%@vvFS z#|-&SDL-$>N2Pq+kl&K>3x@oelusD)H&PDiGH*Vf7)N;U#nO|Z*D@0mLu+&2HRq?S zUN_LOv9qtMr>}d!hJS^fJ^awQ1INzXc(T6|l1R(-hA!mqG@JK`-omm_Mp4KddZzdu zbLht67N) zyt?n~@w-nubqnJ9x>qCCj({&u96NXWzH^Tr{_@m=1F2A)yW{0EKe)d_=}+4`dwT~v zdIvhFXQ&4OV(r9}=GR3|S%c`wpBCyaGh57iLOqkdHH*I%W{P!FK1z-2k6@Vo(@Z`N z?U=gVVjdD-SIoBlgf;hsrc6I;2{bYvBUiB)BONTp$SM{k>0(Zj)yzrK%iNaHWE+dG z8ss(RV&s&m1oA0XN+K=HO|bMY#p`s!>dt=JIw4PVT$&%)$$l|1$f6{>n2V9!EM9An z>zVssQh-%XE=epm8NuR&y#5<_h=8P$+{ki_>}4@VZemfAo0*G|eJtK;klUF1zb6)e zw@hzjX8U=J7!fQ=axZf+avzH^azBd?j3y7UC`phxN#uMQ;rU~Yl3Xl#BPW?6TJ|uH z5hDj#jFCrJjFCeuO7bXkl03oOlOqVve}v`OtRvHdVN7eiv!(5C! z%VLZiHSzpMSt-eL%pEhx^UVFf5*wWzI`#q&5hEv9jFFIOHsla1CBc6snffI;$y|)Q z#A1xR%;GEJ=d*JCW4bjWfzZ6mJn<=)n@uMCHEo^b4XvH?mD$qe7EM*t?OpD4OSH(8 z;0imkMN`cLYlbyC4z@R{X0pqlsw(+4z52WS+EP7(Ur$v}=hr9I(-UQQSDg5BO|h6= zV^i|(I5D|)sx1&Ftyjj2?%L^@SH(+dC|=DKc4mj&Uh%8e0`Y#W)wWAnTNA{mwH3+H zwglRy@6Gi%&j*yMJyENy zs^JnlDqE=%+?gmGbrrTjC9Oyj^;?26ru4Ojq zwcch*NDDiBVP~Fbs?WElTcaD4r6yUF%`dmrCQHBeWU*@gWZOz5ZBG{0)K?_!P*Sr< ztt%F%>z%gcDbl$=MI37wx4$Xb?zTp^D%}#hOs+{SRG;0HkREpU_tzG&&nBg%G-SMZZ&9Lam(navHzl~kjvVX(QBYIlUY0J0>4TcLA#V*~ZY*_gQu;+Mm1fxK zV|`ZXq_8LNgMz6aWKQF`vK^S~3YQ#WJzVu6+*xAFyh0yVeS|G6up+~hkQsL5VJn11 z=i=PDmJC%6^s&IO(;IfChus-rZ*h2H*(;qtYx*#2ao9UG?8;TcZBk(knQCVVY}rg~ ztA&|zv~^H>!j632aBtT8_cz&-hkKN%&cj>8Hs2#1$-@ifUZbQMuik1Tm%A({Gwhuh zcKIe9S3&Ud8(xS|T zJ|5xxTIe$)j=YG|7jfsH?Ot(9ZK}^}jdm-CxmkLk=1^GWu}0@*$>=T^y%9%2#F>Za z5sfMh`-=`$Kad;omZ+Swu&Go`m0vV2yVO?gmm{q5i`$n?OY2n9kl&Qxi#Q6!)RsJP zq$SPnw?=m6hfmVRkRiv^C{P&-HmCeMN>izP!-3L1`ND#p&gf zZ42|IeO*56Gi*IdsxJ_WS4>G;P#|qx1**YvmSdO`%q5VQYr?e1#_~T3aXs zR>6=JaTLj(W<@;NV#%T`kAK)}&$dQ8mCumogF(xaqq~%{y$I#`3c}vlX+{t_xUxtN zyba$9f5aiCwB)04>B-RnrEeXF>`TNaEe>b24IdEfik;)M{Lq3M0n zG$WOKF29%RSOz=MVk%0DzPl z3}IPOs`|iIW+W?M%)s(tbRFA3w;%w*8wgf}H3%&THiWeZTjAiq`H9c$-U{|XL9#*J zIcR`>^h&mkm4UnPFgv=OS-oYif00bz#VumDO1%e-xL?Kn z20wMllzzr!dpylR{nKEy70wpgjBThq1a}K(k81C-2iQBn>!LZRInJOlwUe9dk)4X8 zj`ffO8|9AL{G7p1@HyL}nVeFCTai5U0Iqs0pnjj?ar( z5L03^zJuaf$SWx}bMll;aiXY|Mpm)zj-ha66i+gYEjE}!tJSa1x)xRjspG_!QQil>!646Ty~kRtWcWJOGgUKB4B zk9-wssw6YF@F=(8+o~*b6mC^nNwpeNy;>Y{hXrN_#de`l$0);lXyD{dK-)_>!|$@S zmLMsL8DHz9RqHhE1gocXFqZoo&gvdMMz`&ny={3AM)Gq4*X)P6z*FT)j- zZlftNdMld29dJl)jV#fOjeei(2x%lld$FNKdm>m6qTQ2#%Xm04M<&}KyXFkJ0=H`V zj*Uk(xAE@eo{6aAEy|-s1Bu8Z39ZRcJl8cd7Dc|hn+0`N2AWPJGK z|3(8AmGZ|BO9!Al5TOVm4-;Y|Xl5K)ol)uYXv;?%AC*tovU4VCM#-tT{XW{CS-a*B ztd;XfyZVKETsMMKu`{E+N5nbW(!AHd!ep^^IBNN1q9dPAGVB;TUpXUB0l5nAf0F3&KXI@XR4k)ZHGFu3#lv z+D!=WBYcBUjNyww^X2G7ovQb*CGniUDZ+mQ>}ar&3}|b}Cq31h4Zn+K9-FhW!_P_? z$p>q2hM6}IZ-g=k2d9!UI2X(zsp?Pcc{w8Ta#G%#ydv{B2v%vJN_y6q0nXgo3&FW3K6I*$)>D rqire%$weuL!IPL`uiq8)$m8g2*dJPyFg=D;lY0XHy6c0{js5=xY{`&^ delta 2085 zcmah~eQZ-z6z}b8yKZlt-I!x+vs+=fc5bsSfiWlw6&=ZR102D@@bT8Zm2O=-?%rS> zOHk3xVbo+N12M)#1;T^<`)tTK2Z3BC`J%eL?qF8&+SGR{;|t`J@T0rr)NzGlMaKN1gyBy1%bQ9B4CmKbmQI9fCx>`U{t5~t5XUVzq;MPA+RmuY~c@ILptBdq&pSX%mvtDFwZc8GBr`b9YtXrtk9$l}{?dT%V z5;Uwqcmo{e50YW6u6(mFbqmw<*lSor6_c9VuU+0TzgZL|>ecaqUP=wb8A5ve0A$0Qt& zp2~-$#yS*w0KNA^j(1gVd?Jt!x~Qm#x=?cz2E6&?XKkm~Z1#*Wjh^C{J3^`)ru*=e z+CrldH5`g4?kS1sV##qDpf9Yme2C}$P~me}UPo~hmifFQ=g)bbgzdhE$Z;6+V74A)roA=67orTTy zvX~6J4A<(Na||v#~rMQ6aOj zm|TL{jnhfD*4VgCAQxe*X*#)}{n|7@lrPYA5d*h5!Rs_Cc&}$rx{M|}P0X6fx;fM- z$swI|>z1BqM3G`TiP3wostv)8kbLy%cogCMGYT05pEOF&fVgJb91+#r#;+ES%s|~m ztjV(_6XB+znP|;|rZs^TRusASBn#^D80bd1oBhXhqsqS7eEx?T#^oYRgQ@Ziaueps z1!Rl%v^-+W(^%o2DU&yZ9OA3s18qhiMcDK%5?jW=ZPZ0sRoN=#50d_c1{^BoS3Hdt zqdXH~9zrP=#G9pyxLwAx()nmBLmOX&H`#G~ed!k2uZE%#>SWf5jR3>JGICt|HW)Wn zaw;Xv=uS-pC+{u4&>vy3w6(Yu`PQMwV6?T|&R>W)mOX*MUnZE=mP>xnD%2yY>rLYRx` ztKoKs%lHq`iq{Pg8}A_{(Srw$PzSjWzM~Z+RkL>fD2O~aXH^1!ulJEM@NQTx@=GLO z#s%=^h9zVHT;1Rzb}grSkgU3^u#9fF`x6w7qI4YL5W+!(!w5$ZE+OD^pm-Ok2l@I@ z3L?w}p{L%QZZ7=22v+oL75TfDg_a?>)l*IKp>ktaX)O!VP5g(m7j1Qzq!c9=gWFbb fdo<7$RvxB}aC+nVj5;f+BflB=*Y##t-aF$zV`VVy diff --git a/card_game/__pycache__/ui.cpython-312.pyc b/card_game/__pycache__/ui.cpython-312.pyc index 26f88f72323f332b80f18672b640d56de0a7852a..b23266e5b348015178c91d95e4ea4c43d34218aa 100644 GIT binary patch delta 5931 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 vd-;EI{ WINDOW_HEIGHT - 60: break cid = card_data["id"] @@ -228,29 +236,33 @@ class UI: can_add = in_deck < max_copies and deck_count < DECK_SIZE rect = pygame.Rect(x, y, small_w, small_h) - if card_data["faction"] not in ("neutral", "ally"): + if card_data["faction"] == faction_id: bg = tuple(max(0, c - 30) for c in faction_color) - elif card_data["faction"] == "ally": - bg = (100, 90, 55) else: - bg = (80, 75, 65) + bg = (100, 90, 55) ink_style.draw_ink_rect(self.screen, rect, bg, alpha=180) border_color = PAPER_WHITE if can_add else INK_WASH_3 pygame.draw.rect(self.screen, border_color, rect, 1, border_radius=3) + # Line 1: cost + name + count cost_s = self.font_sm.render(str(card_data["cost"]), True, TENG_HUANG) - self.screen.blit(cost_s, (x + 4, y + 8)) + self.screen.blit(cost_s, (x + 4, y + 3)) - icon = {"unit": "兵", "order": "谋"}.get(card_data["type"], "?") - ally_tag = card_data.get("ally_state", "") - if card_data["faction"] == "ally" and ally_tag: - icon = ally_tag - self.screen.blit(self.font_sm.render(icon, True, TENG_HUANG), (x + 22, y + 8)) - self.screen.blit(self.font_sm.render(card_data["name"][:4], True, PAPER_WHITE), (x + 40, y + 8)) + name_str = card_data["name"][:6] + self.screen.blit(self.font_sm.render(name_str, True, PAPER_WHITE), (x + 22, y + 3)) ct = f"×{in_deck}/{max_copies}" if in_deck > 0 else f"0/{max_copies}" cs = self.font_sm.render(ct, True, count_color if in_deck > 0 else GRAY) - self.screen.blit(cs, (x + small_w - cs.get_width() - 4, y + 8)) + self.screen.blit(cs, (x + small_w - cs.get_width() - 4, y + 3)) + + # Line 2: type + stats + if card_data["type"] == "unit": + icon = {"infantry": "步", "cavalry": "骑", "chariot": "车", + "archer": "弓", "siege": "攻"}.get(card_data.get("unit_type"), "?") + stats = f"{icon} 攻{card_data['attack']} 防{card_data['defense']} 血{card_data['max_hp']}" + else: + stats = f"谋略: {card_data['description'][:12]}" + self.screen.blit(self.font_sm.render(stats, True, LIGHT_GRAY), (x + 22, y + 22)) self.deck_card_rects.append((rect, cid)) # Right: current deck @@ -265,30 +277,32 @@ class UI: for i, (cid, count) in enumerate(deck_items): card_data = CARD_DATABASE[cid] - row, col = divmod(i, 3) - x = right_x + col * (small_w + 8) - y = right_y + row * (small_h + 4) + row, col = divmod(i, 2) + x = right_x + col * (small_w + 6) + y = right_y + row * (small_h + 3) if y + small_h > WINDOW_HEIGHT - 60: break rect = pygame.Rect(x, y, small_w, small_h) - if card_data["faction"] not in ("neutral", "ally"): + if card_data["faction"] == faction_id: bg = tuple(max(0, c - 30) for c in faction_color) - elif card_data["faction"] == "ally": - bg = (100, 90, 55) else: - bg = (80, 75, 65) + bg = (100, 90, 55) ink_style.draw_ink_rect(self.screen, rect, bg, alpha=180) pygame.draw.rect(self.screen, GOLD, rect, 1, border_radius=3) - self.screen.blit(self.font_sm.render(str(card_data["cost"]), True, TENG_HUANG), (x + 4, y + 8)) - icon = {"unit": "兵", "order": "谋"}.get(card_data["type"], "?") - ally_tag = card_data.get("ally_state", "") - if card_data["faction"] == "ally" and ally_tag: - icon = ally_tag - self.screen.blit(self.font_sm.render(icon, True, TENG_HUANG), (x + 22, y + 8)) - self.screen.blit(self.font_sm.render(card_data["name"][:4], True, PAPER_WHITE), (x + 40, y + 8)) + self.screen.blit(self.font_sm.render(str(card_data["cost"]), True, TENG_HUANG), (x + 4, y + 3)) + name_str = card_data["name"][:6] + self.screen.blit(self.font_sm.render(name_str, True, PAPER_WHITE), (x + 22, y + 3)) cs = self.font_sm.render(f"×{count}", True, SONGHUA_GREEN) - self.screen.blit(cs, (x + small_w - cs.get_width() - 4, y + 8)) + self.screen.blit(cs, (x + small_w - cs.get_width() - 4, y + 3)) + + if card_data["type"] == "unit": + icon = {"infantry": "步", "cavalry": "骑", "chariot": "车", + "archer": "弓", "siege": "攻"}.get(card_data.get("unit_type"), "?") + stats = f"{icon} 攻{card_data['attack']} 防{card_data['defense']} 血{card_data['max_hp']}" + else: + stats = f"谋略: {card_data['description'][:12]}" + self.screen.blit(self.font_sm.render(stats, True, LIGHT_GRAY), (x + 22, y + 22)) self.deck_build_rects.append((rect, cid)) # Bottom buttons