mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2026-01-06 10:05:45 -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:
7
68_Orbit/README.md
Normal file
7
68_Orbit/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
### Orbit
|
||||
|
||||
As published in Basic Computer Games (1978)
|
||||
https://www.atariarchives.org/basicgames/showpage.php?page=124
|
||||
|
||||
Downloaded from Vintage Basic at
|
||||
http://www.vintage-basic.net/games.html
|
||||
3
68_Orbit/csharp/README.md
Normal file
3
68_Orbit/csharp/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Microsoft C#](https://docs.microsoft.com/en-us/dotnet/csharp/)
|
||||
192
68_Orbit/java/Orbit.java
Normal file
192
68_Orbit/java/Orbit.java
Normal file
@@ -0,0 +1,192 @@
|
||||
import java.lang.Integer;
|
||||
import java.lang.Math;
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* Game of Orbit
|
||||
* <p>
|
||||
* Based on the BASIC game of Orbit here
|
||||
* https://github.com/coding-horror/basic-computer-games/blob/main/68%20Orbit/orbit.bas
|
||||
* <p>
|
||||
* Note: The idea was to create a version of the 1970's BASIC game in Java, without introducing
|
||||
* new features - no additional text, error checking, etc has been added.
|
||||
*
|
||||
* Converted from BASIC to Java by Darren Cardenas.
|
||||
*/
|
||||
|
||||
public class Orbit {
|
||||
|
||||
private final Scanner scan; // For user input
|
||||
|
||||
public Orbit() {
|
||||
|
||||
scan = new Scanner(System.in);
|
||||
|
||||
} // End of constructor Orbit
|
||||
|
||||
public void play() {
|
||||
|
||||
showIntro();
|
||||
startGame();
|
||||
|
||||
} // End of method play
|
||||
|
||||
private static void showIntro() {
|
||||
|
||||
System.out.println(" ".repeat(32) + "ORBIT");
|
||||
System.out.println(" ".repeat(14) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
||||
System.out.println("\n\n");
|
||||
|
||||
System.out.println("SOMEWHERE ABOVE YOUR PLANET IS A ROMULAN SHIP.");
|
||||
System.out.println("");
|
||||
System.out.println("THE SHIP IS IN A CONSTANT POLAR ORBIT. ITS");
|
||||
System.out.println("DISTANCE FROM THE CENTER OF YOUR PLANET IS FROM");
|
||||
System.out.println("10,000 TO 30,000 MILES AND AT ITS PRESENT VELOCITY CAN");
|
||||
System.out.println("CIRCLE YOUR PLANET ONCE EVERY 12 TO 36 HOURS.");
|
||||
System.out.println("");
|
||||
System.out.println("UNFORTUNATELY, THEY ARE USING A CLOAKING DEVICE SO");
|
||||
System.out.println("YOU ARE UNABLE TO SEE THEM, BUT WITH A SPECIAL");
|
||||
System.out.println("INSTRUMENT YOU CAN TELL HOW NEAR THEIR SHIP YOUR");
|
||||
System.out.println("PHOTON BOMB EXPLODED. YOU HAVE SEVEN HOURS UNTIL THEY");
|
||||
System.out.println("HAVE BUILT UP SUFFICIENT POWER IN ORDER TO ESCAPE");
|
||||
System.out.println("YOUR PLANET'S GRAVITY.");
|
||||
System.out.println("");
|
||||
System.out.println("YOUR PLANET HAS ENOUGH POWER TO FIRE ONE BOMB AN HOUR.");
|
||||
System.out.println("");
|
||||
System.out.println("AT THE BEGINNING OF EACH HOUR YOU WILL BE ASKED TO GIVE AN");
|
||||
System.out.println("ANGLE (BETWEEN 0 AND 360) AND A DISTANCE IN UNITS OF");
|
||||
System.out.println("100 MILES (BETWEEN 100 AND 300), AFTER WHICH YOUR BOMB'S");
|
||||
System.out.println("DISTANCE FROM THE ENEMY SHIP WILL BE GIVEN.");
|
||||
System.out.println("");
|
||||
System.out.println("AN EXPLOSION WITHIN 5,000 MILES OF THE ROMULAN SHIP");
|
||||
System.out.println("WILL DESTROY IT.");
|
||||
System.out.println("");
|
||||
System.out.println("BELOW IS A DIAGRAM TO HELP YOU VISUALIZE YOUR PLIGHT.");
|
||||
System.out.println("");
|
||||
System.out.println("");
|
||||
System.out.println(" 90");
|
||||
System.out.println(" 0000000000000");
|
||||
System.out.println(" 0000000000000000000");
|
||||
System.out.println(" 000000 000000");
|
||||
System.out.println(" 00000 00000");
|
||||
System.out.println(" 00000 XXXXXXXXXXX 00000");
|
||||
System.out.println(" 00000 XXXXXXXXXXXXX 00000");
|
||||
System.out.println(" 0000 XXXXXXXXXXXXXXX 0000");
|
||||
System.out.println(" 0000 XXXXXXXXXXXXXXXXX 0000");
|
||||
System.out.println(" 0000 XXXXXXXXXXXXXXXXXXX 0000");
|
||||
System.out.println("180<== 00000 XXXXXXXXXXXXXXXXXXX 00000 ==>0");
|
||||
System.out.println(" 0000 XXXXXXXXXXXXXXXXXXX 0000");
|
||||
System.out.println(" 0000 XXXXXXXXXXXXXXXXX 0000");
|
||||
System.out.println(" 0000 XXXXXXXXXXXXXXX 0000");
|
||||
System.out.println(" 00000 XXXXXXXXXXXXX 00000");
|
||||
System.out.println(" 00000 XXXXXXXXXXX 00000");
|
||||
System.out.println(" 00000 00000");
|
||||
System.out.println(" 000000 000000");
|
||||
System.out.println(" 0000000000000000000");
|
||||
System.out.println(" 0000000000000");
|
||||
System.out.println(" 270");
|
||||
System.out.println("");
|
||||
System.out.println("X - YOUR PLANET");
|
||||
System.out.println("O - THE ORBIT OF THE ROMULAN SHIP");
|
||||
System.out.println("");
|
||||
System.out.println("ON THE ABOVE DIAGRAM, THE ROMULAN SHIP IS CIRCLING");
|
||||
System.out.println("COUNTERCLOCKWISE AROUND YOUR PLANET. DON'T FORGET THAT");
|
||||
System.out.println("WITHOUT SUFFICIENT POWER THE ROMULAN SHIP'S ALTITUDE");
|
||||
System.out.println("AND ORBITAL RATE WILL REMAIN CONSTANT.");
|
||||
System.out.println("");
|
||||
System.out.println("GOOD LUCK. THE FEDERATION IS COUNTING ON YOU.");
|
||||
|
||||
} // End of method showIntro
|
||||
|
||||
private void startGame() {
|
||||
|
||||
double bombDistance = 0;
|
||||
int bombAltitude = 0;
|
||||
int bombAngle = 0;
|
||||
int deltaAngle = 0;
|
||||
int hour = 0;
|
||||
int shipAltitude = 0;
|
||||
int shipAngle = 0;
|
||||
int shipRate = 0;
|
||||
String userResponse = "";
|
||||
|
||||
// Begin outer while loop
|
||||
while (true) {
|
||||
shipAngle = (int) (361 * Math.random());
|
||||
shipAltitude = (int) (201 * Math.random() + 200);
|
||||
shipRate = (int) (21 * Math.random() + 10);
|
||||
|
||||
hour = 0;
|
||||
|
||||
// Begin time limit loop
|
||||
while (hour < 7) {
|
||||
|
||||
System.out.println("");
|
||||
System.out.println("");
|
||||
System.out.println("THIS IS HOUR " + (hour + 1) + ", AT WHAT ANGLE DO YOU WISH TO SEND");
|
||||
System.out.print("YOUR PHOTON BOMB? ");
|
||||
bombAngle = Integer.parseInt(scan.nextLine());
|
||||
|
||||
System.out.print("HOW FAR OUT DO YOU WISH TO DETONATE IT? ");
|
||||
bombAltitude = Integer.parseInt(scan.nextLine());
|
||||
|
||||
System.out.println("");
|
||||
System.out.println("");
|
||||
|
||||
// Update ship position
|
||||
shipAngle += shipRate;
|
||||
|
||||
// Handle full revolutions
|
||||
if (shipAngle >= 360) {
|
||||
shipAngle -= 360;
|
||||
}
|
||||
|
||||
deltaAngle = Math.abs(shipAngle - bombAngle);
|
||||
|
||||
// Keep angle in upper quadrants
|
||||
if (deltaAngle >= 180) {
|
||||
deltaAngle = 360 - deltaAngle;
|
||||
}
|
||||
|
||||
bombDistance = Math.sqrt(shipAltitude * shipAltitude + bombAltitude * bombAltitude - 2 * shipAltitude
|
||||
* bombAltitude * Math.cos(deltaAngle * Math.PI / 180));
|
||||
|
||||
System.out.format("YOUR PHOTON BOMB EXPLODED " + "%.5f" + "*10^2 MILES FROM THE\n", bombDistance);
|
||||
System.out.println("ROMULAN SHIP.");
|
||||
|
||||
// Win condition
|
||||
if (bombDistance <= 50) {
|
||||
System.out.println("YOU HAVE SUCCESSFULLY COMPLETED YOUR MISSION.");
|
||||
break;
|
||||
}
|
||||
|
||||
hour++;
|
||||
|
||||
} // End time limit loop
|
||||
|
||||
// Lose condition
|
||||
if (hour == 7) {
|
||||
System.out.println("YOU HAVE ALLOWED THE ROMULANS TO ESCAPE.");
|
||||
}
|
||||
|
||||
System.out.println("ANOTHER ROMULAN SHIP HAS GONE INTO ORBIT.");
|
||||
System.out.print("DO YOU WISH TO TRY TO DESTROY IT? ");
|
||||
userResponse = scan.nextLine();
|
||||
|
||||
if (!userResponse.toUpperCase().equals("YES")) {
|
||||
System.out.println("GOOD BYE.");
|
||||
break;
|
||||
}
|
||||
|
||||
} // End outer while loop
|
||||
|
||||
} // End of method startGame
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Orbit game = new Orbit();
|
||||
game.play();
|
||||
|
||||
} // End of method main
|
||||
|
||||
} // End of class Orbit
|
||||
3
68_Orbit/java/README.md
Normal file
3
68_Orbit/java/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Oracle Java](https://openjdk.java.net/)
|
||||
3
68_Orbit/javascript/README.md
Normal file
3
68_Orbit/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
68_Orbit/javascript/orbit.html
Normal file
9
68_Orbit/javascript/orbit.html
Normal file
@@ -0,0 +1,9 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>ORBIT</title>
|
||||
</head>
|
||||
<body>
|
||||
<pre id="output" style="font-size: 12pt;"></pre>
|
||||
<script src="orbit.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
155
68_Orbit/javascript/orbit.js
Normal file
155
68_Orbit/javascript/orbit.js
Normal file
@@ -0,0 +1,155 @@
|
||||
// ORBIT
|
||||
//
|
||||
// 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 a = [];
|
||||
|
||||
// Main program
|
||||
async function main()
|
||||
{
|
||||
print(tab(33) + "ORBIT\n");
|
||||
print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
|
||||
print("\n");
|
||||
print("\n");
|
||||
print("\n");
|
||||
print("SOMEWHERE ABOVE YOUR PLANET IS A ROMULAN SHIP.\n");
|
||||
print("\n");
|
||||
print("THE SHIP IS IN A CONSTANT POLAR ORBIT. ITS\n");
|
||||
print("DISTANCE FROM THE CENTER OF YOUR PLANET IS FROM\n");
|
||||
print("10,000 TO 30,000 MILES AND AT ITS PRESENT VELOCITY CAN\n");
|
||||
print("CIRCLE YOUR PLANET ONCE EVERY 12 TO 36 HOURS.\n");
|
||||
print("\n");
|
||||
print("UNFORTUNATELY, THEY ARE USING A CLOAKING DEVICE SO\n");
|
||||
print("YOU ARE UNABLE TO SEE THEM, BUT WITH A SPECIAL\n");
|
||||
print("INSTRUMENT YOU CAN TELL HOW NEAR THEIR SHIP YOUR\n");
|
||||
print("PHOTON BOMB EXPLODED. YOU HAVE SEVEN HOURS UNTIL THEY\n");
|
||||
print("HAVE BUILT UP SUFFICIENT POWER IN ORDER TO ESCAPE\n");
|
||||
print("YOUR PLANET'S GRAVITY.\n");
|
||||
print("\n");
|
||||
print("YOUR PLANET HAS ENOUGH POWER TO FIRE ONE BOMB AN HOUR.\n");
|
||||
print("\n");
|
||||
print("AT THE BEGINNING OF EACH HOUR YOU WILL BE ASKED TO GIVE AN\n");
|
||||
print("ANGLE (BETWEEN 0 AND 360) AND A DISTANCE IN UNITS OF\n");
|
||||
print("100 MILES (BETWEEN 100 AND 300), AFTER WHICH YOUR BOMB'S\n");
|
||||
print("DISTANCE FROM THE ENEMY SHIP WILL BE GIVEN.\n");
|
||||
print("\n");
|
||||
print("AN EXPLOSION WITHIN 5,000 MILES OF THE ROMULAN SHIP\n");
|
||||
print("WILL DESTROY IT.\n");
|
||||
print("\n");
|
||||
print("BELOW IS A DIAGRAM TO HELP YOU VISUALIZE YOUR PLIGHT.\n");
|
||||
print("\n");
|
||||
print("\n");
|
||||
print(" 90\n");
|
||||
print(" 0000000000000\n");
|
||||
print(" 0000000000000000000\n");
|
||||
print(" 000000 000000\n");
|
||||
print(" 00000 00000\n");
|
||||
print(" 00000 XXXXXXXXXXX 00000\n");
|
||||
print(" 00000 XXXXXXXXXXXXX 00000\n");
|
||||
print(" 0000 XXXXXXXXXXXXXXX 0000\n");
|
||||
print(" 0000 XXXXXXXXXXXXXXXXX 0000\n");
|
||||
print(" 0000 XXXXXXXXXXXXXXXXXXX 0000\n");
|
||||
print("180<== 00000 XXXXXXXXXXXXXXXXXXX 00000 ==>0\n");
|
||||
print(" 0000 XXXXXXXXXXXXXXXXXXX 0000\n");
|
||||
print(" 0000 XXXXXXXXXXXXXXXXX 0000\n");
|
||||
print(" 0000 XXXXXXXXXXXXXXX 0000\n");
|
||||
print(" 00000 XXXXXXXXXXXXX 00000\n");
|
||||
print(" 00000 XXXXXXXXXXX 00000\n");
|
||||
print(" 00000 00000\n");
|
||||
print(" 000000 000000\n");
|
||||
print(" 0000000000000000000\n");
|
||||
print(" 0000000000000\n");
|
||||
print(" 270\n");
|
||||
print("\n");
|
||||
print("X - YOUR PLANET\n");
|
||||
print("O - THE ORBIT OF THE ROMULAN SHIP\n");
|
||||
print("\n");
|
||||
print("ON THE ABOVE DIAGRAM, THE ROMULAN SHIP IS CIRCLING\n");
|
||||
print("COUNTERCLOCKWISE AROUND YOUR PLANET. DON'T FORGET THAT\n");
|
||||
print("WITHOUT SUFFICIENT POWER THE ROMULAN SHIP'S ALTITUDE\n");
|
||||
print("AND ORBITAL RATE WILL REMAIN CONSTANT.\n");
|
||||
print("\n");
|
||||
print("GOOD LUCK. THE FEDERATION IS COUNTING ON YOU.\n");
|
||||
while (1) {
|
||||
a = Math.floor(360 * Math.random());
|
||||
d = Math.floor(200 * Math.random() + 200);
|
||||
r = Math.floor(20 * Math.random() + 10);
|
||||
h = 0;
|
||||
while (h < 7) {
|
||||
print("\n");
|
||||
print("\n");
|
||||
print("THIS IS HOUR " + (h + 1) + ", AT WHAT ANGLE DO YOU WISH TO SEND\n");
|
||||
print("YOUR PHOTON BOMB");
|
||||
a1 = parseFloat(await input());
|
||||
print("HOW FAR OUT DO YOU WISH TO DETONATE IT");
|
||||
d1 = parseFloat(await input());
|
||||
print("\n");
|
||||
print("\n");
|
||||
a += r;
|
||||
if (a >= 360)
|
||||
a -= 360;
|
||||
t = Math.abs(a - a1);
|
||||
if (t >= 180)
|
||||
t = 360 - t;
|
||||
c = Math.sqrt(d * d + d1 * d1 - 2 * d * d1 * Math.cos(t * Math.PI / 180));
|
||||
print("YOUR PHOTON BOMB EXPLODED " + c + "*10^2 MILES FROM THE\n");
|
||||
print("ROMULAN SHIP.\n");
|
||||
if (c <= 50)
|
||||
break;
|
||||
h++;
|
||||
}
|
||||
if (h == 7) {
|
||||
print("YOU HAVE ALLOWED THE ROMULANS TO ESCAPE.\n");
|
||||
} else {
|
||||
print("YOU HAVE SUCCESSFULLY COMPLETED YOUR MISSION.\n");
|
||||
}
|
||||
print("ANOTHER ROMULAN SHIP HAS GONE INTO ORBIT.\n");
|
||||
print("DO YOU WISH TO TRY TO DESTROY IT");
|
||||
str = await input();
|
||||
if (str != "YES")
|
||||
break;
|
||||
}
|
||||
print("GOOD BYE.\n");
|
||||
}
|
||||
|
||||
main();
|
||||
96
68_Orbit/orbit.bas
Normal file
96
68_Orbit/orbit.bas
Normal file
@@ -0,0 +1,96 @@
|
||||
2 PRINT TAB(33);"ORBIT"
|
||||
4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
|
||||
6 PRINT:PRINT:PRINT
|
||||
10 PRINT "SOMEWHERE ABOVE YOUR PLANET IS A ROMULAN SHIP."
|
||||
15 PRINT
|
||||
20 PRINT "THE SHIP IS IN A CONSTANT POLAR ORBIT. ITS"
|
||||
25 PRINT "DISTANCE FROM THE CENTER OF YOUR PLANET IS FROM"
|
||||
30 PRINT "10,000 TO 30,000 MILES AND AT ITS PRESENT VELOCITY CAN"
|
||||
31 PRINT "CIRCLE YOUR PLANET ONCE EVERY 12 TO 36 HOURS."
|
||||
35 PRINT
|
||||
40 PRINT "UNFORTUNATELY, THEY ARE USING A CLOAKING DEVICE SO"
|
||||
45 PRINT "YOU ARE UNABLE TO SEE THEM, BUT WITH A SPECIAL"
|
||||
50 PRINT "INSTRUMENT YOU CAN TELL HOW NEAR THEIR SHIP YOUR"
|
||||
55 PRINT "PHOTON BOMB EXPLODED. YOU HAVE SEVEN HOURS UNTIL THEY"
|
||||
60 PRINT "HAVE BUILT UP SUFFICIENT POWER IN ORDER TO ESCAPE"
|
||||
65 PRINT "YOUR PLANET'S GRAVITY."
|
||||
70 PRINT
|
||||
75 PRINT "YOUR PLANET HAS ENOUGH POWER TO FIRE ONE BOMB AN HOUR."
|
||||
80 PRINT
|
||||
85 PRINT "AT THE BEGINNING OF EACH HOUR YOU WILL BE ASKED TO GIVE AN"
|
||||
90 PRINT "ANGLE (BETWEEN 0 AND 360) AND A DISTANCE IN UNITS OF"
|
||||
95 PRINT "100 MILES (BETWEEN 100 AND 300), AFTER WHICH YOUR BOMB'S"
|
||||
100 PRINT "DISTANCE FROM THE ENEMY SHIP WILL BE GIVEN."
|
||||
105 PRINT
|
||||
110 PRINT "AN EXPLOSION WITHIN 5,000 MILES OF THE ROMULAN SHIP"
|
||||
111 PRINT "WILL DESTROY IT."
|
||||
114 PRINT
|
||||
115 PRINT "BELOW IS A DIAGRAM TO HELP YOU VISUALIZE YOUR PLIGHT."
|
||||
116 PRINT
|
||||
117 PRINT
|
||||
168 PRINT " 90"
|
||||
170 PRINT " 0000000000000"
|
||||
171 PRINT " 0000000000000000000"
|
||||
172 PRINT " 000000 000000"
|
||||
173 PRINT " 00000 00000"
|
||||
174 PRINT " 00000 XXXXXXXXXXX 00000"
|
||||
175 PRINT " 00000 XXXXXXXXXXXXX 00000"
|
||||
176 PRINT " 0000 XXXXXXXXXXXXXXX 0000"
|
||||
177 PRINT " 0000 XXXXXXXXXXXXXXXXX 0000"
|
||||
178 PRINT " 0000 XXXXXXXXXXXXXXXXXXX 0000"
|
||||
179 PRINT "180<== 00000 XXXXXXXXXXXXXXXXXXX 00000 ==>0"
|
||||
180 PRINT " 0000 XXXXXXXXXXXXXXXXXXX 0000"
|
||||
181 PRINT " 0000 XXXXXXXXXXXXXXXXX 0000"
|
||||
182 PRINT " 0000 XXXXXXXXXXXXXXX 0000"
|
||||
183 PRINT " 00000 XXXXXXXXXXXXX 00000"
|
||||
184 PRINT " 00000 XXXXXXXXXXX 00000"
|
||||
185 PRINT " 00000 00000"
|
||||
186 PRINT " 000000 000000"
|
||||
187 PRINT " 0000000000000000000"
|
||||
188 PRINT " 0000000000000"
|
||||
190 PRINT " 270"
|
||||
192 PRINT
|
||||
195 PRINT "X - YOUR PLANET"
|
||||
196 PRINT "O - THE ORBIT OF THE ROMULAN SHIP"
|
||||
197 PRINT
|
||||
198 PRINT "ON THE ABOVE DIAGRAM, THE ROMULAN SHIP IS CIRCLING"
|
||||
199 PRINT "COUNTERCLOCKWISE AROUND YOUR PLANET. DON'T FORGET THAT"
|
||||
200 PRINT "WITHOUT SUFFICIENT POWER THE ROMULAN SHIP'S ALTITUDE"
|
||||
210 PRINT "AND ORBITAL RATE WILL REMAIN CONSTANT."
|
||||
220 PRINT
|
||||
230 PRINT "GOOD LUCK. THE FEDERATION IS COUNTING ON YOU."
|
||||
270 A=INT(360*RND(1))
|
||||
280 D=INT(200*RND(1)+200)
|
||||
290 R=INT(20*RND(1)+10)
|
||||
300 H=0
|
||||
310 IF H=7 THEN 490
|
||||
320 H=H+1
|
||||
325 PRINT
|
||||
326 PRINT
|
||||
330 PRINT "THIS IS HOUR";H;", AT WHAT ANGLE DO YOU WISH TO SEND"
|
||||
335 PRINT "YOUR PHOTON BOMB";
|
||||
340 INPUT A1
|
||||
350 PRINT "HOW FAR OUT DO YOU WISH TO DETONATE IT";
|
||||
360 INPUT D1
|
||||
365 PRINT
|
||||
366 PRINT
|
||||
370 A=A+R
|
||||
380 IF A<360 THEN 400
|
||||
390 A=A-360
|
||||
400 T=ABS(A-A1)
|
||||
410 IF T<180 THEN 430
|
||||
420 T=360-T
|
||||
430 C=SQR(D*D+D1*D1-2*D*D1*COS(T*3.14159/180))
|
||||
440 PRINT "YOUR PHOTON BOMB EXPLODED";C;"*10^2 MILES FROM THE"
|
||||
445 PRINT "ROMULAN SHIP."
|
||||
450 IF C<=50 THEN 470
|
||||
460 GOTO 310
|
||||
470 PRINT "YOU HAVE SUCCESFULLY COMPLETED YOUR MISSION."
|
||||
480 GOTO 500
|
||||
490 PRINT "YOU HAVE ALLOWED THE ROMULANS TO ESCAPE."
|
||||
500 PRINT "ANOTHER ROMULAN SHIP HAS GONE INTO ORBIT."
|
||||
510 PRINT "DO YOU WISH TO TRY TO DESTROY IT";
|
||||
520 INPUT C$
|
||||
530 IF C$="YES" THEN 270
|
||||
540 PRINT "GOOD BYE."
|
||||
999 END
|
||||
3
68_Orbit/pascal/README.md
Normal file
3
68_Orbit/pascal/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Pascal](https://en.wikipedia.org/wiki/Pascal_(programming_language))
|
||||
3
68_Orbit/perl/README.md
Normal file
3
68_Orbit/perl/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Perl](https://www.perl.org/)
|
||||
3
68_Orbit/python/README.md
Normal file
3
68_Orbit/python/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Python](https://www.python.org/about/)
|
||||
163
68_Orbit/python/orbit.py
Normal file
163
68_Orbit/python/orbit.py
Normal file
@@ -0,0 +1,163 @@
|
||||
"""
|
||||
ORBIT
|
||||
|
||||
Orbital mechanics simulation
|
||||
|
||||
Port by Dave LeCompte
|
||||
"""
|
||||
|
||||
import math
|
||||
import random
|
||||
|
||||
PAGE_WIDTH = 64
|
||||
|
||||
|
||||
def print_centered(msg):
|
||||
spaces = " " * ((PAGE_WIDTH - len(msg)) // 2)
|
||||
print(spaces + msg)
|
||||
|
||||
|
||||
def print_instructions():
|
||||
print(
|
||||
"""SOMEWHERE ABOVE YOUR PLANET IS A ROMULAN SHIP.
|
||||
|
||||
THE SHIP IS IN A CONSTANT POLAR ORBIT. ITS
|
||||
DISTANCE FROM THE CENTER OF YOUR PLANET IS FROM
|
||||
10,000 TO 30,000 MILES AND AT ITS PRESENT VELOCITY CAN
|
||||
CIRCLE YOUR PLANET ONCE EVERY 12 TO 36 HOURS.
|
||||
|
||||
UNFORTUNATELY, THEY ARE USING A CLOAKING DEVICE SO
|
||||
YOU ARE UNABLE TO SEE THEM, BUT WITH A SPECIAL
|
||||
INSTRUMENT YOU CAN TELL HOW NEAR THEIR SHIP YOUR
|
||||
PHOTON BOMB EXPLODED. YOU HAVE SEVEN HOURS UNTIL THEY
|
||||
HAVE BUILT UP SUFFICIENT POWER IN ORDER TO ESCAPE
|
||||
YOUR PLANET'S GRAVITY.
|
||||
|
||||
YOUR PLANET HAS ENOUGH POWER TO FIRE ONE BOMB AN HOUR.
|
||||
|
||||
AT THE BEGINNING OF EACH HOUR YOU WILL BE ASKED TO GIVE AN
|
||||
ANGLE (BETWEEN 0 AND 360) AND A DISTANCE IN UNITS OF
|
||||
100 MILES (BETWEEN 100 AND 300), AFTER WHICH YOUR BOMB'S
|
||||
DISTANCE FROM THE ENEMY SHIP WILL BE GIVEN.
|
||||
|
||||
AN EXPLOSION WITHIN 5,000 MILES OF THE ROMULAN SHIP
|
||||
WILL DESTROY IT.
|
||||
|
||||
BELOW IS A DIAGRAM TO HELP YOU VISUALIZE YOUR PLIGHT.
|
||||
|
||||
|
||||
90
|
||||
0000000000000
|
||||
0000000000000000000
|
||||
000000 000000
|
||||
00000 00000
|
||||
00000 XXXXXXXXXXX 00000
|
||||
00000 XXXXXXXXXXXXX 00000
|
||||
0000 XXXXXXXXXXXXXXX 0000
|
||||
0000 XXXXXXXXXXXXXXXXX 0000
|
||||
0000 XXXXXXXXXXXXXXXXXXX 0000
|
||||
180<== 00000 XXXXXXXXXXXXXXXXXXX 00000 ==>0
|
||||
0000 XXXXXXXXXXXXXXXXXXX 0000
|
||||
0000 XXXXXXXXXXXXXXXXX 0000
|
||||
0000 XXXXXXXXXXXXXXX 0000
|
||||
00000 XXXXXXXXXXXXX 00000
|
||||
00000 XXXXXXXXXXX 00000
|
||||
00000 00000
|
||||
000000 000000
|
||||
0000000000000000000
|
||||
0000000000000
|
||||
270
|
||||
|
||||
X - YOUR PLANET
|
||||
O - THE ORBIT OF THE ROMULAN SHIP
|
||||
|
||||
ON THE ABOVE DIAGRAM, THE ROMULAN SHIP IS CIRCLING
|
||||
COUNTERCLOCKWISE AROUND YOUR PLANET. DON'T FORGET THAT
|
||||
WITHOUT SUFFICIENT POWER THE ROMULAN SHIP'S ALTITUDE
|
||||
AND ORBITAL RATE WILL REMAIN CONSTANT.
|
||||
|
||||
GOOD LUCK. THE FEDERATION IS COUNTING ON YOU.
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
def get_yes_or_no():
|
||||
while True:
|
||||
response = input().upper()
|
||||
if response == "YES":
|
||||
return True
|
||||
elif response == "NO":
|
||||
return False
|
||||
else:
|
||||
print("PLEASE TYPE 'YES' OR 'NO'")
|
||||
|
||||
|
||||
def game_over(is_success):
|
||||
if is_success:
|
||||
print("YOU HAVE SUCCESSFULLY COMPLETED YOUR MISSION.")
|
||||
else:
|
||||
print("YOU HAVE ALLOWED THE ROMULANS TO ESCAPE.")
|
||||
print("ANOTHER ROMULAN SHIP HAS GONE INTO ORBIT.")
|
||||
print("DO YOU WISH TO TRY TO DESTROY IT?")
|
||||
|
||||
return get_yes_or_no()
|
||||
|
||||
|
||||
def play_game():
|
||||
rom_angle = random.randint(0, 359)
|
||||
rom_distance = random.randint(100, 300)
|
||||
rom_angular_velocity = random.randint(10, 30)
|
||||
hour = 0
|
||||
while hour < 7:
|
||||
hour += 1
|
||||
print()
|
||||
print()
|
||||
print(f"THIS IS HOUR {hour}, AT WHAT ANGLE DO YOU WISH TO SEND")
|
||||
print("YOUR PHOTON BOMB?")
|
||||
|
||||
bomb_angle = float(input())
|
||||
print("HOW FAR OUT DO YOU WISH TO DETONATE IT?")
|
||||
bomb_distance = float(input())
|
||||
print()
|
||||
print()
|
||||
|
||||
rom_angle = (rom_angle + rom_angular_velocity) % 360
|
||||
angular_difference = rom_angle - bomb_angle
|
||||
c = math.sqrt(
|
||||
rom_distance ** 2
|
||||
+ bomb_distance ** 2
|
||||
- 2
|
||||
* rom_distance
|
||||
* bomb_distance
|
||||
* math.cos(math.radians(angular_difference))
|
||||
)
|
||||
|
||||
print(f"YOUR PHOTON BOMB EXPLODED {c:.4f}*10^2 MILES FROM THE")
|
||||
print("ROMULAN SHIP.")
|
||||
|
||||
if c <= 50:
|
||||
# Destroyed the Romulan
|
||||
return True
|
||||
|
||||
# Ran out of time
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
print_centered("ORBIT")
|
||||
print_centered("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY")
|
||||
print()
|
||||
print()
|
||||
print()
|
||||
|
||||
print_instructions()
|
||||
|
||||
while True:
|
||||
success = play_game()
|
||||
again = game_over(success)
|
||||
if not again:
|
||||
return
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
3
68_Orbit/ruby/README.md
Normal file
3
68_Orbit/ruby/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Ruby](https://www.ruby-lang.org/en/)
|
||||
3
68_Orbit/vbnet/README.md
Normal file
3
68_Orbit/vbnet/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Original BASIC source [downloaded from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Visual Basic .NET](https://en.wikipedia.org/wiki/Visual_Basic_.NET)
|
||||
Reference in New Issue
Block a user