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 450 PRINT:PRINT"#########################":PRINT
470 PRINT "I HOPE YOU BELIEVE ME NOW, FOR YOUR SAKE!!" 470 PRINT "I HOPE YOU BELIEVE ME NOW, FOR YOUR SAKE!!"
480 GOTO 520 480 GOTO 520
510 PRINT "BYE!!!" 500 PRINT "BYE!!!"
520 END 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();