/**
* @fileoverview Bewertungskonfigurationen für TTT-Heuristiken (regular, 3d, ultimate).
* Definiert je drei Profile pro Variante:
* - v1_baseline: Sieg/Verlust-Erkennung, minimale Linienbewertung
* - v2_positional: Positionelle Kontrolle (Zentrum, Ecken, strategische Felder)
* - v3_aggressive: Gabel-Erkennung, Druckmaximierung, Mobilitätseinschränkung
*
* Alle Werte sind Schema-validiert via heuristic-config-schema.js.
* @author Alexander Wolf
*/
/**
* Validiert Config falls Schema-Validator verfügbar ist (Load-Order-sicher).
* @param {Object} config - Rohkonfiguration.
* @returns {Object} Validierte oder unveränderte Konfiguration.
*/
function _tttValidateConfig(config) {
if (typeof validateHeuristicConfig === 'function') {
return validateHeuristicConfig(config);
}
return config;
}
// ═══════════════════════════════════════════════════════════════
// TTT REGULAR — 3×3 Klassik
// ═══════════════════════════════════════════════════════════════
const TTT_REGULAR_PROFILES = {
v1_baseline: _tttValidateConfig({
game: 'ttt', variant: 'regular', profile: 'v1_baseline',
name: 'TTT Regular (Baseline)',
description: 'Minimax-Grundlage: Nur Sieg/Verlust und einfache Linien-Zählung.',
weights: {
win: 1000, loss: -1000, draw: 0,
twoInLine: 10, oneInLine: 1
}
}),
v2_positional: _tttValidateConfig({
game: 'ttt', variant: 'regular', profile: 'v2_positional',
name: 'TTT Regular (Positional)',
description: 'Bewertet Feldqualität: Zentrum (+15), Ecken (+3), Kanten (+1).',
weights: {
win: 1000, loss: -1000, draw: 0,
twoInLine: 10, oneInLine: 1,
centerBonus: 15, cornerBonus: 3, edgeBonus: 1
}
}),
v3_aggressive: _tttValidateConfig({
game: 'ttt', variant: 'regular', profile: 'v3_aggressive',
name: 'TTT Regular (Aggressive)',
description: 'Erzwingt Gabeln (fork +50) und bestraft gegnerische Mobilität.',
weights: {
win: 1000, loss: -1000, draw: 0,
twoInLine: 15, oneInLine: 2,
centerBonus: 10, forkBonus: 50, opponentForkPenalty: -50,
pressureWeight: 15
}
})
};
// ═══════════════════════════════════════════════════════════════
// TTT 3D — 3×3×3 Raum
// ═══════════════════════════════════════════════════════════════
const TTT_3D_PROFILES = {
v1_baseline: _tttValidateConfig({
game: 'ttt', variant: '3d', profile: 'v1_baseline',
name: 'TTT 3D (Baseline)',
description: 'Raumlinien + einfacher Zentrumsbonus.',
weights: {
win: 10000, loss: -10000, draw: 0,
twoInLine: 10, oneInLine: 1, centerBonus: 20
}
}),
v2_positional: _tttValidateConfig({
game: 'ttt', variant: '3d', profile: 'v2_positional',
name: 'TTT 3D (Positional)',
description: 'Starke Zentrums- und Raumkontrolle. Ecken und Kernexpansion.',
weights: {
win: 10000, loss: -10000, draw: 0,
twoInLine: 12, oneInLine: 2,
centerBonus: 40, spatialControl: 5, cornerBonus: 8
}
}),
v3_aggressive: _tttValidateConfig({
game: 'ttt', variant: '3d', profile: 'v3_aggressive',
name: 'TTT 3D (Aggressive)',
description: 'Maximierung von Multi-Linien-Druck und Raumdiagonalen-Kontrolle.',
weights: {
win: 10000, loss: -10000, draw: 0,
twoInLine: 20, oneInLine: 3,
centerBonus: 30, forkBonus: 80, opponentForkPenalty: -70,
pressureWeight: 25, threatMultiplier: 5
}
})
};
// ═══════════════════════════════════════════════════════════════
// TTT ULTIMATE — 9 verschachtelte Boards
// ═══════════════════════════════════════════════════════════════
const TTT_ULTIMATE_PROFILES = {
v1_baseline: _tttValidateConfig({
game: 'ttt', variant: 'ultimate', profile: 'v1_baseline',
name: 'TTT Ultimate (Baseline)',
description: 'Makro-Board-Bewertung + einfache lokale Linienzählung.',
weights: {
win: 100000, loss: -100000, draw: 0,
macroWeight: 50, boardWonBonus: 20,
twoInLine: 10, oneInLine: 1
}
}),
v2_positional: _tttValidateConfig({
game: 'ttt', variant: 'ultimate', profile: 'v2_positional',
name: 'TTT Ultimate (Positional)',
description: 'Hoher Wert für Makro-Zentrum und strategische Board-Kontrolle.',
weights: {
win: 100000, loss: -100000, draw: 0,
macroWeight: 80, boardWonBonus: 30,
twoInLine: 12, oneInLine: 2,
centerBonus: 25
}
}),
v3_aggressive: _tttValidateConfig({
game: 'ttt', variant: 'ultimate', profile: 'v3_aggressive',
name: 'TTT Ultimate (Aggressive)',
description: 'Maximiert Board-Gewinne im Makro und sendet Gegner in tote Boards.',
weights: {
win: 100000, loss: -100000, draw: 0,
macroWeight: 60, boardWonBonus: 40,
twoInLine: 20, oneInLine: 3,
pressureWeight: 20, blockUrgency: 80
}
})
};
/**
* Zentrales Konfigurations-Verzeichnis aller TTT-Profile.
* Schlüssel: variant → profile → config.
* @type {Object<string, Object<string, Object>>}
*/
const TTT_HEURISTICS_CONFIGS = {
regular: TTT_REGULAR_PROFILES,
'3d': TTT_3D_PROFILES,
ultimate: TTT_ULTIMATE_PROFILES
};
/**
* Factory-Funktion: Lädt die Konfiguration für eine TTT-Variante und ein Profil.
* @param {string} [variant='regular'] - 'regular', '3d' oder 'ultimate'.
* @param {string} [profile='v1_baseline'] - 'v1_baseline', 'v2_positional' oder 'v3_aggressive'.
* @returns {Object} Validierte Heuristik-Konfiguration.
*/
function getTTTHeuristicsConfig(variant = 'regular', profile = 'v1_baseline') {
const normalizedVariant = variant === '_3d' ? '3d' : variant;
const variantConfigs = TTT_HEURISTICS_CONFIGS[normalizedVariant];
if (!variantConfigs) {
if (typeof DebugConfig !== 'undefined' && typeof DEBUG_DOMAINS !== 'undefined') {
DebugConfig.log(DEBUG_DOMAINS.AI_HEURISTICS, 'warn',
`Unbekannte TTT-Variante: ${variant}. Fallback auf 'regular'.`);
}
return TTT_HEURISTICS_CONFIGS.regular.v1_baseline;
}
const config = variantConfigs[profile];
if (!config) {
if (typeof DebugConfig !== 'undefined' && typeof DEBUG_DOMAINS !== 'undefined') {
DebugConfig.log(DEBUG_DOMAINS.AI_HEURISTICS, 'warn',
`Unbekanntes Profil: ${profile} für ${variant}. Fallback auf 'v1_baseline'.`);
}
return variantConfigs.v1_baseline;
}
return config;
}
/**
* Gibt alle verfügbaren Profile für eine TTT-Variante zurück.
* @param {string} [variant='regular'] - Spielvariante.
* @returns {Array<{id: string, name: string, description: string}>}
*/
function getTTTProfileList(variant = 'regular') {
const variantConfigs = TTT_HEURISTICS_CONFIGS[variant];
if (!variantConfigs) return [];
return Object.entries(variantConfigs).map(([id, cfg]) => ({
id,
name: cfg.name,
description: cfg.description || ''
}));
}