main
parent
3c3dd7a95f
commit
a994893492
5 changed files with 369 additions and 261 deletions
@ -1,306 +1,311 @@ |
||||
class GameLogic{ |
||||
|
||||
constructor(pieceList = [], missedOportunities = [], currentPlayer = "white") { |
||||
this.pieceList = pieceList; |
||||
this.missedOportunities = missedOportunities; |
||||
this.currentPlayer = currentPlayer; |
||||
} |
||||
|
||||
const pieceList = new Array(); |
||||
missedOportunities = new Array(); |
||||
currentPlayer = "white"; |
||||
isMissedOportunity(pieceRecord) { |
||||
const id = pieceRecord.id; |
||||
return this.missedOportunities.includes(id); |
||||
} |
||||
|
||||
function isMissedOportunity(pieceRecord) { |
||||
const id = pieceRecord.id; |
||||
return missedOportunities.includes(id); |
||||
} |
||||
generateDefaultPositions(){ |
||||
|
||||
function generateDefaultPositions(){ |
||||
var id = 0; |
||||
|
||||
var id = 0; |
||||
for (let i = 0; i < 8; i++) { |
||||
for (let j = 0; j < 3; j++) { |
||||
if((i+j) % 2 == 0){ |
||||
const pieceRecord = {id:id, x:i, y:j, player:"white", type:"basic"}; |
||||
this.pieceList.push(pieceRecord); |
||||
id++; |
||||
} |
||||
|
||||
for (let i = 0; i < 8; i++) { |
||||
for (let j = 0; j < 3; j++) { |
||||
if((i+j) % 2 == 0){ |
||||
pieceRecord = {id:id, x:i, y:j, player:"white", type:"basic"}; |
||||
pieceList.push(pieceRecord); |
||||
id++; |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
for (let i = 0; i < 8; i++) { |
||||
for (let j = 5; j < 8; j++) { |
||||
if((i+j) % 2 == 0){ |
||||
pieceRecord = {id:id, x:i, y:j, player:"black", type:"basic"}; |
||||
pieceList.push(pieceRecord); |
||||
id++; |
||||
} |
||||
for (let i = 0; i < 8; i++) { |
||||
for (let j = 5; j < 8; j++) { |
||||
if((i+j) % 2 == 0){ |
||||
const pieceRecord = {id:id, x:i, y:j, player:"black", type:"basic"}; |
||||
this.pieceList.push(pieceRecord); |
||||
id++; |
||||
} |
||||
|
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
function getPieceRecord(x,y){ |
||||
if (x > 7 || x < 0 || y > 7 || y < 0) { |
||||
return false; |
||||
getPieceRecord(x,y){ |
||||
if (x > 7 || x < 0 || y > 7 || y < 0) { |
||||
return false; |
||||
} |
||||
return this.pieceList.find(pieceRecord => pieceRecord.x == x && pieceRecord.y == y); |
||||
} |
||||
return pieceList.find(pieceRecord => pieceRecord.x == x && pieceRecord.y == y); |
||||
} |
||||
|
||||
|
||||
|
||||
function nukePieceRecord(pieceRecord) { |
||||
const index = pieceList.findIndex(record => record.id == pieceRecord.id); |
||||
pieceList.splice(index, 1); |
||||
} |
||||
nukePieceRecord(pieceRecord) { |
||||
const index = this.pieceList.findIndex(record => record.id == pieceRecord.id); |
||||
this.pieceList.splice(index, 1); |
||||
} |
||||
|
||||
function updatePieceRecord(pieceRecord) { |
||||
const index = pieceList.findIndex(record => record.id == pieceRecord.id); |
||||
pieceList[index] = pieceRecord; |
||||
} |
||||
updatePieceRecord(pieceRecord) { |
||||
const index = this.pieceList.findIndex(record => record.id == pieceRecord.id); |
||||
this.pieceList[index] = pieceRecord; |
||||
} |
||||
|
||||
function updatePieceRecordPosition(pieceRecord, x, y) { |
||||
pieceRecord.x = x; |
||||
pieceRecord.y = y; |
||||
updatePieceRecord(pieceRecord); |
||||
return pieceRecord; |
||||
} |
||||
updatePieceRecordPosition(pieceRecord, x, y) { |
||||
pieceRecord.x = x; |
||||
pieceRecord.y = y; |
||||
this.updatePieceRecord(pieceRecord); |
||||
return pieceRecord; |
||||
} |
||||
|
||||
|
||||
|
||||
function getCasualties(oldX, oldY, newX, newY) { |
||||
const directionX = (newX > oldX) ? 1 : -1; |
||||
const directionY = (newY > oldY) ? 1 : -1; |
||||
getCasualties(oldX, oldY, newX, newY) { |
||||
const directionX = (newX > oldX) ? 1 : -1; |
||||
const directionY = (newY > oldY) ? 1 : -1; |
||||
|
||||
const casualties = new Array(); |
||||
const casualties = new Array(); |
||||
|
||||
for (let i = 1; i < (Math.abs(newY - oldY) + 1); i++) { |
||||
const x = oldX + (i*directionX); |
||||
const y = oldY + (i*directionY); |
||||
for (let i = 1; i < (Math.abs(newY - oldY) + 1); i++) { |
||||
const x = oldX + (i*directionX); |
||||
const y = oldY + (i*directionY); |
||||
|
||||
pieceRecord = getPieceRecord(x,y); |
||||
pieceRecord = this.getPieceRecord(x,y); |
||||
|
||||
if (pieceRecord) { |
||||
casualties.push(pieceRecord); |
||||
if (pieceRecord) { |
||||
casualties.push(pieceRecord); |
||||
|
||||
} |
||||
} |
||||
|
||||
} |
||||
return casualties; |
||||
} |
||||
return casualties; |
||||
} |
||||
|
||||
function getLoser() { |
||||
if (!pieceList.find(pieceRecord => pieceRecord.player == "white")) { |
||||
return "white"; |
||||
} |
||||
if (!pieceList.find(pieceRecord => pieceRecord.player == "black")) { |
||||
return "black"; |
||||
getLoser() { |
||||
if (!this.pieceList.find(pieceRecord => pieceRecord.player == "white")) { |
||||
return "white"; |
||||
} |
||||
if (!this.pieceList.find(pieceRecord => pieceRecord.player == "black")) { |
||||
return "black"; |
||||
} |
||||
return null; |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
function continuableInDirectionForQueen(directionX, directionY, pieceRecord) { |
||||
continuableInDirectionForQueen(directionX, directionY, pieceRecord) { |
||||
|
||||
const pieceX = pieceRecord.x; |
||||
const pieceY = pieceRecord.y; |
||||
const player = pieceRecord.player; |
||||
const pieceX = pieceRecord.x; |
||||
const pieceY = pieceRecord.y; |
||||
const player = pieceRecord.player; |
||||
|
||||
for (let i = 1; i < 8; i++) { |
||||
const x = pieceX + (i*directionX); |
||||
const y = pieceY + (i*directionY); |
||||
for (let i = 1; i < 8; i++) { |
||||
const x = pieceX + (i*directionX); |
||||
const y = pieceY + (i*directionY); |
||||
|
||||
if(x > 7 || x < 0 || y > 7 || y < 0 || (x+directionX) > 7 || (x+directionX) < 0 || (y+directionY) > 7 || (y+directionY) < 0 ){ |
||||
if(x > 7 || x < 0 || y > 7 || y < 0 || (x+directionX) > 7 || (x+directionX) < 0 || (y+directionY) > 7 || (y+directionY) < 0 ){ |
||||
|
||||
return false; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
const record = getPieceRecord(x, y); |
||||
const record = this.getPieceRecord(x, y); |
||||
|
||||
if (record) { |
||||
if (record.player == player) { |
||||
if (record) { |
||||
if (record.player == player) { |
||||
|
||||
return false; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
const firstBlockRecord = getPieceRecord(x+directionX,y+directionY); |
||||
const secondBlockRecord = getPieceRecord(x-directionX,y-directionY); |
||||
const firstBlockRecord = this.getPieceRecord(x+directionX,y+directionY); |
||||
const secondBlockRecord = this.getPieceRecord(x-directionX,y-directionY); |
||||
|
||||
|
||||
return ((!firstBlockRecord || firstBlockRecord.id == pieceRecord.id) && (!secondBlockRecord || secondBlockRecord.id == pieceRecord.id)); |
||||
return ((!firstBlockRecord || firstBlockRecord.id == pieceRecord.id) && (!secondBlockRecord || secondBlockRecord.id == pieceRecord.id)); |
||||
|
||||
|
||||
} |
||||
} |
||||
|
||||
} |
||||
return false; |
||||
} |
||||
return false; |
||||
} |
||||
function continuable(pieceRecord){ |
||||
const x = pieceRecord.x; |
||||
const y = pieceRecord.y; |
||||
const player = pieceRecord.player; |
||||
const type = pieceRecord.type; |
||||
continuable(pieceRecord){ |
||||
const x = pieceRecord.x; |
||||
const y = pieceRecord.y; |
||||
const player = pieceRecord.player; |
||||
const type = pieceRecord.type; |
||||
|
||||
if(player == "white" && ((getPieceRecord(x+1, y+1) && getPieceRecord(x+1, y+1).player != player && !getPieceRecord(x+2, y+2) && (y+2) < 8 && (x+2) < 8) || ((getPieceRecord(x-1, y+1) && getPieceRecord(x-1, y+1).player != player && !getPieceRecord(x-2, y+2) && (y+2) < 8 && (x-2) > 0)))){ |
||||
if(player == "white" && ((this.getPieceRecord(x+1, y+1) && this.getPieceRecord(x+1, y+1).player != player && !this.getPieceRecord(x+2, y+2) && (y+2) < 8 && (x+2) < 8) || ((this.getPieceRecord(x-1, y+1) && this.getPieceRecord(x-1, y+1).player != player && !this.getPieceRecord(x-2, y+2) && (y+2) < 8 && (x-2) > 0)))){ |
||||
|
||||
return true; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
if( player == "black" && ((getPieceRecord(x+1, y-1) && getPieceRecord(x+1, y-1).player != player && !getPieceRecord(x+2, y-2) && (y-2) > 0 && (x+2) < 8) || ((getPieceRecord(x-1, y-1) && getPieceRecord(x-1, y-1).player != player && !getPieceRecord(x-2, y-2) && (y-2) > 0 && (x-2) > 0)))){ |
||||
if( player == "black" && ((this.getPieceRecord(x+1, y-1) && this.getPieceRecord(x+1, y-1).player != player && !this.getPieceRecord(x+2, y-2) && (y-2) > 0 && (x+2) < 8) || ((this.getPieceRecord(x-1, y-1) && this.getPieceRecord(x-1, y-1).player != player && !this.getPieceRecord(x-2, y-2) && (y-2) > 0 && (x-2) > 0)))){ |
||||
|
||||
return true; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
if(type == "queen"){ |
||||
|
||||
if(type == "queen"){ |
||||
return (this.continuableInDirectionForQueen(1,1,pieceRecord) || this.continuableInDirectionForQueen(-1,-1,pieceRecord) || this.continuableInDirectionForQueen(-1,1,pieceRecord) || this.continuableInDirectionForQueen(1,-1,pieceRecord)); |
||||
} |
||||
|
||||
return (continuableInDirectionForQueen(1,1,pieceRecord) || continuableInDirectionForQueen(-1,-1,pieceRecord) || continuableInDirectionForQueen(-1,1,pieceRecord) || continuableInDirectionForQueen(1,-1,pieceRecord)); |
||||
return false; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
getOportunities(pieceRecord){ |
||||
const player = pieceRecord.player; |
||||
const opportunities = new Array(); |
||||
|
||||
function getOportunities(pieceRecord){ |
||||
const player = pieceRecord.player; |
||||
const opportunities = new Array(); |
||||
this.pieceList.forEach(record => { |
||||
if (record.player == player && record != pieceRecord && this.continuable(record)) { |
||||
|
||||
pieceList.forEach(record => { |
||||
if (record.player == player && record != pieceRecord && continuable(record)) { |
||||
opportunities.push(record.id); |
||||
} |
||||
}); |
||||
|
||||
opportunities.push(record.id); |
||||
} |
||||
}); |
||||
return opportunities; |
||||
} |
||||
|
||||
return opportunities; |
||||
} |
||||
getOportunitiesIncludingSelf(pieceRecord){ |
||||
const player = pieceRecord.player; |
||||
const opportunities = new Array(); |
||||
|
||||
function getOportunitiesIncludingSelf(pieceRecord){ |
||||
const player = pieceRecord.player; |
||||
const opportunities = new Array(); |
||||
this.pieceList.forEach(record => { |
||||
if (record.player == player && this.continuable(record)) { |
||||
|
||||
pieceList.forEach(record => { |
||||
if (record.player == player && continuable(record)) { |
||||
opportunities.push(record.id); |
||||
} |
||||
}); |
||||
|
||||
opportunities.push(record.id); |
||||
} |
||||
}); |
||||
return opportunities; |
||||
} |
||||
|
||||
return opportunities; |
||||
} |
||||
isMoveValid(pieceRecord, x, y){ |
||||
|
||||
function isMoveValid(pieceRecord, x, y){ |
||||
|
||||
if(0 > y > 7 || 0 > x > 7){ |
||||
return false; |
||||
} |
||||
|
||||
if(0 > y > 7 || 0 > x > 7){ |
||||
return false; |
||||
} |
||||
if (this.getPieceRecord(x,y)) { |
||||
return false; |
||||
} |
||||
|
||||
if (getPieceRecord(x,y)) { |
||||
return false; |
||||
} |
||||
const currentX = pieceRecord.x; |
||||
const currentY = pieceRecord.y; |
||||
|
||||
if (Math.abs(y - currentY) != Math.abs(x - currentX)) { |
||||
return false; |
||||
} |
||||
|
||||
const currentX = pieceRecord.x; |
||||
const currentY = pieceRecord.y; |
||||
const player = pieceRecord.player; |
||||
const type = pieceRecord.type; |
||||
|
||||
if (Math.abs(y - currentY) != Math.abs(x - currentX)) { |
||||
return false; |
||||
} |
||||
//Check correct Y direction if piece is basic
|
||||
if (currentY > y && player == "white" && type == "basic") { |
||||
return false; |
||||
} |
||||
|
||||
const player = pieceRecord.player; |
||||
const type = pieceRecord.type; |
||||
|
||||
//Check correct Y direction if piece is basic
|
||||
if (currentY > y && player == "white" && type == "basic") { |
||||
return false; |
||||
} |
||||
const directionY = (y > currentY) ? 1 : -1; |
||||
const directionX = (x > currentX) ? 1 : -1; |
||||
|
||||
space = 0; |
||||
piecesInWay = 0; |
||||
|
||||
const directionY = (y > currentY) ? 1 : -1; |
||||
const directionX = (x > currentX) ? 1 : -1; |
||||
for (let i = 1; i < (Math.abs(y-currentY)+1); i++) { |
||||
|
||||
space = 0; |
||||
piecesInWay = 0; |
||||
const nowX = currentX + (i*directionX); |
||||
const nowY = currentY + (i*directionY); |
||||
|
||||
for (let i = 1; i < (Math.abs(y-currentY)+1); i++) { |
||||
if (inWayPieceRecord = this.getPieceRecord(nowX, nowY)) { |
||||
|
||||
const nowX = currentX + (i*directionX); |
||||
const nowY = currentY + (i*directionY); |
||||
if(inWayPieceRecord.player == player){ |
||||
return false; |
||||
} |
||||
|
||||
if (inWayPieceRecord = getPieceRecord(nowX, nowY)) { |
||||
space = 0; |
||||
piecesInWay++; |
||||
}else{ |
||||
space++; |
||||
piecesInWay = 0; |
||||
} |
||||
|
||||
if(inWayPieceRecord.player == player){ |
||||
if(piecesInWay > 1){ |
||||
return false; |
||||
} |
||||
|
||||
space = 0; |
||||
piecesInWay++; |
||||
}else{ |
||||
space++; |
||||
piecesInWay = 0; |
||||
} |
||||
if (space > 1 && type == "basic") { |
||||
return false; |
||||
} |
||||
|
||||
if(piecesInWay > 1){ |
||||
return false; |
||||
} |
||||
|
||||
if (space > 1 && type == "basic") { |
||||
return false; |
||||
} |
||||
return true; |
||||
|
||||
} |
||||
swapPlayers() {
|
||||
this.currentPlayer = (this.currentPlayer == "white") ? "black" : "white"; |
||||
} |
||||
|
||||
return true; |
||||
makeMove(pieceRecord, x, y){ |
||||
const player = pieceRecord.player; |
||||
|
||||
} |
||||
function swapPlayers() {
|
||||
currentPlayer = (currentPlayer == "white") ? "black" : "white"; |
||||
} |
||||
if (!isMoveValid(pieceRecord, x, y)) { |
||||
return 0; |
||||
} |
||||
|
||||
function makeMove(pieceRecord, x, y){ |
||||
const player = pieceRecord.player; |
||||
const oldX = pieceRecord.x; |
||||
const oldY = pieceRecord.y; |
||||
|
||||
const casualties = this.getCasualties(oldX, oldY, x, y); |
||||
|
||||
if (!isMoveValid(pieceRecord, x, y)) { |
||||
return 0; |
||||
} |
||||
|
||||
const oldX = pieceRecord.x; |
||||
const oldY = pieceRecord.y; |
||||
casualties.forEach(casualty => { |
||||
this.nukePieceRecord(casualty); |
||||
}); |
||||
|
||||
const casualties = getCasualties(oldX, oldY, x, y); |
||||
this.missedOportunities = new Array(); |
||||
oportunities = this.getOportunitiesIncludingSelf(pieceRecord); |
||||
|
||||
if(casualties.length == 0 && oportunities.length != 0) { |
||||
this.missedOportunities = oportunities; |
||||
|
||||
casualties.forEach(casualty => { |
||||
nukePieceRecord(casualty); |
||||
}); |
||||
} |
||||
|
||||
missedOportunities = new Array(); |
||||
oportunities = getOportunitiesIncludingSelf(pieceRecord); |
||||
const original_type = pieceRecord.type; |
||||
|
||||
if(casualties.length == 0 && oportunities.length != 0) { |
||||
missedOportunities = oportunities; |
||||
if ((player == "white" && y == 7) || (player == "black" && y == 0) && pieceRecord.type == "basic") { |
||||
|
||||
} |
||||
pieceRecord.type = "queen"; |
||||
|
||||
} |
||||
|
||||
const original_type = pieceRecord.type; |
||||
const updatedPieceRecord = updatePieceRecordPosition(pieceRecord, x, y); |
||||
|
||||
if ((player == "white" && y == 7) || (player == "black" && y == 0) && pieceRecord.type == "basic") { |
||||
if (this.continuable(updatedPieceRecord) && casualties.length > 0 && pieceRecord.type == original_type) { |
||||
return 2; |
||||
} |
||||
|
||||
pieceRecord.type = "queen"; |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
const updatedPieceRecord = updatePieceRecordPosition(pieceRecord, x, y); |
||||
|
||||
if (continuable(updatedPieceRecord) && casualties.length > 0 && pieceRecord.type == original_type) { |
||||
return 2; |
||||
nukePieceRecordThatMissedOportunity(pieceRecord) { |
||||
if (this.missedOportunities.includes(pieceRecord.id)) { |
||||
this.missedOportunities = new Array(); |
||||
this.nukePieceRecord(pieceRecord); |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
|
||||
return 1; |
||||
} |
||||
|
||||
function nukePieceRecordThatMissedOportunity(pieceRecord) { |
||||
if (missedOportunities.includes(pieceRecord.id)) { |
||||
missedOportunities = new Array(); |
||||
nukePieceRecord(pieceRecord); |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
|
||||
generateDefaultPositions(); |
||||
module.exports = GameLogic; |
||||
Loading…
Reference in new issue