- BC20270022's blog
玉防闪
- 2025-4-25 21:55:28 @
HF
基础物资
玉 免疫重拳
防 免疫戳、斩、小电、小猪
闪 免疫戳、千年、万年、亿年、小电、中电
甩剑 本回合后台不可抵消
特殊牌
哈哈
反小猪,中猪,斩,元气斩,暴击,重击,白洞
上挂
下挂
举报
使所有状态为挂的玩家退出,且命数清零
防系(抵消)
4防=2盾(前台3.5G,后台0.5G)=2盾=1钟(前台8G,后台1G)=1钟
戳系
2玉=2戳(0.5G)=1千年(0.5G)->万年(1G)->亿年(2G)
猪系
8玉=4小猪(0.5G)=2中猪(1G)=1大猪(2G)=1吴猪(4G)->聪明吴猪(8G)
电系
12闪=4小电(0.5G)=2中电(1G)=1大电(2G)->雷神(4G)
斩系(群)
2玉2防=2斩(0.5G)=1元气斩(0.5G)
1元气斩(出过中猪)=1猪油斩(1G)
绝杀系(群)
40玉=2绝杀(1命)=1超级绝杀(2命)(无视挂的免疫)
(剩2人,状态为挂)=1绝杀
搏击系
12玉=4重拳(0.5G)=2天地之拳(1G)=1无相(2G)=1马丁(4G)->百变马丁(8G)
8玉8防=4暴击(0.5G)=2重击(1G)=1痛击(2G)=1马丁(4G)->百变马丁(8G)
洞系
4玉=1黑洞
1黑洞+2甩剑=1白洞(伤害1G)
1黑洞+1白洞=1虫洞(伤害2G)
狒狒系
10甩剑=2狒狒(伤害3.5G)=1暗黑狒狒(伤害7G)+1蕉蕉(蕉蕉1命)
16玉6防(剩2人)=2狒狒(伤害3.5G)=1暗黑狒狒(伤害7G)+1暗黑蕉蕉(蕉蕉2命)
解析
游戏是同步行动制,每人初始1命,物资皆为0个
护盾可以吸收伤害,若护盾剩余伤害吸收量不为正,则护盾破碎
若1个二级护盾仅吸收了0.5G伤害,则此护盾转化为1个一级护盾
一级护盾伤害吸收量为0.5G,每回合最多只能用1个一级护盾吸收伤害
二级护盾伤害吸收量为1G
若本回合选了45或46,则不可使用非本回合获得的护盾
若本回合选了9或41,且你最终受到的伤害不超过3.5G,则不可使用其他护盾
若本回合选了10或42,且你最终受到的伤害不超过8G,则不可使用其他护盾
若本回合选了9或41,且你最终受到的伤害超过3.5G,则本回合不可使用本回合获得的护盾
若本回合选了10或42,且你最终受到的伤害超过8G,则本回合不可使用本回合获得的护盾
每回合结束时若护盾无法吸收剩余伤害,则命数减1,且重新获得本回合吸收伤害过程中失去的护盾,重新恢复本回合吸收伤害过程中转化的护盾
命数不为正则出局
物资为负需重新选择本回合的行动
G为伤害单位
减命不算伤害,不可无视,吸收
若双方互相造成伤害,则伤害小的无效,若造成相同伤害,则都无效
若你本回合有柜,且你没选43和44和45和46和5,则本回合无视行动的消耗和前提条件
若你本回合有柜,且你没选44和45和46和5,且仅存在2个人未出局,则本回合无视行动的消耗和前提条件
若你本回合有柜,则本回合无视所有伤害
若你本回合受到多个伤害,则其中仅最大的伤害生效
若你本回合受到黑洞的影响,且你本回合选45或46,则黑洞的影响不对45和46生效
若你本回合受到多个黑洞的影响,则所有影响你的黑洞的使用者无法执行你的此行动
你的柜数仅能为0或1
每回合所有人需从下列选一个行动完成
1.获得2个玉,且本回合无视重拳的伤害
2.获得2个防,且本回合无视戳,斩,小电,小猪的伤害
3.获得2个闪,且本回合无视戳,千年,万年,亿年,小电,中电的伤害
4.获得2个甩剑,且本回合护盾不可吸收伤害
5.仅柜数为0才能选,获得1个柜
6.仅柜数为1才能选,失去1个柜
7.使本回合所有有柜的人出局且行动效果无效化
8.仅你上2回合没有都选8才能选本回合反弹别人对你造成的白洞,暴击,重击,小猪,中猪,斩,元气斩的伤害
9.消耗了2个防,获得1个一级护盾,仅本回合此护盾伤害吸收量额外增加3G
10.消耗2个一级护盾,获得1个二级护盾,仅本回合此护盾伤害吸收量额外增加7G
11.消耗1个玉,获得1个戳,且本回合可造成0.5G的戳的伤害,若目标选32或27,则此伤害无效
12.消耗2个戳,本回合可造成0.5G的千年的伤害,若目标选32,则此伤害无效
13.仅上回合选了12才能选,本回合可造成1G的万年的伤害
14.仅上回合选了13才能选,本回合可造成2G的亿年的伤害
15.消耗1个玉和1个防,获得1个斩,且本回合可对其他所有人造成0.5G的斩的伤害,若有人对你造成元气斩或暴击的伤害,则其无视此伤害
16.消耗2个斩,获得1个元气斩,且本回合可对其他所有人造成0.5G的元气斩的伤害,若有人对你造成暴击的伤害,则其无视此伤害
17.仅选过23才能选,消耗1个元气斩,本回合可对其他所有人造成1G的伤害
18.消耗3个闪,获得1个小电,且本回合可造成0.5G的小电的伤害,若目标选32,则此伤害无效
19.消耗2个小电,获得1个中电,且本回合可造成1G的中电的伤害
20.消耗2个中电,获得1个大电,且本回合可造成2G的伤害
21.仅上回合选了20才能选,本回合可造成4G的伤害
22.消耗2个玉,获得1个小猪,且本回合可造成0.5G的小猪的伤害,若目标选32,则此伤害无效
23.消耗2个小猪,获得1个中猪,且本回合可造成1G的中猪的伤害
24.消耗2个中猪,获得1个大猪,且本回合可造成2G的伤害
25.消耗1个大猪,本回合可造成4G的伤害
26.仅上回合选了25才能选,本回合可造成8G的伤害
27.消耗3个玉,获得1个重拳,且本回合可造成0.5G的重拳的伤害,若目标选32,则此伤害无效
28.消耗2个重拳,获得1个天地之拳,且本回合可造成1G的伤害
29.消耗2个天地之拳,获得1个无相,且本回合可造成2G的伤害
30.消耗1个无相,本回合可造成4G的伤害
31.仅上回合选了30或35才能选,本回合可造成8G的伤害
32.消耗2个玉和2个防,获得1个暴击,且本回合可造成0.5G的暴击的伤害
33.消耗2个暴击,获得1个重击,且本回合可造成1G的重击的伤害
34.消耗2个重击,获得1个痛击,且本回合可造成2G的伤害
35.消耗1个痛击,本回合可造成4G的伤害
36.消耗5个甩剑,获得1个狒狒和1个蕉蕉,且本回合可造成3.5G的伤害
37.消耗2个狒狒,获得1个暗黑蕉蕉,且本回合可造成7G的伤害
38.消耗1个蕉蕉,你的命数加1,且本回合护盾不可吸收伤害
39.消耗1个暗黑蕉蕉,你的命数加2,且本回合护盾不可吸收伤害
40.仅本回合仅存在2个人未出局才能选,消耗8个玉和3个防,获得1个狒狒和1个蕉蕉,且本回合可造成3.5G的伤害
41.消耗1个一级护盾,获得1个一级护盾,仅本回合此护盾伤害吸收量额外增加3G
42.消耗1个二级护盾,获得1个二级护盾,仅本回合此护盾伤害吸收量额外增加7G
43.消耗20个玉,获得1个绝杀,且本回合无视所有伤害,本回合若目标有人不选43或44且目标没柜,其命数减1,且其本回合不会再因为回合结束时护盾无法吸收剩余伤害而减命
44.消耗2个绝杀,且本回合无视所有伤害,本回合若有人选43,其命数减1,若有人不选43或44,其命数减2,且其本回合不会再减命
45.仅目标选1或2或3或4或8或9或10才能选,消耗4个玉,获得1个黑洞,且目标的行动无效且消耗不变,你额外执行目标的行动且无视此行动的消耗和前提条件
46.仅目标不选1和2和3和4和8和9和10才能选,消耗4个玉,获得1个黑洞,且目标的行动无效且消耗不变,你记录目标的行动
47.消耗1个黑洞和2个甩剑,获得1个白洞,且本回合可造成1G的白洞的伤害
48.消耗1个黑洞和1个白洞,本回合可造成2G的伤害
49.从你记录的行动中选择1个执行并删除,且本回合无视行动的消耗和前提条件
平局条件
1.所有人都出局
2.所有人都有柜
deepseek
import pygame
import random
import math
from enum import Enum
# 初始化pygame
pygame.init()
WIDTH, HEIGHT = 1000, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("同步行动制游戏")
# 颜色定义
BACKGROUND = (20, 30, 50)
PANEL_BG = (30, 40, 60)
BUTTON_BG = (50, 70, 100)
BUTTON_HOVER = (70, 90, 120)
BUTTON_TEXT = (220, 220, 240)
PLAYER_COLORS = [(255, 100, 100), (100, 255, 100), (100, 100, 255), (255, 255, 100)]
TEXT_COLOR = (220, 220, 240)
DAMAGE_COLOR = (255, 100, 100)
SHIELD_COLOR = (100, 200, 255)
CABINET_COLOR = (200, 150, 255)
# 游戏字体
font_small = pygame.font.SysFont(None, 24)
font_medium = pygame.font.SysFont(None, 32)
font_large = pygame.font.SysFont(None, 48)
font_title = pygame.font.SysFont(None, 64)
class ActionType(Enum):
GET_JADE = 1
GET_DEFENSE = 2
GET_DODGE = 3
GET_SWING_SWORD = 4
GET_CABINET = 5
LOSE_CABINET = 6
ELIMINATE_CABINET = 7
REFLECT = 8
SHIELD1_UPGRADE = 9
SHIELD2_UPGRADE = 10
STAB = 11
THOUSAND_YEAR = 12
TEN_THOUSAND_YEAR = 13
HUNDRED_MILLION_YEAR = 14
SLASH = 15
ENERGY_SLASH = 16
ENERGY_BLAST = 17
SMALL_LIGHTNING = 18
MEDIUM_LIGHTNING = 19
LARGE_LIGHTNING = 20
HUGE_LIGHTNING = 21
SMALL_PIG = 22
MEDIUM_PIG = 23
LARGE_PIG = 24
HUGE_PIG = 25
GIGA_PIG = 26
HEAVY_FIST = 27
SKY_EARTH_FIST = 28
FORMLESS_FIST = 29
MEGA_FIST = 30
GIGA_FIST = 31
CRITICAL = 32
HEAVY_HIT = 33
PAIN_HIT = 34
SUPER_HIT = 35
BABOON_BANANA = 36
DARK_BANANA = 37
ADD_LIFE_BANANA = 38
ADD_LIFE_DARK_BANANA = 39
BABOON_BANANA_SPECIAL = 40
SHIELD1_ENHANCE = 41
SHIELD2_ENHANCE = 42
FINISHER = 43
ULTIMATE_FINISHER = 44
BLACK_HOLE1 = 45
BLACK_HOLE2 = 46
WHITE_HOLE = 47
WHITE_HOLE_BLAST = 48
RECORDED_ACTION = 49
class Player:
def __init__(self, player_id, x, y):
self.id = player_id
self.x = x
self.y = y
self.radius = 40
self.hp = 1
self.jade = 0
self.defense = 0
self.dodge = 0
self.swing_sword = 0
self.cabinet = 0
self.shield1 = 0
self.shield2 = 0
self.actions = []
self.selected_action = None
self.target_player = None
self.damage_received = 0
self.shield_used = False
self.special_shield_used = False
self.eliminated = False
self.last_two_actions = [None, None]
self.recorded_actions = []
self.animation_timer = 0
self.damage_animation = 0
self.shield_animation = 0
def reset_turn(self):
self.damage_received = 0
self.shield_used = False
self.special_shield_used = False
self.target_player = None
self.animation_timer = 0
self.damage_animation = 0
self.shield_animation = 0
def can_perform_action(self, action):
# 检查行动前提条件
if action == ActionType.GET_CABINET:
return self.cabinet == 0
elif action == ActionType.LOSE_CABINET:
return self.cabinet == 1
elif action == ActionType.REFLECT:
return self.last_two_actions[0] != ActionType.REFLECT or self.last_two_actions[1] != ActionType.REFLECT
elif action == ActionType.SHIELD1_UPGRADE:
return self.defense >= 2
elif action == ActionType.SHIELD2_UPGRADE:
return self.shield1 >= 2
elif action == ActionType.STAB:
return self.jade >= 1
elif action == ActionType.THOUSAND_YEAR:
return self.actions and self.actions[-1] == ActionType.STAB and self.jade >= 2
# 其他行动检查...
return True
def perform_action(self, action, target=None):
if not self.can_perform_action(action):
return False
self.selected_action = action
self.target_player = target
# 记录行动
if len(self.actions) >= 2:
self.last_two_actions = [self.actions[-1], self.actions[-2]]
self.actions.append(action)
return True
def take_damage(self, damage):
if self.cabinet:
return 0 # 有柜无视伤害
if self.shield_used:
absorbed = min(damage, 3.5 if self.special_shield_used and self.selected_action in [ActionType.SHIELD1_UPGRADE, ActionType.SHIELD1_ENHANCE] else 0.5)
damage -= absorbed
self.shield_animation = absorbed * 5
if self.shield2 > 0 and damage > 0:
absorbed = min(damage, 8.0 if self.special_shield_used and self.selected_action in [ActionType.SHIELD2_UPGRADE, ActionType.SHIELD2_ENHANCE] else 1.0)
damage -= absorbed
self.shield2 -= 1
if absorbed < 1.0:
self.shield1 += 1
self.shield_animation = absorbed * 5
if self.shield1 > 0 and damage > 0:
absorbed = min(damage, 0.5)
damage -= absorbed
self.shield1 -= 1
self.shield_animation = absorbed * 5
if damage > 0:
self.hp -= 1
self.damage_animation = damage * 10
if self.hp <= 0:
self.eliminated = True
return damage
def draw(self, screen):
# 绘制玩家
color = PLAYER_COLORS[self.id]
pygame.draw.circle(screen, color, (self.x, self.y), self.radius)
# 绘制生命值
hp_text = font_medium.render(f"HP: {self.hp}", True, TEXT_COLOR)
screen.blit(hp_text, (self.x - 30, self.y - 60))
# 绘制物资
resources = [
f"玉: {self.jade}",
f"防: {self.defense}",
f"闪: {self.dodge}",
f"甩剑: {self.swing_sword}",
f"柜: {self.cabinet}",
f"盾1: {self.shield1}",
f"盾2: {self.shield2}"
]
for i, res in enumerate(resources):
res_text = font_small.render(res, True, TEXT_COLOR)
screen.blit(res_text, (self.x - 40, self.y + 20 + i * 20))
# 绘制伤害动画
if self.damage_animation > 0:
damage_text = font_large.render(f"-{self.damage_animation/10:.1f}G", True, DAMAGE_COLOR)
screen.blit(damage_text, (self.x - 40, self.y - 100 - self.damage_animation))
self.damage_animation -= 0.5
# 绘制护盾动画
if self.shield_animation > 0:
pygame.draw.circle(screen, SHIELD_COLOR, (self.x, self.y), self.radius + self.shield_animation, 3)
self.shield_animation -= 0.3
# 绘制柜效果
if self.cabinet:
pygame.draw.circle(screen, CABINET_COLOR, (self.x, self.y), self.radius + 5, 3)
# 绘制被淘汰状态
if self.eliminated:
pygame.draw.line(screen, (255, 0, 0), (self.x - self.radius, self.y - self.radius),
(self.x + self.radius, self.y + self.radius), 5)
pygame.draw.line(screen, (255, 0, 0), (self.x + self.radius, self.y - self.radius),
(self.x - self.radius, self.y + self.radius), 5)
class Game:
def __init__(self, num_players):
self.players = []
self.num_players = num_players
self.current_turn = 0
self.game_over = False
self.winner = None
self.phase = "select" # select, resolve, result
self.message = ""
self.message_timer = 0
# 初始化玩家位置
center_x, center_y = WIDTH // 2, HEIGHT // 2
radius = min(WIDTH, HEIGHT) * 0.35
for i in range(num_players):
angle = 2 * math.pi * i / num_players
x = center_x + int(radius * math.cos(angle))
y = center_y + int(radius * math.sin(angle))
self.players.append(Player(i, x, y))
def start_new_turn(self):
self.current_turn += 1
self.phase = "select"
self.message = f"回合 {self.current_turn} - 选择行动"
self.message_timer = 120
for player in self.players:
if not player.eliminated:
player.reset_turn()
def resolve_actions(self):
self.phase = "resolve"
self.message = "处理行动效果..."
self.message_timer = 180
# 处理行动效果
for player in self.players:
if player.eliminated or not player.selected_action:
continue
action = player.selected_action
# 处理获得物资类行动
if action == ActionType.GET_JADE:
player.jade += 2
elif action == ActionType.GET_DEFENSE:
player.defense += 2
elif action == ActionType.GET_DODGE:
player.dodge += 2
elif action == ActionType.GET_SWING_SWORD:
player.swing_sword += 2
elif action == ActionType.GET_CABINET:
player.cabinet = 1
elif action == ActionType.LOSE_CABINET:
player.cabinet = 0
# 处理护盾类行动
elif action == ActionType.SHIELD1_UPGRADE:
if player.defense >= 2:
player.defense -= 2
player.shield1 += 1
player.shield_used = True
player.special_shield_used = True
elif action == ActionType.SHIELD2_UPGRADE:
if player.shield1 >= 2:
player.shield1 -= 2
player.shield2 += 1
player.shield_used = True
player.special_shield_used = True
# 处理攻击类行动
elif action in [ActionType.STAB, ActionType.THOUSAND_YEAR, ActionType.SMALL_LIGHTNING, ActionType.SMALL_PIG]:
if player.target_player and not player.target_player.eliminated:
player.target_player.damage_received = max(player.target_player.damage_received, 0.5)
# 其他行动处理...
# 处理伤害
for player in self.players:
if player.eliminated or player.damage_received <= 0:
continue
player.take_damage(player.damage_received)
# 检查游戏结束条件
self.check_game_over()
def check_game_over(self):
alive_players = [p for p in self.players if not p.eliminated]
# 所有人都出局
if len(alive_players) == 0:
self.game_over = True
self.message = "游戏结束!平局(所有玩家出局)"
return
# 所有人都有柜
if all(p.cabinet == 1 for p in self.players if not p.eliminated):
self.game_over = True
self.message = "游戏结束!平局(所有玩家都有柜)"
return
# 只剩一个玩家存活
if len(alive_players) == 1:
self.game_over = True
self.winner = alive_players[0]
self.message = f"游戏结束!玩家 {self.winner.id+1} 获胜!"
return
def draw(self, screen):
# 绘制背景
screen.fill(BACKGROUND)
# 绘制标题
title_text = font_title.render("同步行动制游戏", True, TEXT_COLOR)
screen.blit(title_text, (WIDTH//2 - title_text.get_width()//2, 20))
# 绘制回合信息
if self.message_timer > 0:
message_text = font_medium.render(self.message, True, TEXT_COLOR)
screen.blit(message_text, (WIDTH//2 - message_text.get_width()//2, 80))
self.message_timer -= 1
# 绘制玩家
for player in self.players:
player.draw(screen)
# 绘制行动面板
if self.phase == "select":
pygame.draw.rect(screen, PANEL_BG, (50, HEIGHT - 200, WIDTH - 100, 150))
actions = [
("获得2玉", ActionType.GET_JADE),
("获得2防", ActionType.GET_DEFENSE),
("获得2闪", ActionType.GET_DODGE),
("获得2甩剑", ActionType.GET_SWING_SWORD),
("获得柜", ActionType.GET_CABINET),
("升级盾1", ActionType.SHIELD1_UPGRADE),
("戳击", ActionType.STAB),
("闪电", ActionType.SMALL_LIGHTNING),
("更多...", None)
]
for i, (text, action) in enumerate(actions):
x = 100 + i * 110
y = HEIGHT - 150
width = 100
height = 40
mouse_x, mouse_y = pygame.mouse.get_pos()
hover = x <= mouse_x <= x + width and y <= mouse_y <= y + height
color = BUTTON_HOVER if hover else BUTTON_BG
pygame.draw.rect(screen, color, (x, y, width, height), border_radius=5)
action_text = font_small.render(text, True, BUTTON_TEXT)
screen.blit(action_text, (x + width//2 - action_text.get_width()//2,
y + height//2 - action_text.get_height()//2))
# 绘制游戏结束信息
if self.game_over:
pygame.draw.rect(screen, (0, 0, 0, 180), (0, 0, WIDTH, HEIGHT))
game_over_text = font_large.render(self.message, True, TEXT_COLOR)
screen.blit(game_over_text, (WIDTH//2 - game_over_text.get_width()//2, HEIGHT//2 - 50))
restart_text = font_medium.render("按R键重新开始", True, TEXT_COLOR)
screen.blit(restart_text, (WIDTH//2 - restart_text.get_width()//2, HEIGHT//2 + 20))
# 主游戏循环
def main():
game = Game(4)
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r and game.game_over:
game = Game(4)
if event.type == pygame.MOUSEBUTTONDOWN:
if game.phase == "select":
# 处理行动选择
pass
elif game.phase == "resolve":
game.start_new_turn()
# 游戏逻辑
if not game.game_over and game.phase == "resolve" and game.message_timer <= 0:
game.start_new_turn()
# 绘制
game.draw(screen)
pygame.display.flip()
clock.tick(60)
pygame.quit()
if __name__ == "__main__":
main()