Compare commits
3 commits
9107c557af
...
8020d30d6b
Author | SHA1 | Date | |
---|---|---|---|
8020d30d6b | |||
05c935d3fa | |||
de2884c16d |
1 changed files with 59 additions and 5 deletions
|
@ -8,6 +8,11 @@ import { State } from "./State.js";
|
||||||
*/
|
*/
|
||||||
export class Game
|
export class Game
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* The number of chips required for a win.
|
||||||
|
*/
|
||||||
|
static #count = 4;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The width of the board.
|
* The width of the board.
|
||||||
*/
|
*/
|
||||||
|
@ -74,6 +79,50 @@ export class Game
|
||||||
return this.state.board;
|
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.
|
* Dumps the state of the game.
|
||||||
*
|
*
|
||||||
|
@ -189,7 +238,9 @@ export class Game
|
||||||
{
|
{
|
||||||
className: this.state.currentPlayer
|
className: this.state.currentPlayer
|
||||||
},
|
},
|
||||||
`It's player "${Constants.PLAYER_NAMES[this.state.currentPlayer]}"s turn`
|
this.winner ?
|
||||||
|
`Player ${Constants.PLAYER_NAMES[this.winner]} wins!` :
|
||||||
|
`It's player "${Constants.PLAYER_NAMES[this.state.currentPlayer]}"s turn`
|
||||||
],
|
],
|
||||||
this.#log);
|
this.#log);
|
||||||
}
|
}
|
||||||
|
@ -208,12 +259,15 @@ export class Game
|
||||||
*/
|
*/
|
||||||
addChip(x, y)
|
addChip(x, y)
|
||||||
{
|
{
|
||||||
for (let i = Game.#height - 1; i >= 0; i--)
|
if (!this.winner)
|
||||||
{
|
{
|
||||||
if (this.board[i][x] === "")
|
for (let i = Game.#height - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
this.board[i][x] = this.state.currentPlayer;
|
if (this.board[i][x] === "")
|
||||||
return true;
|
{
|
||||||
|
this.board[i][x] = this.state.currentPlayer;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue