Add a method for checking whether there is a winner
This commit is contained in:
parent
9107c557af
commit
de2884c16d
1 changed files with 49 additions and 0 deletions
|
@ -8,6 +8,11 @@ import { State } from "./State.js";
|
|||
*/
|
||||
export class Game
|
||||
{
|
||||
/**
|
||||
* The number of chips required for a win.
|
||||
*/
|
||||
static #count = 4;
|
||||
|
||||
/**
|
||||
* The width of the board.
|
||||
*/
|
||||
|
@ -74,6 +79,50 @@ export class Game
|
|||
return this.state.board;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the id of the player that is winning.
|
||||
*
|
||||
* @type {CellOwner}
|
||||
*/
|
||||
get winner()
|
||||
{
|
||||
for (let yOffset = 0; yOffset <= 1; yOffset++)
|
||||
{
|
||||
for (let xOffset = (yOffset === 1) ? -1 : 1; xOffset <= 1; xOffset++)
|
||||
{
|
||||
let lowerBound = Math.max(0, xOffset * (Game.#count - 1) * -1);
|
||||
let upperBound = Math.min(Game.#width, Game.#width - (xOffset * (Game.#count - 1)));
|
||||
|
||||
for (let y = 0; y < (Game.#height - yOffset * (Game.#count - 1)); y++)
|
||||
{
|
||||
for (let x = lowerBound; x < upperBound; x++)
|
||||
{
|
||||
/**
|
||||
* @type {CellOwner[]}
|
||||
*/
|
||||
let tokens = [];
|
||||
|
||||
for (let i = 0; i < Game.#count; i++)
|
||||
{
|
||||
tokens.push(this.board[y + i * yOffset][x + i * xOffset]);
|
||||
}
|
||||
|
||||
let player = tokens[0];
|
||||
|
||||
if (
|
||||
player !== "" &&
|
||||
tokens.every((token) => token === player))
|
||||
{
|
||||
return player;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dumps the state of the game.
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue