Skip to content

Commit 1204501

Browse files
committed
Code duplication fixed. Added new futures for defending the King pieces.
1 parent 5674158 commit 1204501

File tree

6 files changed

+317
-249
lines changed

6 files changed

+317
-249
lines changed

src/components/GameComponent/classes/ChessMoveProvider.ts

Lines changed: 109 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -2,90 +2,120 @@ import MapFrame from "./MapFrame";
22
import { GameMap } from "./GameMap";
33
import { CalculateChessMoves } from "./CalculateChessMoves";
44
export class ChessMoveProvider {
5-
public static Provide(gameMap: GameMap, item: MapFrame, markedItems: string[], setMarkedItems: React.Dispatch<string[]>, setMarkedPossibleCastles: React.Dispatch<string[]>) {
6-
let possibleMoves: Array<string>;
7-
let possibleCastles: Array<string>;
8-
let selectedFrame = gameMap.mapFrames.get(item.positionName);
9-
if (markedItems[0] !== undefined) {
10-
markedItems.forEach((markedItem) => {
11-
gameMap.mapFrames.get(markedItem)?.SetIsMarked(false);
12-
})
5+
public static Provide(
6+
gameMap: GameMap,
7+
item: MapFrame,
8+
markedItems: string[],
9+
setMarkedItems: React.Dispatch<string[]>,
10+
setMarkedPossibleCastles: React.Dispatch<string[]>
11+
) {
12+
let possibleMoves: Array<string> = [];
13+
let possibleCastles: Array<string> = [];
14+
let isKingInCheckWithoutThisPiecePosition: boolean = false;
15+
let selectedFrame = gameMap.mapFrames.get(item.positionName);
16+
let pieceColor: "white" | "black" =
17+
selectedFrame?.piece?.color === "black"
18+
? selectedFrame.piece.color
19+
: "white";
20+
if (markedItems[0] !== undefined) {
21+
markedItems.forEach((markedItem) => {
22+
gameMap.mapFrames.get(markedItem)?.SetIsMarked(false);
23+
});
24+
}
25+
function setPossibleMoves() {
26+
if (possibleMoves) {
27+
possibleMoves.forEach((cordinate) => {
28+
gameMap.mapFrames.get(cordinate)?.SetIsMarked(true);
29+
});
30+
setMarkedItems(possibleMoves);
31+
}
32+
}
33+
function setPossibleCastles() {
34+
if (possibleCastles) {
35+
possibleCastles.forEach((cordinate) => {
36+
gameMap.mapFrames.get(cordinate)?.SetIsMarkedForCastle(true);
37+
});
38+
}
39+
setMarkedPossibleCastles(possibleCastles);
40+
}
41+
42+
console.log(selectedFrame?.piece?.name);
43+
console.log(selectedFrame?.positionName);
44+
45+
46+
if (selectedFrame?.piece?.name !== "King") {
47+
isKingInCheckWithoutThisPiecePosition = gameMap.isThreatenedPosition(
48+
pieceColor === "white"
49+
? gameMap.whiteKingLocation
50+
: gameMap.blackKingLocation,
51+
pieceColor,
52+
selectedFrame?.positionName,
53+
"",
54+
true
55+
);
56+
57+
if (isKingInCheckWithoutThisPiecePosition) {
58+
return [];
1359
}
14-
function setPossibleMoves() {
15-
if (possibleMoves) {
16-
possibleMoves.forEach((cordinate) => {
17-
gameMap.mapFrames.get(cordinate)?.SetIsMarked(true);
18-
})
19-
setMarkedItems(possibleMoves);
20-
}
60+
}
61+
62+
switch (item.piece?.name) {
63+
case "Pawn":
64+
if (selectedFrame) {
65+
possibleMoves = CalculateChessMoves.Pawn(gameMap, selectedFrame);
2166
}
22-
function setPossibleCastles() {
23-
if (possibleCastles) {
24-
possibleCastles.forEach((cordinate) => {
25-
gameMap.mapFrames.get(cordinate)?.SetIsMarkedForCastle(true);
26-
})
27-
}
28-
setMarkedPossibleCastles(possibleCastles);
67+
break;
68+
case "Knight":
69+
if (selectedFrame) {
70+
possibleMoves = CalculateChessMoves.Knight(gameMap, selectedFrame);
2971
}
30-
switch (item.piece?.name) {
31-
case "Pawn":
32-
if (selectedFrame) {
33-
possibleMoves = CalculateChessMoves.Pawn(gameMap, selectedFrame);
34-
35-
setPossibleMoves();
36-
37-
return possibleMoves;
38-
}
39-
break;
40-
case "Knight":
41-
if (selectedFrame) {
42-
possibleMoves = CalculateChessMoves.Knight(gameMap, selectedFrame);
43-
44-
setPossibleMoves();
45-
46-
return possibleMoves;
47-
}
48-
break;
49-
case "Bishop":
50-
if (selectedFrame) {
51-
possibleMoves = CalculateChessMoves.Bishop(gameMap, selectedFrame);
52-
53-
setPossibleMoves();
54-
55-
return possibleMoves;
56-
}
57-
break;
58-
case "Rook":
59-
if (selectedFrame) {
60-
possibleMoves = CalculateChessMoves.Rook(gameMap, selectedFrame);
61-
62-
setPossibleMoves();
72+
break;
73+
case "Bishop":
74+
if (selectedFrame) {
75+
possibleMoves = CalculateChessMoves.Bishop(gameMap, selectedFrame);
76+
}
77+
break;
78+
case "Rook":
79+
if (selectedFrame) {
80+
possibleMoves = CalculateChessMoves.Rook(gameMap, selectedFrame);
81+
}
82+
break;
83+
case "Queen":
84+
if (selectedFrame) {
85+
possibleMoves = CalculateChessMoves.Queen(gameMap, selectedFrame);
86+
}
87+
break;
88+
case "King":
89+
if (selectedFrame) {
90+
possibleMoves = CalculateChessMoves.King(gameMap, selectedFrame);
91+
possibleCastles = CalculateChessMoves.KingCastles(
92+
gameMap,
93+
selectedFrame
94+
);
6395

64-
return possibleMoves;
65-
}
66-
break;
67-
case "Queen":
68-
if (selectedFrame) {
69-
possibleMoves = CalculateChessMoves.Queen(gameMap, selectedFrame);
96+
setPossibleMoves();
97+
setPossibleCastles();
7098

71-
setPossibleMoves();
99+
return possibleMoves;
100+
}
101+
break;
102+
}
72103

73-
return possibleMoves;
74-
}
75-
break;
76-
case "King":
77-
if (selectedFrame) {
78-
possibleMoves = CalculateChessMoves.King(gameMap, selectedFrame);
79-
possibleCastles = CalculateChessMoves.KingCastles(gameMap, selectedFrame);
80-
console.log(possibleCastles);
81-
104+
if (gameMap.isKingInCheck()) {
105+
possibleMoves = possibleMoves.filter((move) => {
106+
return !gameMap.isThreatenedPosition(
107+
pieceColor === "white"
108+
? gameMap.whiteKingLocation
109+
: gameMap.blackKingLocation,
110+
pieceColor,
111+
"",
112+
move
113+
);
114+
});
115+
}
82116

83-
setPossibleMoves();
84-
setPossibleCastles();
117+
setPossibleMoves();
85118

86-
return possibleMoves;
87-
}
88-
break;
89-
}
90-
}
91-
}
119+
return possibleMoves;
120+
}
121+
}

src/components/GameComponent/pieceMoves/BishopMoves.ts

Lines changed: 70 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,66 +2,83 @@ import { GameMap } from "../classes/GameMap";
22
import MapFrame from "../classes/MapFrame";
33
import { numberToLetter as NTL } from "../utils/numberToLetter";
44

5-
export function BishopMoves(gameMap: GameMap, mapFrame: MapFrame, onlyIsAvailableToTake: boolean = false, allyColor?: "white" | "black", skipPosition?: string) {
6-
let isKingInCheckWithoutThisPiecePosition: boolean = false;
7-
if (!allyColor && !onlyIsAvailableToTake) {
8-
if (mapFrame.piece?.color === "white") {
9-
isKingInCheckWithoutThisPiecePosition = gameMap.isThreatenedPosition(gameMap.whiteKingLocation, "white", mapFrame.positionName);
5+
export function BishopMoves(
6+
gameMap: GameMap,
7+
mapFrame: MapFrame,
8+
onlyIsAvailableToTake: boolean = false,
9+
allyColor?: "white" | "black",
10+
skipPosition?: string,
11+
hitPosition?: string,
12+
bypassKingProtection: boolean = false,
13+
returnOnlyIfSkipPositionIsSkipped: boolean = false
14+
): string[] {
15+
let isSkipPositionIsSkipped: boolean = false;
16+
17+
let availableMoves: Array<string> = [];
18+
19+
function checkPositions(colModifier: number, rowModifier: number) {
20+
let currWorkPos;
21+
let currWorkCol = mapFrame.position.col;
22+
let currWorkRow = mapFrame.position.row;
23+
let isUnavailable = false;
24+
25+
while (!isUnavailable) {
26+
currWorkPos = `${NTL(currWorkCol + colModifier)}${
27+
currWorkRow + rowModifier
28+
}`;
29+
30+
if (!gameMap.Contains(currWorkPos)) {
31+
isUnavailable = true;
32+
break;
33+
}
34+
35+
currWorkCol += colModifier;
36+
currWorkRow += rowModifier;
37+
38+
let pieceColor = allyColor ?? mapFrame.piece?.color;
39+
40+
if (gameMap.isAvailableMove(currWorkPos)) {
41+
console.log(`${currWorkPos} === ${hitPosition}`);
42+
43+
if (!onlyIsAvailableToTake) {
44+
availableMoves.push(currWorkPos);
45+
} else if (currWorkPos === hitPosition) {
46+
availableMoves.push(currWorkPos);
47+
isUnavailable = true;
1048
}
11-
if (mapFrame.piece?.color === "black") {
12-
isKingInCheckWithoutThisPiecePosition = gameMap.isThreatenedPosition(gameMap.blackKingLocation, "black", mapFrame.positionName);
49+
} else if (pieceColor) {
50+
if (skipPosition) {
51+
if (skipPosition === currWorkPos) {
52+
isSkipPositionIsSkipped = true;
53+
continue;
54+
}
1355
}
14-
if (isKingInCheckWithoutThisPiecePosition) {
15-
return [];
56+
if (gameMap.isAvailableToTake(currWorkPos, pieceColor)) {
57+
availableMoves.push(currWorkPos);
58+
isUnavailable = true;
59+
} else {
60+
isUnavailable = true;
1661
}
62+
} else {
63+
isUnavailable = true;
64+
}
1765
}
18-
let availableMoves: Array<string> = [];
66+
}
1967

20-
function checkPositions(colModifier: number, rowModifier: number) {
21-
let currWorkPos;
22-
let currWorkCol = mapFrame.position.col;
23-
let currWorkRow = mapFrame.position.row;
24-
let isUnavailable = false;
25-
while (!isUnavailable) {
26-
currWorkPos = `${NTL(currWorkCol + colModifier)}${currWorkRow + rowModifier}`;
68+
checkPositions(1, 1);
69+
checkPositions(-1, 1);
70+
checkPositions(1, -1);
71+
checkPositions(-1, -1);
2772

28-
if (!gameMap.Contains(currWorkPos)) {
29-
isUnavailable = true;
30-
break;
31-
}
32-
33-
currWorkCol += colModifier;
34-
currWorkRow += rowModifier;
73+
if (isSkipPositionIsSkipped && returnOnlyIfSkipPositionIsSkipped) {
74+
console.log(`${skipPosition} IS SKIPPED!`);
3575

36-
let pieceColor = allyColor ?? mapFrame.piece?.color;
37-
38-
if (gameMap.isAvailableMove(currWorkPos)) {
39-
if (!onlyIsAvailableToTake) {
40-
availableMoves.push(currWorkPos);
41-
}
42-
}
43-
else if (pieceColor) {
44-
if (skipPosition) {
45-
if (skipPosition === currWorkPos) {
46-
continue;
47-
}
48-
}
49-
if (gameMap.isAvailableToTake(currWorkPos, pieceColor)) {
50-
availableMoves.push(currWorkPos);
51-
isUnavailable = true;
52-
} else {
53-
isUnavailable = true;
54-
}
55-
} else {
56-
isUnavailable = true;
57-
}
58-
}
59-
}
76+
return availableMoves;
77+
} else if (returnOnlyIfSkipPositionIsSkipped) {
78+
console.log(`${skipPosition} IS NOT SKIPPED!`);
6079

61-
checkPositions(1, 1);
62-
checkPositions(-1, 1);
63-
checkPositions(1, -1);
64-
checkPositions(-1, -1);
80+
return [];
81+
}
6582

66-
return availableMoves;
83+
return availableMoves;
6784
}

0 commit comments

Comments
 (0)