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