fork download
  1. import itertools
  2. import math
  3.  
  4. # ==========================================
  5. # 1. 遊戲參數與寶石計算引擎
  6. # ==========================================
  7. BASE_DMG = 50
  8. BASE_DELAY = 1.0
  9. TIME_LIMIT = 60.0
  10. NUM_FLOORS = 81
  11.  
  12. def calculate_weapon_stats(combo_string):
  13. """
  14. 根據寶石順序,計算最終的神劍屬性
  15. combo_string: 類似 'RRES', 'EEES' 的 4 字元字串
  16. """
  17. dmg = BASE_DMG
  18. delay = BASE_DELAY
  19.  
  20. for gem in combo_string:
  21. if gem == 'R':
  22. dmg += 200
  23. elif gem == 'E':
  24. dmg *= 1.8
  25. delay += 0.2
  26. elif gem == 'S':
  27. delay *= 0.6
  28. dmg -= 50
  29. if dmg < 10:
  30. dmg = 10
  31.  
  32. # 避免極端情況浮點數誤差,攻速最低限制為 0.01 秒
  33. delay = max(0.01, delay)
  34. return dmg, delay
  35.  
  36. def can_beat_boss(dmg, delay, floor_k):
  37. """判斷特定的武器屬性是否能在 60 秒內擊殺第 K 層的 Boss"""
  38. boss_hp = 5000 + (1000 * floor_k)
  39. boss_armor = 10 * floor_k
  40.  
  41. hits = math.floor(TIME_LIMIT / delay) + 1
  42. actual_dmg_per_hit = max(1, dmg - boss_armor)
  43.  
  44. total_damage = hits * actual_dmg_per_hit
  45. return total_damage >= boss_hp
  46.  
  47. # ==========================================
  48. # 2. 模擬與建圖 (Graph Construction)
  49. # ==========================================
  50. def build_bipartite_graph():
  51. # 產生 3^4 = 81 種寶石鑲嵌組合
  52. gems = ['R', 'E', 'S']
  53. all_combos = [''.join(c) for c in itertools.product(gems, repeat=4)]
  54.  
  55. print(f"✅ 成功生成 {len(all_combos)} 種獨特的寶石配裝方案。")
  56.  
  57. # 建立二分圖的 Adjacency List
  58. # graph[combo] = [能擊殺的樓層 list]
  59. graph = {}
  60. for combo in all_combos:
  61. dmg, delay = calculate_weapon_stats(combo)
  62. beatable_floors = []
  63. for floor in range(1, NUM_FLOORS + 1):
  64. if can_beat_boss(dmg, delay, floor):
  65. beatable_floors.append(floor)
  66. graph[combo] = beatable_floors
  67.  
  68. return graph, all_combos
  69.  
  70. # ==========================================
  71. # 3. 核心演算法:最大二分圖匹配 (Kuhn's Algorithm)
  72. # ==========================================
  73. def max_bipartite_matching(graph, combos):
  74. """
  75. 使用 DFS 尋找增廣路徑 (Augmenting Path)
  76. 來解出最多能通關多少層樓。
  77. """
  78. # 紀錄某個樓層目前是被哪個 combo 佔用
  79. floor_assignment = {}
  80.  
  81. def dfs_match(combo, visited):
  82. # 遍歷這個配裝能打贏的所有樓層
  83. for floor in graph[combo]:
  84. if floor not in visited:
  85. visited.add(floor)
  86. # 如果該樓層還沒有分配配裝,或者佔用該樓層的配裝可以被挪去打別層(遞迴尋找增廣路)
  87. if floor not in floor_assignment or dfs_match(floor_assignment[floor], visited):
  88. floor_assignment[floor] = combo
  89. return True
  90. return False
  91.  
  92. matches = 0
  93. # 對每一種配裝嘗試進行匹配
  94. for combo in combos:
  95. visited = set()
  96. if dfs_match(combo, visited):
  97. matches += 1
  98.  
  99. return matches, floor_assignment
  100.  
  101. # ==========================================
  102. # 4. 執行主程式
  103. # ==========================================
  104. def main():
  105. print("⚔️ 啟動 Stick Ranger 無盡之塔 81 層模擬器...\n")
  106.  
  107. # 1. 建立圖形
  108. graph, combos = build_bipartite_graph()
  109.  
  110. # 2. 跑圖論匹配演算法
  111. max_wins, final_assignments = max_bipartite_matching(graph, combos)
  112.  
  113. # 3. 輸出結果分析
  114. print(f"🏆 在 81 層中,不重複使用配裝的情況下,極限能通關: 【 {max_wins} 】層!\n")
  115.  
  116. print("--- ⚔️ 部分精選通關樓層配裝報告 ⚔️ ---")
  117.  
  118. # 反轉 dict 以樓層來排序輸出
  119. floor_to_combo = {k: v for k, v in final_assignments.items()}
  120.  
  121. # 顯示前 5 樓、中間樓層、以及挑戰成功的最高樓層
  122. floors_to_show = [1, 2, 3, 4, 5, 40, max(floor_to_combo.keys())]
  123.  
  124. for floor in sorted(list(set(floors_to_show))):
  125. if floor in floor_to_combo:
  126. combo = floor_to_combo[floor]
  127. dmg, delay = calculate_weapon_stats(combo)
  128. boss_hp = 5000 + (1000 * floor)
  129. boss_armor = 10 * floor
  130.  
  131. print(f"🏢 第 {floor:02d} 層 | Boss [HP:{boss_hp:6d}, 甲:{boss_armor:3d}] "
  132. f"| 配裝: {combo} (傷:{dmg:6.1f}, 攻速:{delay:.2f}s)")
  133.  
  134. # 尋找最強破甲與最高秒傷配裝
  135. print("\n--- 🔬 神劍資料科學分析 ---")
  136. best_dmg_combo = max(combos, key=lambda c: calculate_weapon_stats(c)[0])
  137. fastest_combo = min(combos, key=lambda c: calculate_weapon_stats(c)[1])
  138.  
  139. print(f"🔥 最高單發傷害配裝: {best_dmg_combo} (傷害: {calculate_weapon_stats(best_dmg_combo)[0]:.1f})")
  140. print(f"⚡ 最高攻擊速度配裝: {fastest_combo} (間隔: {calculate_weapon_stats(fastest_combo)[1]:.3f}s)")
  141.  
  142. if __name__ == '__main__':
  143. main()
Success #stdin #stdout 0.03s 9424KB
stdin
Standard input is empty
stdout
⚔️ 啟動 Stick Ranger 無盡之塔 81 層模擬器...

✅ 成功生成 81 種獨特的寶石配裝方案。
🏆 在 81 層中,不重複使用配裝的情況下,極限能通關: 【 34 】層!

--- ⚔️ 部分精選通關樓層配裝報告 ⚔️ ---
🏢 第 01 層 | Boss [HP:  6000, 甲: 10] | 配裝: ERSR (傷: 440.0, 攻速:0.72s)
🏢 第 02 層 | Boss [HP:  7000, 甲: 20] | 配裝: ERES (傷: 472.0, 攻速:0.84s)
🏢 第 03 層 | Boss [HP:  8000, 甲: 30] | 配裝: EREE (傷: 939.6, 攻速:1.60s)
🏢 第 04 層 | Boss [HP:  9000, 甲: 40] | 配裝: ERER (傷: 722.0, 攻速:1.40s)
🏢 第 05 層 | Boss [HP: 10000, 甲: 50] | 配裝: ERRS (傷: 440.0, 攻速:0.72s)
🏢 第 34 層 | Boss [HP: 39000, 甲:340] | 配裝: RRRE (傷:1170.0, 攻速:1.20s)

--- 🔬 神劍資料科學分析 ---
🔥 最高單發傷害配裝: RREE (傷害: 1458.0)
⚡ 最高攻擊速度配裝: SSSS (間隔: 0.130s)