Skip to content

Commit

Permalink
Merge branch 'fix/no-detect-the-winner-when-the-pieces-are-distributed'
Browse files Browse the repository at this point in the history
  • Loading branch information
RomanFama592 committed Feb 14, 2024
2 parents b91d994 + 09d48be commit 815b571
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 69 deletions.
30 changes: 11 additions & 19 deletions src/assets/ts/constants.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { PlayersType, PosMovN } from "../types/types";
import type { PlayersType, PosMov } from "../types/types";


/* links */
Expand Down Expand Up @@ -26,24 +26,16 @@ export const defaultPlayers: PlayersType = [
{ symbol: '🔶', color: "#ffb861" }
]

export const movementSchemaN: PosMovN = {
top: [0, 1],
bottom: [2, 1],
left: [1, 0],
right: [1, 2],
leftTop:[0, 0],
leftBottom:[2, 0],
rightTop:[0, 2],
rightBottom:[2, 2]
export const movementSchema: PosMov = {
vertical: [[0, 1], [2, 1]],
horizontal: [[1, 0], [1, 2]],
diagonalLtRb: [[0, 0], [2, 2]],
diagonalRtLb: [[0, 2], [2, 0]]
}

export const schemaSumsN: PosMovN = {
top: [-1, 0],
bottom: [1, 0],
left: [0, -1],
right: [0, 1],
leftTop:[-1, -1],
leftBottom:[1, -1],
rightTop:[-1, 1],
rightBottom:[1, 1]
export const schemaSums: PosMov = {
vertical: [[-1, 0], [1, 0]],
horizontal: [[0, -1], [0, 1]],
diagonalLtRb: [[-1, -1], [1, 1]],
diagonalRtLb: [[-1, 1], [1, -1]]
}
74 changes: 42 additions & 32 deletions src/assets/ts/functions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { BoardType, PlayersType, GeneratedOptions, GridOfBoardType, SizeDeclarationBoard, BucketTypeN, PosMovN } from "@/assets/types/types.ts"
import { movementSchemaN, schemaSumsN } from "./constants";
import type { BoardType, PlayersType, GeneratedOptions, GridOfBoardType, SizeDeclarationBoard, PosMov, BucketType } from "@/assets/types/types.ts"
import { movementSchema, schemaSums } from "./constants";

//TODO: do tests

Expand Down Expand Up @@ -124,7 +124,6 @@ function get3x3GridOfABoard(

const grid3x3: GridOfBoardType = [];


if (
!board[0]?.length
|| initialRow < 0
Expand All @@ -149,31 +148,40 @@ function get3x3GridOfABoard(
return grid3x3;
}

function evalIfBucketFull(winningLineLength: number, bucket: BucketTypeN): SizeDeclarationBoard[][] | null {
type keysBucket = keyof BucketTypeN
function evalIfBucketFull(winningLineLength: number, bucket: BucketType): SizeDeclarationBoard[][] | null {
type keysBucket = keyof BucketType

const winningPlays = []

for (const orientation in bucket) {
const orientationArray = bucket[orientation as keysBucket]

if (orientationArray.length >= winningLineLength) {
if (orientationArray.length >= winningLineLength - 1) {
winningPlays.push(orientationArray)
}
}

return winningPlays.length > 0 ? winningPlays : null
}

function searchInSchemaMovement<T extends keyof PosMovN>(positionToSearch: SizeDeclarationBoard): T | null {
for (const orientation in movementSchemaN) {
const [row, col] = movementSchemaN[orientation as T];
function searchInSchemaMovement<T extends keyof PosMov>(positionToSearch: SizeDeclarationBoard): { orientation: T; position: 0 | 1 } | null {
for (const orientation in movementSchema) {
const positions = movementSchema[orientation as T];

const foundPosition = positions.find(
([row, col]) => (
row === positionToSearch[0] && col === positionToSearch[1]
));

if (row === positionToSearch[0]
&& col === positionToSearch[1]) return orientation as T
if (foundPosition) {
return {
orientation: orientation as T,
position: positions.indexOf(foundPosition) as 0 | 1
};
}
}

return null;
return null
}

export const checkWinner = (
Expand All @@ -182,15 +190,11 @@ export const checkWinner = (
winningLineLength: number
): SizeDeclarationBoard[][] | null => {

const bucket: BucketTypeN = {
top: [],
bottom: [],
left: [],
right: [],
leftTop: [],
rightTop: [],
leftBottom: [],
rightBottom: [],
const bucket: BucketType = {
vertical: [],
horizontal: [],
diagonalLtRb: [],
diagonalRtLb: []
}

const mainPiece: number = board[piecePositionAbs[0]]![piecePositionAbs[1]]!
Expand All @@ -203,37 +207,43 @@ export const checkWinner = (

grid.forEach((row, indexLocalRow) => {
row.forEach((borderingPiece, indexLocalCol) => {
//if the position piece in the loop is equal to the main piece

if (indexLocalCol === 1 && indexLocalRow === 1) return;

if (borderingPiece !== mainPiece) return;

const orientation: keyof PosMovN | null = searchInSchemaMovement([indexLocalRow, indexLocalCol]);
const direction = searchInSchemaMovement([indexLocalRow, indexLocalCol]);

if (direction === null) return;

if (orientation === null) return;
const { orientation, position } = direction

let currentPiece: number | null | undefined = borderingPiece

let currentPiecePositionAbs: SizeDeclarationBoard = [
piecePositionAbs[0] + schemaSumsN[orientation][0],
piecePositionAbs[1] + schemaSumsN[orientation][1]
piecePositionAbs[0] + schemaSums[orientation][position][0],
piecePositionAbs[1] + schemaSums[orientation][position][1]
]

bucket[orientation].push(piecePositionAbs)

while (currentPiece === mainPiece) {
bucket[orientation].push(currentPiecePositionAbs)

currentPiecePositionAbs = [
currentPiecePositionAbs[0] + schemaSumsN[orientation][0],
currentPiecePositionAbs[1] + schemaSumsN[orientation][1]
currentPiecePositionAbs[0] + schemaSums[orientation][position][0],
currentPiecePositionAbs[1] + schemaSums[orientation][position][1]
]

currentPiece = board[currentPiecePositionAbs[0]]?.[currentPiecePositionAbs[1]]
}
})
})

return evalIfBucketFull(winningLineLength, bucket)
const result = evalIfBucketFull(winningLineLength, bucket)

if (result !== null) {
result.forEach((_value, index, array) => {
array[index]?.push(piecePositionAbs)
})
}

return result
}
41 changes: 23 additions & 18 deletions src/assets/types/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,31 @@ export type GridOfBoardType = (number | null | undefined)[][]

export type OptionsToggle = [string, boolean][];

export type PosMovN = {
top: SizeDeclarationBoard,
bottom: SizeDeclarationBoard,
left: SizeDeclarationBoard,
right: SizeDeclarationBoard,
leftTop: SizeDeclarationBoard,
rightTop: SizeDeclarationBoard,
leftBottom: SizeDeclarationBoard,
rightBottom: SizeDeclarationBoard,
/**
* orientation: [[topPos], [bottomPos]]
*
* format: [
*
* [topPos, topPos, topPos],
*
* [topPos, ---X---, bottomPos],
*
* [bottomPos, bottomPos, bottomPos],
*
* ]
*/
export type PosMov = {
vertical: [SizeDeclarationBoard, SizeDeclarationBoard],
horizontal: [SizeDeclarationBoard, SizeDeclarationBoard],
diagonalLtRb: [SizeDeclarationBoard, SizeDeclarationBoard],
diagonalRtLb: [SizeDeclarationBoard, SizeDeclarationBoard]
}

export type BucketTypeN = {
top: SizeDeclarationBoard[],
bottom: SizeDeclarationBoard[],
left: SizeDeclarationBoard[],
right: SizeDeclarationBoard[],
leftTop: SizeDeclarationBoard[],
rightTop: SizeDeclarationBoard[],
leftBottom: SizeDeclarationBoard[],
rightBottom: SizeDeclarationBoard[],
export type BucketType = {
vertical: SizeDeclarationBoard[],
horizontal: SizeDeclarationBoard[],
diagonalLtRb: SizeDeclarationBoard[],
diagonalRtLb: SizeDeclarationBoard[]
}

export type GenerateOptionsParams = {
Expand Down

0 comments on commit 815b571

Please sign in to comment.