From a8c5fb2356e96f49ea5667c34f666966716b0ee9 Mon Sep 17 00:00:00 2001 From: hefanyang Date: Sun, 24 May 2026 09:05:39 +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 --- .../__pycache__/battlefield.cpython-312.pyc | Bin 14955 -> 14903 bytes card_game/__pycache__/card.cpython-312.pyc | Bin 5026 -> 5163 bytes card_game/__pycache__/config.cpython-312.pyc | Bin 23314 -> 23169 bytes card_game/__pycache__/ui.cpython-312.pyc | Bin 52968 -> 52882 bytes card_game/battlefield.py | 3 +- card_game/card.py | 4 +- card_game/config.py | 64 +++++++++--------- card_game/ui.py | 16 ++--- 8 files changed, 43 insertions(+), 44 deletions(-) diff --git a/card_game/__pycache__/battlefield.cpython-312.pyc b/card_game/__pycache__/battlefield.cpython-312.pyc index 7f9e9abda664362b1e0f3e14b98e9b05c7780590..4ef0b95e0dbecbd0d4e6a4ace5189e38036184e6 100644 GIT binary patch delta 645 zcmZXRO=uHQ5XU>4Y=TXeq)l3b)Edo~t40D%T0?CDNgz$>M@aoR6kH?O)TGI7eA)D% zu~hGczg3ps`x2Y{G2N3#;6;P z&X_iKnY@p2eu%M%fZt&!+Kj)WV{zVJ~nF_4WX&7%aW!_ zRi-MMVQ+U@EtP4w6KoyJQ>QH9@R9|JGK3taL;e$UW@rejvL=-q4XLBlv^HBMxj;zc zMkws4lgHAK6}E=2Lp@l*>F}BGHL8MS@MUdHx?%7YxoU2fN{6vDoxM&dVK2N1_jMui zm3P;u(j+K^DnhgbNAye4E$)BK7K=au&&QsEOW%zZIGDka2|q;j$%#3D1>B5}!=(N! z?ghx;P9gv~+)JEjwIBJ-L0FX+puIsgCw delta 660 zcmZXRO-vI}5XUo58C>=MWgjV z;*H}ROw@}cCYor3>_HDky%1!b0W^Sy@N0X@%aG5v}-@?LGFq>4Qs7ltyZ|k1#?)q9bdS%So4)iS;d>u z1Nf=O+tc9wBz1n2cQdz87Kd6M7ki|cnfoZuca3;8TnH*pvFrwKFo+C2&l zop~Ru78%lGG~z@WkQ8;0pA{+2Al5dTND1*Hv4-Z ziNE@9gHyk8cuIgV{BqO>hjd{e36RFrU^g7oOM?=?IIcweFo|~~`(PAbMP8=QQvZwz zgDq!Eb=6>6eo5tFfwz)EZws@XC9hK8Z$5u$UTe&RkBoPaI)Ph5oiL&Q7&-xv!ja+i n7WyWB4!;k(od4E3xsxnK71qn7?K!+0U3VlIgtsk3?lJY>y;`nK diff --git a/card_game/__pycache__/card.cpython-312.pyc b/card_game/__pycache__/card.cpython-312.pyc index 9ab4b0d2172ea4e88fb48b0c655ac648fbc99619..0f6307b71787db5a7cf4c8c96a80ff77ebe4a241 100644 GIT binary patch delta 315 zcmZ3azFLF#G%qg~0}z<{2xa};$jiaY;Q-`KXQ*MA%*ZY>`JMn9PX%K!A0tBwQw>8F z(_}?naVciMTkOe+Wr;aOmABZEGZKr^Q&%z-2?F&^cH#BVES3kd8W?Wy3-{M`)-8~{ z$gg#Y-(y9_4we0SJM}K;d0gP|DAEL}{?8*u*g6rQb!>@6$r-6dx7dmj^U_mOio7Pj z;Wbi0vq<71zvd-=_Z1O4ME1+=l)Iqoeu2Y%vofCvBjc^f5&U_KL7R{Bw=uG%0Ie=c znH(&*8z{~%G+WdgB;XGs;y^?yh{%|{Ur3SBZt_DRO%6}SPi%~=9*mO(gwq)FCYK9q F0{}}aSz7=A delta 208 zcmZ3ju}GcwG%qg~0}$-A6Uy4Nk(Yy)Lk`HB&XB@5nUPOSu#6#?L6gbv7F%*gVo`eP zO2)}0ydGko1%YZB7;f;3&oG&9H`DF{zvcxF&B+gVrE%ykO3X`7O)2u69KvVBTI3DX zy?GU%2_xgL$@ls57y~!^3A8b?B?E?W+p aXfruOSd&fb6B{F|*5sMOX^gp(M6>}u_csgx diff --git a/card_game/__pycache__/config.cpython-312.pyc b/card_game/__pycache__/config.cpython-312.pyc index 17799a97ce99e1a3ac549dbc248006e8c3a0ade7..7067ebfc921a86e567c247279398785eb4f47aa2 100644 GIT binary patch delta 6735 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 delta 6855 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 delta 3057 zcmcJRdr*|u6~Om?%Px-<5SHbsiy*pg)kRd^uLU7IG?CX*VQ-g8&Mbfz=?r{B!} zzH`qx_uPB#J>R{%YfyP-P#JV7Ffc&DpW&j=`o!*$pnWD1E*~)+QIZeg>BX&NzkFfw z@07tg)IjG^BmDuLPZu0e!AQ#dh=s!hdny#vG%R_gj(Ar*e3ueEi!O16(xp*cyI(Qr z+cDd&p~+m6f*Puzsjx8h61fiFq;`@t*pRk?q{G)~2GS0(={;mA97|tLGT@aZRJLST zr2oh0eeh9shM~hpQKxVzEQ#Lf^SNcxEa%+G*0dTQnoV;cH7743x1BGP%Sg=)^Arju z(L6h$`E(idmSpkK+7#6i;lGY)tqNnQd@BFvlKIZtuisO0+wIdJ-kg+XEyOXtf ze5{;mtXBl_WC#W_s4B_T=iZs?n;6%xl@tUR_;z zExk%^T=|9cKlnl8%9nnzN-q&L#8wQF2za~VE47K&4@;CspSh|ce)9IpLSK>%SF6`) z3b~=~4YWRh74%iE{gSREeqgp4NS<74o2AmMMr$_008pPvGUWH`^L)5ZNK+O`g|eoo zisv4=7z0=XrkIC{SGeTyskJuNFavLUeC(E*MmB)<&k$C0TEpSM?_$>E!!psDC7*6e zP?2fyduIw+0g)}4d~)S2lvK*2E&B+WE3ay`DE(*<4L+c%PXc$07A~}hlj(4){j6_@ zC>=eRc7})1P|*l>rt`Ssp<4L$hGQ{dF3F{C=NhUL6{qBH-l~ykIQ-$8vUxr6<;$jpjqU(-6`K8EW@n9FjSK!a^z?0Nwp2GcoNOAZJm}&N?#`Uhuh1G$ z-NKm7?zGf4vwFDOIft)&L|0~F7kBoknp*9=@_n1CEshpe<560j4IU+}v9l(OwGP1$ z4(RNfqsG!`*TUURS{Un6kuCDMuGJ)dyyALn!jTqU?z)tlDd{8CClkg@qo#@3*HX&9 zR4V*KZ$Z*ik#hM9&B~wx40eIfix-zf;DfDCt3@^DfpObXk^|3e`<#@@CEWw6;BXp3 zL#dXAQ5_8zXQvL7J>mQ#i0*k2N_rV|nYFNahaY^@8w44>!6ce*+&VbbtB;F$Y}3Rx zc(;Xbg||ea;h(*0$xK+&m&7B5!lAxMqK7km?}Y1dlWL?#Co|z^j4}4nCdEMj%-5{P z9B$$=w}KgFkv6bGaq0KBj~zz)2K4+CB^OGVe2bbl@4UI=kGl`C4&FA-WzpymgV=~( zle?W(i8?>j9YiS*VM27G?n9J*hH(J}QYZ`5A8ydP1ZnSQP%l+}{9oUY8d;N*?c5|^kw4%ghq0HK9 zskPdvrP|79B)`!deA5-16`ur09ms^MU1jpX?z_B73a{&DAF=T&2}{12oHnxRWZ0N~ zR6n7;mi#2|5Eya``pTl@clYd5>56e6{5+WfQG(4G4FvZ3n)oE5@ z+l{Wzz&l5mkz83d{J@{w2j%f4ajj^?yUQ5Mto-E(sB_fW9Zsvg+Qxjj5ysEQYQ&@; zu6gJ2c{;Ha$FXZX#w|dcfHTJpwPMDZXt8k^wNv+nNA0w-wKk_WsYY~p9wBBbE{rN{ zHgI^%Z5qgQK?m=lU_wq>3|CImQyz%$SyH5R9x%4fxibSNcGGhqCKV57tVk%Fu z0_ely(2xr5u?2Zzu+YZ_6PxlbdYwf~rsGjzst#sBE#}V7Aa+8~c$C_T;u?A3_{Wk) ztf^S&DCj*GnJh-oJT`)u(bNbcmUpc%${1o?t~{%i$VF&A7cJQcjEv1F5^)0mdz{Ic zdS~~a5i#sRo;Mt9iICO5xB(QlT8aSdJ9>FNBbO_|4@casxD1w*DL1z&PFj diff --git a/card_game/battlefield.py b/card_game/battlefield.py index 2e16a46..18ebd8f 100644 --- a/card_game/battlefield.py +++ b/card_game/battlefield.py @@ -106,8 +106,7 @@ class Battlefield: if owner and owner.faction_id == "qin": owner.provisions += 1 - if "no_retaliation" not in attacker.abilities: - if not (attacker.is_ranged() and attacker.zone == "support"): + if "no_retaliation" not in attacker.abilities and not attacker.is_ranged(): retal = defender.get_effective_defense() if defender.is_alive() else 0 if retal > 0: attacker.take_damage(retal) diff --git a/card_game/card.py b/card_game/card.py index 95fc47c..4fc12f4 100644 --- a/card_game/card.py +++ b/card_game/card.py @@ -60,10 +60,10 @@ class Card: self.buffs = [(a, d, t - 1) for a, d, t in self.buffs if t > 1] def can_move_and_attack(self): - return "charge" in self.abilities + return self.unit_type == "cavalry" or "charge" in self.abilities def is_ranged(self): - return "ranged" in self.abilities + return self.unit_type == "archer" or "ranged" in self.abilities def get_keywords(self): result = [] diff --git a/card_game/config.py b/card_game/config.py index 766ce5d..7d3e3ba 100644 --- a/card_game/config.py +++ b/card_game/config.py @@ -108,7 +108,7 @@ RARITY_LIMITS = { } # --- Unit Types --- -UNIT_TYPES = ["infantry", "cavalry", "chariot", "archer", "siege"] +UNIT_TYPES = ["infantry", "cavalry", "archer"] # ============================================================ # CARD DATABASE @@ -142,7 +142,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "qin_bubing": { @@ -172,7 +172,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "骑兵·冲锋", - "abilities": ["charge"], + "abilities": [], "rarity": "common", }, "qin_gongcheng": { @@ -180,14 +180,14 @@ CARD_DATABASE = { "name": "攻城弩", "faction": "qin", "type": "unit", - "unit_type": "siege", + "unit_type": "archer", "cost": 5, "op_cost": 2, "attack": 3, "defense": 1, "max_hp": 3, "description": "攻城·对都城双倍伤害", - "abilities": ["siege", "ranged"], + "abilities": ["siege"], "rarity": "rare", }, "qin_shangyang": { @@ -250,7 +250,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 3, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "qin_ruiqi": { @@ -265,7 +265,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "骑兵·冲锋", - "abilities": ["charge"], + "abilities": [], "rarity": "common", }, "qin_fangzhen": { @@ -339,7 +339,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "qi_tianqi": { @@ -347,7 +347,7 @@ CARD_DATABASE = { "name": "天齐战车", "faction": "qi", "type": "unit", - "unit_type": "chariot", + "unit_type": "infantry", "cost": 5, "op_cost": 2, "attack": 4, @@ -417,7 +417,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "qi_shangdui": { @@ -506,7 +506,7 @@ CARD_DATABASE = { "defense": 3, "max_hp": 3, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "chu_zhancha": { @@ -514,7 +514,7 @@ CARD_DATABASE = { "name": "楚战车", "faction": "chu", "type": "unit", - "unit_type": "chariot", + "unit_type": "infantry", "cost": 5, "op_cost": 2, "attack": 4, @@ -584,7 +584,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "骑兵·冲锋", - "abilities": ["charge"], + "abilities": [], "rarity": "common", }, "chu_nushou": { @@ -599,7 +599,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "chu_wuzhu2": { @@ -643,7 +643,7 @@ CARD_DATABASE = { "defense": 1, "max_hp": 2, "description": "骑兵·行动费用-1", - "abilities": ["charge"], + "abilities": [], "rarity": "common", }, "yan_cike": { @@ -688,7 +688,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "yan_jingke": { @@ -766,7 +766,7 @@ CARD_DATABASE = { "defense": 1, "max_hp": 2, "description": "骑兵·冲锋·行动费用-1", - "abilities": ["charge"], + "abilities": [], "rarity": "common", }, "yan_chihou": { @@ -822,7 +822,7 @@ CARD_DATABASE = { "defense": 3, "max_hp": 3, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "han_shushi": { @@ -867,7 +867,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 3, "description": "骑兵·冲锋", - "abilities": ["charge"], + "abilities": [], "rarity": "common", }, "han_weiwei": { @@ -930,7 +930,7 @@ CARD_DATABASE = { "defense": 3, "max_hp": 3, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "han_tiejiang": { @@ -989,7 +989,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "骑兵·冲锋", - "abilities": ["charge"], + "abilities": [], "rarity": "common", }, "zhao_tieqi": { @@ -1004,7 +1004,7 @@ CARD_DATABASE = { "defense": 3, "max_hp": 4, "description": "骑兵·无视报复", - "abilities": ["charge", "no_retaliation"], + "abilities": ["no_retaliation"], "rarity": "rare", }, "zhao_bubing": { @@ -1034,7 +1034,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "zhao_qixi": { @@ -1097,7 +1097,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 3, "description": "骑兵·冲锋", - "abilities": ["charge"], + "abilities": [], "rarity": "common", }, "zhao_gongshou2": { @@ -1112,7 +1112,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "zhao_qiangbing": { @@ -1186,7 +1186,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "wei_qibing": { @@ -1201,7 +1201,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 3, "description": "骑兵·冲锋", - "abilities": ["charge"], + "abilities": [], "rarity": "common", }, "wei_zhengjun": { @@ -1279,7 +1279,7 @@ CARD_DATABASE = { "defense": 3, "max_hp": 3, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "wei_zhancha": { @@ -1287,7 +1287,7 @@ CARD_DATABASE = { "name": "魏战车", "faction": "wei", "type": "unit", - "unit_type": "chariot", + "unit_type": "infantry", "cost": 5, "op_cost": 2, "attack": 4, @@ -1414,7 +1414,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "骑兵·冲锋", - "abilities": ["charge"], + "abilities": [], "rarity": "rare", }, "ally_song_yishang": { @@ -1474,7 +1474,7 @@ CARD_DATABASE = { "defense": 3, "max_hp": 3, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "ally_wu_wuzixu": { @@ -1714,7 +1714,7 @@ CARD_DATABASE = { "defense": 2, "max_hp": 2, "description": "弓手·可从营地射击", - "abilities": ["ranged"], + "abilities": [], "rarity": "common", }, "ally_cai_qingtong": { diff --git a/card_game/ui.py b/card_game/ui.py index 7e78d04..410a0d7 100644 --- a/card_game/ui.py +++ b/card_game/ui.py @@ -257,8 +257,8 @@ class UI: # Line 2: type + stats if card_data["type"] == "unit": - icon = {"infantry": "步", "cavalry": "骑", "chariot": "车", - "archer": "弓", "siege": "攻"}.get(card_data.get("unit_type"), "?") + icon = {"infantry": "步", "cavalry": "骑", + "archer": "弓"}.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]}" @@ -297,8 +297,8 @@ class UI: 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"), "?") + icon = {"infantry": "步", "cavalry": "骑", + "archer": "弓"}.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]}" @@ -492,8 +492,8 @@ class UI: self.screen.blit(name_surf, (x + w // 2 - name_surf.get_width() // 2, y + 3)) # Unit type icon - icon_char = {"infantry": "步", "cavalry": "骑", "chariot": "车", - "archer": "弓", "siege": "攻"}.get(unit.unit_type, "?") + icon_char = {"infantry": "步", "cavalry": "骑", + "archer": "弓"}.get(unit.unit_type, "?") self.screen.blit(self.font_sm.render(icon_char, True, TENG_HUANG), (x + 3, y + 3)) # Operation cost @@ -564,8 +564,8 @@ class UI: self.screen.blit(name_surf, (x + w // 2 - name_surf.get_width() // 2, y + 28)) if card.card_type == "unit": - icon = {"infantry": "步", "cavalry": "骑", "chariot": "车", - "archer": "弓", "siege": "攻"}.get(card.unit_type, "?") + icon = {"infantry": "步", "cavalry": "骑", + "archer": "弓"}.get(card.unit_type, "?") self.screen.blit(self.font_sm.render(icon, True, TENG_HUANG), (x + 3, y + h - 40)) self.screen.blit(self.font_md.render(str(card.attack), True, (200, 80, 60)), (x + 5, y + h - 22)) self.screen.blit(self.font_md.render(str(card.defense), True, (60, 80, 160)), (x + w - 15, y + h - 22))