You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
265 lines
6.8 KiB
265 lines
6.8 KiB
|
|
|
|
const pieceList = new Array();
|
|
currentPlayer = "white";
|
|
|
|
function generateDefaultPositions(){
|
|
|
|
var id = 0;
|
|
|
|
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:"queen"};
|
|
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:"queen"};
|
|
pieceList.push(pieceRecord);
|
|
id++;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
function getPieceRecord(x,y){
|
|
if (x > 7 || x < 0 || y > 7 || y < 0) {
|
|
return false;
|
|
}
|
|
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);
|
|
}
|
|
|
|
function updatePieceRecord(pieceRecord) {
|
|
const index = pieceList.findIndex(record => record.id == pieceRecord.id);
|
|
pieceList[index] = pieceRecord;
|
|
}
|
|
|
|
function updatePieceRecordPosition(pieceRecord, x, y) {
|
|
pieceRecord.x = x;
|
|
pieceRecord.y = y;
|
|
updatePieceRecord(pieceRecord);
|
|
return pieceRecord;
|
|
}
|
|
|
|
function isMoveValid(pieceRecord, x, y){
|
|
|
|
|
|
if(0 > y > 7 || 0 > x > 7){
|
|
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 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;
|
|
|
|
for (let i = 1; i < (Math.abs(y-currentY)+1); i++) {
|
|
|
|
const nowX = currentX + (i*directionX);
|
|
const nowY = currentY + (i*directionY);
|
|
|
|
if (inWayPieceRecord = getPieceRecord(nowX, nowY)) {
|
|
|
|
if(inWayPieceRecord.player == player){
|
|
return false;
|
|
}
|
|
|
|
space = 0;
|
|
piecesInWay++;
|
|
}else{
|
|
space++;
|
|
piecesInWay = 0;
|
|
}
|
|
|
|
if(piecesInWay > 1){
|
|
return false;
|
|
}
|
|
|
|
if (space > 1 && type == "basic") {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
function getCasualties(oldX, oldY, newX, newY) {
|
|
const directionX = (newX > oldX) ? 1 : -1;
|
|
const directionY = (newY > oldY) ? 1 : -1;
|
|
|
|
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);
|
|
|
|
pieceRecord = getPieceRecord(x,y);
|
|
|
|
if (pieceRecord) {
|
|
casualties.push(pieceRecord);
|
|
|
|
}
|
|
|
|
}
|
|
return casualties;
|
|
}
|
|
|
|
function getLoser() {
|
|
if (!pieceList.find(pieceRecord => pieceRecord.player == "white")) {
|
|
return "white";
|
|
}
|
|
if (!pieceList.find(pieceRecord => pieceRecord.player == "black")) {
|
|
return "black";
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function continuableInDirectionForQueen(directionX, directionY, pieceRecord) {
|
|
|
|
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);
|
|
|
|
if(x > 7 || x < 0 || y > 7 || y < 0 || (x+directionX) > 7 || (x+directionX) < 0 || (y+directionY) > 7 || (y+directionY) < 0 ){
|
|
|
|
return false;
|
|
}
|
|
|
|
const record = getPieceRecord(x, y);
|
|
|
|
if (record) {
|
|
if (record.player == player) {
|
|
|
|
return false;
|
|
}
|
|
|
|
const firstBlockRecord = getPieceRecord(x+directionX,y+directionY);
|
|
const secondBlockRecord = getPieceRecord(x-directionX,y-directionY);
|
|
|
|
|
|
return ((!firstBlockRecord || firstBlockRecord.id == pieceRecord.id) && (!secondBlockRecord || secondBlockRecord.id == pieceRecord.id));
|
|
|
|
|
|
}
|
|
|
|
}
|
|
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;
|
|
}
|
|
|
|
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)))){
|
|
|
|
return true;
|
|
}
|
|
|
|
if(type == "queen"){
|
|
|
|
return (continuableInDirectionForQueen(1,1,pieceRecord) || continuableInDirectionForQueen(-1,-1,pieceRecord) || continuableInDirectionForQueen(-1,1,pieceRecord) || continuableInDirectionForQueen(1,-1,pieceRecord));
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function getOportunities(pieceRecord){
|
|
const player = pieceRecord.player;
|
|
const opportunities = new Array();
|
|
|
|
pieceList.forEach(record => {
|
|
if (record.player == player && record != pieceRecord && continuable(record)) {
|
|
|
|
opportunities.push(pieceRecord);
|
|
}
|
|
});
|
|
|
|
return opportunities;
|
|
}
|
|
|
|
function swapPlayers() {
|
|
currentPlayer = (currentPlayer == "white") ? "black" : "white";
|
|
}
|
|
|
|
function makeMove(pieceRecord, x, y){
|
|
const player = pieceRecord.player;
|
|
|
|
if (!isMoveValid(pieceRecord, x, y)) {
|
|
return 0;
|
|
}
|
|
|
|
const oldX = pieceRecord.x;
|
|
const oldY = pieceRecord.y;
|
|
|
|
const casualties = getCasualties(oldX, oldY, x, y);
|
|
|
|
|
|
casualties.forEach(casualty => {
|
|
nukePieceRecord(casualty);
|
|
});
|
|
|
|
/*if (casualties.length == 0 && getOportunities(pieceRecord).length != 0) {
|
|
//POTŘREBA DODĚLAT SBÍRÁNÍ DÍLKŮ ZA NESKÁKÁNÍ
|
|
}*/
|
|
|
|
if ((player == "white" && y == 7) || (player == "black" && y == 0) && pieceRecord.type == "basic") {
|
|
|
|
pieceRecord.type = "queen";
|
|
|
|
}
|
|
|
|
const updatedPieceRecord = updatePieceRecordPosition(pieceRecord, x, y);
|
|
|
|
if (continuable(updatedPieceRecord) && casualties.length > 0) {
|
|
return 2;
|
|
}
|
|
|
|
|
|
return 1;
|
|
}
|
|
generateDefaultPositions(); |