Kampf fortsetzen, Gamepad im Deckbau, Deck-Codes, Kapitel 3, Elementbooster, englische Karten, Host-Wechsel und Zuschauer
- 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
This commit is contained in:
@@ -30,13 +30,16 @@ static func board_value(p: Game.Player) -> float:
|
||||
return v
|
||||
|
||||
|
||||
## Stellung aus Sicht von p: eigenes Leben, Feld und Hand zählen positiv,
|
||||
## die der Gegner negativ. Ein besiegter Gegner ist viel wert.
|
||||
## Stellung aus Sicht von p: eigenes Leben, Feld und Hand zählen positiv, die der Gegner
|
||||
## negativ, der stärkste Gegner etwas mehr (jeder gegen jeden: den Führenden bremsen).
|
||||
## Gegnerische Angriffskraft ohne eigenen Wächter ist eine Bedrohung, tödliche besonders.
|
||||
static func evaluate(g: Game, p: Game.Player) -> float:
|
||||
if not p.alive():
|
||||
return -10000.0
|
||||
var score := p.life * 1.0 + board_value(p) * 1.0 + p.hand.size() * 0.8 + p.traps.size() * 2.5
|
||||
var alive_enemies := 0
|
||||
var threat := 0.0
|
||||
var leader := 0.0
|
||||
for e in g.players:
|
||||
if e == p:
|
||||
continue
|
||||
@@ -44,11 +47,28 @@ static func evaluate(g: Game, p: Game.Player) -> float:
|
||||
score += 40.0
|
||||
continue
|
||||
alive_enemies += 1
|
||||
score -= e.life * 0.6 + board_value(e) * 0.9 + e.hand.size() * 0.2
|
||||
var ev: float = e.life * 0.6 + board_value(e) * 0.9 + e.hand.size() * 0.2
|
||||
score -= ev
|
||||
leader = maxf(leader, ev)
|
||||
if e.life <= 6:
|
||||
score += 3.0 # fast besiegt: dranbleiben
|
||||
for c in e.board:
|
||||
if not c.frozen:
|
||||
threat += c.power() * c.attacks_per_turn()
|
||||
if alive_enemies == 0:
|
||||
return 10000.0
|
||||
score -= leader * 0.25
|
||||
var guarded := false
|
||||
for c in p.board:
|
||||
if c.taunt():
|
||||
guarded = true
|
||||
break
|
||||
if guarded:
|
||||
score -= threat * 0.1
|
||||
elif threat >= p.life:
|
||||
score -= 25.0
|
||||
else:
|
||||
score -= threat * 0.3
|
||||
return score
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user