mirror of
https://github.com/neogeek23/neogeek23.github.io.git
synced 2026-02-04 10:58:21 +00:00
Add files via upload
This commit is contained in:
parent
3ad63bb5f8
commit
47b83f8587
193
ChessEngine.js
Normal file
193
ChessEngine.js
Normal file
@ -0,0 +1,193 @@
|
||||
const maxBoardLength = 8;
|
||||
window.onload = function(){chess_main();};
|
||||
|
||||
|
||||
class ChessBot{
|
||||
constructor(difficulty, color){
|
||||
this.difficulty = difficulty;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
makeMove(game, board, source, target){
|
||||
let nextMove = undefined;
|
||||
if (this.difficulty === 'Random'){
|
||||
nextMove = this.determineSimplestBotMove(game, source, target);
|
||||
} else if (this.difficulty === 'Easy') {
|
||||
nextMove = this.determineNextBestBotMoveOneMoveDeep(game, source, target);
|
||||
} else if (this.difficulty === 'Medium'){
|
||||
let depth = Math.floor(Math.random() * 3 + 2);
|
||||
console.clear();
|
||||
console.log(depth + " moves ahead.");
|
||||
nextMove = this.determineBestBotMove(depth, game, true);
|
||||
}
|
||||
|
||||
if (nextMove !== undefined) {
|
||||
game.move(nextMove);
|
||||
board.position(game.fen());
|
||||
}else {
|
||||
throw "difficulty not recognized" + this.difficulty;
|
||||
}
|
||||
}
|
||||
|
||||
determineSimplestBotMove(game, source, target){
|
||||
let possibleMoves = game.moves();
|
||||
|
||||
if (possibleMoves.length === 0) return;
|
||||
|
||||
let randomIndex = Math.floor(Math.random() * possibleMoves.length);
|
||||
return possibleMoves[randomIndex];
|
||||
}
|
||||
|
||||
getWhitePieceWeight(piece){
|
||||
if (piece.type === 'p'){
|
||||
return 10;
|
||||
} else if (piece.type === 'r'){
|
||||
return 50;
|
||||
} else if (piece.type === 'n'){
|
||||
return 30;
|
||||
} else if (piece.type === 'b'){
|
||||
return 35;
|
||||
} else if (piece.type === 'q'){
|
||||
return 90;
|
||||
} else if (piece.type === 'k'){
|
||||
return 900;
|
||||
}
|
||||
throw "Unknown piece type: " + piece.type;
|
||||
}
|
||||
|
||||
getPieceValue(piece){
|
||||
if(piece === null){
|
||||
return 0;
|
||||
}
|
||||
return piece.color === 'w' ? this.getWhitePieceWeight(piece) : -this.getWhitePieceWeight(piece);
|
||||
}
|
||||
|
||||
evaluateBoardForWhite(game){
|
||||
let totalEvaluation = 0;
|
||||
for (let i = 0; i < maxBoardLength; i++){
|
||||
for (let j = 0; j < maxBoardLength; j++){
|
||||
totalEvaluation += this.getPieceValue(game.get(String.fromCharCode(97 + i) + (j + 1)));
|
||||
}
|
||||
}
|
||||
return totalEvaluation;
|
||||
}
|
||||
|
||||
evaluateBoardForBlack(game){return -this.evaluateBoardForWhite(game);}
|
||||
|
||||
determineNextBestBotMoveOneMoveDeep(game, source, target) {
|
||||
let bestMove = null;
|
||||
let bestValue = -9999;
|
||||
let boardValue = 0;
|
||||
let possibleMoves = game.moves();
|
||||
|
||||
for (let i = 0; i < possibleMoves.length; i++) {
|
||||
let newGameMove = possibleMoves[i];
|
||||
game.move(newGameMove);
|
||||
|
||||
if (this.color === "w") {
|
||||
boardValue = this.evaluateBoardForWhite(game);
|
||||
} else if (this.color === "b") {
|
||||
boardValue = this.evaluateBoardForBlack(game);
|
||||
} else {
|
||||
throw "Unknown bot team color: " + this.color;
|
||||
}
|
||||
game.undo();
|
||||
|
||||
if (boardValue > bestValue) {
|
||||
bestValue = boardValue;
|
||||
bestMove = newGameMove;
|
||||
}
|
||||
}
|
||||
|
||||
if (bestValue === 0) {
|
||||
return this.determineSimplestBotMove(game, source, target);
|
||||
} else {
|
||||
return bestMove;
|
||||
}
|
||||
}
|
||||
|
||||
determineBestBotMove(depth, game, isMaximizingPlayer){
|
||||
let possibleMoves = game.moves();
|
||||
let bestValue = -9999;
|
||||
let bestMove;
|
||||
|
||||
for (let i = 0; i < possibleMoves.length; i++){
|
||||
game.move(possibleMoves[i])
|
||||
let currentValue = this.mini_max_AB(depth - 1, game, -10000, 10000, !isMaximizingPlayer);
|
||||
game.undo();
|
||||
if(currentValue >= bestValue){
|
||||
bestMove = possibleMoves[i];
|
||||
bestValue = currentValue;
|
||||
}
|
||||
}
|
||||
return bestMove;
|
||||
}
|
||||
|
||||
mini_max_AB(depth, game, alpha, beta, isMaximizingPlayer){
|
||||
if (depth === 0 && this.color === 'w'){
|
||||
return this.evaluateBoardForWhite(game);
|
||||
} else if (depth === 0 && this.color === 'b') {
|
||||
return this.evaluateBoardForBlack(game);
|
||||
}
|
||||
|
||||
let possibleMoves = game.moves();
|
||||
let bestValue = 9999 * (isMaximizingPlayer ? -1 : 1);
|
||||
for (let i = 0; i < possibleMoves.length; i++){
|
||||
game.move(possibleMoves[i]);
|
||||
if (isMaximizingPlayer){
|
||||
bestValue = Math.max(bestValue, this.mini_max_AB(depth-1, game, alpha, beta, !isMaximizingPlayer));
|
||||
alpha = Math.max(alpha, bestValue);
|
||||
} else {
|
||||
bestValue = Math.min(bestValue, this.mini_max_AB(depth-1, game, alpha, beta, !isMaximizingPlayer));
|
||||
beta = Math.min(beta, bestValue);
|
||||
}
|
||||
game.undo();
|
||||
if (beta <= alpha){
|
||||
return bestValue;
|
||||
}
|
||||
}
|
||||
return bestValue;
|
||||
}
|
||||
}
|
||||
|
||||
function chess_main() {
|
||||
let game = new Chess();
|
||||
let board = ChessBoard('board');
|
||||
let BBot = new ChessBot('Medium', 'b');
|
||||
setupChess(game, board, BBot);
|
||||
}
|
||||
|
||||
function setupChess(game, board, bot){
|
||||
let onDragStart = function(source, piece, position, orientation) {
|
||||
if (game.in_checkmate() === true || game.in_draw() === true ||
|
||||
piece.search(/^b/) !== -1) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
let onDrop = function(source, target) {
|
||||
let move = game.move({
|
||||
from: source,
|
||||
to: target,
|
||||
promotion: 'q' // NOTE: always promote to a queen for example simplicity
|
||||
});
|
||||
|
||||
if (move === null) return 'snapback';
|
||||
|
||||
window.setTimeout(bot.makeMove(game, board, source, target), 250);
|
||||
};
|
||||
|
||||
let onSnapEnd = function() {
|
||||
board.position(game.fen());
|
||||
};
|
||||
|
||||
let cfg = {
|
||||
draggable: true,
|
||||
dropOffBoard: 'snapback',
|
||||
position: 'start',
|
||||
onDragStart: onDragStart,
|
||||
onDrop: onDrop,
|
||||
onSnapEnd: onSnapEnd
|
||||
};
|
||||
board = ChessBoard('board', cfg);
|
||||
}
|
||||
70
chessboard-0.3.0.css
Normal file
70
chessboard-0.3.0.css
Normal file
@ -0,0 +1,70 @@
|
||||
/*!
|
||||
* chessboard.js v0.3.0
|
||||
*
|
||||
* Copyright 2013 Chris Oakman
|
||||
* Released under the MIT license
|
||||
* https://github.com/oakmac/chessboardjs/blob/master/LICENSE
|
||||
*
|
||||
* Date: 10 Aug 2013
|
||||
*/
|
||||
|
||||
/* clearfix */
|
||||
.clearfix-7da63 {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
/* board */
|
||||
.board-b72b1 {
|
||||
border: 2px solid #404040;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
/* square */
|
||||
.square-55d63 {
|
||||
float: left;
|
||||
position: relative;
|
||||
|
||||
/* disable any native browser highlighting */
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
/* white square */
|
||||
.white-1e1d7 {
|
||||
background-color: #f0d9b5;
|
||||
color: #b58863;
|
||||
}
|
||||
|
||||
/* black square */
|
||||
.black-3c85d {
|
||||
background-color: #b58863;
|
||||
color: #f0d9b5;
|
||||
}
|
||||
|
||||
/* highlighted square */
|
||||
.highlight1-32417, .highlight2-9c5d2 {
|
||||
-webkit-box-shadow: inset 0 0 3px 3px yellow;
|
||||
-moz-box-shadow: inset 0 0 3px 3px yellow;
|
||||
box-shadow: inset 0 0 3px 3px yellow;
|
||||
}
|
||||
|
||||
/* notation */
|
||||
.notation-322f9 {
|
||||
cursor: default;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
font-size: 14px;
|
||||
position: absolute;
|
||||
}
|
||||
.alpha-d2270 {
|
||||
bottom: 1px;
|
||||
right: 3px;
|
||||
}
|
||||
.numeric-fc462 {
|
||||
top: 2px;
|
||||
left: 2px;
|
||||
}
|
||||
1714
chessboard-0.3.0.js
Normal file
1714
chessboard-0.3.0.js
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user