/*
* C++ Implementation: main
*
* Description:
*
*
* Author: Hendrik Hochstetter <hochsthk@studi.informatik.uni-stuttgart.de>, (C) 2008
*
* Copyright: See COPYING file that comes with this distribution
*
*/
#include "globals.h"
#include "aimanager.h"
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
void myMessageOutput(QtMsgType type, const char *msg)
{
switch (type) {
case QtDebugMsg:
fprintf(stdout, "Debug: %s\n", msg);
break;
case QtWarningMsg:
fprintf(stdout, "Warning: %s\n", msg);
break;
case QtCriticalMsg:
fprintf(stdout, "Critical: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stdout, "Fatal: %s\n", msg);
abort();
}
}
int main (int argc, char *argv[])
{
qInstallMsgHandler(myMessageOutput);
QCoreApplication *app = new QCoreApplication (argc, argv);
AiManager *aiManager = new AiManager (app);
aiManager -> run ();
aiManager -> writeSettings ();
return app -> exec ();
};
/**
\page ai AI: Die künstliche Intelligenz für 3d-pyramidal-schach
\section about Allgemein
Die KI wird über QSettings konfiguriert. Einstellbar sind Username und Passwort über die mit Server eine Verbindung hergestellt wird. Die maximale Anzahl an gleichzeitig laufenden KI-Threads kann genauso eingestellt werden, wie die Standard- Suchtiefe und die maximale Suchtiefe (die Standard-Suchtiefe kann durch die KI bei unruhigen Stellungen überschritten werden). Die KI tritt jedem Spiel, das nach dem Schema KiName_Gegner aufgebaut ist als weiß bei und jedem nach Schema Gegner_KiName als schwarz. Auch einstellbar: das Refresh-Intervall, die Zeit, die der KI-Manager wartet, bis er auf dem Server schaut ob neue Spiele angelegt worden sind, denen die KI beitreten soll bzw. ob in einem Spiel die KI am Zug ist. Ist die KI am Zug wird ein AiBrain-Objekt erzeugt,
in dem dann die Berechnung des Zugs erfolgt.
\see AiManager AiPlayer AiBrain
\section implementation Implementierung der Darstellung für Felder
Felder werden als Integer dargestellt in jedes Field werden x, y und
z koordinaten (je aus {0..7}) kodiert. die ersten 3 bit für die x
koordinate dann 3 null-bits (um überläufe bei addition und subtraktion
abfangen zu können) 3bits für y usw.
Dadurch lassen sich Vektoraddition und Subtraktion (im positiven Zahlenbereich)
als einfache Integeradditionen realsieren. wenn ein oder mehr null-bits nach der addition/subtraktion ungleich 0 werden dann liegt das ergebnisfeld nicht auf dem brett.
\see Field
Bsp.: Feld (3,4,3) ist in o.g. Darstellung 0030403 (oktal)
\section implementation2 Implementierung der Darstellung für Züge
Für Züge wird wie für Felder als Datentyp Integer verwendet. Einziger Unterschied zwischen
Zügen und Feldern ist, dass Züge auch negative Komponenten enthalten können. Dieses Problem
wird dadurch gelöst, dass jeder Zugvektor in der Darstellung um 0030303 (oktal) verschoben
ist und erst nach Ausführung eines Zuges die 0030303 Verschiebung ausgeglichen wird.
Zusätzlich zu den Grundrichtungen möglicher Züge werden auch Skalierungen gespeichert.
Die Richtung der Züge richtet sich nach der Ausrichtung des Bretts und ist nicht relativ sondern absolut. weiß spielt und negative z-Richtung schwarz in positive, was aber nur bei Bauerzügen beachtet werden muss.
\see MoveVector Move
Bsp.: Der Springervektor (2,1,0) würde also 0030405 (oktal) lauten, (-2,0,1) wäre 0040301 (oktal).
**/