// ************************************************* //
// *** Game Definition (games/tictactoe/game.js) *** //
// ************************************************* //
// Create a new SpoookyJS game
var game = new Spoooky.Game;
game.initialize("Tic Tac Toe");
game.setDescription("Auf einem quadratischen, 3×3 Felder großen Spielfeld setzen die beiden Spieler " +
"abwechselnd ihr Zeichen auf ein freies Feld. Der Spieler, der als Erster drei Zeichen " +
"in eine Zeile, Spalte oder Diagonale setzen kann, gewinnt.");
game.setGameMode("PLACING");
// Setup Meta Entities
var player1 = game.createPlayer({
name: "Jan",
type: "HUMAN"
});
var player2 = game.createPlayer({
name: "Scully",
type: "ARTIFICIAL"
});
// Enable active learning of the agent
//player2.enableLearning();
var w = "gridCellWhiteWithBorder";
// Create the game board
game.setupGridWorld(3, 3, [
w, w, w,
w, w, w,
w, w, w
]);
// Add entity blueprints to the game to use them ingame
var black = game.addBlueprint(player2, Spoooky.Blueprints.TICTACTOE.entities.black),
white = game.addBlueprint(player1, Spoooky.Blueprints.TICTACTOE.entities.white);
game.addEntitiesToGameBoard([
0, 0, 0,
0, 0, 0,
0, 0, 0
]);
// Set the player who will start the game
game.setPlayer(player1);
// Game goals for tic tac toe
// Player 1 has three entities in a row
game.addGameRuleAtom({
atomName : "Player1: Three entities in a row",
atomFunction : "Player Has Number Of Entities In Row",
atomArguments : {
number : 3,
playerID : player1.getID(),
entityID : white.typeID
}
});
game.assembleGameRule({
name : "Player 1 has three entities in a row",
atoms : ["Player1: Three entities in a row"]
});
game.connectGameRuleConsequences({
ruleName : "Player 1 has three entities in a row",
consequences : [{
jobName: "Stop the Game",
jobFunction: "Stop Game"
}, {
jobName: "Output winning Message for player 1",
jobFunction: "Print Game Process",
jobArguments: "Spieler 1 gewinnt!"
}, {
jobName: "Set the Winner of the Game",
jobFunction: "Set Winner",
jobArguments: player1.getID()
}]});
// Player 1 has three entities in a column
game.addGameRuleAtom({
atomName : "Player1: Three entities in a column",
atomFunction : "Player Has Number Of Entities In Column",
atomArguments : {
number : 3,
playerID : player1.getID(),
entityID : white.typeID
}
});
game.assembleGameRule({
name : "Player 1 has three entities in a column",
atoms : ["Player1: Three entities in a column"]
});
game.connectGameRuleConsequences({
ruleName : "Player 1 has three entities in a column",
consequences : [{
jobName: "Stop the Game",
jobFunction: "Stop Game"
}, {
jobName: "Output winning Message for player 1",
jobFunction: "Print Game Process",
jobArguments: "Spieler 1 gewinnt!"
}, {
jobName: "Set the Winner of the Game",
jobFunction: "Set Winner",
jobArguments: player1.getID()
}]});
// Player 1 has three entities diagonally
game.addGameRuleAtom({
atomName : "Player1: Three entities diagonally",
atomFunction : "Player Has Number Of Entities Diagonally",
atomArguments : {
number : 3,
playerID : player1.getID(),
entityID : white.typeID
}
});
game.assembleGameRule({
name : "Player 1 has three entities diagonally",
atoms : ["Player1: Three entities diagonally"]
});
game.connectGameRuleConsequences({
ruleName : "Player 1 has three entities diagonally",
consequences : [{
jobName: "Stop the Game",
jobFunction: "Stop Game"
}, {
jobName: "Output winning Message for player 1",
jobFunction: "Print Game Process",
jobArguments: "Spieler 1 gewinnt!"
}, {
jobName: "Set the Winner of the Game",
jobFunction: "Set Winner",
jobArguments: player1.getID()
}]});
// Game Goals For Player 2
// Player 2 has three entities in a row
game.addGameRuleAtom({
atomName : "Player2: Three entities in a row",
atomFunction : "Player Has Number Of Entities In Row",
atomArguments : {
number : 3,
playerID : player2.getID(),
entityID : black.typeID
}
});
game.assembleGameRule({
name : "Player 2 has three entities in a row",
atoms : ["Player2: Three entities in a row"]
});
game.connectGameRuleConsequences({
ruleName : "Player 2 has three entities in a row",
consequences : [{
jobName: "Stop the Game",
jobFunction: "Stop Game"
}, {
jobName: "Output winning Message for player 2",
jobFunction: "Print Game Process",
jobArguments: "Spieler 2 gewinnt!"
}, {
jobName: "Set the Winner of the Game",
jobFunction: "Set Winner",
jobArguments: player2.getID()
}]});
// Player 2 has three entities in a column
game.addGameRuleAtom({
atomName : "Player2: Three entities in a column",
atomFunction : "Player Has Number Of Entities In Column",
atomArguments : {
number : 3,
playerID : player2.getID(),
entityID : black.typeID
}
});
game.assembleGameRule({
name : "Player 2 has three entities in a column",
atoms : ["Player2: Three entities in a column"]
});
game.connectGameRuleConsequences({
ruleName : "Player 2 has three entities in a column",
consequences : [{
jobName: "Stop the Game",
jobFunction: "Stop Game"
}, {
jobName: "Output winning Message for player 2",
jobFunction: "Print Game Process",
jobArguments: "Spieler 2 gewinnt!"
}, {
jobName: "Set the Winner of the Game",
jobFunction: "Set Winner",
jobArguments: player2.getID()
}]});
// Player 2 has three entities diagonally
game.addGameRuleAtom({
atomName : "Player2: Three entities diagonally",
atomFunction : "Player Has Number Of Entities Diagonally",
atomArguments : {
number : 3,
playerID : player2.getID(),
entityID : black.typeID
}
});
game.assembleGameRule({
name : "Player 2 has three entities diagonally",
atoms : ["Player2: Three entities diagonally"]
});
game.connectGameRuleConsequences({
ruleName : "Player 2 has three entities diagonally",
consequences : [{
jobName: "Stop the Game",
jobFunction: "Stop Game"
}, {
jobName: "Output winning Message for player 2",
jobFunction: "Print Game Process",
jobArguments: "Spieler 2 gewinnt!"
}, {
jobName: "Set the Winner of the Game",
jobFunction: "Set Winner",
jobArguments: player2.getID()
}]});
// Draw rule
game.addGameRuleAtom({
atomName : "Every Field Has Been Played",
atomFunction : "No Empty Field On The Game Board"
});
game.addGameRuleAtom({
atomName : "Game State is INGAME",
atomFunction : "Game State Is",
atomArguments : "INGAME"
});
game.assembleGameRule({
name : "Draw If Game Board Is Full",
atoms : ["Every Field Has Been Played",
"Game State is INGAME"]
});
game.connectGameRuleConsequences({
ruleName : "Draw If Game Board Is Full",
consequences : [{
jobName: "Stop the Game",
jobFunction: "Stop Game"
}, {
jobName: "Output Draw Message",
jobFunction: "Print Game Process",
jobArguments: "Unentschieden!"
}]});
// ***************************** //
// *** Interface / AngularJS *** //
// ***************************** //
var SpoookyGame = new Spoooky.AngularWrapper({
game : game,
cellWidth : 165,
cellHeight : 165 });