<!--
// DBUS! Deutschland - Enterprise Information Portal By Busskamp And Scholwin
// Source Code By Dirk Busskamp And Web Design By Sabine Busskamp
// Copyright 2000 - 2010 DBUS! Deutschland
// http://www.dbus.de
// mailto:info@dbus.de

var WinLenght = 5;
var DeskRows = 10;
var DeskCols = 25;
var Directions = new Array(new Object(), new Object(), new Object(), new Object());
Directions[0].R = 1; Directions[0].C = 0;
Directions[1].R = 0; Directions[1].C = 1;
Directions[2].R = 1; Directions[2].C = 1;
Directions[3].R = 1; Directions[3].C = -1;

var eX = 1;
var eO = -1;

var AutoPlaying = false;
var PlayGround;
var Lines;
var TilesPlayed = 0;
var MaxDepth = 10;

var TileXWImage = new Image(); TileXWImage.src = 'xw.gif';
var TileOWImage = new Image(); TileOWImage.src = 'ow.gif';
var TileXBImage = new Image(); TileXBImage.src = 'xr.gif';
var TileOBImage = new Image(); TileOBImage.src = 'or.gif';
var TileEWImage = new Image(); TileEWImage.src = 'ew.gif';
var TileHintImage = new Image(); TileHintImage.src = "hr.gif";

var PendingTimeout = 0;

var PlayAllowed = true;
var LastPlayedRow = -1;
var LastPlayedCol = -1;
var HintShownRow = -1;
var HintShownCol = -1;

function ResetGame() {
window.clearTimeout(PendingTimeout);
AutoPlaying = false
TilesPlayed = 0;
LastPlayedRow = -1;
LastPlayedCol = -1;
HintShownRow = -1;
HintShownCol = -1;
PlayGround = new Array();
for (var Row = 0; Row < DeskRows; ++Row) {
PlayGround[Row] = new Array();
for (var Col = 0; Col < DeskCols; ++Col) {
PlayGround[Row][Col] = 0;
ShowTile(Row, Col);
}
}
InitLines();
AllowPlay();
}

function GetLineValue(r, c, d) {
var Tile = 0;
var TileCount = 0;
var TotalCount = 0;
var tR = r; var tC = c;
for (var tL = 0;
(tL < WinLenght) && (tR >= 0) && (tR < DeskRows) && (tC >= 0) && (tC < DeskCols);
++tL, tR += Directions[d].R, tC += Directions[d].C) {
if (PlayGround[tR][tC] == 0) {
++TotalCount
}
else if ((Tile == 0) || (Tile == PlayGround[tR][tC])) {
++TotalCount;
++TileCount;
Tile = PlayGround[tR][tC];
} else break;
}
if (TotalCount < WinLenght) return 10000
else if (Tile == 0) return TotalCount
else return (TotalCount - TileCount) * Tile;
}

function InitLines() {
Lines = new Array();
for (var r = 0; r < DeskRows; ++r) {
if (typeof Lines[r] == "undefined") {
Lines[r] = new Array();
}
for (var c = 0; c < DeskCols; ++c) {
if (typeof Lines[r][c] == "undefined") {
Lines[r][c] = new Array();
}
for (var d = 0; d < Directions.length; ++d) {
Lines[r][c][d] = GetLineValue(r,c,d);
}
}
}
}

function HighlightLine(R,C,d) {
var ImgSrc = TileOBImage.src;
var OWins = true;
if (PlayGround[R][C] == eX) {
ImgSrc = TileXBImage.src;
OWins = false;
}
for (i = 0; i < WinLenght; ++i) {
ShowTileHi(R, C);
R += Directions[d].R;
C += Directions[d].C;
}
if (!AutoPlaying) {
window.alert( OWins ? "DBUS! Deutschland gratuliert Ihnen zum Sieg.": "Pech gehabt, aber diesmal war DBUS! Deutschland besser.");
}
}

function UpdateLines(R, C) {
var Result = false;
for (var d = 0; d < Directions.length; ++d) {
var tR = R;
var tC = C;
for (var tL = 0;
((tL < WinLenght) && (tR >= 0) && (tR < DeskRows) && (tC >= 0) && (tC < DeskCols));
++tL, tR -= Directions[d].R, tC -= Directions[d].C) {
var Value = GetLineValue(tR, tC, d);
Lines[tR][tC][d] = Value;
if (0 == Value) {
Result = true;
HighlightLine(tR,tC,d);
}
}
}
return Result;
}

function GetPointScoreVector(R, C, Player) {
var Result = new Array();
for (var i = 0; i <= WinLenght * 2 - 2; ++i) {
Result[i] = 0;
}
for (var d = 0; d < Directions.length; ++d) {
var tR = R;
var tC = C;
for (var tL = 0;
((tL < WinLenght) && (tR >= 0) && (tR < DeskRows) && (tC >= 0) && (tC < DeskCols));
++tL, tR -= Directions[d].R, tC -= Directions[d].C) {
var LineValue = Lines[tR][tC][d];
if ((Math.abs(LineValue) < WinLenght) && (Math.abs(LineValue) > 0)) {
++Result[ (Math.abs(LineValue)-1) * 2 + 1];
if (Player * LineValue > 0)
++Result[ (Math.abs(LineValue)-1) * 2];
} else if (Math.abs(LineValue) == WinLenght) {
++Result[WinLenght * 2 - 2];
}
}
}
return Result;
}

function CompareScores(ScoreA,ScoreB, Depth) {
if (typeof(ScoreB) == "undefined") {
return 1;
}
for (var i = 0; (i < Depth) && (i < ScoreA.length); ++i) {
if (ScoreA[i] < ScoreB[i]) return -1
else if (ScoreA[i] > ScoreB[i]) return 1;
}
return 0;
}

function GetRowCol(Row, Col) {
return Row * DeskCols + Col;
}

function GetRow(RowCol) {
return Math.floor(RowCol / DeskCols);
}

function GetCol(RowCol) {
return RowCol % DeskCols;
}

function ChoseMove(Depth, Player) {
var BestScore;
var Chosen;

for (var Row = 0; Row < DeskRows; ++Row) {
for (var Col = 0; Col < DeskCols; ++Col) {
if (PlayGround[Row][Col] == 0) {
var Score = GetPointScoreVector(Row, Col, Player);
var Comp = CompareScores(Score, BestScore, Depth);
if ((Comp > 0) || typeof Chosen == "undefined") {
Chosen = new Array();
Chosen[0] = GetRowCol(Row, Col);
BestScore = Score;
} else if (Comp == 0) {
Chosen[Chosen.length] = GetRowCol(Row, Col);
}
}
}
}
if (typeof Chosen == "undefined") {
return -1;
} else return Chosen[ Math.floor(Math.random() * Chosen.length) ];
}

function DisallowPlay() {
PlayAllowed = false;
}

function AllowPlay() {
PlayAllowed = true;
}

function ShowTile(Row, Col) {
var TileImage;
var Player = PlayGround[Row][Col];

if (Player == eX) TileImage = TileXWImage
else if (Player == eO) TileImage = TileOWImage
else TileImage = TileEWImage;
window.document.images['D.'+Row.toString()+'.'+Col.toString()].src = TileImage.src;
}

function ShowTileHi(Row, Col) {
var TileImage;
var Player = PlayGround[Row][Col];

if (Player == eX) TileImage = TileXBImage
else if (Player == eO) TileImage = TileOBImage
else TileImage = TileEWImage;
window.document.images['D.'+Row.toString()+'.'+Col.toString()].src = TileImage.src;
}

function ShowHint() {
if (PlayAllowed) {
if (HintShownCol >= 0) {
ShowTile(HintShownRow, HintShownCol);
}
var Chosen = ChoseMove(MaxDepth, eO);
if (Chosen >= 0) {
HintShownRow = GetRow(Chosen);
HintShownCol = GetCol(Chosen);
window.document.images['D.'+HintShownRow.toString()+'.'+HintShownCol.toString()].src = TileHintImage.src;
} else {
HintShownRow = -1;
HintShownCol = -1;
}
}
}

function PutTile(Row, Col, Player) {
PlayGround[Row][Col] = Player;
if (LastPlayedCol >= 0) {
ShowTile(LastPlayedRow, LastPlayedCol);
}
ShowTileHi(Row, Col, Player);
LastPlayedCol = Col;
LastPlayedRow = Row;
++TilesPlayed;
var Result = UpdateLines(Row, Col);
if ((!Result) && (TilesPlayed >= DeskCols * DeskRows)) {
if (!AutoPlaying)
window.alert('Unentschieden');
Result = true;
}
return Result;
}

function Play(Row, Col) {
if (PlayAllowed && (PlayGround[Row][Col] == 0)) {
DisallowPlay();
if (HintShownCol >= 0) {
ShowTile(HintShownRow, HintShownCol);
HintShownCol = -1;
HintShownRow = -1;
}
if (!PutTile(Row, Col, eO)) {
PendingTimeout = window.setTimeout("ComputerPlay()", 100);
}
}
}

function ComputerPlay() {
var Chosen = ChoseMove(MaxDepth, eX);
if (Chosen >= 0) {
var Row = GetRow(Chosen);
var Col = GetCol(Chosen);
if (!PutTile(Row, Col, eX)) {
AllowPlay();
}
}
}

function AutoPlayX() {
var Chosen = ChoseMove(MaxDepth, eX);
if (Chosen >= 0) {
var Row = GetRow(Chosen);
var Col = GetCol(Chosen);
if (!PutTile(Row, Col, eX)) {
PendingTimeout = window.setTimeout("AutoPlayO()", 100);
}
}
}

function AutoPlayO() {
var Chosen = ChoseMove(MaxDepth, eO);
if (Chosen >= 0) {
var Row = GetRow(Chosen);
var Col = GetCol(Chosen);
if (!PutTile(Row, Col, eO)) {
PendingTimeout = window.setTimeout("AutoPlayX()", 100);
}
}
}

function DemoGame() {
ResetGame();
DisallowPlay();
AutoPlaying = true;
AutoPlayO();
}

function StartX() {
ResetGame();
ComputerPlay();
}

function SorryGame() {
document.writeln('<p><b>Sorry<\/b>, unser Dynamic HTML Spiel kann in Ihrem Browser nicht gestartet werden!<\/p>');
}

function YouStart() {
document.writeln('<p><a href="javascript:ResetGame()">Neues&nbsp;' +
'Spiel<\/a>&nbsp;&nbsp;&nbsp;Sie "O" beginnen<\/p>');
}

function WeStart() {
document.writeln('<p><a href="javascript:StartX()">Neues&nbsp;' +
'Spiel<\/a>&nbsp;&nbsp;&nbsp;DBUS! Deutschland "X" beginnt<\/p>');
}

function DemoStart() {
document.writeln('<p><a href="javascript:DemoGame()">Demo<\/a>&nbsp;&nbsp;&nbsp;Ihr&nbsp;' +
'Computer gegen DBUS! Deutschland<\/p>');
}

function FutureStart() {
document.writeln('<p><a href="javascript:ShowHint()">Tip<\/a>&nbsp;&nbsp;&nbsp;DBUS!&nbsp;' +
'Deutschland hilft Ihnen und schaut in die Zukunft<\/p>');
}

function CreateDeskTable(RowCount, ColCount) {
document.writeln('<table border=0 cellpadding=0 cellspacing=0>');
for (var i = 0; i < RowCount; ++i) {
document.writeln('  <tr>');
for (var j = 0; j < ColCount; ++j) {
document.writeln(
'<TD><A HREF="javascript:Play(' + i.toString() + ',' + j.toString() + ')">' +
'<IMG border=0 height=20 '+
'name="D.'+i.toString()+'.'+j.toString()+'" ' +
'src="ew.gif"' +
' width=20 ></A></TD>');
}
document.writeln('<TD><IMG border=0 height=20 src="bp.gif" width=1></TD>');
document.writeln('</tr>');
}
document.writeln('  <tr><td colspan="' + (ColCount+1).toString() + '">'+
'<IMG border=0 height=1 width=' + (ColCount*20+1).toString() +
' src="bp.gif"></td></tr>');
document.writeln('</table>');
}
//-->
