mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 07:10:42 -08:00
Removed spaces from top-level directory names.
Spaces tend to cause annoyances in a Unix-style shell environment. This change fixes that.
This commit is contained in:
3
23_Checkers/javascript/README.md
Normal file
3
23_Checkers/javascript/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Shells)
|
||||
9
23_Checkers/javascript/checkers.html
Normal file
9
23_Checkers/javascript/checkers.html
Normal file
@@ -0,0 +1,9 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>CHECKERS</title>
|
||||
</head>
|
||||
<body>
|
||||
<pre id="output" style="font-size: 12pt;"></pre>
|
||||
<script src="checkers.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
300
23_Checkers/javascript/checkers.js
Normal file
300
23_Checkers/javascript/checkers.js
Normal file
@@ -0,0 +1,300 @@
|
||||
// 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();
|
||||
Reference in New Issue
Block a user