mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-23 07:29:02 -08:00
261 lines
8.5 KiB
JavaScript
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();
|