Files
basic-computer-games/23_Checkers/javascript/checkers.js
Martin Thoma e64fb6795c MAINT: Apply pre-commit
Remove byte-order-marker pre-commit check as there would be
many adjustments necessary
2022-03-05 09:29:23 +01:00

301 lines
8.5 KiB
JavaScript

// CHECKERS
//
// Converted from BASIC to Javascript by Oscar Toledo G. (nanochess)
//
function print(str)
{
document.getElementById("output").appendChild(document.createTextNode(str));
}
function input()
{
var input_element;
var input_str;
return new Promise(function (resolve) {
input_element = document.createElement("INPUT");
print("? ");
input_element.setAttribute("type", "text");
input_element.setAttribute("length", "50");
document.getElementById("output").appendChild(input_element);
input_element.focus();
input_str = undefined;
input_element.addEventListener("keydown", function (event) {
if (event.keyCode == 13) {
input_str = input_element.value;
document.getElementById("output").removeChild(input_element);
print(input_str);
print("\n");
resolve(input_str);
}
});
});
}
function tab(space)
{
var str = "";
while (space-- > 0)
str += " ";
return str;
}
// x,y = origin square
// a,b = movement direction
function try_computer()
{
u = x + a;
v = y + b;
if (u < 0 || u > 7 || v < 0 || v > 7)
return;
if (s[u][v] == 0) {
eval_move();
return;
}
if (s[u][v] < 0) // Cannot jump over own pieces
return;
u += a;
u += b;
if (u < 0 || u > 7 || v < 0 || v > 7)
return;
if (s[u][v] == 0)
eval_move();
}
// x,y = origin square
// u,v = target square
function eval_move()
{
if (v == 0 && s[x][y] == -1)
q += 2;
if (Math.abs(y - v) == 2)
q += 5;
if (y == 7)
q -= 2;
if (u == 0 || u == 7)
q++;
for (c = -1; c <= 1; c += 2) {
if (u + c < 0 || u + c > 7 || v + g < 0)
continue;
if (s[u + c][v + g] < 0) { // Computer piece
q++;
continue;
}
if (u - c < 0 || u - c > 7 || v - g > 7)
continue;
if (s[u + c][v + g] > 0 && (s[u - c][v - g] == 0 || (u - c == x && v - g == y)))
q -= 2;
}
if (q > r[0]) { // Best movement so far?
r[0] = q; // Take note of score
r[1] = x; // Origin square
r[2] = y;
r[3] = u; // Target square
r[4] = v;
}
q = 0;
}
function more_captures() {
u = x + a;
v = y + b;
if (u < 0 || u > 7 || v < 0 || v > 7)
return;
if (s[u][v] == 0 && s[x + a / 2][y + b / 2] > 0)
eval_move();
}
var r = [-99, 0, 0, 0, 0];
var s = [];
for (x = 0; x <= 7; x++)
s[x] = [];
var g = -1;
var data = [1, 0, 1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, -1, 0, -1, 15];
var p = 0;
var q = 0;
// Main program
async function main()
{
print(tab(32) + "CHECKERS\n");
print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
print("\n");
print("\n");
print("\n");
print("THIS IS THE GAME OF CHECKERS. THE COMPUTER IS X,\n");
print("AND YOU ARE O. THE COMPUTER WILL MOVE FIRST.\n");
print("SQUARES ARE REFERRED TO BY A COORDINATE SYSTEM.\n");
print("(0,0) IS THE LOWER LEFT CORNER\n");
print("(0,7) IS THE UPPER LEFT CORNER\n");
print("(7,0) IS THE LOWER RIGHT CORNER\n");
print("(7,7) IS THE UPPER RIGHT CORNER\n");
print("THE COMPUTER WILL TYPE '+TO' WHEN YOU HAVE ANOTHER\n");
print("JUMP. TYPE TWO NEGATIVE NUMBERS IF YOU CANNOT JUMP.\n");
print("\n");
print("\n");
print("\n");
for (x = 0; x <= 7; x++) {
for (y = 0; y <= 7; y++) {
if (data[p] == 15)
p = 0;
s[x][y] = data[p];
p++;
}
}
while (1) {
// Search the board for the best movement
for (x = 0; x <= 7; x++) {
for (y = 0; y <= 7; y++) {
if (s[x][y] > -1)
continue;
if (s[x][y] == -1) { // Piece
for (a = -1; a <= 1; a += 2) {
b = g; // Only advances
try_computer();
}
} else if (s[x][y] == -2) { // King
for (a = -1; a <= 1; a += 2) {
for (b = -1; b <= 1; b += 2) {
try_computer();
}
}
}
}
}
if (r[0] == -99) {
print("\n");
print("YOU WIN.\n");
break;
}
print("FROM " + r[1] + "," + r[2] + " TO " + r[3] + "," + r[4]);
r[0] = -99;
while (1) {
if (r[4] == 0) { // Computer reaches the bottom
s[r[3]][r[4]] = -2; // King
break;
}
s[r[3]][r[4]] = s[r[1]][r[2]]; // Move
s[r[1]][r[2]] = 0;
if (Math.abs(r[1] - r[3]) == 2) {
s[(r[1] + r[3]) / 2][(r[2] + r[4]) / 2] = 0; // Capture
x = r[3];
y = r[4];
if (s[x][y] == -1) {
b = -2;
for (a = -2; a <= 2; a += 4) {
more_captures();
}
} else if (s[x][y] == -2) {
for (a = -2; a <= 2; a += 4) {
for (b = -2; b <= 2; b += 4) {
more_captures();
}
}
}
if (r[0] != -99) {
print(" TO " + r[3] + "," + r[4]);
r[0] = -99;
continue;
}
}
break;
}
print("\n");
print("\n");
print("\n");
for (y = 7; y >= 0; y--) {
str = "";
for (x = 0; x <= 7; x++) {
if (s[x][y] == 0)
str += ".";
if (s[x][y] == 1)
str += "O";
if (s[x][y] == -1)
str += "X";
if (s[x][y] == -2)
str += "X*";
if (s[x][y] == 2)
str += "O*";
while (str.length % 5)
str += " ";
}
print(str + "\n");
print("\n");
}
print("\n");
z = 0;
t = 0;
for (l = 0; l <= 7; l++) {
for (m = 0; m <= 7; m++) {
if (s[l][m] == 1 || s[l][m] == 2)
z = 1;
if (s[l][m] == -1 || s[l][m] == -2)
t = 1;
}
}
if (z != 1) {
print("\n");
print("I WIN.\n");
break;
}
if (t != 1) {
print("\n");
print("YOU WIN.\n");
break;
}
do {
print("FROM");
e = await input();
h = parseInt(e.substr(e.indexOf(",") + 1));
e = parseInt(e);
x = e;
y = h;
} while (s[x][y] <= 0) ;
do {
print("TO");
a = await input();
b = parseInt(a.substr(a.indexOf(",") + 1));
a = parseInt(a);
x = a;
y = b;
if (s[x][y] == 0 && Math.abs(a - e) <= 2 && Math.abs(a - e) == Math.abs(b - h))
break;
print("WHAT?\n");
} while (1) ;
i = 46;
do {
s[a][b] = s[e][h]
s[e][h] = 0;
if (Math.abs(e - a) != 2)
break;
s[(e + a) / 2][(h + b) / 2] = 0;
while (1) {
print("+TO");
a1 = await input();
b1 = parseInt(a1.substr(a1.indexOf(",") + 1));
a1 = parseInt(a1);
if (a1 < 0)
break;
if (s[a1][b1] == 0 && Math.abs(a1 - a) == 2 && Math.abs(b1 - b) == 2)
break;
}
if (a1 < 0)
break;
e = a;
h = b;
a = a1;
b = b1;
i += 15;
} while (1);
if (b == 7) // Player reaches top
s[a][b] = 2; // Convert to king
}
}
main();