- KI-Bewertung mit Bedrohung und Führenden-Bremse (62:38 gegen die alte im Duell, gleichauf zu viert) - Balance: Sand +1/+1 statt Schild, Erde+Luft und Erde geschwächt, Wasser angehoben, Messlauf mit N=200 möglich - Einzelspieler-Kämpfe werden laufend gespeichert (voller Spielstand, viewer -1) und im Menü fortgesetzt - Karten, Deckzeilen und Kartenrücken fokussierbar: Gamepad in Deckbau, Werkstatt und Booster - Kartennamen (name_en) und Kartentexte übersetzbar, Übersetzungstest deckt cards.gd mit ab - Deck-Code DINGER1:id*anzahl mit Zwischenablage; acht neue Karten; Kampagne Kapitel 3; Elementbooster 120 Münzen - Netzwerk: Nachfolge-Host mit vollem Spielstand, Neuverbindung der anderen, Zuschauer (Sicht -2); Bot kann hosten - Große Schrift: Kartennamen, Kartentext, Knopfleisten, Gegnervorschau, Dialogtext - Anleitung 1 garantiert ein 1-Energie-Wesen; Tests: DINGER_ONLY für einzelne Oberflächentests - Oberflächentest auch auf Xephyr mit llvmpipe (wie Xvfb in der CI) grün Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QPgKvy5W9WRNFHjkm5QsHx
42 lines
1.5 KiB
GDScript
42 lines
1.5 KiB
GDScript
extends SceneTree
|
|
## Archetyp-Stärke: jede Elementkombination gegen zufällige andere, gleiche Zielstärke, beide KI.
|
|
|
|
|
|
func archetypes() -> Array:
|
|
var out := []
|
|
for e in Cards.ELEMENTS:
|
|
out.append([e])
|
|
for i in Cards.ELEMENTS.size():
|
|
for j in range(i + 1, Cards.ELEMENTS.size()):
|
|
out.append([Cards.ELEMENTS[i], Cards.ELEMENTS[j]])
|
|
return out
|
|
|
|
|
|
func _initialize() -> void:
|
|
var r := RandomNumberGenerator.new()
|
|
r.seed = 21
|
|
var arts := archetypes()
|
|
var n := int(OS.get_environment("N")) if OS.get_environment("N") != "" else 60
|
|
var results := {}
|
|
for a in arts:
|
|
var wins := 0
|
|
for i in n:
|
|
var b: Array = arts[r.randi_range(0, arts.size() - 1)]
|
|
var deck_a := Game.build_opponent_deck_rated(r, a, 1.6)
|
|
var deck_b := Game.build_opponent_deck_rated(r, b, 1.6)
|
|
var opp := Game.Player.new("Gegner 1", deck_b, false, Game.START_LIFE, "x")
|
|
var g := Game.new_battle_with(deck_a, [opp], r)
|
|
var guard := 0
|
|
while g.winner == "" and guard < 300:
|
|
AI.take_turn(g, g.current())
|
|
guard += 1
|
|
if g.winner == "human":
|
|
wins += 1
|
|
results["+".join(a)] = wins * 100 / n
|
|
print("%-14s %3d%%" % ["+".join(a), wins * 100 / n])
|
|
var f := FileAccess.open(DeckGen.ARCHETYPE_PATH, FileAccess.WRITE)
|
|
f.store_string(JSON.stringify(results, "\t"))
|
|
f.close()
|
|
print("nach %s geschrieben" % DeckGen.ARCHETYPE_PATH)
|
|
quit()
|