This commit is contained in:
team3
2026-09-16 17:00:41 +02:00
parent f1c78f66f4
commit 9800c614bb
21 changed files with 497 additions and 191 deletions

View File

@@ -69,13 +69,19 @@ static func _regler() -> Dictionary:
return STUFEN[clampi(stufe, 0, STUFEN.size() - 1)]
## `wissen`: was der Bot über die anderen weiss - "bekannt" sind aufgedeckte
## Gegnerwürfel (Spähen), "fenster" ist je Augenzahl [von, bis] vom Zählen.
## Ohne das würfe er die Münzen und ignorierte, was sie ihm sagen.
static func choose_action(values: Array, total_dice: int, bid: Dictionary,
must_bid: bool, rng: RandomNumberGenerator) -> Dictionary:
must_bid: bool, rng: RandomNumberGenerator, wissen: Dictionary = {}) -> Dictionary:
var known: Array = []
for v in values:
if v > 0:
known.append(v)
var unknown := total_dice - known.size()
for v in wissen.get("bekannt", []):
known.append(int(v))
var unknown := maxi(0, total_dice - known.size())
var fenster: Dictionary = wissen.get("fenster", {})
if bid.is_empty():
var op := _opening(known, unknown, rng)
@@ -83,6 +89,21 @@ static func choose_action(values: Array, total_dice: int, bid: Dictionary,
var r := _regler()
var hold := chance(known, unknown, bid.count, bid.face)
var genau_p := exact_chance(known, unknown, bid.count, bid.face)
if fenster.has(int(bid.face)):
# Gezählt: das Fenster schlägt jede Schätzung.
var f: Array = fenster[int(bid.face)]
var von := int(f[0])
var bis := int(f[1])
if bis < int(bid.count):
hold = 0.0
genau_p = 0.0
elif von >= int(bid.count):
hold = 1.0
genau_p = 1.0 if von == bis and von == int(bid.count) else (0.34 if von == int(bid.count) else 0.0)
else:
hold = float(bis - int(bid.count) + 1) / float(bis - von + 1)
genau_p = 1.0 / float(bis - von + 1)
var raise_ = _best_raise(known, unknown, total_dice, bid, float(r.sicher))
var low := lowest_raise(bid, total_dice)
@@ -91,8 +112,8 @@ static func choose_action(values: Array, total_dice: int, bid: Dictionary,
# Anfechtung: der Ansager verliert, und man bekommt selbst einen dazu.
# Aber nur ab und zu: Genau nimmt keinen Würfel vom Tisch. Ein Bot,
# der es bei jeder Gelegenheit ruft, zieht die Partie ins Endlose.
if exact_chance(known, unknown, bid.count, bid.face) > float(r.genau) and hold < 0.6 \
and rng.randf() < GENAU_LUST:
# Sicheres Wissen (Fenster exakt) nutzt er dagegen immer.
if genau_p >= 0.999 or (genau_p > float(r.genau) and hold < 0.6 and rng.randf() < GENAU_LUST):
return {"type": "exact"}
var doubt := float(r.zweifel) + rng.randf_range(-0.07, 0.07)
if hold < doubt and (raise_.is_empty() or raise_.p < 0.32):