Ported CHECKERS, CHEMIST, and CHIEF to Javascript

This commit is contained in:
nanochess
2021-02-19 15:04:20 -06:00
parent 59bdbb82e6
commit 6f3d173f4a
7 changed files with 515 additions and 1 deletions

View 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>

View 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();

View File

@@ -0,0 +1,9 @@
<html>
<head>
<title>CHEMIST</title>
</head>
<body>
<pre id="output" style="font-size: 12pt;"></pre>
<script src="chemist.js"></script>
</body>
</html>

View File

@@ -0,0 +1,82 @@
// CHEMIST
//
// 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;
}
// Main program
async function main()
{
print(tab(33) + "CHEMIST\n");
print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
print("\n");
print("\n");
print("\n");
print("THE FICTITIOUS CHECMICAL KRYPTOCYANIC ACID CAN ONLY BE\n");
print("DILUTED BY THE RATIO OF 7 PARTS WATER TO 3 PARTS ACID.\n");
print("IF ANY OTHER RATIO IS ATTEMPTED, THE ACID BECOMES UNSTABLE\n");
print("AND SOON EXPLODES. GIVEN THE AMOUNT OF ACID, YOU MUST\n");
print("DECIDE WHO MUCH WATER TO ADD FOR DILUTION. IF YOU MISS\n");
print("YOU FACE THE CONSEQUENCES.\n");
t = 0;
while (1) {
a = Math.floor(Math.random() * 50);
w = 7 * a / 3;
print(a + " LITERS OF KRYPTOCYANIC ACID. HOW MUCH WATER");
r = parseFloat(await input());
d = Math.abs(w - r);
if (d > w / 20) {
print(" SIZZLE! YOU HAVE JUST BEEN DESALINATED INTO A BLOB\n");
print(" OF QUIVERING PROTOPLASM!\n");
t++;
if (t == 9)
break;
print(" HOWEVER, YOU MAY TRY AGAIN WITH ANOTHER LIFE.\n");
} else {
print(" GOOD JOB! YOU MAY BREATHE NOW, BUT DON'T INHALE THE FUMES!\n");
print("\n");
}
}
print(" YOUR 9 LIVES ARE USED, BUT YOU WILL BE LONG REMEMBERED FOR\n");
print(" YOUR CONTRIBUTIONS TO THE FIELD OF COMIC BOOK CHEMISTRY.\n");
}
main();

View File

@@ -47,5 +47,5 @@
450 PRINT:PRINT"#########################":PRINT
470 PRINT "I HOPE YOU BELIEVE ME NOW, FOR YOUR SAKE!!"
480 GOTO 520
510 PRINT "BYE!!!"
500 PRINT "BYE!!!"
520 END

View File

@@ -0,0 +1,9 @@
<html>
<head>
<title>CHIEF</title>
</head>
<body>
<pre id="output" style="font-size: 12pt;"></pre>
<script src="chief.js"></script>
</body>
</html>

View File

@@ -0,0 +1,105 @@
// CHIEF
//
// 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;
}
// Main program
async function main()
{
print(tab(30) + "CHIEF\n");
print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
print("\n");
print("\n");
print("\n");
print("I AM CHIEF NUMBERS FREEK, THE GREAT INDIAN MATH GOD.\n");
print("ARE YOU READY TO TAKE THE TEST YOU CALLED ME OUT FOR");
a = await input();
if (a.substr(0, 1) != "Y")
print("SHUT UP, PALE FACE WITH WIE TONGUE.\n");
print(" TAKE A NUMBER AND ADD 3. DIVIDE THIS NUMBER BY 5 AND\n");
print("MULTIPLY BY 8. DIVIDE BY 5 AND ADD THE SAME. SUBTRACT 1.\n");
print(" WHAT DO YOU HAVE");
b = parseFloat(await input());
c = (b + 1 - 5) * 5 / 8 * 5 - 3;
print("I BET YOUR NUMBER WAS " + Math.floor(c + 0.5) + ". AM I RIGHT");
d = await input();
if (d.substr(0, 1) != "Y") {
print("WHAT WAS YOUR ORIGINAL NUMBER");
k = parseFloat(await input());
f = k + 3;
g = f / 5;
h = g * 8;
i = h / 5 + 5;
j = i - 1;
print("SO YOU THINK YOU'RE SO SMART, EH?\n");
print("NOW WATCH.\n");
print(k + " PLUS 3 EQUALS " + f + ". THIS DIVIDED BY 5 EQUALS " + g + ";\n");
print("THIS TIMES 8 EQUALS " + h + ". IF WE DIVIDE BY 5 AND ADD 5,\n");
print("WE GET " + i + ", WHICH, MINUS 1, EQUALS " + j + ".\n");
print("NOW DO YOU BELIEVE ME");
z = await input();
if (z.substr(0, 1) != "Y") {
print("YOU HAVE MADE ME MAD!!!\n");
print("THERE MUST BE A GREAT LIGHTNING BOLT!\n");
print("\n");
print("\n");
for (x = 30; x >= 22; x--)
print(tab(x) + "X X\n");
print(tab(21) + "X XXX\n");
print(tab(20) + "X X\n");
print(tab(19) + "XX X\n");
for (y = 20; y >= 13; y--)
print(tab(y) + "X X\n");
print(tab(12) + "XX\n");
print(tab(11) + "X\n");
print(tab(10) + "*\n");
print("\n");
print("#########################\n");
print("\n");
print("I HOPE YOU BELIEVE ME NOW, FOR YOUR SAKE!!\n");
return;
}
}
print("BYE!!!\n");
}
main();