Files
cards/tests/simulate.gd
T
team3 1d563b9eec
Tests / headless (push) Waiting to run
Tests / fenster-schnell (push) Waiting to run
Tests / fenster-voll (push) Skipped
Tests / balance (push) Skipped
update
2026-10-14 17:35:09 +02:00

51 lines
1.9 KiB
GDScript

extends SceneTree
## Balance-Simulation, die KI spielt auch den Menschen. Bei gleichen Regeln
## sind etwa 50 % Siege zu erwarten:
## godot --headless --path . -s tests/simulate.gd
func _initialize() -> void:
var games := 100
var r := RandomNumberGenerator.new()
r.seed = 0
var t0 := Time.get_ticks_msec()
print("Beide gierig (Erwartung etwa 50 %):")
_run(games, r, true, true)
print("Du mit Vorausschau, Gegner gierig:")
_run(games / 2, r, false, true)
print("Beide mit Vorausschau:")
_run(games / 2, r, false, false)
print("Kampagne (du mit Vorausschau), je Stufe:")
for stage in [0, 4, 9, 19, 29, 39, 49]:
_campaign(stage, games / 4, r)
print("Dauer %.1f s" % ((Time.get_ticks_msec() - t0) / 1000.0))
quit()
func _campaign(stage: int, games: int, r: RandomNumberGenerator) -> void:
var wins := 0
for i in games:
var g := Game.new_battle_with(Campaign.opponent(stage), r, false, {"deck": DeckGen.element_deck(Cards.NEUTRAL)}) # du mit der Startsammlung
while g.winner == "":
AI.take_turn(g, g.current(), false)
assert(g.turn < 300, "Spiel endet nicht")
if g.winner == "human":
wins += 1
var st := Campaign.stage(stage)
print("Stufe %2d %-12s %2d Leben, %d Merkmale: Siege %3d%%" % [stage + 1, st.name, int(st.life), st.perks.size(), wins * 100 / games])
func _run(games: int, r: RandomNumberGenerator, human_greedy: bool, opp_greedy: bool) -> void:
var wins := 0
var turns := 0
for i in games:
var g := Game.new_battle(r)
while g.winner == "":
var p := g.current()
AI.take_turn(g, p, human_greedy if p.is_human else opp_greedy)
assert(g.turn < 300, "Spiel endet nicht")
if g.winner == "human":
wins += 1
turns += g.turn
print("Siege %3d%% Ø Züge %.1f" % [wins * 100 / games, float(turns) / games])