Files
basic-computer-games/79 Slalom/javascript/slalom.js
2021-03-08 22:31:10 -06:00

261 lines
8.5 KiB
JavaScript

// SLALOM
//
// 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;
}
var speed = [,14,18,26,29,18,
25,28,32,29,20,
29,29,25,21,26,
29,20,21,20,18,
26,25,33,31,22];
function show_instructions()
{
print("\n");
print("*** SLALOM: THIS IS THE 1976 WINTER OLYMPIC GIANT SLALOM. YOU ARE\n");
print(" THE AMERICAN TEAM'S ONLY HOPE OF A GOLD MEDAL.\n");
print("\n");
print(" 0 -- TYPE THIS IS YOU WANT TO SEE HOW LONG YOU'VE TAKEN.\n");
print(" 1 -- TYPE THIS IF YOU WANT TO SPEED UP A LOT.\n");
print(" 2 -- TYPE THIS IF YOU WANT TO SPEED UP A LITTLE.\n");
print(" 3 -- TYPE THIS IF YOU WANT TO SPEED UP A TEENSY.\n");
print(" 4 -- TYPE THIS IF YOU WANT TO KEEP GOING THE SAME SPEED.\n");
print(" 5 -- TYPE THIS IF YOU WANT TO CHECK A TEENSY.\n");
print(" 6 -- TYPE THIS IF YOU WANT TO CHECK A LITTLE.\n");
print(" 7 -- TYPE THIS IF YOU WANT TO CHECK A LOT.\n");
print(" 8 -- TYPE THIS IF YOU WANT TO CHEAT AND TRY TO SKIP A GATE.\n");
print("\n");
print(" THE PLACE TO USE THESE OPTIONS IS WHEN THE COMPUTER ASKS:\n");
print("\n");
print("OPTION?\n");
print("\n");
print(" GOOD LUCK!\n");
print("\n");
}
function show_speeds()
{
print("GATE MAX\n");
print(" # M.P.H.\n");
print("----------\n");
for (var b = 1; b <= v; b++) {
print(" " + b + " " + speed[b] + "\n");
}
}
// Main program
async function main()
{
var gold = 0;
var silver = 0;
var bronze = 0;
print(tab(33) + "SLALOM\n");
print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
print("\n");
print("\n");
print("\n");
while (1) {
print("HOW MANY GATES DOES THIS COURSE HAVE (1 TO 25)");
v = parseInt(await input());
if (v >= 25) {
print("25 IS THE LIMIT\n");
v = 25;
} else if (v < 1) {
print("TRY AGAIN.\n");
} else {
break;
}
}
print("\n");
print("TYPE \"INS\" FOR INSTRUCTIONS\n");
print("TYPE \"MAX\" FOR APPROXIMATE MAXIMUM SPEEDS\n");
print("TYPE \"RUN\" FOR THE BEGINNING OF THE RACE\n");
while (1) {
print("COMMAND--");
str = await input();
if (str == "INS") {
show_instructions();
} else if (str == "MAX") {
show_speeds();
} else if (str == "RUN") {
break;
} else {
print("\"" + str + "\" IS AN ILLEGAL COMMAND--RETRY");
}
}
while (1) {
print("RATE YOURSELF AS A SKIER, (1=WORST, 3=BEST)");
a = parseInt(await input());
if (a < 1 || a > 3)
print("THE BOUNDS ARE 1-3\n");
else
break;
}
while (1) {
print("THE STARTER COUNTS DOWN...5...4...3...2...1...GO!");
t = 0;
s = Math.floor(Math.random(1) * (18 - 9) + 9);
print("\n");
print("YOU'RE OFF!\n");
for (o = 1; o <= v; o++) {
q = speed[o];
print("\n");
print("HERE COMES GATE #" + o + " :\n");
print(s + " M.P.H.\n");
s1 = s;
while (1) {
print("OPTION");
o1 = parseInt(await input());
if (o1 < 0 || o1 > 8)
print("WHAT?\n");
else if (o1 == 0)
print("YOU'VE TAKEN " + (t + Math.random()) + " SECONDS.\n");
else
break;
}
finish = false;
switch (o1) {
case 1:
s += Math.floor(Math.random() * (10 - 5) + 5);
break;
case 2:
s += Math.floor(Math.random() * (5 - 3) + 3);
break;
case 3:
s += Math.floor(Math.random() * (4 - 1) + 1);
break;
case 4:
break;
case 5:
s -= Math.floor(Math.random() * (4 - 1) + 1);
break;
case 6:
s -= Math.floor(Math.random() * (5 - 3) + 3);
break;
case 7:
s -= Math.floor(Math.random() * (10 - 5) + 5);
break;
case 8:
print("***CHEAT\n");
if (Math.random() >= 0.7) {
print("YOU MADE IT!\n");
t += 1.5;
} else {
print("AN OFFICIAL CAUGHT YOU!\n");
print("YOU TOOK " + (t + Math.random()) + " SECONDS.\n");
finish = true;
}
break;
}
if (!finish) {
if (o1 != 4)
print(s + " M.P.H.\n");
if (s > q) {
if (Math.random() < ((s - q) * 0.1) + 0.2) {
print("YOU WENT OVER THE MAXIMUM SPEED AND ");
if (Math.random() < 0.5) {
print("SNAGGED A FLAG!\n");
} else {
print("WIPED OUT!\n");
}
print("YOU TOOK " + (t + Math.random()) + " SECONDS.\n");
finish = true;
} else {
print("YOU WENT OVER THE MAXIMUM SPEED AND MADE IT!\n");
}
} else if (s > q - 1) {
print("CLOSE ONE!\n");
}
}
if (finish)
break;
if (s < 7) {
print("LET'S BE REALISTIC, OK? LET'S GO BACK AND TRY AGAIN...\n");
s = s1;
o--;
continue;
}
t += q - s + 1;
if (s > q) {
t += 0.5;
}
}
if (!finish) {
print("\n");
print("YOU TOOK " + (t + Math.random()) + " SECONDS.\n");
m = t;
m /= v;
if (m < 1.5 - (a * 0.1)) {
print("YOU WON A GOLD MEDAL!\n");
gold++;
} else if (m < 2.9 - (a * 0.1)) {
print("YOU WON A SILVER MEDAL\n");
silver++;
} else if (m < 4.4 - (a * 0.1)) {
print("YOU WON A BRONZE MEDAL\n");
bronze++;
}
}
while (1) {
print("\n");
print("DO YOU WANT TO RACE AGAIN");
str = await input();
if (str != "YES" && str != "NO")
print("PLEASE TYPE 'YES' OR 'NO'\n");
else
break;
}
if (str != "YES")
break;
}
print("THANKS FOR THE RACE\n");
if (gold >= 1)
print("GOLD MEDALS: " + gold + "\n");
if (silver >= 1)
print("SILVER MEDALS: " + silver + "\n");
if (bronze >= 1)
print("BRONZE MEDALS: " + bronze + "\n");
}
main();