my second commit
This commit is contained in:
parent
547b5de903
commit
2d68715003
|
@ -0,0 +1,28 @@
|
||||||
|
module.exports = {
|
||||||
|
env: {
|
||||||
|
"browser": true,
|
||||||
|
"jest": true,
|
||||||
|
"node": true,
|
||||||
|
},
|
||||||
|
extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
plugins: ['@typescript-eslint'],
|
||||||
|
rules: {
|
||||||
|
"no-unused-vars": "off",
|
||||||
|
"@typescript-eslint/no-inferrable-types" : "off",
|
||||||
|
"@typescript-eslint/no-unused-vars": "off",
|
||||||
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
|
"array-callback-return": "error",
|
||||||
|
"consistent-return": "error",
|
||||||
|
"eqeqeq": "error",
|
||||||
|
"no-eval": "error",
|
||||||
|
"no-fallthrough": "error",
|
||||||
|
"no-mixed-spaces-and-tabs": "error",
|
||||||
|
"no-undef": "error",
|
||||||
|
"no-unreachable": "error",
|
||||||
|
"no-var": "error",
|
||||||
|
"prefer-const": "error",
|
||||||
|
"semi": "error",
|
||||||
|
},
|
||||||
|
root: true,
|
||||||
|
};
|
|
@ -0,0 +1,5 @@
|
||||||
|
dist/*
|
||||||
|
.parcel-cache
|
||||||
|
.vscode/*
|
||||||
|
node_modules
|
||||||
|
package-lock.json
|
|
@ -0,0 +1,8 @@
|
||||||
|
parcel:
|
||||||
|
npm run parcel src/player.html src/*.ts
|
||||||
|
|
||||||
|
uncrash:
|
||||||
|
pkill -9 node
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf .parcel-cache dist
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"name": "free-carc-viewer",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"scripts": {
|
||||||
|
"build": "npx parcel build --no-source-maps --public-url '.' src/player.html",
|
||||||
|
"parcel": "npx parcel src/player.html",
|
||||||
|
"eslint": "npx eslint -c .eslintrc.cjs src",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://thor.enseirb-matmeca.fr/ruby/repositories/11007"
|
||||||
|
},
|
||||||
|
"source": "src/player.html",
|
||||||
|
"author": "David Renault",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/node": "^20.12.5",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^7.5.0",
|
||||||
|
"@typescript-eslint/parser": "^7.5.0",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"parcel": "^2.12.0",
|
||||||
|
"typescript": "^5.4.4"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,172 @@
|
||||||
|
/**
|
||||||
|
* return the WebBoard information
|
||||||
|
*/
|
||||||
|
function getWebBoardInfo() {
|
||||||
|
|
||||||
|
const gameGrid = document.getElementById("board");
|
||||||
|
const topDiv = document.getElementById("line0");
|
||||||
|
if (!gameGrid || !topDiv)
|
||||||
|
throw Error("The game grid is not initialized. Can't proceed");
|
||||||
|
|
||||||
|
const nbColumn: number = topDiv.childElementCount;
|
||||||
|
const nbLines: number = gameGrid.childElementCount;
|
||||||
|
return {gameGrid, topDiv, nbLines, nbColumns: nbColumn};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the size of each div to have them fill the entire screen
|
||||||
|
*/
|
||||||
|
function resizeBoard(staySquare: boolean = true) {
|
||||||
|
|
||||||
|
const gameInfo = getWebBoardInfo();
|
||||||
|
const unit = window.innerHeight > window.innerWidth ? "vw" : "vh";
|
||||||
|
const maxPercent = Math.min(100 / gameInfo.nbColumns, 100 / gameInfo.nbLines);
|
||||||
|
|
||||||
|
for (let i = 0; i < gameInfo.nbLines; i++) {
|
||||||
|
const line = document.getElementById("line" + i);
|
||||||
|
if (!line)
|
||||||
|
throw Error("Error while resizing the board, the line " + i + "does not exist");
|
||||||
|
line.style.height = staySquare ? maxPercent + unit : 100 / gameInfo.nbLines + "%";
|
||||||
|
line.style.width = "100%";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < gameInfo.nbColumns; j++) {
|
||||||
|
const tiles = document.getElementsByClassName("tile" + j);
|
||||||
|
if (!tiles)
|
||||||
|
throw Error("Can't find the tile");
|
||||||
|
for (let k = 0; k < tiles.length; k++) {
|
||||||
|
const elm = tiles[k] as HTMLElement;
|
||||||
|
elm.style.width = staySquare ? maxPercent + unit : 100 / gameInfo.nbColumns + "%";
|
||||||
|
elm.style.height = "100%";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create a div where district could be placed
|
||||||
|
* @param id
|
||||||
|
* @param lineMode default size to have a smooth animation
|
||||||
|
*/
|
||||||
|
function createDiv(id: number, lineMode: boolean) {
|
||||||
|
const newDiv = document.createElement("div");
|
||||||
|
if (lineMode) {
|
||||||
|
newDiv.style.height = "0";
|
||||||
|
newDiv.style.width = '100%';
|
||||||
|
} else {
|
||||||
|
newDiv.style.height = "100%";
|
||||||
|
newDiv.style.width = "0";
|
||||||
|
}
|
||||||
|
newDiv.className = "gridTile tile" + id;
|
||||||
|
return newDiv;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create a new line of divs
|
||||||
|
* @param id the lineID.
|
||||||
|
* @param nbColumn the number of divs that will be added to the line
|
||||||
|
*/
|
||||||
|
function createRow(id: number, nbColumn: number) {
|
||||||
|
|
||||||
|
const newLine = document.createElement("div");
|
||||||
|
newLine.id = "line" + id;
|
||||||
|
newLine.className = "gridLine";
|
||||||
|
newLine.style.width = "100%";
|
||||||
|
newLine.style.height = "0";
|
||||||
|
|
||||||
|
for (let i = 0; i < nbColumn; i++) {
|
||||||
|
newLine.append(createDiv(i, true));
|
||||||
|
}
|
||||||
|
return newLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new line at the top or
|
||||||
|
*/
|
||||||
|
function addRowAbove() {
|
||||||
|
|
||||||
|
const gameInfo = getWebBoardInfo();
|
||||||
|
// move existing row down
|
||||||
|
for (let i = gameInfo.nbLines - 1; i >= 0; i--) {
|
||||||
|
const l = document.getElementById("line" + i);
|
||||||
|
if (!l)
|
||||||
|
throw Error("The game grid is not initialized. Can't proceed");
|
||||||
|
l.id = "line" + (i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const newLine = createRow(0, gameInfo.nbColumns);
|
||||||
|
|
||||||
|
gameInfo.gameGrid.prepend(newLine);
|
||||||
|
setTimeout(resizeBoard, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
function addRowUnder() {
|
||||||
|
|
||||||
|
const gameInfo = getWebBoardInfo();
|
||||||
|
|
||||||
|
const newLine = createRow(gameInfo.nbLines, gameInfo.nbColumns);
|
||||||
|
gameInfo.gameGrid.appendChild(newLine);
|
||||||
|
setTimeout(resizeBoard, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add a column at the right or let
|
||||||
|
*/
|
||||||
|
function addColumnLeft() {
|
||||||
|
const gameInfo = getWebBoardInfo();
|
||||||
|
|
||||||
|
for (let j = gameInfo.nbColumns - 1; j >= 0; j--) {
|
||||||
|
|
||||||
|
const tiles = document.getElementsByClassName("tile" + j);
|
||||||
|
if (!tiles)
|
||||||
|
throw Error("Can't find the tile");
|
||||||
|
for (let k = 0; k < tiles.length; k++) {
|
||||||
|
const elm = tiles[k] as HTMLElement;
|
||||||
|
elm.className = "gridTile tile" + (j + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < gameInfo.nbLines; i++) {
|
||||||
|
document.getElementById("line" + i)?.prepend(createDiv(0, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(resizeBoard, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
function addColumnRight() {
|
||||||
|
const gameInfo = getWebBoardInfo();
|
||||||
|
|
||||||
|
for (let i = 0; i < gameInfo.nbLines; i++) {
|
||||||
|
document.getElementById("line" + i)?.append(createDiv(gameInfo.nbColumns, false));
|
||||||
|
}
|
||||||
|
setTimeout(resizeBoard, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* reset the WebBoard
|
||||||
|
*/
|
||||||
|
function clearBoard() {
|
||||||
|
const grid = document.getElementById("gameGrid");
|
||||||
|
if (!grid)
|
||||||
|
throw Error("error");
|
||||||
|
grid.innerHTML = "";
|
||||||
|
for (let i = 0; i < 6; i++) {
|
||||||
|
const line = document.createElement("div");
|
||||||
|
line.id = "line" + i;
|
||||||
|
line.className = "gridLine";
|
||||||
|
|
||||||
|
for (let j = 0; j < 6; j++) {
|
||||||
|
const tile = document.createElement("div");
|
||||||
|
tile.className = "gridTile tile" + j;
|
||||||
|
line.append(tile);
|
||||||
|
}
|
||||||
|
grid.append(line);
|
||||||
|
}
|
||||||
|
resizeBoard();
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
addColumnRight, addColumnLeft, addRowUnder, addRowAbove, resizeBoard, clearBoard, getWebBoardInfo
|
||||||
|
};
|
|
@ -0,0 +1,80 @@
|
||||||
|
import {setGameInfo} from "./moooove";
|
||||||
|
import {resizeBoard} from "./Board";
|
||||||
|
|
||||||
|
type CrashGroup = {
|
||||||
|
name: string;
|
||||||
|
passed: number;
|
||||||
|
status: string;
|
||||||
|
total: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
type CommandOpts = {
|
||||||
|
continue: boolean;
|
||||||
|
record_on: string;
|
||||||
|
timeout: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
type CrashCommand = {
|
||||||
|
cause: string;
|
||||||
|
cmd: string[];
|
||||||
|
code: number;
|
||||||
|
key: string[];
|
||||||
|
opts: CommandOpts;
|
||||||
|
status: string;
|
||||||
|
stderr: string;
|
||||||
|
stdout: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type CrashReport = {
|
||||||
|
commands: CrashCommand[];
|
||||||
|
groups: CrashGroup[];
|
||||||
|
player_1: string;
|
||||||
|
player_2: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type Move = {
|
||||||
|
qsrc: number;
|
||||||
|
qdst: number;
|
||||||
|
adst: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
type Game = {
|
||||||
|
seed: number;
|
||||||
|
type: string;
|
||||||
|
player0: string;
|
||||||
|
player1: string;
|
||||||
|
queens0: number[];
|
||||||
|
queens1: number[];
|
||||||
|
moves: Move[];
|
||||||
|
winner?: string;
|
||||||
|
cause?: string;
|
||||||
|
crashReport?: CrashReport;
|
||||||
|
};
|
||||||
|
|
||||||
|
let games: Game[] = [];
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
games = JSON.parse(document.getElementById("jsonData")!.textContent!) as Game[];
|
||||||
|
const crashes = JSON.parse(document.getElementById("errors")!.textContent!) as (CrashReport & { log: Game; })[];
|
||||||
|
const timeouts: CrashReport[] = [];
|
||||||
|
crashes.forEach((c) => {
|
||||||
|
const {log: gameLog, ...crashReportWithoutGame} = c;
|
||||||
|
if (typeof (gameLog as unknown) === "string") { // Timeout case...
|
||||||
|
timeouts.push(crashReportWithoutGame);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gameLog.crashReport = crashReportWithoutGame;
|
||||||
|
games.push(gameLog);
|
||||||
|
});
|
||||||
|
console.log(games);
|
||||||
|
console.log(timeouts);
|
||||||
|
console.log(crashes);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = ((e) => {
|
||||||
|
main();
|
||||||
|
setGameInfo();
|
||||||
|
resizeBoard();
|
||||||
|
});
|
||||||
|
|
||||||
|
export {games};
|
|
@ -0,0 +1,153 @@
|
||||||
|
import {games} from "./index";
|
||||||
|
import {addColumnLeft, addColumnRight, addRowAbove, addRowUnder} from "./Board";
|
||||||
|
|
||||||
|
type Move2 = {
|
||||||
|
player_id: number;
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
let min_x = 0;
|
||||||
|
let max_x = 0;
|
||||||
|
let min_y = 0;
|
||||||
|
let max_y = 0;
|
||||||
|
let gameIndex = 0;
|
||||||
|
let gameMoveId = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* change the displayed game info to the previous/next game
|
||||||
|
*/
|
||||||
|
function switchPrevGame() {
|
||||||
|
if (gameIndex > 0)
|
||||||
|
gameIndex--;
|
||||||
|
setGameInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
function switchNextGame() {
|
||||||
|
if (gameIndex < games.length - 1)
|
||||||
|
gameIndex++;
|
||||||
|
setGameInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* change game info value to gameIndex game
|
||||||
|
*/
|
||||||
|
function setGameInfo() {
|
||||||
|
(<HTMLElement>document.getElementById("seed_disp")).innerText = games[gameIndex].seed + "";
|
||||||
|
(<HTMLElement>document.getElementById("player0_disp")).innerText = games[gameIndex].player0 + "";
|
||||||
|
(<HTMLElement>document.getElementById("player1_disp")).innerText = games[gameIndex].player1 + "";
|
||||||
|
(<HTMLElement>document.getElementById("winner_disp")).innerText = games[gameIndex].winner + "";
|
||||||
|
(<HTMLElement>document.getElementById("cause_disp")).innerText = games[gameIndex].cause + "";
|
||||||
|
gameMoveId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function nextMove() {
|
||||||
|
if (games[gameIndex]["moves"][gameMoveId + 1] !== undefined) {
|
||||||
|
gameMoveId++;
|
||||||
|
addMove(games[gameIndex]["moves"][gameMoveId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function prevMove() {
|
||||||
|
if (gameMoveId > 0) {
|
||||||
|
removeMove(games[gameIndex]["moves"][gameMoveId]);
|
||||||
|
gameMoveId--;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function tolastMove() {
|
||||||
|
while (games[gameIndex]["moves"][gameMoveId + 1] !== undefined) {
|
||||||
|
nextMove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toFirstMove() {
|
||||||
|
while (gameMoveId > 0) {
|
||||||
|
prevMove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns if 0 x is in intervall [a, b], a and b included, -1 if x < a, 1 if x > b
|
||||||
|
* @param x
|
||||||
|
* @param a
|
||||||
|
* @param b
|
||||||
|
*/
|
||||||
|
function inInterval(x: number, a: number, b: number) {
|
||||||
|
return x < a ? -1 : x > b ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* resize the board and add the move to it
|
||||||
|
* @param move
|
||||||
|
*/
|
||||||
|
function addMove(move: Move2) {
|
||||||
|
switch (inInterval(move.x, min_x, max_x)) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
max_x++;
|
||||||
|
addColumnRight();
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
min_x--;
|
||||||
|
addColumnLeft();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (inInterval(move.y, min_y, max_y)) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
max_y++;
|
||||||
|
addRowUnder();
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
min_y--;
|
||||||
|
addRowAbove();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
placeMove(move);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* there is the real adding part
|
||||||
|
* @param move
|
||||||
|
*/
|
||||||
|
function placeMove(move: Move2) {
|
||||||
|
console.log(`real coords: ${move.x - min_x} ${move.y - min_y}`);
|
||||||
|
const line = <HTMLElement>document.getElementById("line" + (move.y - min_y));
|
||||||
|
const box = <HTMLElement>line.children[move.x - min_x];
|
||||||
|
box.style.background = 'darkblue';
|
||||||
|
box.innerText = gameMoveId + "-> (" + move.x + ", " + move.y + ")";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeMove(move: Move2) {
|
||||||
|
console.log(`real coords: ${move.x - min_x} ${move.y - min_y}`);
|
||||||
|
const line = <HTMLElement>document.getElementById("line" + (move.y - min_y));
|
||||||
|
const box = <HTMLElement>line.children[move.x - min_x];
|
||||||
|
box.innerText = "";
|
||||||
|
box.style.background = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
const prevGameButton = (<HTMLElement>document.getElementById("prevGameButton"));
|
||||||
|
const nextGameButton = (<HTMLElement>document.getElementById("nextGameButton"));
|
||||||
|
|
||||||
|
const nextMoveButton = (<HTMLElement>document.getElementById("nextMoveButton"));
|
||||||
|
const prevMoveButton = (<HTMLElement>document.getElementById("prevMoveButton"));
|
||||||
|
|
||||||
|
const lastMoveButton = (<HTMLElement>document.getElementById("lastMoveButton"));
|
||||||
|
const firstMoveButton = (<HTMLElement>document.getElementById("firstMoveButton"));
|
||||||
|
|
||||||
|
prevGameButton.addEventListener("click", switchPrevGame);
|
||||||
|
nextGameButton.addEventListener("click", switchNextGame);
|
||||||
|
|
||||||
|
nextMoveButton.addEventListener("click", nextMove);
|
||||||
|
prevMoveButton.addEventListener("click", prevMove);
|
||||||
|
|
||||||
|
lastMoveButton.addEventListener("click", tolastMove);
|
||||||
|
firstMoveButton.addEventListener("click", toFirstMove);
|
||||||
|
|
||||||
|
export {setGameInfo, switchPrevGame};
|
|
@ -0,0 +1,183 @@
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<!--<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">-->
|
||||||
|
<link rel="stylesheet" href="../bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="./style.css">
|
||||||
|
<script src="index.ts" type="module"></script>
|
||||||
|
<script src="moooove.ts" type="module"></script>
|
||||||
|
|
||||||
|
<title>Carcassonne Viewer</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="container-fluid bg-light">
|
||||||
|
<h1 id="title">Carcassonne viewer</h1>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-3 sidebar">
|
||||||
|
<ul class="list-group" id="games_list">
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-9">
|
||||||
|
<div id="game_container" class="row">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row viewer_controls">
|
||||||
|
<div class="col-lg-2"></div>
|
||||||
|
<div class="btn-group col-lg-8" role="group" aria-label="Basic example">
|
||||||
|
<button type="button" class="btn btn-secondary" id="prevGameButton">|<<<</button>
|
||||||
|
<button type="button" class="btn btn-secondary" id="firstMoveButton">|<<</button>
|
||||||
|
<button type="button" class="btn btn-secondary" id="prevMoveButton"><</button>
|
||||||
|
<button type="button" class="btn btn-secondary" id="nextMoveButton">></button>
|
||||||
|
<button type="button" class="btn btn-secondary" id="lastMoveButton">>>|</button>
|
||||||
|
<button type="button" class="btn btn-secondary" id="nextGameButton">>>>|</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-2"></div>
|
||||||
|
</div>
|
||||||
|
<table class="table table-striped table-sm" style="text-align: left; width: 100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th scope="row" style="width: 15%">Player 0</th>
|
||||||
|
<td id="player0_disp">player0</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Player 1</th>
|
||||||
|
<td id="player1_disp">player1</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Seed</th>
|
||||||
|
<td id="seed_disp">uéuéuéu</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Winner</th>
|
||||||
|
<td id="winner_disp">winner</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Cause</th>
|
||||||
|
<td id="cause_disp">cause</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="games">
|
||||||
|
<div id="board" class="board">
|
||||||
|
<div class=gridLine id="line0">
|
||||||
|
<div class="gridTile tile0"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="jsonData">
|
||||||
|
<pre>[
|
||||||
|
{
|
||||||
|
"seed": 1881916104,
|
||||||
|
"player0": "Teisipyte",
|
||||||
|
"player1": "Teisipyte",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": -1, "y": 0 }, { "id": 1, "x": -1, "y": 1 }, { "id": 0, "x": -2, "y": 1 }, { "id": 1, "x": -1, "y": 2 }, { "id": 0, "x": -3, "y": 1 }, { "id": 1, "x": -3, "y": 0 } ],
|
||||||
|
"winner": "??",
|
||||||
|
"cause": "Maximal number of moves reached (7), game is a draw"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"seed": 2130915275,
|
||||||
|
"player0": "Hippolyte",
|
||||||
|
"player1": "Full random player",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": 1, "y": 0 }, { "id": 1, "x": 8, "y": 4 }, { "id": 0, "x": 0, "y": -1 }, { "id": 1, "x": 8, "y": 8 }, { "id": 0, "x": 0, "y": -2 }, { "id": 1, "x": 2, "y": 0 } ],
|
||||||
|
"winner": "??",
|
||||||
|
"cause": "Maximal number of moves reached (7), game is a draw"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"seed": 2130915275,
|
||||||
|
"player0": "Full random player",
|
||||||
|
"player1": "Hippolyte",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": 4, "y": 8 }, { "id": 1, "x": 4, "y": 7 }, { "id": 0, "x": 6, "y": 8 }, { "id": 1, "x": 4, "y": 6 }, { "id": 0, "x": 3, "y": 2 }, { "id": 1, "x": 2, "y": 2 } ],
|
||||||
|
"winner": "??",
|
||||||
|
"cause": "Maximal number of moves reached (7), game is a draw"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"seed": 2130915275,
|
||||||
|
"player0": "Hippolyte",
|
||||||
|
"player1": "Full random player",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": 1, "y": 0 }, { "id": 1, "x": 8, "y": 4 }, { "id": 0, "x": 0, "y": -1 }, { "id": 1, "x": 8, "y": 8 }, { "id": 0, "x": 0, "y": -2 }, { "id": 1, "x": 2, "y": 0 } ],
|
||||||
|
"winner": "??",
|
||||||
|
"cause": "Maximal number of moves reached (7), game is a draw"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"seed": 2130915275,
|
||||||
|
"player0": "Full random player",
|
||||||
|
"player1": "Hippolyte",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": 4, "y": 8 }, { "id": 1, "x": 4, "y": 7 }, { "id": 0, "x": 6, "y": 8 }, { "id": 1, "x": 4, "y": 6 }, { "id": 0, "x": 3, "y": 2 }, { "id": 1, "x": 2, "y": 2 } ],
|
||||||
|
"winner": "??",
|
||||||
|
"cause": "Maximal number of moves reached (7), game is a draw"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"seed": 3336162595,
|
||||||
|
"player0": "Androdameia",
|
||||||
|
"player1": "Phoebe",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": -1, "y": 0 }, { "id": 1, "x": -2, "y": 0 }, { "id": 0, "x": 0, "y": -1 }, { "id": 1, "x": 1, "y": 0 }, { "id": 0, "x": 0, "y": -2 }, { "id": 1, "x": -1, "y": -2 } ],
|
||||||
|
"winner": "Phoebe",
|
||||||
|
"cause": "Victory on points for player Phoebe"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"seed": 1127192704,
|
||||||
|
"player0": "Androdameia",
|
||||||
|
"player1": "Full random player",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": -1, "y": 0 }, { "id": 1, "x": 9, "y": 5 }, { "id": 0, "x": 9, "y": 6 }, { "id": 1, "x": 0, "y": 7 }, { "id": 0, "x": 9, "y": 7 }, { "id": 1, "x": 3, "y": 0 } ],
|
||||||
|
"winner": "??",
|
||||||
|
"cause": "Maximal number of moves reached (7), game is a draw"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"seed": 1127192704,
|
||||||
|
"player0": "Full random player",
|
||||||
|
"player1": "Androdameia",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": 1, "y": 9 }, { "id": 1, "x": 2, "y": 9 }, { "id": 0, "x": 9, "y": 0 }, { "id": 1, "x": 1, "y": 8 }, { "id": 0, "x": 0, "y": 3 }, { "id": 1, "x": 2, "y": 10 } ],
|
||||||
|
"winner": "Androdameia",
|
||||||
|
"cause": "Victory on points for player Androdameia"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"seed": 1127192704,
|
||||||
|
"player0": "Androdameia",
|
||||||
|
"player1": "Full random player",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": -1, "y": 0 }, { "id": 1, "x": 9, "y": 5 }, { "id": 0, "x": 9, "y": 6 }, { "id": 1, "x": 0, "y": 7 }, { "id": 0, "x": 9, "y": 7 }, { "id": 1, "x": 3, "y": 0 } ],
|
||||||
|
"winner": "??",
|
||||||
|
"cause": "Maximal number of moves reached (7), game is a draw"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"seed": 1127192704,
|
||||||
|
"player0": "Full random player",
|
||||||
|
"player1": "Androdameia",
|
||||||
|
"moves": [ { "id": 4294967295, "x": 0, "y": 0 }, { "id": 0, "x": 1, "y": 9 }, { "id": 1, "x": 2, "y": 9 }, { "id": 0, "x": 9, "y": 0 }, { "id": 1, "x": 1, "y": 8 }, { "id": 0, "x": 0, "y": 3 }, { "id": 1, "x": 2, "y": 10 } ],
|
||||||
|
"winner": "Androdameia",
|
||||||
|
"cause": "Victory on points for player Androdameia"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="error_box" style="display: none">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="errors" style="background-color: #fee; display: visible">
|
||||||
|
<pre style="white-space: break-spaces">[
|
||||||
|
|
||||||
|
]</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1,23 @@
|
||||||
|
.board {
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
background: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gridTile {
|
||||||
|
border: 1px solid white;
|
||||||
|
color: white;
|
||||||
|
font-size: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gridLine {
|
||||||
|
width: 100%;
|
||||||
|
height: 200px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "es2020",
|
||||||
|
"target": "es2020",
|
||||||
|
"noImplicitAny": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"alwaysStrict": true,
|
||||||
|
"declaration": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"importHelpers": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noImplicitThis": true,
|
||||||
|
"outDir": "dist",
|
||||||
|
"strictNullChecks": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"types": [
|
||||||
|
"node"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src/**/*.ts"
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in New Issue