mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2026-06-30 02:03:42 -07:00
Merge pull request #2 from coding-horror/main
Merge changes from coding-horror/main
This commit is contained in:
+2
-2
@@ -1,7 +1,7 @@
|
||||
*/.vs
|
||||
|
||||
*/csharp/bin
|
||||
*/csharp/obj
|
||||
bin/
|
||||
obj/
|
||||
|
||||
.idea
|
||||
*.iws
|
||||
|
||||
@@ -90,6 +90,7 @@ One could go many directions with this game:
|
||||
game_number = 0
|
||||
move_count = 0
|
||||
losing_book = []
|
||||
n = 0
|
||||
|
||||
MAX_HISTORY = 9
|
||||
LOSING_BOOK_SIZE = 50
|
||||
|
||||
@@ -0,0 +1,224 @@
|
||||
import java.util.Scanner;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.lang.Math;
|
||||
|
||||
/**
|
||||
* Game of Banner
|
||||
* <p>
|
||||
* Based on the BASIC game of Banner here
|
||||
* https://github.com/coding-horror/basic-computer-games/blob/main/06%20Banner/banner.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 Banner {
|
||||
|
||||
private final Scanner scan; // For user input
|
||||
|
||||
public Banner() {
|
||||
|
||||
scan = new Scanner(System.in);
|
||||
|
||||
} // End of constructor Banner
|
||||
|
||||
public void play() {
|
||||
|
||||
int bitIndex = 0;
|
||||
int centerFlag = 0;
|
||||
int dataIndex = 0;
|
||||
int hIndex = 0;
|
||||
int horizontal = 0;
|
||||
int index = 0;
|
||||
int letterIndex = 0;
|
||||
int tempVal = 0;
|
||||
int vertical = 0;
|
||||
int vIndex = 0;
|
||||
int writeIndex = 0;
|
||||
|
||||
int[] writerMap = new int[10];
|
||||
int[] writeLimit = new int[10];
|
||||
|
||||
String centerResponse = "";
|
||||
String characters = "";
|
||||
String letter = "";
|
||||
String lineContent = "";
|
||||
String setPage = "";
|
||||
String statement = "";
|
||||
String token = ""; // Print token
|
||||
|
||||
Map<String, int[]> symbolData = new HashMap<String, int[]>();
|
||||
symbolData.put(" ", new int[]{0,0,0,0,0,0,0,0 });
|
||||
symbolData.put("A", new int[]{0,505,37,35,34,35,37,505 });
|
||||
symbolData.put("G", new int[]{0,125,131,258,258,290,163,101});
|
||||
symbolData.put("E", new int[]{0,512,274,274,274,274,258,258});
|
||||
symbolData.put("T", new int[]{0,2,2,2,512,2,2,2 });
|
||||
symbolData.put("W", new int[]{0,256,257,129,65,129,257,256 });
|
||||
symbolData.put("L", new int[]{0,512,257,257,257,257,257,257});
|
||||
symbolData.put("S", new int[]{0,69,139,274,274,274,163,69 });
|
||||
symbolData.put("O", new int[]{0,125,131,258,258,258,131,125});
|
||||
symbolData.put("N", new int[]{0,512,7,9,17,33,193,512 });
|
||||
symbolData.put("F", new int[]{0,512,18,18,18,18,2,2 });
|
||||
symbolData.put("K", new int[]{0,512,17,17,41,69,131,258 });
|
||||
symbolData.put("B", new int[]{0,512,274,274,274,274,274,239});
|
||||
symbolData.put("D", new int[]{0,512,258,258,258,258,131,125});
|
||||
symbolData.put("H", new int[]{0,512,17,17,17,17,17,512 });
|
||||
symbolData.put("M", new int[]{0,512,7,13,25,13,7,512 });
|
||||
symbolData.put("?", new int[]{0,5,3,2,354,18,11,5 });
|
||||
symbolData.put("U", new int[]{0,128,129,257,257,257,129,128});
|
||||
symbolData.put("R", new int[]{0,512,18,18,50,82,146,271 });
|
||||
symbolData.put("P", new int[]{0,512,18,18,18,18,18,15 });
|
||||
symbolData.put("Q", new int[]{0,125,131,258,258,322,131,381});
|
||||
symbolData.put("Y", new int[]{0,8,9,17,481,17,9,8 });
|
||||
symbolData.put("V", new int[]{0,64,65,129,257,129,65,64 });
|
||||
symbolData.put("X", new int[]{0,388,69,41,17,41,69,388 });
|
||||
symbolData.put("Z", new int[]{0,386,322,290,274,266,262,260});
|
||||
symbolData.put("I", new int[]{0,258,258,258,512,258,258,258});
|
||||
symbolData.put("C", new int[]{0,125,131,258,258,258,131,69 });
|
||||
symbolData.put("J", new int[]{0,65,129,257,257,257,129,128 });
|
||||
symbolData.put("1", new int[]{0,0,0,261,259,512,257,257 });
|
||||
symbolData.put("2", new int[]{0,261,387,322,290,274,267,261});
|
||||
symbolData.put("*", new int[]{0,69,41,17,512,17,41,69 });
|
||||
symbolData.put("3", new int[]{0,66,130,258,274,266,150,100 });
|
||||
symbolData.put("4", new int[]{0,33,49,41,37,35,512,33 });
|
||||
symbolData.put("5", new int[]{0,160,274,274,274,274,274,226});
|
||||
symbolData.put("6", new int[]{0,194,291,293,297,305,289,193});
|
||||
symbolData.put("7", new int[]{0,258,130,66,34,18,10,8 });
|
||||
symbolData.put("8", new int[]{0,69,171,274,274,274,171,69 });
|
||||
symbolData.put("9", new int[]{0,263,138,74,42,26,10,7 });
|
||||
symbolData.put("=", new int[]{0,41,41,41,41,41,41,41 });
|
||||
symbolData.put("!", new int[]{0,1,1,1,384,1,1,1 });
|
||||
symbolData.put("0", new int[]{0,57,69,131,258,131,69,57 });
|
||||
symbolData.put(".", new int[]{0,1,1,129,449,129,1,1 });
|
||||
|
||||
System.out.print("HORIZONTAL? ");
|
||||
horizontal = Integer.parseInt(scan.nextLine());
|
||||
|
||||
System.out.print("VERTICAL? ");
|
||||
vertical = Integer.parseInt(scan.nextLine());
|
||||
|
||||
System.out.print("CENTERED? ");
|
||||
centerResponse = scan.nextLine().toUpperCase();
|
||||
|
||||
centerFlag = 0;
|
||||
|
||||
// Lexicographical comparison
|
||||
if (centerResponse.compareTo("P") > 0) {
|
||||
centerFlag = 1;
|
||||
}
|
||||
|
||||
System.out.print("CHARACTER (TYPE 'ALL' IF YOU WANT CHARACTER BEING PRINTED)? ");
|
||||
characters = scan.nextLine().toUpperCase();
|
||||
|
||||
System.out.print("STATEMENT? ");
|
||||
statement = scan.nextLine().toUpperCase();
|
||||
|
||||
// Initiates the print
|
||||
System.out.print("SET PAGE? ");
|
||||
setPage = scan.nextLine();
|
||||
|
||||
// Begin loop through statement letters
|
||||
for (letterIndex = 1; letterIndex <= statement.length(); letterIndex++) {
|
||||
|
||||
// Extract a letter
|
||||
letter = String.valueOf(statement.charAt(letterIndex - 1));
|
||||
|
||||
// Begin loop through all symbol data
|
||||
for (String symbolString: symbolData.keySet()) {
|
||||
|
||||
// Begin letter handling
|
||||
if (letter.equals(" ")) {
|
||||
for (index = 1; index <= (7 * horizontal); index++) {
|
||||
System.out.println("");
|
||||
}
|
||||
break;
|
||||
|
||||
} else if (letter.equals(symbolString)) {
|
||||
token = characters;
|
||||
|
||||
if (characters.equals("ALL")) {
|
||||
token = symbolString;
|
||||
}
|
||||
|
||||
for (dataIndex = 1; dataIndex <= 7; dataIndex++) {
|
||||
|
||||
// Avoid overwriting symbol data
|
||||
tempVal = symbolData.get(symbolString)[dataIndex];
|
||||
|
||||
for (bitIndex = 8; bitIndex >= 0; bitIndex--) {
|
||||
|
||||
if (Math.pow(2, bitIndex) < tempVal) {
|
||||
writerMap[9 - bitIndex] = 1;
|
||||
tempVal -= Math.pow(2, bitIndex);
|
||||
|
||||
if (tempVal == 1) {
|
||||
writeLimit[dataIndex] = 9 - bitIndex;
|
||||
break;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
writerMap[9 - bitIndex] = 0;
|
||||
}
|
||||
} // End of bitIndex loop
|
||||
|
||||
for (hIndex = 1; hIndex <= horizontal; hIndex++) {
|
||||
|
||||
// Add whitespace for centering
|
||||
lineContent = " ".repeat((int)((63 - 4.5 * vertical) * centerFlag / token.length()));
|
||||
|
||||
for (writeIndex = 1; writeIndex <= writeLimit[dataIndex]; writeIndex++) {
|
||||
|
||||
if (writerMap[writeIndex] == 0) {
|
||||
|
||||
for (vIndex = 1; vIndex <= vertical; vIndex++) {
|
||||
|
||||
for (index = 1; index <= token.length(); index++) {
|
||||
lineContent += " ";
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
for (vIndex = 1; vIndex <= vertical; vIndex++) {
|
||||
lineContent += token;
|
||||
}
|
||||
}
|
||||
|
||||
} // End of writeIndex loop
|
||||
|
||||
System.out.println(lineContent);
|
||||
|
||||
} // End of hIndex loop
|
||||
|
||||
} // End of dataIndex loop
|
||||
|
||||
// Add padding between letters
|
||||
for (index = 1; index <= 2 * horizontal; index++) {
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
} // End letter handling
|
||||
|
||||
} // End loop through all symbol data
|
||||
|
||||
} // End loop through statement letters
|
||||
|
||||
// Add extra length to the banner
|
||||
for (index = 1; index <= 75; index++) {
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
} // End of method play
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Banner game = new Banner();
|
||||
game.play();
|
||||
|
||||
} // End of method main
|
||||
|
||||
} // End of class Banner
|
||||
@@ -0,0 +1,167 @@
|
||||
require "set"
|
||||
|
||||
class Battlefield
|
||||
TOTAL_OUTPOSTS = 25
|
||||
TOTAL_PLATOONS = 4
|
||||
|
||||
class << self
|
||||
def with_random_platoon_placements
|
||||
new((1..TOTAL_OUTPOSTS).to_a.sample(4))
|
||||
end
|
||||
|
||||
def valid_platoon_placement?(i)
|
||||
i.between?(1, TOTAL_OUTPOSTS)
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(platoon_placements)
|
||||
@platoon_placements = Set.new(platoon_placements)
|
||||
end
|
||||
|
||||
# Fires a missile at the specified outpost. Returns true if it hits a
|
||||
# platoon, false otherwise.
|
||||
def fire_missile_at(outpost)
|
||||
!@platoon_placements.delete?(outpost).nil?
|
||||
end
|
||||
|
||||
def remaining_platoons_count
|
||||
@platoon_placements.size
|
||||
end
|
||||
end
|
||||
|
||||
class Game
|
||||
def initialize(player_battlefield:, computer_battlefield:)
|
||||
@player_battlefield = player_battlefield
|
||||
@computer_battlefield = computer_battlefield
|
||||
end
|
||||
|
||||
def play
|
||||
player_choice = get_integer_answer_to("WHERE DO YOU WISH TO FIRE")
|
||||
|
||||
if @computer_battlefield.fire_missile_at(player_choice)
|
||||
print_player_success_message
|
||||
return if @computer_battlefield.remaining_platoons_count == 0
|
||||
else
|
||||
puts "HA, HA YOU MISSED. MY TURN NOW:"
|
||||
end
|
||||
puts
|
||||
|
||||
computer_choice = rand(1..Battlefield::TOTAL_OUTPOSTS)
|
||||
|
||||
if @player_battlefield.fire_missile_at(computer_choice)
|
||||
print_computer_success_message(computer_choice)
|
||||
else
|
||||
puts "I MISSED YOU, YOU DIRTY RAT. I PICKED #{computer_choice}. YOUR TURN:"
|
||||
end
|
||||
puts
|
||||
end
|
||||
|
||||
def finished?
|
||||
@player_battlefield.remaining_platoons_count == 0 ||
|
||||
@computer_battlefield.remaining_platoons_count == 0
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def get_integer_answer_to(question)
|
||||
puts question
|
||||
$stdin.gets.strip.to_i
|
||||
end
|
||||
|
||||
def print_computer_success_message(computer_choice)
|
||||
if @player_battlefield.remaining_platoons_count == 0
|
||||
puts "YOU'RE DEAD. YOUR LAST OUTPOST WAS AT #{computer_choice}. HA, HA, HA."
|
||||
puts "BETTER LUCK NEXT TIME."
|
||||
return
|
||||
end
|
||||
|
||||
puts "I GOT YOU. IT WON'T BE LONG NOW. POST #{computer_choice} WAS HIT."
|
||||
|
||||
case @player_battlefield.remaining_platoons_count
|
||||
when 1
|
||||
puts "YOU HAVE ONLY ONE OUTPOST LEFT"
|
||||
when 2
|
||||
puts "YOU HAVE ONLY TWO OUTPOSTS LEFT"
|
||||
when 3
|
||||
puts "YOU HAVE ONLY THREE OUTPOSTS LEFT"
|
||||
end
|
||||
end
|
||||
|
||||
def print_player_success_message
|
||||
if @computer_battlefield.remaining_platoons_count == 0
|
||||
puts "YOU GOT ME, I'M GOING FAST. BUT I'LL GET YOU WHEN"
|
||||
puts "MY TRANSISTO&S RECUP%RA*E!"
|
||||
return
|
||||
end
|
||||
|
||||
puts "YOU GOT ONE OF MY OUTPOSTS!"
|
||||
|
||||
case @computer_battlefield.remaining_platoons_count
|
||||
when 1
|
||||
puts "THREE DOWN, ONE TO GO."
|
||||
when 2
|
||||
puts "TWO DOWN, TWO TO GO."
|
||||
when 3
|
||||
puts "ONE DOWN, THREE TO GO."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
INTRODUCTION = <<~TEXT
|
||||
BOMBARDMENT
|
||||
CREATIVE COMPUTING MORRISTOWN, NEW JERSEY
|
||||
|
||||
|
||||
|
||||
YOU ARE ON A BATTLEFIELD WITH 4 PLATOONS AND YOU
|
||||
HAVE 25 OUTPOSTS AVAILABLE WHERE THEY MAY BE PLACED.
|
||||
YOU CAN ONLY PLACE ONE PLATOON AT ANY ONE OUTPOST.
|
||||
THE COMPUTER DOES THE SAME WITH ITS FOUR PLATOONS.
|
||||
|
||||
THE OBJECT OF THE GAME IS TO FIRE MISSLES AT THE
|
||||
OUTPOSTS OF THE COMPUTER. IT WILL DO THE SAME TO YOU.
|
||||
THE ONE WHO DESTROYS ALL FOUR OF THE ENEMY'S PLATOONS
|
||||
FIRST IS THE WINNER.
|
||||
|
||||
GOOD LUCK... AND TELL US WHERE YOU WANT THE BODIES SENT!
|
||||
|
||||
TEAR OFF MATRIX AND USE IT TO CHECK OFF THE NUMBERS.
|
||||
TEXT
|
||||
|
||||
def print_matrix
|
||||
(1..25).each do |i|
|
||||
print i
|
||||
print i % 5 == 0 ? "\n" : "\t"
|
||||
end
|
||||
end
|
||||
|
||||
def ask_for_platoon_placements
|
||||
puts "WAHT ARE YOUR FOUR POSITIONS?"
|
||||
platoon_placements = $stdin.gets.strip.split(",").map(&:to_i)
|
||||
|
||||
if platoon_placements.size == 4 &&
|
||||
platoon_placements.all? { |i| Battlefield.valid_platoon_placement?(i) }
|
||||
platoon_placements
|
||||
else
|
||||
puts "POSITIONS SHOULD BE BETWEEN 1 TO 25, DELIMITED BY COMMA."
|
||||
ask_for_platoon_placements
|
||||
end
|
||||
end
|
||||
|
||||
def start_game
|
||||
puts INTRODUCTION
|
||||
puts
|
||||
print_matrix
|
||||
puts
|
||||
platoon_placements = ask_for_platoon_placements
|
||||
puts
|
||||
|
||||
game = Game.new(
|
||||
player_battlefield: Battlefield.new(platoon_placements),
|
||||
computer_battlefield: Battlefield.with_random_platoon_placements
|
||||
)
|
||||
|
||||
game.play until game.finished?
|
||||
end
|
||||
|
||||
start_game
|
||||
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/perl
|
||||
use strict;
|
||||
|
||||
print ' 'x 33 . "BUNNY\n";
|
||||
print ' 'x 15 . "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n";
|
||||
print "\n"; print "\n"; print "\n";
|
||||
#REM "BUNNY" FROM AHL'$S 'BASIC COMPUTER GAMES';
|
||||
|
||||
# This data contains the letter Bunny A=1, B=2, C=3...
|
||||
my @A= (2,21,14,14,25);
|
||||
|
||||
# This data structure contains the pair of start and finish absolute position to show letters.
|
||||
# -1 means next line, whatever more than 128 will stop the data read.
|
||||
my @B= (
|
||||
1,2,-1,0,2,45,50,-1,0,5,43,52,-1,0,7,41,52,-1,
|
||||
1,9,37,50,-1,2,11,36,50,-1,3,13,34,49,-1,4,14,32,48,-1,
|
||||
5,15,31,47,-1,6,16,30,45,-1,7,17,29,44,-1,8,19,28,43,-1,
|
||||
9,20,27,41,-1,10,21,26,40,-1,11,22,25,38,-1,12,22,24,36,-1,
|
||||
13,34,-1,14,33,-1,15,31,-1,17,29,-1,18,27,-1,
|
||||
19,26,-1,16,28,-1,13,30,-1,11,31,-1,10,32,-1,
|
||||
8,33,-1,7,34,-1,6,13,16,34,-1,5,12,16,35,-1,
|
||||
4,12,16,35,-1,3,12,15,35,-1,2,35,-1,1,35,-1,
|
||||
2,34,-1,3,34,-1,4,33,-1,6,33,-1,10,32,34,34,-1,
|
||||
14,17,19,25,28,31,35,35,-1,15,19,23,30,36,36,-1,
|
||||
14,18,21,21,24,30,37,37,-1,13,18,23,29,33,38,-1,
|
||||
12,29,31,33,-1,11,13,17,17,19,19,22,22,24,31,-1,
|
||||
10,11,17,18,22,22,24,24,29,29,-1,
|
||||
22,23,26,29,-1,27,29,-1,28,29,-1,4096
|
||||
);
|
||||
|
||||
|
||||
&ENTERS();
|
||||
my $L= 64; #REM ASCII LETTER CODE...
|
||||
print "\n";
|
||||
|
||||
my $P=0; #Position read iterator
|
||||
my $Line= ' 'x 60;
|
||||
while (1) {
|
||||
my $X= $B[$P]; $P++; #Read start position.
|
||||
if ($X<0) { print "$Line\n";; $Line= ' 'x 60; next; }
|
||||
if ($X>128) { last; }
|
||||
my $Y= $B[$P]; $P++; #Read end position.
|
||||
|
||||
for (my $I=$X; $I<=$Y; $I++) { my $J=$I-5*int($I/5);
|
||||
substr($Line, $I, 1, chr($L+$A[$J])); #You can change $I for $X to get a nice bunny shadow.
|
||||
}
|
||||
}
|
||||
|
||||
&ENTERS();
|
||||
exit;
|
||||
|
||||
|
||||
sub ENTERS { #GOSUB 260
|
||||
for (my $I=1; $I<=6; $I++) { print chr(10); }
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
/**
|
||||
* Game of Calendar
|
||||
* <p>
|
||||
* Based on the BASIC game of Calendar here
|
||||
* https://github.com/coding-horror/basic-computer-games/blob/main/21%20Calendar/calendar.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 Calendar {
|
||||
|
||||
private static final int NUM_WEEK_ROWS = 6;
|
||||
private static final int NUM_DAYS_PER_WEEK = 7;
|
||||
private static final int NUM_MONTHS_PER_YEAR = 12;
|
||||
private static final int[] daysPerMonth = { 0, 31, 28, 31, 30, 31, 30,
|
||||
31, 31, 30, 31, 30, 31 };
|
||||
|
||||
public void play() {
|
||||
|
||||
showIntro();
|
||||
startGame();
|
||||
|
||||
} // End of method play
|
||||
|
||||
private static void showIntro() {
|
||||
|
||||
System.out.println(" ".repeat(31) + "CALENDAR");
|
||||
System.out.println(" ".repeat(14) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
||||
System.out.println("\n\n");
|
||||
|
||||
} // End of method showIntro
|
||||
|
||||
private void startGame() {
|
||||
|
||||
int dayOfMonth = 0;
|
||||
int dayOfWeek = 0;
|
||||
int dayOfYear = 0;
|
||||
int daysTotal = 0;
|
||||
int index = 0;
|
||||
int month = 0;
|
||||
int row = 0;
|
||||
|
||||
String lineContent = "";
|
||||
|
||||
for (index = 1; index <= 6; index++) {
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
daysTotal = -1;
|
||||
dayOfYear = 0;
|
||||
|
||||
System.out.println("");
|
||||
|
||||
// Begin loop through all months
|
||||
for (month = 1; month <= NUM_MONTHS_PER_YEAR; month++) {
|
||||
|
||||
System.out.println("");
|
||||
|
||||
dayOfYear = dayOfYear + daysPerMonth[month - 1];
|
||||
|
||||
lineContent = String.format("** %-3d" + "*".repeat(18), dayOfYear);
|
||||
|
||||
switch (month) {
|
||||
case 1:
|
||||
lineContent += " JANUARY ";
|
||||
break;
|
||||
case 2:
|
||||
lineContent += " FEBRUARY";
|
||||
break;
|
||||
case 3:
|
||||
lineContent += " MARCH ";
|
||||
break;
|
||||
case 4:
|
||||
lineContent += " APRIL ";
|
||||
break;
|
||||
case 5:
|
||||
lineContent += " MAY ";
|
||||
break;
|
||||
case 6:
|
||||
lineContent += " JUNE ";
|
||||
break;
|
||||
case 7:
|
||||
lineContent += " JULY ";
|
||||
break;
|
||||
case 8:
|
||||
lineContent += " AUGUST ";
|
||||
break;
|
||||
case 9:
|
||||
lineContent += "SEPTEMBER";
|
||||
break;
|
||||
case 10:
|
||||
lineContent += " OCTOBER ";
|
||||
break;
|
||||
case 11:
|
||||
lineContent += " NOVEMBER";
|
||||
break;
|
||||
case 12:
|
||||
lineContent += " DECEMBER";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
lineContent += "*".repeat(18) + " " + (365 - dayOfYear) + "**";
|
||||
|
||||
System.out.println(lineContent);
|
||||
System.out.println("");
|
||||
|
||||
System.out.print(" S M T W");
|
||||
System.out.println(" T F S");
|
||||
System.out.println("");
|
||||
|
||||
System.out.println("*".repeat(59));
|
||||
|
||||
// Begin loop through each week row
|
||||
for (row = 1; row <= NUM_WEEK_ROWS; row++) {
|
||||
|
||||
System.out.println("");
|
||||
|
||||
lineContent = " ";
|
||||
|
||||
// Begin loop through days of the week
|
||||
for (dayOfWeek = 1; dayOfWeek <= NUM_DAYS_PER_WEEK; dayOfWeek++) {
|
||||
|
||||
daysTotal++;
|
||||
|
||||
dayOfMonth = daysTotal - dayOfYear;
|
||||
|
||||
if (dayOfMonth > daysPerMonth[month]) {
|
||||
row = 6;
|
||||
break;
|
||||
}
|
||||
|
||||
if (dayOfMonth > 0) {
|
||||
lineContent += dayOfMonth;
|
||||
}
|
||||
|
||||
while (lineContent.length() < (4 + 8 * dayOfWeek)) {
|
||||
lineContent += " ";
|
||||
}
|
||||
|
||||
} // End loop through days of the week
|
||||
|
||||
if (dayOfMonth == daysPerMonth[month]) {
|
||||
row = 6;
|
||||
daysTotal += dayOfWeek;
|
||||
System.out.println(lineContent);
|
||||
break;
|
||||
}
|
||||
|
||||
System.out.println(lineContent);
|
||||
|
||||
} // End loop through each week row
|
||||
|
||||
daysTotal -= dayOfWeek;
|
||||
|
||||
} // End loop through all months
|
||||
|
||||
for (index = 1; index <= 6; index++) {
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
} // End of method startGame
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Calendar game = new Calendar();
|
||||
game.play();
|
||||
|
||||
} // End of method main
|
||||
|
||||
} // End of class Calendar
|
||||
@@ -0,0 +1,5 @@
|
||||
.vs
|
||||
TestResults
|
||||
bin
|
||||
obj
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.31112.23
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Craps", "Craps\Craps.csproj", "{783A49D7-DADE-477A-9973-D9457258573B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrapsTester", "CrapsTester\CrapsTester.csproj", "{44DFE8DB-715F-428E-992D-A97C34D47B98}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{783A49D7-DADE-477A-9973-D9457258573B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{783A49D7-DADE-477A-9973-D9457258573B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{783A49D7-DADE-477A-9973-D9457258573B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{783A49D7-DADE-477A-9973-D9457258573B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{44DFE8DB-715F-428E-992D-A97C34D47B98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{44DFE8DB-715F-428E-992D-A97C34D47B98}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{44DFE8DB-715F-428E-992D-A97C34D47B98}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{44DFE8DB-715F-428E-992D-A97C34D47B98}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {871679FF-B86C-468B-960E-DFC625CDB5D0}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,8 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,73 @@
|
||||
namespace Craps
|
||||
{
|
||||
public enum Result
|
||||
{
|
||||
// It's not used in this program but it's often a good idea to include a "none"
|
||||
// value in an enum so that you can set an instance of the enum to "invalid" or
|
||||
// initialise it to "none of the valid values".
|
||||
noResult,
|
||||
naturalWin,
|
||||
snakeEyesLoss,
|
||||
naturalLoss,
|
||||
pointLoss,
|
||||
pointWin,
|
||||
};
|
||||
|
||||
class CrapsGame
|
||||
{
|
||||
private readonly UserInterface ui;
|
||||
private Dice dice1 = new Dice();
|
||||
private Dice dice2 = new Dice();
|
||||
|
||||
public CrapsGame(ref UserInterface ui)
|
||||
{
|
||||
this.ui = ui;
|
||||
}
|
||||
|
||||
public Result Play(out int diceRoll)
|
||||
{
|
||||
diceRoll = dice1.Roll() + dice2.Roll();
|
||||
|
||||
if (Win(diceRoll))
|
||||
{
|
||||
return Result.naturalWin;
|
||||
}
|
||||
else if (Lose(diceRoll))
|
||||
{
|
||||
return (diceRoll == 2) ? Result.snakeEyesLoss : Result.naturalLoss;
|
||||
}
|
||||
else
|
||||
{
|
||||
var point = diceRoll;
|
||||
ui.Point(point);
|
||||
|
||||
while (true)
|
||||
{
|
||||
var newRoll = dice1.Roll() + dice2.Roll();
|
||||
if (newRoll == point)
|
||||
{
|
||||
diceRoll = newRoll;
|
||||
return Result.pointWin;
|
||||
}
|
||||
else if (newRoll == 7)
|
||||
{
|
||||
diceRoll = newRoll;
|
||||
return Result.pointLoss;
|
||||
}
|
||||
|
||||
ui.NoPoint(newRoll);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool Lose(int diceRoll)
|
||||
{
|
||||
return diceRoll == 2 || diceRoll == 3 || diceRoll == 12;
|
||||
}
|
||||
|
||||
private bool Win(int diceRoll)
|
||||
{
|
||||
return diceRoll == 7 || diceRoll == 11;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
|
||||
|
||||
namespace Craps
|
||||
{
|
||||
public class Dice
|
||||
{
|
||||
private Random rand = new Random();
|
||||
public readonly int sides;
|
||||
|
||||
public Dice()
|
||||
{
|
||||
sides = 6;
|
||||
}
|
||||
|
||||
public Dice(int sides)
|
||||
{
|
||||
this.sides = sides;
|
||||
}
|
||||
|
||||
public int Roll() => rand.Next(1, sides + 1);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using System.Diagnostics;
|
||||
|
||||
|
||||
|
||||
namespace Craps
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
var ui = new UserInterface();
|
||||
var game = new CrapsGame(ref ui);
|
||||
int winnings = 0;
|
||||
|
||||
ui.Intro();
|
||||
|
||||
do
|
||||
{
|
||||
var bet = ui.PlaceBet();
|
||||
var result = game.Play(out int diceRoll);
|
||||
|
||||
switch (result)
|
||||
{
|
||||
case Result.naturalWin:
|
||||
winnings += bet;
|
||||
break;
|
||||
|
||||
case Result.naturalLoss:
|
||||
case Result.snakeEyesLoss:
|
||||
case Result.pointLoss:
|
||||
winnings -= bet;
|
||||
break;
|
||||
|
||||
case Result.pointWin:
|
||||
winnings += (2 * bet);
|
||||
break;
|
||||
|
||||
// Include a default so that we will be warned if the values of the enum
|
||||
// ever change and we forget to add code to handle the new value.
|
||||
default:
|
||||
Debug.Assert(false); // We should never get here.
|
||||
break;
|
||||
}
|
||||
|
||||
ui.ShowResult(result, diceRoll, bet);
|
||||
} while (ui.PlayAgain(winnings));
|
||||
|
||||
ui.GoodBye(winnings);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
|
||||
|
||||
|
||||
namespace Craps
|
||||
{
|
||||
public class UserInterface
|
||||
{
|
||||
public void Intro()
|
||||
{
|
||||
Console.WriteLine(" CRAPS");
|
||||
Console.WriteLine(" CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n");
|
||||
Console.WriteLine("2,3,12 ARE LOSERS; 4,5,6,8,9,10 ARE POINTS; 7,11 ARE NATURAL WINNERS.");
|
||||
|
||||
// In the original game a random number would be generated and then thrown away for as many
|
||||
// times as the number the user entered. This is presumably something to do with ensuring
|
||||
// that different random numbers will be generated each time the program is run.
|
||||
//
|
||||
// This is not necessary in C#; the random number generator uses the current time as a seed
|
||||
// so the results will always be different every time it is run.
|
||||
//
|
||||
// So that the game exactly matches the original game we ask the question but then ignore
|
||||
// the answer.
|
||||
Console.Write("PICK A NUMBER AND INPUT TO ROLL DICE ");
|
||||
GetInt();
|
||||
}
|
||||
|
||||
public int PlaceBet()
|
||||
{
|
||||
Console.Write("INPUT THE AMOUNT OF YOUR WAGER. ");
|
||||
int n = GetInt();
|
||||
Console.WriteLine("I WILL NOW THROW THE DICE");
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
public bool PlayAgain(int winnings)
|
||||
{
|
||||
// Goodness knows why we have to enter 5 to play
|
||||
// again but that's what the original game asked.
|
||||
Console.Write("IF YOU WANT TO PLAY AGAIN PRINT 5 IF NOT PRINT 2 ");
|
||||
|
||||
bool playAgain = (GetInt() == 5);
|
||||
|
||||
if (winnings < 0)
|
||||
{
|
||||
Console.WriteLine($"YOU ARE NOW UNDER ${-winnings}");
|
||||
}
|
||||
else if (winnings > 0)
|
||||
{
|
||||
Console.WriteLine($"YOU ARE NOW OVER ${winnings}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"YOU ARE NOW EVEN AT ${winnings}");
|
||||
}
|
||||
|
||||
return playAgain;
|
||||
}
|
||||
|
||||
public void GoodBye(int winnings)
|
||||
{
|
||||
if (winnings < 0)
|
||||
{
|
||||
Console.WriteLine("TOO BAD, YOU ARE IN THE HOLE. COME AGAIN.");
|
||||
}
|
||||
else if (winnings > 0)
|
||||
{
|
||||
Console.WriteLine("CONGRATULATIONS---YOU CAME OUT A WINNER. COME AGAIN!");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("CONGRATULATIONS---YOU CAME OUT EVEN, NOT BAD FOR AN AMATEUR");
|
||||
}
|
||||
}
|
||||
|
||||
public void NoPoint(int diceRoll)
|
||||
{
|
||||
Console.WriteLine($"{diceRoll} - NO POINT. I WILL ROLL AGAIN ");
|
||||
}
|
||||
|
||||
public void Point(int point)
|
||||
{
|
||||
Console.WriteLine($"{point} IS THE POINT. I WILL ROLL AGAIN");
|
||||
}
|
||||
|
||||
public void ShowResult(Result result, int diceRoll, int bet)
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
case Result.naturalWin:
|
||||
Console.WriteLine($"{diceRoll} - NATURAL....A WINNER!!!!");
|
||||
Console.WriteLine($"{diceRoll} PAYS EVEN MONEY, YOU WIN {bet} DOLLARS");
|
||||
break;
|
||||
|
||||
case Result.naturalLoss:
|
||||
Console.WriteLine($"{diceRoll} - CRAPS...YOU LOSE.");
|
||||
Console.WriteLine($"YOU LOSE {bet} DOLLARS.");
|
||||
break;
|
||||
|
||||
case Result.snakeEyesLoss:
|
||||
Console.WriteLine($"{diceRoll} - SNAKE EYES....YOU LOSE.");
|
||||
Console.WriteLine($"YOU LOSE {bet} DOLLARS.");
|
||||
break;
|
||||
|
||||
case Result.pointLoss:
|
||||
Console.WriteLine($"{diceRoll} - CRAPS. YOU LOSE.");
|
||||
Console.WriteLine($"YOU LOSE ${bet}");
|
||||
break;
|
||||
|
||||
case Result.pointWin:
|
||||
Console.WriteLine($"{diceRoll} - A WINNER.........CONGRATS!!!!!!!!");
|
||||
Console.WriteLine($"AT 2 TO 1 ODDS PAYS YOU...LET ME SEE... {2 * bet} DOLLARS");
|
||||
break;
|
||||
|
||||
// Include a default so that we will be warned if the values of the enum
|
||||
// ever change and we forget to add code to handle the new value.
|
||||
default:
|
||||
Debug.Assert(false); // We should never get here.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private int GetInt()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
string input = Console.ReadLine();
|
||||
if (int.TryParse(input, out int n))
|
||||
{
|
||||
return n;
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.Write("ENTER AN INTEGER ");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="2.1.0" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.1.0" />
|
||||
<PackageReference Include="coverlet.collector" Version="1.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Craps\Craps.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,96 @@
|
||||
using Craps;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
|
||||
|
||||
namespace CrapsTester
|
||||
{
|
||||
[TestClass]
|
||||
public class DiceTests
|
||||
{
|
||||
[TestMethod]
|
||||
public void SixSidedDiceReturnsValidRolls()
|
||||
{
|
||||
var dice = new Dice();
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
var roll = dice.Roll();
|
||||
Assert.IsTrue(roll >= 1 && roll <= dice.sides);
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TwentySidedDiceReturnsValidRolls()
|
||||
{
|
||||
var dice = new Dice(20);
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
var roll = dice.Roll();
|
||||
Assert.IsTrue(roll >= 1 && roll <= dice.sides);
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DiceRollsAreRandom()
|
||||
{
|
||||
// Roll 600,000 dice and count how many rolls there are for each side.
|
||||
|
||||
var dice = new Dice();
|
||||
|
||||
int numOnes = 0;
|
||||
int numTwos = 0;
|
||||
int numThrees = 0;
|
||||
int numFours = 0;
|
||||
int numFives = 0;
|
||||
int numSixes = 0;
|
||||
int numErrors = 0;
|
||||
|
||||
for (int i = 0; i < 600000; i++)
|
||||
{
|
||||
switch (dice.Roll())
|
||||
{
|
||||
case 1:
|
||||
numOnes++;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
numTwos++;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
numThrees++;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
numFours++;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
numFives++;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
numSixes++;
|
||||
break;
|
||||
|
||||
default:
|
||||
numErrors++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// We'll assume that a variation of 10% in rolls for the different numbers is random enough.
|
||||
// Perfectly random rolling would produce 100000 rolls per side, +/- 5% of this gives the
|
||||
// range 90000..110000.
|
||||
const int minRolls = 95000;
|
||||
const int maxRolls = 105000;
|
||||
Assert.IsTrue(numOnes >= minRolls && numOnes <= maxRolls);
|
||||
Assert.IsTrue(numTwos >= minRolls && numTwos <= maxRolls);
|
||||
Assert.IsTrue(numThrees >= minRolls && numThrees <= maxRolls);
|
||||
Assert.IsTrue(numFours >= minRolls && numFours <= maxRolls);
|
||||
Assert.IsTrue(numFives >= minRolls && numFives <= maxRolls);
|
||||
Assert.IsTrue(numSixes >= minRolls && numSixes <= maxRolls);
|
||||
Assert.AreEqual(numErrors, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
import java.util.Scanner;
|
||||
import java.lang.Math;
|
||||
|
||||
/**
|
||||
* Game of Depth Charge
|
||||
* <p>
|
||||
* Based on the BASIC game of Depth Charge here
|
||||
* https://github.com/coding-horror/basic-computer-games/blob/main/31%20Depth%20Charge/depthcharge.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 DepthCharge {
|
||||
|
||||
private final Scanner scan; // For user input
|
||||
|
||||
public DepthCharge() {
|
||||
|
||||
scan = new Scanner(System.in);
|
||||
|
||||
} // End of constructor DepthCharge
|
||||
|
||||
public void play() {
|
||||
|
||||
showIntro();
|
||||
startGame();
|
||||
|
||||
} // End of method play
|
||||
|
||||
private static void showIntro() {
|
||||
|
||||
System.out.println(" ".repeat(29) + "DEPTH CHARGE");
|
||||
System.out.println(" ".repeat(14) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
||||
System.out.println("\n\n");
|
||||
|
||||
} // End of method showIntro
|
||||
|
||||
private void startGame() {
|
||||
|
||||
int searchArea = 0;
|
||||
int shotNum = 0;
|
||||
int shotTotal = 0;
|
||||
int shotX = 0;
|
||||
int shotY = 0;
|
||||
int shotZ = 0;
|
||||
int targetX = 0;
|
||||
int targetY = 0;
|
||||
int targetZ = 0;
|
||||
int tries = 0;
|
||||
String[] userCoordinates;
|
||||
String userResponse = "";
|
||||
|
||||
System.out.print("DIMENSION OF SEARCH AREA? ");
|
||||
searchArea = Integer.parseInt(scan.nextLine());
|
||||
System.out.println("");
|
||||
|
||||
shotTotal = (int) (Math.log10(searchArea) / Math.log10(2)) + 1;
|
||||
|
||||
System.out.println("YOU ARE THE CAPTAIN OF THE DESTROYER USS COMPUTER");
|
||||
System.out.println("AN ENEMY SUB HAS BEEN CAUSING YOU TROUBLE. YOUR");
|
||||
System.out.println("MISSION IS TO DESTROY IT. YOU HAVE " + shotTotal + " SHOTS.");
|
||||
System.out.println("SPECIFY DEPTH CHARGE EXPLOSION POINT WITH A");
|
||||
System.out.println("TRIO OF NUMBERS -- THE FIRST TWO ARE THE");
|
||||
System.out.println("SURFACE COORDINATES; THE THIRD IS THE DEPTH.");
|
||||
|
||||
// Begin outer while loop
|
||||
while (true) {
|
||||
|
||||
System.out.println("");
|
||||
System.out.println("GOOD LUCK !");
|
||||
System.out.println("");
|
||||
|
||||
targetX = (int) ((searchArea + 1) * Math.random());
|
||||
targetY = (int) ((searchArea + 1) * Math.random());
|
||||
targetZ = (int) ((searchArea + 1) * Math.random());
|
||||
|
||||
// Begin loop through all shots
|
||||
for (shotNum = 1; shotNum <= shotTotal; shotNum++) {
|
||||
|
||||
// Get user input
|
||||
System.out.println("");
|
||||
System.out.print("TRIAL # " + shotNum + "? ");
|
||||
userResponse = scan.nextLine();
|
||||
|
||||
// Split on commas
|
||||
userCoordinates = userResponse.split(",");
|
||||
|
||||
// Assign to integer variables
|
||||
shotX = Integer.parseInt(userCoordinates[0].trim());
|
||||
shotY = Integer.parseInt(userCoordinates[1].trim());
|
||||
shotZ = Integer.parseInt(userCoordinates[2].trim());
|
||||
|
||||
// Win condition
|
||||
if (Math.abs(shotX - targetX) + Math.abs(shotY - targetY)
|
||||
+ Math.abs(shotZ - targetZ) == 0) {
|
||||
|
||||
System.out.println("B O O M ! ! YOU FOUND IT IN" + shotNum + " TRIES!");
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
this.getReport(targetX, targetY, targetZ, shotX, shotY, shotZ);
|
||||
|
||||
System.out.println("");
|
||||
|
||||
} // End loop through all shots
|
||||
|
||||
if (shotNum > shotTotal) {
|
||||
|
||||
System.out.println("");
|
||||
System.out.println("YOU HAVE BEEN TORPEDOED! ABANDON SHIP!");
|
||||
System.out.println("THE SUBMARINE WAS AT " + targetX + "," + targetY + "," + targetZ);
|
||||
}
|
||||
|
||||
System.out.println("");
|
||||
System.out.println("");
|
||||
System.out.print("ANOTHER GAME (Y OR N)? ");
|
||||
userResponse = scan.nextLine();
|
||||
|
||||
if (!userResponse.toUpperCase().equals("Y")) {
|
||||
System.out.print("OK. HOPE YOU ENJOYED YOURSELF.");
|
||||
return;
|
||||
}
|
||||
|
||||
} // End outer while loop
|
||||
|
||||
} // End of method startGame
|
||||
|
||||
public void getReport(int a, int b, int c, int x, int y, int z) {
|
||||
|
||||
System.out.print("SONAR REPORTS SHOT WAS ");
|
||||
|
||||
// Handle y coordinate
|
||||
if (y > b) {
|
||||
|
||||
System.out.print("NORTH");
|
||||
|
||||
} else if (y < b) {
|
||||
|
||||
System.out.print("SOUTH");
|
||||
}
|
||||
|
||||
// Handle x coordinate
|
||||
if (x > a) {
|
||||
|
||||
System.out.print("EAST");
|
||||
|
||||
} else if (x < a) {
|
||||
|
||||
System.out.print("WEST");
|
||||
}
|
||||
|
||||
if ((y != b) || (x != a)) {
|
||||
|
||||
System.out.print(" AND");
|
||||
}
|
||||
|
||||
// Handle depth
|
||||
if (z > c) {
|
||||
|
||||
System.out.println(" TOO LOW.");
|
||||
|
||||
} else if (z < c) {
|
||||
|
||||
System.out.println(" TOO HIGH.");
|
||||
|
||||
} else {
|
||||
|
||||
System.out.println(" DEPTH OK.");
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
} // End of method getReport
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
DepthCharge game = new DepthCharge();
|
||||
game.play();
|
||||
|
||||
} // End of method main
|
||||
|
||||
} // End of class DepthCharge
|
||||
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/perl
|
||||
use strict;
|
||||
|
||||
my $L1;
|
||||
while (1) {
|
||||
print ' 'x 33 . "GUESS\n";
|
||||
print ' 'x 15 . "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n";
|
||||
print "\n"; print "\n"; print "\n";
|
||||
print "THIS IS A NUMBER GUESSING GAME. I'LL THINK\n";
|
||||
print "OF A NUMBER BETWEEN 1 AND ANY LIMIT YOU WANT.\n";
|
||||
print "THEN YOU HAVE TO GUESS WHAT IT IS.\n";
|
||||
print "\n";
|
||||
print "WHAT LIMIT DO YOU WANT";
|
||||
print "? "; chomp(my $L = <STDIN>);
|
||||
print "\n";
|
||||
$L1= int(log($L)/log(2))+1;
|
||||
|
||||
while (1) {
|
||||
print "I'M THINKING OF A NUMBER BETWEEN 1 AND $L\n";
|
||||
my $G=0;
|
||||
print "NOW YOU TRY TO GUESS WHAT IT IS.\n";
|
||||
my $M=int($L*rand(1)+1);
|
||||
my $N=0;
|
||||
while (1) {
|
||||
while (1) {
|
||||
print "? "; chomp($N = <STDIN>);
|
||||
if ($N>0) { last; }
|
||||
}
|
||||
$G=$G+1;
|
||||
if ($N==$M) { last; }
|
||||
if ($N>$M) { print "TOO HIGH. TRY A SMALLER ANSWER.\n"; }
|
||||
else { print "TOO LOW. TRY A BIGGER ANSWER.\n"; }
|
||||
}
|
||||
print "THAT'S IT! YOU GOT IT IN $G TRIES.\n";
|
||||
if ($G<$L1) { print "VERY "; }
|
||||
if ($G<=$L1) { print "GOOD.\n"; }
|
||||
if ($G>$L1) { print "YOU SHOULD HAVE BEEN ABLE TO GET IT IN ONLY $L1\n"; }
|
||||
&ENTERS();
|
||||
}
|
||||
}
|
||||
|
||||
exit;
|
||||
|
||||
|
||||
sub ENTERS { #GOSUB 70
|
||||
for (my $H=1; $H<=5; $H++) {
|
||||
print "\n";
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Scanner;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* HANGMAN
|
||||
*
|
||||
* Converted from BASIC to Java by Aldrin Misquitta (@aldrinm)
|
||||
*/
|
||||
public class Hangman {
|
||||
|
||||
//50 word list
|
||||
private final static List<String> words = List.of(
|
||||
"GUM", "SIN", "FOR", "CRY", "LUG", "BYE", "FLY",
|
||||
"UGLY", "EACH", "FROM", "WORK", "TALK", "WITH", "SELF",
|
||||
"PIZZA", "THING", "FEIGN", "FIEND", "ELBOW", "FAULT", "DIRTY",
|
||||
"BUDGET", "SPIRIT", "QUAINT", "MAIDEN", "ESCORT", "PICKAX",
|
||||
"EXAMPLE", "TENSION", "QUININE", "KIDNEY", "REPLICA", "SLEEPER",
|
||||
"TRIANGLE", "KANGAROO", "MAHOGANY", "SERGEANT", "SEQUENCE",
|
||||
"MOUSTACHE", "DANGEROUS", "SCIENTIST", "DIFFERENT", "QUIESCENT",
|
||||
"MAGISTRATE", "ERRONEOUSLY", "LOUDSPEAKER", "PHYTOTOXIC",
|
||||
"MATRIMONIAL", "PARASYMPATHOMIMETIC", "THIGMOTROPISM");
|
||||
|
||||
public static void main(String[] args) {
|
||||
Scanner scan = new Scanner(System.in);
|
||||
|
||||
printIntro();
|
||||
|
||||
int[] usedWords = new int[50];
|
||||
int roundNumber = 1;
|
||||
int totalWords = words.size();
|
||||
boolean continueGame;
|
||||
|
||||
do {
|
||||
if (roundNumber > totalWords) {
|
||||
System.out.println("\nYOU DID ALL THE WORDS!!");
|
||||
break;
|
||||
}
|
||||
|
||||
int randomWordIndex;
|
||||
do {
|
||||
randomWordIndex = ((int) (totalWords * Math.random())) + 1;
|
||||
} while (usedWords[randomWordIndex] == 1);
|
||||
usedWords[randomWordIndex] = 1;
|
||||
|
||||
boolean youWon = playRound(scan, words.get(randomWordIndex - 1));
|
||||
if (!youWon) {
|
||||
System.out.print("\nYOU MISSED THAT ONE. DO YOU WANT ANOTHER WORD? ");
|
||||
} else {
|
||||
System.out.print("\nWANT ANOTHER WORD? ");
|
||||
}
|
||||
final String anotherWordChoice = scan.next();
|
||||
continueGame = "YES".equals(anotherWordChoice);
|
||||
roundNumber++;
|
||||
} while (continueGame);
|
||||
|
||||
System.out.println("\nIT'S BEEN FUN! BYE FOR NOW.");
|
||||
}
|
||||
|
||||
private static boolean playRound(Scanner scan, String word) {
|
||||
char[] letters;
|
||||
char[] discoveredLetters;
|
||||
int misses = 0;
|
||||
Set<Character> lettersUsed = new LinkedHashSet<>();//LinkedHashSet maintains the order of characters inserted
|
||||
|
||||
String[][] hangmanPicture = new String[12][12];
|
||||
//initialize the hangman picture
|
||||
for (int i = 0; i < hangmanPicture.length; i++) {
|
||||
for (int j = 0; j < hangmanPicture[i].length; j++) {
|
||||
hangmanPicture[i][j] = " ";
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < hangmanPicture.length; i++) {
|
||||
hangmanPicture[i][0] = "X";
|
||||
}
|
||||
for (int i = 0; i < 7; i++) {
|
||||
hangmanPicture[0][i] = "X";
|
||||
}
|
||||
hangmanPicture[1][6] = "X";
|
||||
|
||||
int totalWordGuesses = 0; //guesses
|
||||
|
||||
int len = word.length();
|
||||
letters = word.toCharArray();
|
||||
|
||||
discoveredLetters = new char[len];
|
||||
Arrays.fill(discoveredLetters, '-');
|
||||
|
||||
boolean validNextGuess = false;
|
||||
char guessLetter = ' ';
|
||||
|
||||
while (misses < 10) {
|
||||
while (!validNextGuess) {
|
||||
printLettersUsed(lettersUsed);
|
||||
printDiscoveredLetters(discoveredLetters);
|
||||
|
||||
System.out.print("WHAT IS YOUR GUESS? ");
|
||||
var tmpRead = scan.next();
|
||||
guessLetter = tmpRead.charAt(0);
|
||||
if (lettersUsed.contains(guessLetter)) {
|
||||
System.out.println("YOU GUESSED THAT LETTER BEFORE!");
|
||||
} else {
|
||||
lettersUsed.add(guessLetter);
|
||||
totalWordGuesses++;
|
||||
validNextGuess = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (word.indexOf(guessLetter) >= 0) {
|
||||
//replace all occurrences in D$ with G$
|
||||
for (int i = 0; i < letters.length; i++) {
|
||||
if (letters[i] == guessLetter) {
|
||||
discoveredLetters[i] = guessLetter;
|
||||
}
|
||||
}
|
||||
//check if the word is fully discovered
|
||||
boolean isWordDiscovered = true;
|
||||
for (char discoveredLetter : discoveredLetters) {
|
||||
if (discoveredLetter == '-') {
|
||||
isWordDiscovered = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isWordDiscovered) {
|
||||
System.out.println("YOU FOUND THE WORD!");
|
||||
return true;
|
||||
}
|
||||
|
||||
printDiscoveredLetters(discoveredLetters);
|
||||
System.out.print("WHAT IS YOUR GUESS FOR THE WORD? ");
|
||||
final String wordGuess = scan.next();
|
||||
if (wordGuess.equals(word)) {
|
||||
System.out.printf("RIGHT!! IT TOOK YOU %s GUESSES!", totalWordGuesses);
|
||||
return true;
|
||||
} else {
|
||||
System.out.println("WRONG. TRY ANOTHER LETTER.");
|
||||
}
|
||||
} else {
|
||||
misses = misses + 1;
|
||||
System.out.println("\n\nSORRY, THAT LETTER ISN'T IN THE WORD.");
|
||||
drawHangman(misses, hangmanPicture);
|
||||
}
|
||||
validNextGuess = false;
|
||||
}
|
||||
|
||||
System.out.printf("SORRY, YOU LOSE. THE WORD WAS %s", word);
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void drawHangman(int m, String[][] hangmanPicture) {
|
||||
switch (m) {
|
||||
case 1:
|
||||
System.out.println("FIRST, WE DRAW A HEAD");
|
||||
hangmanPicture[2][5] = "-";
|
||||
hangmanPicture[2][6] = "-";
|
||||
hangmanPicture[2][7] = "-";
|
||||
hangmanPicture[3][4] = "(";
|
||||
hangmanPicture[3][5] = ".";
|
||||
hangmanPicture[3][7] = ".";
|
||||
hangmanPicture[3][8] = ")";
|
||||
hangmanPicture[4][5] = "-";
|
||||
hangmanPicture[4][6] = "-";
|
||||
hangmanPicture[4][7] = "-";
|
||||
break;
|
||||
case 2:
|
||||
System.out.println("NOW WE DRAW A BODY.");
|
||||
for (var i = 5; i <= 8; i++) {
|
||||
hangmanPicture[i][6] = "X";
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
System.out.println("NEXT WE DRAW AN ARM.");
|
||||
for (int i = 3; i <= 6; i++) {
|
||||
hangmanPicture[i][i - 1] = "\\";
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
System.out.println("THIS TIME IT'S THE OTHER ARM.");
|
||||
hangmanPicture[3][10] = "/";
|
||||
hangmanPicture[4][9] = "/";
|
||||
hangmanPicture[5][8] = "/";
|
||||
hangmanPicture[6][7] = "/";
|
||||
break;
|
||||
case 5:
|
||||
System.out.println("NOW, LET'S DRAW THE RIGHT LEG.");
|
||||
hangmanPicture[9][5] = "/";
|
||||
hangmanPicture[10][4] = "/";
|
||||
break;
|
||||
case 6:
|
||||
System.out.println("THIS TIME WE DRAW THE LEFT LEG.");
|
||||
hangmanPicture[9][7] = "\\";
|
||||
hangmanPicture[10][8] = "\\";
|
||||
break;
|
||||
case 7:
|
||||
System.out.println("NOW WE PUT UP A HAND.");
|
||||
hangmanPicture[2][10] = "\\";
|
||||
break;
|
||||
case 8:
|
||||
System.out.println("NEXT THE OTHER HAND.");
|
||||
hangmanPicture[2][2] = "/";
|
||||
break;
|
||||
case 9:
|
||||
System.out.println("NOW WE DRAW ONE FOOT");
|
||||
hangmanPicture[11][9] = "\\";
|
||||
hangmanPicture[11][10] = "-";
|
||||
break;
|
||||
case 10:
|
||||
System.out.println("HERE'S THE OTHER FOOT -- YOU'RE HUNG!!");
|
||||
hangmanPicture[11][2] = "-";
|
||||
hangmanPicture[11][3] = "/";
|
||||
break;
|
||||
}
|
||||
for (int i = 0; i <= 11; i++) {
|
||||
for (int j = 0; j <= 11; j++) {
|
||||
System.out.print(hangmanPicture[i][j]);
|
||||
}
|
||||
System.out.print("\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void printDiscoveredLetters(char[] D$) {
|
||||
System.out.println(new String(D$));
|
||||
System.out.println("\n");
|
||||
}
|
||||
|
||||
private static void printLettersUsed(Set<Character> lettersUsed) {
|
||||
System.out.println("\nHERE ARE THE LETTERS YOU USED:");
|
||||
System.out.println(lettersUsed.stream()
|
||||
.map(Object::toString).collect(Collectors.joining(",")));
|
||||
System.out.println("\n");
|
||||
}
|
||||
|
||||
private static void printIntro() {
|
||||
System.out.println(" HANGMAN");
|
||||
System.out.println(" CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
||||
System.out.println("\n\n\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,266 @@
|
||||
/**
|
||||
* Game of Poetry
|
||||
* <p>
|
||||
* Based on the BASIC game of Poetry here
|
||||
* https://github.com/coding-horror/basic-computer-games/blob/main/70%20Poetry/poetry.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 Poetry {
|
||||
|
||||
private final static double COMMA_RATE = 0.19;
|
||||
private final static double SPACE_RATE = 0.65;
|
||||
private final static int PARAGRAPH_RATE = 20;
|
||||
|
||||
private enum Step {
|
||||
WORD_GROUP1, WORD_GROUP2, WORD_GROUP3, WORD_GROUP4, RANDOMIZE_COMMA,
|
||||
RANDOMIZE_WHITESPACE, RANDOMIZE_COUNTERS
|
||||
}
|
||||
|
||||
public void play() {
|
||||
|
||||
showIntro();
|
||||
startGame();
|
||||
|
||||
} // End of method play
|
||||
|
||||
private void showIntro() {
|
||||
|
||||
System.out.println(" ".repeat(29) + "POETRY");
|
||||
System.out.println(" ".repeat(14) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
||||
System.out.println("\n\n");
|
||||
|
||||
} // End of method showIntro
|
||||
|
||||
private void startGame() {
|
||||
|
||||
int groupIndex = 0;
|
||||
int paragraphIndex = 0;
|
||||
int punctuationIndex = 0;
|
||||
int wordIndex = 1;
|
||||
|
||||
Step nextStep = Step.WORD_GROUP1;
|
||||
|
||||
// Begin outer while loop
|
||||
while (true) {
|
||||
|
||||
switch (nextStep) {
|
||||
|
||||
case WORD_GROUP1:
|
||||
|
||||
if (wordIndex == 1) {
|
||||
|
||||
System.out.print("MIDNIGHT DREARY");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 2) {
|
||||
|
||||
System.out.print("FIERY EYES");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 3) {
|
||||
|
||||
System.out.print("BIRD OR FIEND");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 4) {
|
||||
|
||||
System.out.print("THING OF EVIL");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 5) {
|
||||
|
||||
System.out.print("PROPHET");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
}
|
||||
break;
|
||||
|
||||
case WORD_GROUP2:
|
||||
|
||||
if (wordIndex == 1) {
|
||||
|
||||
System.out.print("BEGUILING ME");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 2) {
|
||||
|
||||
System.out.print("THRILLED ME");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 3) {
|
||||
|
||||
System.out.print("STILL SITTING....");
|
||||
nextStep = Step.RANDOMIZE_WHITESPACE;
|
||||
|
||||
} else if (wordIndex == 4) {
|
||||
|
||||
System.out.print("NEVER FLITTING");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 5) {
|
||||
|
||||
System.out.print("BURNED");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
}
|
||||
break;
|
||||
|
||||
case WORD_GROUP3:
|
||||
|
||||
if (wordIndex == 1) {
|
||||
|
||||
System.out.print("AND MY SOUL");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 2) {
|
||||
|
||||
System.out.print("DARKNESS THERE");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 3) {
|
||||
|
||||
System.out.print("SHALL BE LIFTED");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 4) {
|
||||
|
||||
System.out.print("QUOTH THE RAVEN");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 5) {
|
||||
|
||||
if (punctuationIndex != 0) {
|
||||
|
||||
System.out.print("SIGN OF PARTING");
|
||||
}
|
||||
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
}
|
||||
break;
|
||||
|
||||
case WORD_GROUP4:
|
||||
|
||||
if (wordIndex == 1) {
|
||||
|
||||
System.out.print("NOTHING MORE");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 2) {
|
||||
|
||||
System.out.print("YET AGAIN");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 3) {
|
||||
|
||||
System.out.print("SLOWLY CREEPING");
|
||||
nextStep = Step.RANDOMIZE_WHITESPACE;
|
||||
|
||||
} else if (wordIndex == 4) {
|
||||
|
||||
System.out.print("...EVERMORE");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
|
||||
} else if (wordIndex == 5) {
|
||||
|
||||
System.out.print("NEVERMORE");
|
||||
nextStep = Step.RANDOMIZE_COMMA;
|
||||
}
|
||||
break;
|
||||
|
||||
case RANDOMIZE_COMMA:
|
||||
|
||||
// Insert commas
|
||||
if ((punctuationIndex != 0) && (Math.random() <= COMMA_RATE)) {
|
||||
|
||||
System.out.print(",");
|
||||
punctuationIndex = 2;
|
||||
}
|
||||
nextStep = Step.RANDOMIZE_WHITESPACE;
|
||||
break;
|
||||
|
||||
|
||||
case RANDOMIZE_WHITESPACE:
|
||||
|
||||
// Insert spaces
|
||||
if (Math.random() <= SPACE_RATE) {
|
||||
|
||||
System.out.print(" ");
|
||||
punctuationIndex++;
|
||||
|
||||
}
|
||||
// Insert newlines
|
||||
else {
|
||||
|
||||
System.out.println("");
|
||||
punctuationIndex = 0;
|
||||
}
|
||||
nextStep = Step.RANDOMIZE_COUNTERS;
|
||||
break;
|
||||
|
||||
case RANDOMIZE_COUNTERS:
|
||||
|
||||
wordIndex = (int)((int)(10 * Math.random()) / 2) + 1;
|
||||
|
||||
groupIndex++;
|
||||
paragraphIndex++;
|
||||
|
||||
if ((punctuationIndex == 0) && (groupIndex % 2 == 0)) {
|
||||
|
||||
System.out.print(" ");
|
||||
}
|
||||
|
||||
if (groupIndex == 1) {
|
||||
|
||||
nextStep = Step.WORD_GROUP1;
|
||||
|
||||
} else if (groupIndex == 2) {
|
||||
|
||||
nextStep = Step.WORD_GROUP2;
|
||||
|
||||
} else if (groupIndex == 3) {
|
||||
|
||||
nextStep = Step.WORD_GROUP3;
|
||||
|
||||
} else if (groupIndex == 4) {
|
||||
|
||||
nextStep = Step.WORD_GROUP4;
|
||||
|
||||
} else if (groupIndex == 5) {
|
||||
|
||||
groupIndex = 0;
|
||||
System.out.println("");
|
||||
|
||||
if (paragraphIndex > PARAGRAPH_RATE) {
|
||||
|
||||
System.out.println("");
|
||||
punctuationIndex = 0;
|
||||
paragraphIndex = 0;
|
||||
nextStep = Step.WORD_GROUP2;
|
||||
|
||||
} else {
|
||||
|
||||
nextStep = Step.RANDOMIZE_COUNTERS;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
System.out.println("INVALID STEP");
|
||||
break;
|
||||
}
|
||||
|
||||
} // End outer while loop
|
||||
|
||||
} // End of method startGame
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Poetry poetry = new Poetry();
|
||||
poetry.play();
|
||||
|
||||
} // End of method main
|
||||
|
||||
} // End of class Poetry
|
||||
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/perl
|
||||
#use strict;
|
||||
# Automatic converted by bas2perl.pl
|
||||
# Too much spaguetti code to be properly converted.
|
||||
|
||||
|
||||
print ' 'x 30 . "POETRY\n";
|
||||
print ' 'x 15 . "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n";
|
||||
print "\n"; print "\n"; print "\n";
|
||||
Line90:
|
||||
if ($I==1) { goto Line100; } elsif ($I==2) { goto Line101; } elsif ($I==3) { goto Line102; } elsif ($I==4) { goto Line103; } elsif ($I==5) { goto Line104; } ;
|
||||
Line100:
|
||||
print "MIDNIGHT DREARY"; goto Line210;
|
||||
Line101:
|
||||
print "FIERY EYES"; goto Line210;
|
||||
Line102:
|
||||
print "BIRD OR FIEND"; goto Line210;
|
||||
Line103:
|
||||
print "THING OF EVIL"; goto Line210;
|
||||
Line104:
|
||||
print "PROPHET"; goto Line210;
|
||||
Line110:
|
||||
if ($I==1) { goto Line111; } elsif ($I==2) { goto Line112; } elsif ($I==3) { goto Line113; } elsif ($I==4) { goto Line114; } elsif ($I==5) { goto Line115; } ;
|
||||
Line111:
|
||||
print "BEGUILING ME"; $U=2; goto Line210;
|
||||
Line112:
|
||||
print "THRILLED ME"; goto Line210;
|
||||
Line113:
|
||||
print "STILL SITTING...."; goto Line212;
|
||||
Line114:
|
||||
print "NEVER FLITTING"; $U=2; goto Line210;
|
||||
Line115:
|
||||
print "BURNED"; goto Line210;
|
||||
Line120:
|
||||
if ($I==1) { goto Line121; } elsif ($I==2) { goto Line122; } elsif ($I==3) { goto Line123; } elsif ($I==4) { goto Line124; } elsif ($I==5) { goto Line125; } ;
|
||||
Line121:
|
||||
print "AND MY SOUL"; goto Line210;
|
||||
Line122:
|
||||
print "DARKNESS THERE"; goto Line210;
|
||||
Line123:
|
||||
print "SHALL BE LIFTED"; goto Line210;
|
||||
Line124:
|
||||
print "QUOTH THE RAVEN"; goto Line210;
|
||||
Line125:
|
||||
if ($U==0) { goto Line210; }
|
||||
print "SIGN OF PARTING"; goto Line210;
|
||||
Line130:
|
||||
if ($I==1) { goto Line131; } elsif ($I==2) { goto Line132; } elsif ($I==3) { goto Line133; } elsif ($I==4) { goto Line134; } elsif ($I==5) { goto Line135; } ;
|
||||
Line131:
|
||||
print "NOTHING MORE"; goto Line210;
|
||||
Line132:
|
||||
print "YET AGAIN"; goto Line210;
|
||||
Line133:
|
||||
print "SLOWLY CREEPING"; goto Line210;
|
||||
Line134:
|
||||
print "...EVERMORE"; goto Line210;
|
||||
Line135:
|
||||
print "NEVERMORE";
|
||||
Line210:
|
||||
if ($U==0 || rand(1)>.19) { goto Line212; }
|
||||
print ","; $U=2;
|
||||
Line212:
|
||||
if (rand(1)>.65) { goto Line214; }
|
||||
print " "; $U=$U+1; goto Line215;
|
||||
Line214:
|
||||
print "\n"; $U=0;
|
||||
Line215:
|
||||
$I=int(int(10*rand(1))/2)+1;
|
||||
$J=$J+1; $K=$K+1;
|
||||
if ($U>0 || int($J/2)!=$J/2) { goto Line240; }
|
||||
print " ";
|
||||
Line240:
|
||||
if ($J==1) { goto Line90; } elsif ($J==2) { goto Line110; } elsif ($J==3) { goto Line120; } elsif ($J==4) { goto Line130; } elsif ($J==5) { goto Line250; } ;
|
||||
Line250:
|
||||
$J=0; print "\n"; if ($K>20) { goto Line270; }
|
||||
goto Line215;
|
||||
Line270:
|
||||
print "\n"; $U=0; $K=0; goto Line110;
|
||||
exit;
|
||||
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/perl
|
||||
#use strict;
|
||||
# Automatic converted by bas2perl.pl
|
||||
# Too much spaguetti code to be properly converted.
|
||||
|
||||
|
||||
print ' 'x 30 . "POETRY\n";
|
||||
print ' 'x 15 . "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n";
|
||||
print "\n"; print "\n"; print "\n";
|
||||
Line90:
|
||||
if ($I==1) { goto Line100; } elsif ($I==2) { goto Line101; } elsif ($I==3) { goto Line102; } elsif ($I==4) { goto Line103; } elsif ($I==5) { goto Line104; } ;
|
||||
Line100:
|
||||
print "MIDNIGHT DREARY"; goto Line210;
|
||||
Line101:
|
||||
print "FIERY EYES"; goto Line210;
|
||||
Line102:
|
||||
print "BIRD OR FIEND"; goto Line210;
|
||||
Line103:
|
||||
print "THING OF EVIL"; goto Line210;
|
||||
Line104:
|
||||
print "PROPHET"; goto Line210;
|
||||
Line110:
|
||||
if ($I==1) { goto Line111; } elsif ($I==2) { goto Line112; } elsif ($I==3) { goto Line113; } elsif ($I==4) { goto Line114; } elsif ($I==5) { goto Line115; } ;
|
||||
Line111:
|
||||
print "BEGUILING ME"; $U=2; goto Line210;
|
||||
Line112:
|
||||
print "THRILLED ME"; goto Line210;
|
||||
Line113:
|
||||
print "STILL SITTING...."; goto Line212;
|
||||
Line114:
|
||||
print "NEVER FLITTING"; $U=2; goto Line210;
|
||||
Line115:
|
||||
print "BURNED"; goto Line210;
|
||||
Line120:
|
||||
if ($I==1) { goto Line121; } elsif ($I==2) { goto Line122; } elsif ($I==3) { goto Line123; } elsif ($I==4) { goto Line124; } elsif ($I==5) { goto Line125; } ;
|
||||
Line121:
|
||||
print "AND MY SOUL"; goto Line210;
|
||||
Line122:
|
||||
print "DARKNESS THERE"; goto Line210;
|
||||
Line123:
|
||||
print "SHALL BE LIFTED"; goto Line210;
|
||||
Line124:
|
||||
print "QUOTH THE RAVEN"; goto Line210;
|
||||
Line125:
|
||||
if ($U==0) { goto Line210; }
|
||||
print "SIGN OF PARTING"; goto Line210;
|
||||
Line130:
|
||||
if ($I==1) { goto Line131; } elsif ($I==2) { goto Line132; } elsif ($I==3) { goto Line133; } elsif ($I==4) { goto Line134; } elsif ($I==5) { goto Line135; } ;
|
||||
Line131:
|
||||
print "NOTHING MORE"; goto Line210;
|
||||
Line132:
|
||||
print "YET AGAIN"; goto Line210;
|
||||
Line133:
|
||||
print "SLOWLY CREEPING"; goto Line210;
|
||||
Line134:
|
||||
print "...EVERMORE"; goto Line210;
|
||||
Line135:
|
||||
print "NEVERMORE";
|
||||
Line210:
|
||||
if ($U==0 || rand(1)>.19) { goto Line212; }
|
||||
print ","; $U=2;
|
||||
Line212:
|
||||
if (rand(1)>.65) { goto Line214; }
|
||||
print " "; $U=$U+1; goto Line215;
|
||||
Line214:
|
||||
print "\n"; $U=0;
|
||||
Line215:
|
||||
$I=int(int(10*rand(1))/2)+1;
|
||||
$J=$J+1; $K=$K+1;
|
||||
if ($U>0 || int($J/2)!=$J/2) { goto Line240; }
|
||||
print " ";
|
||||
Line240:
|
||||
if ($J==1) { goto Line90; } elsif ($J==2) { goto Line110; } elsif ($J==3) { goto Line120; } elsif ($J==4) { goto Line130; } elsif ($J==5) { goto Line250; } ;
|
||||
Line250:
|
||||
$J=0; print "\n"; if ($K>20) { goto Line270; }
|
||||
goto Line215;
|
||||
Line270:
|
||||
print "\n"; $U=0; $K=0; goto Line110;
|
||||
exit;
|
||||
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
import java.util.Scanner;
|
||||
import java.lang.Math;
|
||||
|
||||
/**
|
||||
* Game of Reverse
|
||||
* <p>
|
||||
* Based on the BASIC game of Reverse here
|
||||
* https://github.com/coding-horror/basic-computer-games/blob/main/73%20Reverse/reverse.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 Reverse {
|
||||
|
||||
private final int NUMBER_COUNT = 9;
|
||||
|
||||
private final Scanner scan; // For user input
|
||||
|
||||
private enum Step {
|
||||
INITIALIZE, PERFORM_REVERSE, TRY_AGAIN, END_GAME
|
||||
}
|
||||
|
||||
public Reverse() {
|
||||
|
||||
scan = new Scanner(System.in);
|
||||
|
||||
} // End of constructor Reverse
|
||||
|
||||
public void play() {
|
||||
|
||||
showIntro();
|
||||
startGame();
|
||||
|
||||
} // End of method play
|
||||
|
||||
private static void showIntro() {
|
||||
|
||||
System.out.println(" ".repeat(31) + "REVERSE");
|
||||
System.out.println(" ".repeat(14) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
||||
System.out.println("\n\n");
|
||||
System.out.println("REVERSE -- A GAME OF SKILL");
|
||||
System.out.println("");
|
||||
|
||||
} // End of method showIntro
|
||||
|
||||
private void startGame() {
|
||||
|
||||
int index = 0;
|
||||
int numMoves = 0;
|
||||
int numReverse = 0;
|
||||
int tempVal = 0;
|
||||
int[] numList = new int[NUMBER_COUNT + 1];
|
||||
|
||||
Step nextStep = Step.INITIALIZE;
|
||||
|
||||
String userResponse = "";
|
||||
|
||||
System.out.print("DO YOU WANT THE RULES? ");
|
||||
userResponse = scan.nextLine();
|
||||
|
||||
if (!userResponse.toUpperCase().equals("NO")) {
|
||||
|
||||
this.printRules();
|
||||
}
|
||||
|
||||
// Begin outer while loop
|
||||
while (true) {
|
||||
|
||||
// Begin outer switch
|
||||
switch (nextStep) {
|
||||
|
||||
case INITIALIZE:
|
||||
|
||||
// Make a random list of numbers
|
||||
numList[1] = (int)((NUMBER_COUNT - 1) * Math.random() + 2);
|
||||
|
||||
for (index = 2; index <= NUMBER_COUNT; index++) {
|
||||
|
||||
// Keep generating lists if there are duplicates
|
||||
while (true) {
|
||||
|
||||
numList[index] = (int)(NUMBER_COUNT * Math.random() + 1);
|
||||
|
||||
// Search for duplicates
|
||||
if (!this.findDuplicates(numList, index)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("");
|
||||
System.out.println("HERE WE GO ... THE LIST IS:");
|
||||
|
||||
numMoves = 0;
|
||||
|
||||
this.printBoard(numList);
|
||||
|
||||
nextStep = Step.PERFORM_REVERSE;
|
||||
break;
|
||||
|
||||
case PERFORM_REVERSE:
|
||||
|
||||
System.out.print("HOW MANY SHALL I REVERSE? ");
|
||||
numReverse = Integer.parseInt(scan.nextLine());
|
||||
|
||||
if (numReverse == 0) {
|
||||
|
||||
nextStep = Step.TRY_AGAIN;
|
||||
|
||||
} else if (numReverse > NUMBER_COUNT) {
|
||||
|
||||
System.out.println("OOPS! TOO MANY! I CAN REVERSE AT MOST " + NUMBER_COUNT);
|
||||
nextStep = Step.PERFORM_REVERSE;
|
||||
|
||||
} else {
|
||||
|
||||
numMoves++;
|
||||
|
||||
for (index = 1; index <= (int)(numReverse / 2.0); index++) {
|
||||
|
||||
tempVal = numList[index];
|
||||
numList[index] = numList[numReverse - index + 1];
|
||||
numList[numReverse - index + 1] = tempVal;
|
||||
}
|
||||
|
||||
this.printBoard(numList);
|
||||
|
||||
nextStep = Step.TRY_AGAIN;
|
||||
|
||||
// Check for a win
|
||||
for (index = 1; index <= NUMBER_COUNT; index++) {
|
||||
|
||||
if (numList[index] != index) {
|
||||
nextStep = Step.PERFORM_REVERSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (nextStep == Step.TRY_AGAIN) {
|
||||
System.out.println("YOU WON IT IN " + numMoves + " MOVES!!!");
|
||||
System.out.println("");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case TRY_AGAIN:
|
||||
|
||||
System.out.println("");
|
||||
System.out.print("TRY AGAIN (YES OR NO)? ");
|
||||
userResponse = scan.nextLine();
|
||||
|
||||
if (userResponse.toUpperCase().equals("YES")) {
|
||||
nextStep = Step.INITIALIZE;
|
||||
} else {
|
||||
nextStep = Step.END_GAME;
|
||||
}
|
||||
break;
|
||||
|
||||
case END_GAME:
|
||||
|
||||
System.out.println("");
|
||||
System.out.println("O.K. HOPE YOU HAD FUN!!");
|
||||
return;
|
||||
|
||||
default:
|
||||
|
||||
System.out.println("INVALID STEP");
|
||||
break;
|
||||
|
||||
} // End outer switch
|
||||
|
||||
} // End outer while loop
|
||||
|
||||
} // End of method startGame
|
||||
|
||||
public boolean findDuplicates(int[] board, int length) {
|
||||
|
||||
int index = 0;
|
||||
|
||||
for (index = 1; index <= length - 1; index++) {
|
||||
|
||||
// Identify duplicates
|
||||
if (board[length] == board[index]) {
|
||||
|
||||
return true; // Found a duplicate
|
||||
}
|
||||
}
|
||||
|
||||
return false; // No duplicates found
|
||||
|
||||
} // End of method findDuplicates
|
||||
|
||||
public void printBoard(int[] board) {
|
||||
|
||||
int index = 0;
|
||||
|
||||
System.out.println("");
|
||||
|
||||
for (index = 1; index <= NUMBER_COUNT; index++) {
|
||||
|
||||
System.out.format("%2d", board[index]);
|
||||
}
|
||||
|
||||
System.out.println("\n");
|
||||
|
||||
} // End of method printBoard
|
||||
|
||||
public void printRules() {
|
||||
|
||||
System.out.println("");
|
||||
System.out.println("THIS IS THE GAME OF 'REVERSE'. TO WIN, ALL YOU HAVE");
|
||||
System.out.println("TO DO IS ARRANGE A LIST OF NUMBERS (1 THROUGH " + NUMBER_COUNT + ")");
|
||||
System.out.println("IN NUMERICAL ORDER FROM LEFT TO RIGHT. TO MOVE, YOU");
|
||||
System.out.println("TELL ME HOW MANY NUMBERS (COUNTING FROM THE LEFT) TO");
|
||||
System.out.println("REVERSE. FOR EXAMPLE, IF THE CURRENT LIST IS:");
|
||||
System.out.println("");
|
||||
System.out.println("2 3 4 5 1 6 7 8 9");
|
||||
System.out.println("");
|
||||
System.out.println("AND YOU REVERSE 4, THE RESULT WILL BE:");
|
||||
System.out.println("");
|
||||
System.out.println("5 4 3 2 1 6 7 8 9");
|
||||
System.out.println("");
|
||||
System.out.println("NOW IF YOU REVERSE 5, YOU WIN!");
|
||||
System.out.println("");
|
||||
System.out.println("1 2 3 4 5 6 7 8 9");
|
||||
System.out.println("");
|
||||
System.out.println("NO DOUBT YOU WILL LIKE THIS GAME, BUT");
|
||||
System.out.println("IF YOU WANT TO QUIT, REVERSE 0 (ZERO).");
|
||||
System.out.println("");
|
||||
|
||||
} // End of method printRules
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Reverse game = new Reverse();
|
||||
game.play();
|
||||
|
||||
} // End of method main
|
||||
|
||||
} // End of class Reverse
|
||||
@@ -0,0 +1,34 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26124.0
|
||||
MinimumVisualStudioVersion = 15.0.26124.0
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stars", "Stars\Stars.csproj", "{5832C21C-4DE5-475E-893D-745DA15F1AAC}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Release|x64.Build.0 = Release|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{5832C21C-4DE5-475E-893D-745DA15F1AAC}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,94 @@
|
||||
using System;
|
||||
|
||||
namespace Stars
|
||||
{
|
||||
internal class Game
|
||||
{
|
||||
private readonly int _maxNumber;
|
||||
private readonly int _maxGuessCount;
|
||||
private readonly Random _random;
|
||||
|
||||
public Game(int maxNumber, int maxGuessCount)
|
||||
{
|
||||
_maxNumber = maxNumber;
|
||||
_maxGuessCount = maxGuessCount;
|
||||
_random = new Random();
|
||||
}
|
||||
|
||||
internal void DisplayInstructions()
|
||||
{
|
||||
if (Input.GetString("Do you want instructions? ").Equals("N", StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Console.WriteLine($"I am thinking of a number between 1 and {_maxNumber}.");
|
||||
Console.WriteLine("Try to guess my number. After you guess, I");
|
||||
Console.WriteLine("will type one or more stars (*). The more");
|
||||
Console.WriteLine("stars I type, the close you are to my number.");
|
||||
Console.WriteLine("One star (*) means far away, seven stars (*******)");
|
||||
Console.WriteLine($"means really close! You get {_maxGuessCount} guesses.");
|
||||
}
|
||||
|
||||
internal void Play()
|
||||
{
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
|
||||
var target = _random.Next(_maxNumber) + 1;
|
||||
|
||||
Console.WriteLine("Ok, I am thinking of a number. Start guessing.");
|
||||
|
||||
AcceptGuesses(target);
|
||||
}
|
||||
|
||||
private void AcceptGuesses(int target)
|
||||
{
|
||||
for (int guessCount = 1; guessCount <= _maxGuessCount; guessCount++)
|
||||
{
|
||||
Console.WriteLine();
|
||||
var guess = Input.GetNumber("Your guess? ");
|
||||
|
||||
if (guess == target)
|
||||
{
|
||||
DisplayWin(guessCount);
|
||||
return;
|
||||
}
|
||||
|
||||
DisplayStars(target, guess);
|
||||
}
|
||||
|
||||
DisplayLoss(target);
|
||||
}
|
||||
|
||||
private static void DisplayStars(int target, float guess)
|
||||
{
|
||||
var stars = Math.Abs(guess - target) switch
|
||||
{
|
||||
>= 64 => "*",
|
||||
>= 32 => "**",
|
||||
>= 16 => "***",
|
||||
>= 8 => "****",
|
||||
>= 4 => "*****",
|
||||
>= 2 => "******",
|
||||
_ => "*******"
|
||||
};
|
||||
|
||||
Console.WriteLine(stars);
|
||||
}
|
||||
|
||||
private static void DisplayWin(int guessCount)
|
||||
{
|
||||
Console.WriteLine();
|
||||
Console.WriteLine(new string('*', 79));
|
||||
Console.WriteLine();
|
||||
Console.WriteLine($"You got it in {guessCount} guesses!!! Let's play again...");
|
||||
}
|
||||
|
||||
private void DisplayLoss(int target)
|
||||
{
|
||||
Console.WriteLine();
|
||||
Console.WriteLine($"Sorry, that's {_maxGuessCount} guesses. The number was {target}.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
|
||||
namespace Stars
|
||||
{
|
||||
internal static class Input
|
||||
{
|
||||
// Float, because that's what the BASIC input operation returns
|
||||
internal static float GetNumber(string prompt)
|
||||
{
|
||||
Console.Write(prompt);
|
||||
|
||||
while (true)
|
||||
{
|
||||
var response = Console.ReadLine();
|
||||
if (float.TryParse(response, out var value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
Console.WriteLine("!Number expected - retry input line");
|
||||
Console.Write("? ");
|
||||
}
|
||||
}
|
||||
|
||||
internal static string GetString(string prompt)
|
||||
{
|
||||
Console.Write(prompt);
|
||||
return Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
|
||||
namespace Stars
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
DisplayTitle();
|
||||
|
||||
var game = new Game(maxNumber: 100, maxGuessCount: 7);
|
||||
|
||||
game.DisplayInstructions();
|
||||
|
||||
while (true)
|
||||
{
|
||||
game.Play();
|
||||
}
|
||||
}
|
||||
|
||||
private static void DisplayTitle()
|
||||
{
|
||||
Console.WriteLine(" Stars");
|
||||
Console.WriteLine(" Creative Computing Morristown, New Jersey");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@@ -4,7 +4,6 @@ using SuperStarTrek.Resources;
|
||||
using SuperStarTrek.Space;
|
||||
using SuperStarTrek.Systems;
|
||||
using SuperStarTrek.Systems.ComputerFunctions;
|
||||
using static System.StringComparison;
|
||||
|
||||
namespace SuperStarTrek
|
||||
{
|
||||
@@ -22,17 +21,18 @@ namespace SuperStarTrek
|
||||
private int _initialKlingonCount;
|
||||
private Enterprise _enterprise;
|
||||
|
||||
public Game()
|
||||
internal Game(Output output, Input input, Random random)
|
||||
{
|
||||
_output = new Output();
|
||||
_input = new Input(_output);
|
||||
_random = new Random();
|
||||
_output = output;
|
||||
_input = input;
|
||||
_random = random;
|
||||
}
|
||||
|
||||
public float Stardate => _currentStardate;
|
||||
public float StardatesRemaining => _finalStarDate - _currentStardate;
|
||||
internal float Stardate => _currentStardate;
|
||||
|
||||
public void DoIntroduction()
|
||||
internal float StardatesRemaining => _finalStarDate - _currentStardate;
|
||||
|
||||
internal void DoIntroduction()
|
||||
{
|
||||
_output.Write(Strings.Title);
|
||||
|
||||
@@ -44,16 +44,13 @@ namespace SuperStarTrek
|
||||
}
|
||||
}
|
||||
|
||||
public void Play()
|
||||
internal void Play()
|
||||
{
|
||||
Initialise();
|
||||
var gameOver = false;
|
||||
var newQuadrantText = Strings.StartText;
|
||||
|
||||
while (!gameOver)
|
||||
{
|
||||
_enterprise.Quadrant.Display(Strings.NowEntering);
|
||||
|
||||
var command = _input.GetCommand();
|
||||
|
||||
var result = _enterprise.Execute(command);
|
||||
@@ -120,7 +117,7 @@ namespace SuperStarTrek
|
||||
private Quadrant BuildCurrentQuadrant() =>
|
||||
new Quadrant(_galaxy[_currentQuadrant], _enterprise, _random, _galaxy, _input, _output);
|
||||
|
||||
public bool Replay() => _galaxy.StarbaseCount > 0 && _input.GetString(Strings.ReplayPrompt, "Aye");
|
||||
internal bool Replay() => _galaxy.StarbaseCount > 0 && _input.GetString(Strings.ReplayPrompt, "Aye");
|
||||
|
||||
private bool CheckIfStranded()
|
||||
{
|
||||
|
||||
@@ -10,24 +10,24 @@ namespace SuperStarTrek
|
||||
{
|
||||
private readonly Output _output;
|
||||
|
||||
public Input(Output output)
|
||||
internal Input(Output output)
|
||||
{
|
||||
_output = output;
|
||||
}
|
||||
|
||||
public void WaitForAnyKeyButEnter(string prompt)
|
||||
internal void WaitForAnyKeyButEnter(string prompt)
|
||||
{
|
||||
_output.Write($"Hit any key but Enter {prompt} ");
|
||||
while (Console.ReadKey(intercept: true).Key == ConsoleKey.Enter);
|
||||
}
|
||||
|
||||
public string GetString(string prompt)
|
||||
internal string GetString(string prompt)
|
||||
{
|
||||
_output.Prompt(prompt);
|
||||
return Console.ReadLine();
|
||||
}
|
||||
|
||||
public float GetNumber(string prompt)
|
||||
internal float GetNumber(string prompt)
|
||||
{
|
||||
_output.Prompt(prompt);
|
||||
|
||||
@@ -44,24 +44,24 @@ namespace SuperStarTrek
|
||||
}
|
||||
}
|
||||
|
||||
public (float X, float Y) GetCoordinates(string prompt)
|
||||
internal (float X, float Y) GetCoordinates(string prompt)
|
||||
{
|
||||
_output.Prompt($"{prompt} (X,Y)");
|
||||
var responses = ReadNumbers(2);
|
||||
return (responses[0], responses[1]);
|
||||
}
|
||||
|
||||
public bool TryGetNumber(string prompt, float minValue, float maxValue, out float value)
|
||||
internal bool TryGetNumber(string prompt, float minValue, float maxValue, out float value)
|
||||
{
|
||||
value = GetNumber($"{prompt} ({minValue}-{maxValue})");
|
||||
|
||||
return value >= minValue && value <= maxValue;
|
||||
}
|
||||
|
||||
internal bool GetString(string replayPrompt, string trueValue)
|
||||
=> GetString(replayPrompt).Equals(trueValue, InvariantCultureIgnoreCase);
|
||||
internal bool GetString(string replayPrompt, string trueValue) =>
|
||||
GetString(replayPrompt).Equals(trueValue, InvariantCultureIgnoreCase);
|
||||
|
||||
public Command GetCommand()
|
||||
internal Command GetCommand()
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
@@ -82,7 +82,7 @@ namespace SuperStarTrek
|
||||
}
|
||||
}
|
||||
|
||||
public bool TryGetCourse(string prompt, string officer, out Course course)
|
||||
internal bool TryGetCourse(string prompt, string officer, out Course course)
|
||||
{
|
||||
if (!TryGetNumber(prompt, 1, 9, out var direction))
|
||||
{
|
||||
@@ -95,7 +95,7 @@ namespace SuperStarTrek
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool GetYesNo(string prompt, YesNoMode mode)
|
||||
internal bool GetYesNo(string prompt, YesNoMode mode)
|
||||
{
|
||||
_output.Prompt($"{prompt} (Y/N)");
|
||||
var response = Console.ReadLine().ToUpperInvariant();
|
||||
@@ -150,7 +150,7 @@ namespace SuperStarTrek
|
||||
return numbers;
|
||||
}
|
||||
|
||||
public enum YesNoMode
|
||||
internal enum YesNoMode
|
||||
{
|
||||
TrueOnY,
|
||||
FalseOnN
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SuperStarTrek.Commands;
|
||||
using SuperStarTrek.Resources;
|
||||
using SuperStarTrek.Space;
|
||||
@@ -31,22 +30,33 @@ namespace SuperStarTrek.Objects
|
||||
_input = input;
|
||||
}
|
||||
|
||||
public Quadrant Quadrant => _quadrant;
|
||||
public Coordinates QuadrantCoordinates => _quadrant.Coordinates;
|
||||
public Coordinates SectorCoordinates { get; private set; }
|
||||
internal Quadrant Quadrant => _quadrant;
|
||||
|
||||
public string Condition => GetCondition();
|
||||
public LibraryComputer Computer => (LibraryComputer)_commandExecutors[Command.COM];
|
||||
public ShieldControl ShieldControl => (ShieldControl)_commandExecutors[Command.SHE];
|
||||
public float Energy => TotalEnergy - ShieldControl.ShieldEnergy;
|
||||
public float TotalEnergy { get; private set; }
|
||||
public int DamagedSystemCount => _systems.Count(s => s.IsDamaged);
|
||||
public IEnumerable<Subsystem> Systems => _systems;
|
||||
public PhotonTubes PhotonTubes => (PhotonTubes)_commandExecutors[Command.TOR];
|
||||
public bool IsDocked => _quadrant.EnterpriseIsNextToStarbase;
|
||||
public bool IsStranded => TotalEnergy < 10 || Energy < 10 && ShieldControl.IsDamaged;
|
||||
internal Coordinates QuadrantCoordinates => _quadrant.Coordinates;
|
||||
|
||||
public Enterprise Add(Subsystem system)
|
||||
internal Coordinates SectorCoordinates { get; private set; }
|
||||
|
||||
internal string Condition => GetCondition();
|
||||
|
||||
internal LibraryComputer Computer => (LibraryComputer)_commandExecutors[Command.COM];
|
||||
|
||||
internal ShieldControl ShieldControl => (ShieldControl)_commandExecutors[Command.SHE];
|
||||
|
||||
internal float Energy => TotalEnergy - ShieldControl.ShieldEnergy;
|
||||
|
||||
internal float TotalEnergy { get; private set; }
|
||||
|
||||
internal int DamagedSystemCount => _systems.Count(s => s.IsDamaged);
|
||||
|
||||
internal IEnumerable<Subsystem> Systems => _systems;
|
||||
|
||||
internal PhotonTubes PhotonTubes => (PhotonTubes)_commandExecutors[Command.TOR];
|
||||
|
||||
internal bool IsDocked => _quadrant.EnterpriseIsNextToStarbase;
|
||||
|
||||
internal bool IsStranded => TotalEnergy < 10 || Energy < 10 && ShieldControl.IsDamaged;
|
||||
|
||||
internal Enterprise Add(Subsystem system)
|
||||
{
|
||||
_systems.Add(system);
|
||||
_commandExecutors[system.Command] = system;
|
||||
@@ -54,38 +64,29 @@ namespace SuperStarTrek.Objects
|
||||
return this;
|
||||
}
|
||||
|
||||
public void StartIn(Quadrant quadrant)
|
||||
internal void StartIn(Quadrant quadrant)
|
||||
{
|
||||
_quadrant = quadrant;
|
||||
quadrant.Display(Strings.StartText);
|
||||
}
|
||||
|
||||
private string GetCondition() =>
|
||||
(_quadrant.HasKlingons, Energy / _maxEnergy) switch
|
||||
IsDocked switch
|
||||
{
|
||||
(true, _) => "*Red*",
|
||||
(_, < 0.1f) => "Yellow",
|
||||
_ => "Green"
|
||||
true => "Docked",
|
||||
false when _quadrant.HasKlingons => "*Red*",
|
||||
false when Energy / _maxEnergy < 0.1f => "Yellow",
|
||||
false => "Green"
|
||||
};
|
||||
|
||||
public CommandResult Execute(Command command)
|
||||
internal CommandResult Execute(Command command)
|
||||
{
|
||||
if (command == Command.XXX) { return CommandResult.GameOver; }
|
||||
|
||||
return _commandExecutors[command].ExecuteCommand(_quadrant);
|
||||
}
|
||||
|
||||
public void Refuel() => TotalEnergy = _maxEnergy;
|
||||
|
||||
internal bool Recognises(string command)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
internal string GetCommandList()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
internal void Refuel() => TotalEnergy = _maxEnergy;
|
||||
|
||||
public override string ToString() => "<*>";
|
||||
|
||||
|
||||
@@ -7,19 +7,20 @@ namespace SuperStarTrek.Objects
|
||||
{
|
||||
private readonly Random _random;
|
||||
|
||||
public Klingon(Coordinates sector, Random random)
|
||||
internal Klingon(Coordinates sector, Random random)
|
||||
{
|
||||
Sector = sector;
|
||||
_random = random;
|
||||
Energy = _random.GetFloat(100, 300);
|
||||
}
|
||||
|
||||
public float Energy { get; private set; }
|
||||
public Coordinates Sector { get; private set; }
|
||||
internal float Energy { get; private set; }
|
||||
|
||||
internal Coordinates Sector { get; private set; }
|
||||
|
||||
public override string ToString() => "+K+";
|
||||
|
||||
public CommandResult FireOn(Enterprise enterprise)
|
||||
internal CommandResult FireOn(Enterprise enterprise)
|
||||
{
|
||||
var attackStrength = _random.GetFloat();
|
||||
var distanceToEnterprise = Sector.GetDistanceTo(enterprise.SectorCoordinates);
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace SuperStarTrek.Objects
|
||||
private readonly Output _output;
|
||||
private readonly float _repairDelay;
|
||||
|
||||
public Starbase(Coordinates sector, Random random, Input input, Output output)
|
||||
internal Starbase(Coordinates sector, Random random, Input input, Output output)
|
||||
{
|
||||
Sector = sector;
|
||||
_repairDelay = random.GetFloat() * 0.5f;
|
||||
@@ -18,6 +18,7 @@ namespace SuperStarTrek.Objects
|
||||
}
|
||||
|
||||
internal Coordinates Sector { get; }
|
||||
|
||||
public override string ToString() => ">!<";
|
||||
|
||||
internal bool TryRepair(Enterprise enterprise, out float repairTime)
|
||||
|
||||
@@ -4,33 +4,33 @@ namespace SuperStarTrek
|
||||
{
|
||||
internal class Output
|
||||
{
|
||||
public Output Write(string text)
|
||||
internal Output Write(string text)
|
||||
{
|
||||
Console.Write(text);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Output Write(string format, params object[] args)
|
||||
internal Output Write(string format, params object[] args)
|
||||
{
|
||||
Console.Write(format, args);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Output WriteLine(string text = "")
|
||||
internal Output WriteLine(string text = "")
|
||||
{
|
||||
Console.WriteLine(text);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public Output NextLine()
|
||||
internal Output NextLine()
|
||||
{
|
||||
Console.WriteLine();
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public Output Prompt(string text = "")
|
||||
internal Output Prompt(string text = "")
|
||||
{
|
||||
Console.Write($"{text}? ");
|
||||
return this;
|
||||
|
||||
@@ -29,8 +29,11 @@ namespace SuperStarTrek
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
var foo = Utils.DirectionAndDistance.From(1,1).To(4,5);
|
||||
var game = new Game();
|
||||
var output = new Output();
|
||||
var input = new Input(output);
|
||||
var random = new Random();
|
||||
|
||||
var game = new Game(output, input, random);
|
||||
|
||||
game.DoIntroduction();
|
||||
|
||||
|
||||
@@ -4,22 +4,22 @@ namespace SuperStarTrek
|
||||
{
|
||||
internal class Random
|
||||
{
|
||||
private static readonly System.Random _random = new();
|
||||
private readonly System.Random _random = new();
|
||||
|
||||
public Coordinates GetCoordinate() => new Coordinates(Get1To8Inclusive() - 1, Get1To8Inclusive() - 1);
|
||||
internal Coordinates GetCoordinate() => new Coordinates(Get1To8Inclusive() - 1, Get1To8Inclusive() - 1);
|
||||
|
||||
// Duplicates the algorithm used in the original code to get an integer value from 1 to 8, inclusive:
|
||||
// 475 DEF FNR(R)=INT(RND(R)*7.98+1.01)
|
||||
// Returns a value from 1 to 8, inclusive.
|
||||
// Note there's a slight bias away from the extreme values, 1 and 8.
|
||||
public int Get1To8Inclusive() => (int)(GetFloat() * 7.98 + 1.01);
|
||||
internal int Get1To8Inclusive() => (int)(GetFloat() * 7.98 + 1.01);
|
||||
|
||||
public int GetInt(int inclusiveMinValue, int exclusiveMaxValue) =>
|
||||
internal int GetInt(int inclusiveMinValue, int exclusiveMaxValue) =>
|
||||
_random.Next(inclusiveMinValue, exclusiveMaxValue);
|
||||
|
||||
public float GetFloat() => (float)_random.NextDouble();
|
||||
internal float GetFloat() => (float)_random.NextDouble();
|
||||
|
||||
public float GetFloat(float inclusiveMinValue, float exclusiveMaxValue)
|
||||
internal float GetFloat(float inclusiveMinValue, float exclusiveMaxValue)
|
||||
=> GetFloat() * (exclusiveMaxValue - inclusiveMinValue) + inclusiveMinValue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
|
||||
Functions available from Library-Computer:
|
||||
0 = Cumulative galactic record
|
||||
1 = Status report
|
||||
2 = Photon torpedo data
|
||||
3 = Starbase nav data
|
||||
4 = Direction/distance calculator
|
||||
5 = Galaxy 'region name' map
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
|
||||
Now entering {0} quadrant . . .
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
Shields dropped for docking purposes
|
||||
Shields dropped for docking purposes
|
||||
@@ -0,0 +1,2 @@
|
||||
Deflector control room report:
|
||||
'Shields now at {0} units per your command.'
|
||||
@@ -6,38 +6,60 @@ namespace SuperStarTrek.Resources
|
||||
{
|
||||
internal static class Strings
|
||||
{
|
||||
public static string CombatArea => GetResource();
|
||||
public static string ComputerFunctions => GetResource();
|
||||
public static string Congratulations => GetResource();
|
||||
public static string CourtMartial => GetResource();
|
||||
public static string Destroyed => GetResource();
|
||||
public static string EndOfMission => GetResource();
|
||||
public static string Enterprise => GetResource();
|
||||
public static string Instructions => GetResource();
|
||||
public static string LowShields => GetResource();
|
||||
public static string NoEnemyShips => GetResource();
|
||||
public static string NoStarbase => GetResource();
|
||||
public static string NowEntering => GetResource();
|
||||
public static string Orders => GetResource();
|
||||
public static string PermissionDenied => GetResource();
|
||||
public static string Protected => GetResource();
|
||||
public static string RegionNames => GetResource();
|
||||
public static string RelievedOfCommand => GetResource();
|
||||
public static string RepairEstimate => GetResource();
|
||||
public static string RepairPrompt => GetResource();
|
||||
public static string ReplayPrompt => GetResource();
|
||||
public static string ShieldsDropped => GetResource();
|
||||
public static string ShortRangeSensorsOut => GetResource();
|
||||
public static string StartText => GetResource();
|
||||
public static string Stranded => GetResource();
|
||||
public static string Title => GetResource();
|
||||
internal static string CombatArea => GetResource();
|
||||
|
||||
internal static string Congratulations => GetResource();
|
||||
|
||||
internal static string CourtMartial => GetResource();
|
||||
|
||||
internal static string Destroyed => GetResource();
|
||||
|
||||
internal static string EndOfMission => GetResource();
|
||||
|
||||
internal static string Enterprise => GetResource();
|
||||
|
||||
internal static string Instructions => GetResource();
|
||||
|
||||
internal static string LowShields => GetResource();
|
||||
|
||||
internal static string NoEnemyShips => GetResource();
|
||||
|
||||
internal static string NoStarbase => GetResource();
|
||||
|
||||
internal static string NowEntering => GetResource();
|
||||
|
||||
internal static string Orders => GetResource();
|
||||
|
||||
internal static string PermissionDenied => GetResource();
|
||||
|
||||
internal static string Protected => GetResource();
|
||||
|
||||
internal static string RegionNames => GetResource();
|
||||
|
||||
internal static string RelievedOfCommand => GetResource();
|
||||
|
||||
internal static string RepairEstimate => GetResource();
|
||||
|
||||
internal static string RepairPrompt => GetResource();
|
||||
|
||||
internal static string ReplayPrompt => GetResource();
|
||||
|
||||
internal static string ShieldsDropped => GetResource();
|
||||
|
||||
internal static string ShieldsSet => GetResource();
|
||||
|
||||
internal static string ShortRangeSensorsOut => GetResource();
|
||||
|
||||
internal static string StartText => GetResource();
|
||||
|
||||
internal static string Stranded => GetResource();
|
||||
|
||||
internal static string Title => GetResource();
|
||||
|
||||
private static string GetResource([CallerMemberName] string name = "")
|
||||
{
|
||||
var streamName = $"SuperStarTrek.Resources.{name}.txt";
|
||||
using var stream = Assembly
|
||||
.GetExecutingAssembly()
|
||||
.GetManifestResourceStream(streamName);
|
||||
using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(streamName);
|
||||
using var reader = new StreamReader(stream);
|
||||
|
||||
return reader.ReadToEnd();
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace SuperStarTrek.Space
|
||||
// Note that the origin is top-left, x increase downwards, and y increases to the right.
|
||||
internal record Coordinates
|
||||
{
|
||||
public Coordinates(int x, int y)
|
||||
internal Coordinates(int x, int y)
|
||||
{
|
||||
X = Validated(x, nameof(x));
|
||||
Y = Validated(y, nameof(y));
|
||||
@@ -16,12 +16,15 @@ namespace SuperStarTrek.Space
|
||||
SubRegionIndex = Y % 4;
|
||||
}
|
||||
|
||||
public int X { get; }
|
||||
public int Y { get; }
|
||||
public int RegionIndex { get; }
|
||||
public int SubRegionIndex { get; }
|
||||
internal int X { get; }
|
||||
|
||||
internal int Y { get; }
|
||||
|
||||
internal int RegionIndex { get; }
|
||||
|
||||
internal int SubRegionIndex { get; }
|
||||
|
||||
private int Validated(int value, string argumentName)
|
||||
private static int Validated(int value, string argumentName)
|
||||
{
|
||||
if (value >= 0 && value <= 7) { return value; }
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ namespace SuperStarTrek.Space
|
||||
}
|
||||
|
||||
internal float DeltaX { get; }
|
||||
|
||||
internal float DeltaY { get; }
|
||||
|
||||
internal IEnumerable<Coordinates> GetSectorsFrom(Coordinates start)
|
||||
@@ -74,16 +75,16 @@ namespace SuperStarTrek.Space
|
||||
return (xComplete && yComplete, new Coordinates(quadrantX, quadrantY), new Coordinates(sectorX, sectorY));
|
||||
}
|
||||
|
||||
private (bool, int, int) GetNewCoordinate(int quadrant, int sector, float sectorsTravelled)
|
||||
private static (bool, int, int) GetNewCoordinate(int quadrant, int sector, float sectorsTravelled)
|
||||
{
|
||||
var galacticCoordinate = quadrant * 8 + sector + sectorsTravelled;
|
||||
var newQuadrant = (int)(galacticCoordinate / 8);
|
||||
var newSector = (int)(galacticCoordinate - newQuadrant * 8);
|
||||
|
||||
if (newSector == -1)
|
||||
if (newSector < 0)
|
||||
{
|
||||
newQuadrant -= 1;
|
||||
newSector = 7;
|
||||
newSector += 8;
|
||||
}
|
||||
|
||||
return newQuadrant switch
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SuperStarTrek.Objects;
|
||||
using SuperStarTrek.Resources;
|
||||
|
||||
using static System.StringSplitOptions;
|
||||
@@ -13,7 +11,6 @@ namespace SuperStarTrek.Space
|
||||
private static readonly string[] _regionNames;
|
||||
private static readonly string[] _subRegionIdentifiers;
|
||||
private readonly QuadrantInfo[][] _quadrants;
|
||||
private readonly Random _random;
|
||||
|
||||
static Galaxy()
|
||||
{
|
||||
@@ -21,16 +18,14 @@ namespace SuperStarTrek.Space
|
||||
_subRegionIdentifiers = new[] { "I", "II", "III", "IV" };
|
||||
}
|
||||
|
||||
public Galaxy(Random random)
|
||||
internal Galaxy(Random random)
|
||||
{
|
||||
_random = random;
|
||||
|
||||
_quadrants = Enumerable
|
||||
.Range(0, 8)
|
||||
.Select(x => Enumerable
|
||||
.Range(0, 8)
|
||||
.Select(y => new Coordinates(x, y))
|
||||
.Select(c => QuadrantInfo.Create(c, GetQuadrantName(c)))
|
||||
.Select(c => QuadrantInfo.Create(c, GetQuadrantName(c), random))
|
||||
.ToArray())
|
||||
.ToArray();
|
||||
|
||||
@@ -46,16 +41,18 @@ namespace SuperStarTrek.Space
|
||||
}
|
||||
}
|
||||
|
||||
public QuadrantInfo this[Coordinates coordinate] => _quadrants[coordinate.X][coordinate.Y];
|
||||
internal QuadrantInfo this[Coordinates coordinate] => _quadrants[coordinate.X][coordinate.Y];
|
||||
|
||||
public int KlingonCount => _quadrants.SelectMany(q => q).Sum(q => q.KlingonCount);
|
||||
public int StarbaseCount => _quadrants.SelectMany(q => q).Count(q => q.HasStarbase);
|
||||
public IEnumerable<IEnumerable<QuadrantInfo>> Quadrants => _quadrants;
|
||||
internal int KlingonCount => _quadrants.SelectMany(q => q).Sum(q => q.KlingonCount);
|
||||
|
||||
internal int StarbaseCount => _quadrants.SelectMany(q => q).Count(q => q.HasStarbase);
|
||||
|
||||
internal IEnumerable<IEnumerable<QuadrantInfo>> Quadrants => _quadrants;
|
||||
|
||||
private static string GetQuadrantName(Coordinates coordinates) =>
|
||||
$"{_regionNames[coordinates.RegionIndex]} {_subRegionIdentifiers[coordinates.SubRegionIndex]}";
|
||||
|
||||
public IEnumerable<IEnumerable<QuadrantInfo>> GetNeighborhood(Quadrant quadrant) =>
|
||||
internal IEnumerable<IEnumerable<QuadrantInfo>> GetNeighborhood(Quadrant quadrant) =>
|
||||
Enumerable.Range(-1, 3)
|
||||
.Select(dx => dx + quadrant.Coordinates.X)
|
||||
.Select(x => GetNeighborhoodRow(quadrant, x));
|
||||
|
||||
@@ -14,9 +14,9 @@ namespace SuperStarTrek.Space
|
||||
private readonly Dictionary<Coordinates, object> _sectors;
|
||||
private readonly Enterprise _enterprise;
|
||||
private readonly Output _output;
|
||||
private bool _displayed = false;
|
||||
private bool _entered = false;
|
||||
|
||||
public Quadrant(
|
||||
internal Quadrant(
|
||||
QuadrantInfo info,
|
||||
Enterprise enterprise,
|
||||
Random random,
|
||||
@@ -39,13 +39,19 @@ namespace SuperStarTrek.Space
|
||||
PositionObject(_ => new Star(), _info.StarCount);
|
||||
}
|
||||
|
||||
public Coordinates Coordinates => _info.Coordinates;
|
||||
public bool HasKlingons => _info.KlingonCount > 0;
|
||||
public int KlingonCount => _info.KlingonCount;
|
||||
public bool HasStarbase => _info.HasStarbase;
|
||||
public Starbase Starbase { get; }
|
||||
internal Coordinates Coordinates => _info.Coordinates;
|
||||
|
||||
internal bool HasKlingons => _info.KlingonCount > 0;
|
||||
|
||||
internal int KlingonCount => _info.KlingonCount;
|
||||
|
||||
internal bool HasStarbase => _info.HasStarbase;
|
||||
|
||||
internal Starbase Starbase { get; }
|
||||
|
||||
internal Galaxy Galaxy { get; }
|
||||
public bool EnterpriseIsNextToStarbase =>
|
||||
|
||||
internal bool EnterpriseIsNextToStarbase =>
|
||||
_info.HasStarbase &&
|
||||
Math.Abs(_enterprise.SectorCoordinates.X - Starbase.Sector.X) <= 1 &&
|
||||
Math.Abs(_enterprise.SectorCoordinates.Y - Starbase.Sector.Y) <= 1;
|
||||
@@ -71,9 +77,11 @@ namespace SuperStarTrek.Space
|
||||
|
||||
internal void Display(string textFormat)
|
||||
{
|
||||
if (_displayed) { return; }
|
||||
|
||||
_output.Write(textFormat, this);
|
||||
if (!_entered)
|
||||
{
|
||||
_output.Write(textFormat, this);
|
||||
_entered = true;
|
||||
}
|
||||
|
||||
if (_info.KlingonCount > 0)
|
||||
{
|
||||
@@ -82,8 +90,6 @@ namespace SuperStarTrek.Space
|
||||
}
|
||||
|
||||
_enterprise.Execute(Command.SRS);
|
||||
|
||||
_displayed = true;
|
||||
}
|
||||
|
||||
internal bool HasObjectAt(Coordinates coordinates) => _sectors.ContainsKey(coordinates);
|
||||
@@ -166,10 +172,10 @@ namespace SuperStarTrek.Space
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<string> GetDisplayLines() => Enumerable.Range(0, 8).Select(x => GetDisplayLine(x));
|
||||
internal IEnumerable<string> GetDisplayLines() => Enumerable.Range(0, 8).Select(x => GetDisplayLine(x));
|
||||
|
||||
private string GetDisplayLine(int x)
|
||||
=> string.Join(
|
||||
private string GetDisplayLine(int x) =>
|
||||
string.Join(
|
||||
" ",
|
||||
Enumerable
|
||||
.Range(0, 8)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
using SuperStarTrek.Objects;
|
||||
|
||||
namespace SuperStarTrek.Space
|
||||
{
|
||||
internal class QuadrantInfo
|
||||
@@ -15,15 +13,18 @@ namespace SuperStarTrek.Space
|
||||
HasStarbase = hasStarbase;
|
||||
}
|
||||
|
||||
public Coordinates Coordinates { get; }
|
||||
public string Name { get; }
|
||||
public int KlingonCount { get; private set; }
|
||||
public bool HasStarbase { get; private set; }
|
||||
public int StarCount { get; }
|
||||
internal Coordinates Coordinates { get; }
|
||||
|
||||
public static QuadrantInfo Create(Coordinates coordinates, string name)
|
||||
internal string Name { get; }
|
||||
|
||||
internal int KlingonCount { get; private set; }
|
||||
|
||||
internal bool HasStarbase { get; private set; }
|
||||
|
||||
internal int StarCount { get; }
|
||||
|
||||
internal static QuadrantInfo Create(Coordinates coordinates, string name, Random random)
|
||||
{
|
||||
var random = new Random();
|
||||
var klingonCount = random.GetFloat() switch
|
||||
{
|
||||
> 0.98f => 3,
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace SuperStarTrek.Systems.ComputerFunctions
|
||||
}
|
||||
|
||||
internal string Description { get; }
|
||||
|
||||
protected Output Output { get; }
|
||||
|
||||
internal abstract void Execute(Quadrant quadrant);
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SuperStarTrek.Objects;
|
||||
using SuperStarTrek.Space;
|
||||
|
||||
@@ -11,8 +8,8 @@ namespace SuperStarTrek.Systems.ComputerFunctions
|
||||
private readonly Enterprise _enterprise;
|
||||
private readonly Input _input;
|
||||
|
||||
public DirectionDistanceCalculator(Enterprise enterprise, Output output, Input input)
|
||||
: base("Starbase nav data", output)
|
||||
internal DirectionDistanceCalculator(Enterprise enterprise, Output output, Input input)
|
||||
: base("Direction/distance calculator", output)
|
||||
{
|
||||
_enterprise = enterprise;
|
||||
_input = input;
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace SuperStarTrek.Systems.ComputerFunctions
|
||||
{
|
||||
internal abstract class GalacticReport : ComputerFunction
|
||||
{
|
||||
public GalacticReport(string description, Output output, Galaxy galaxy)
|
||||
internal GalacticReport(string description, Output output, Galaxy galaxy)
|
||||
: base(description, output)
|
||||
{
|
||||
Galaxy = galaxy;
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace SuperStarTrek.Systems.ComputerFunctions
|
||||
{
|
||||
private readonly Enterprise _enterprise;
|
||||
|
||||
public StarbaseDataCalculator(Enterprise enterprise, Output output)
|
||||
internal StarbaseDataCalculator(Enterprise enterprise, Output output)
|
||||
: base("Starbase nav data", output)
|
||||
{
|
||||
_enterprise = enterprise;
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace SuperStarTrek.Systems.ComputerFunctions
|
||||
private readonly Galaxy _galaxy;
|
||||
private readonly Enterprise _enterprise;
|
||||
|
||||
public StatusReport(Game game, Galaxy galaxy, Enterprise enterprise, Output output)
|
||||
internal StatusReport(Game game, Galaxy galaxy, Enterprise enterprise, Output output)
|
||||
: base("Status report", output)
|
||||
{
|
||||
_game = game;
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace SuperStarTrek.Systems.ComputerFunctions
|
||||
{
|
||||
private readonly Enterprise _enterprise;
|
||||
|
||||
public TorpedoDataCalculator(Enterprise enterprise, Output output)
|
||||
internal TorpedoDataCalculator(Enterprise enterprise, Output output)
|
||||
: base("Photon torpedo data", output)
|
||||
{
|
||||
_enterprise = enterprise;
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace SuperStarTrek.Systems
|
||||
private readonly Enterprise _enterprise;
|
||||
private readonly Output _output;
|
||||
|
||||
public DamageControl(Enterprise enterprise, Output output)
|
||||
internal DamageControl(Enterprise enterprise, Output output)
|
||||
: base("Damage Control", Command.DAM, output)
|
||||
{
|
||||
_enterprise = enterprise;
|
||||
@@ -40,7 +40,7 @@ namespace SuperStarTrek.Systems
|
||||
return CommandResult.Ok;
|
||||
}
|
||||
|
||||
public void WriteDamageReport()
|
||||
internal void WriteDamageReport()
|
||||
{
|
||||
_output.NextLine().WriteLine("Device State of Repair");
|
||||
foreach (var system in _enterprise.Systems)
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace SuperStarTrek.Systems
|
||||
private readonly Input _input;
|
||||
private readonly ComputerFunction[] _functions;
|
||||
|
||||
public LibraryComputer(Output output, Input input, params ComputerFunction[] functions)
|
||||
internal LibraryComputer(Output output, Input input, params ComputerFunction[] functions)
|
||||
: base("Library-Computer", Command.COM, output)
|
||||
{
|
||||
_output = output;
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SuperStarTrek.Commands;
|
||||
using SuperStarTrek.Objects;
|
||||
using SuperStarTrek.Resources;
|
||||
using SuperStarTrek.Space;
|
||||
|
||||
namespace SuperStarTrek.Systems
|
||||
@@ -14,7 +9,7 @@ namespace SuperStarTrek.Systems
|
||||
private readonly Galaxy _galaxy;
|
||||
private readonly Output _output;
|
||||
|
||||
public LongRangeSensors(Galaxy galaxy, Output output)
|
||||
internal LongRangeSensors(Galaxy galaxy, Output output)
|
||||
: base("Long Range Sensors", Command.LRS, output)
|
||||
{
|
||||
_galaxy = galaxy;
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace SuperStarTrek.Systems
|
||||
private readonly Input _input;
|
||||
private readonly Random _random;
|
||||
|
||||
public PhaserControl(Enterprise enterprise, Output output, Input input, Random random)
|
||||
internal PhaserControl(Enterprise enterprise, Output output, Input input, Random random)
|
||||
: base("Phaser Control", Command.PHA, output)
|
||||
{
|
||||
_enterprise = enterprise;
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace SuperStarTrek.Systems
|
||||
private readonly Output _output;
|
||||
private readonly Input _input;
|
||||
|
||||
public PhotonTubes(int tubeCount, Enterprise enterprise, Output output, Input input)
|
||||
internal PhotonTubes(int tubeCount, Enterprise enterprise, Output output, Input input)
|
||||
: base("Photon Tubes", Command.TOR, output)
|
||||
{
|
||||
TorpedoCount = _tubeCount = tubeCount;
|
||||
@@ -20,7 +20,7 @@ namespace SuperStarTrek.Systems
|
||||
_input = input;
|
||||
}
|
||||
|
||||
public int TorpedoCount { get; private set; }
|
||||
internal int TorpedoCount { get; private set; }
|
||||
|
||||
protected override bool CanExecuteCommand() => HasTorpedoes() && IsOperational("{name} are not operational");
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using SuperStarTrek.Commands;
|
||||
using SuperStarTrek.Objects;
|
||||
using SuperStarTrek.Resources;
|
||||
using SuperStarTrek.Space;
|
||||
|
||||
namespace SuperStarTrek.Systems
|
||||
@@ -10,7 +11,7 @@ namespace SuperStarTrek.Systems
|
||||
private readonly Output _output;
|
||||
private readonly Input _input;
|
||||
|
||||
public ShieldControl(Enterprise enterprise, Output output, Input input)
|
||||
internal ShieldControl(Enterprise enterprise, Output output, Input input)
|
||||
: base("Shield Control", Command.SHE, output)
|
||||
{
|
||||
_enterprise = enterprise;
|
||||
@@ -18,7 +19,7 @@ namespace SuperStarTrek.Systems
|
||||
_input = input;
|
||||
}
|
||||
|
||||
public float ShieldEnergy { get; set; }
|
||||
internal float ShieldEnergy { get; set; }
|
||||
|
||||
protected override bool CanExecuteCommand() => IsOperational("{name} inoperable");
|
||||
|
||||
@@ -30,6 +31,7 @@ namespace SuperStarTrek.Systems
|
||||
if (Validate(requested))
|
||||
{
|
||||
ShieldEnergy = requested;
|
||||
_output.Write(Strings.ShieldsSet, requested);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace SuperStarTrek.Systems
|
||||
private readonly Game _game;
|
||||
private readonly Output _output;
|
||||
|
||||
public ShortRangeSensors(Enterprise enterprise, Galaxy galaxy, Game game, Output output)
|
||||
internal ShortRangeSensors(Enterprise enterprise, Galaxy galaxy, Game game, Output output)
|
||||
: base("Short Range Sensors", Command.SRS, output)
|
||||
{
|
||||
_enterprise = enterprise;
|
||||
@@ -47,7 +47,7 @@ namespace SuperStarTrek.Systems
|
||||
return CommandResult.Ok;
|
||||
}
|
||||
|
||||
public IEnumerable<string> GetStatusLines()
|
||||
internal IEnumerable<string> GetStatusLines()
|
||||
{
|
||||
yield return $"Stardate {_game.Stardate}";
|
||||
yield return $"Condition {_enterprise.Condition}";
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
using System;
|
||||
using SuperStarTrek.Commands;
|
||||
using SuperStarTrek.Space;
|
||||
|
||||
@@ -16,10 +15,13 @@ namespace SuperStarTrek.Systems
|
||||
_output = output;
|
||||
}
|
||||
|
||||
public string Name { get; }
|
||||
public float Condition { get; private set; }
|
||||
public bool IsDamaged => Condition < 0;
|
||||
public Command Command { get; }
|
||||
internal string Name { get; }
|
||||
|
||||
internal float Condition { get; private set; }
|
||||
|
||||
internal bool IsDamaged => Condition < 0;
|
||||
|
||||
internal Command Command { get; }
|
||||
|
||||
protected virtual bool CanExecuteCommand() => true;
|
||||
|
||||
@@ -34,12 +36,12 @@ namespace SuperStarTrek.Systems
|
||||
return true;
|
||||
}
|
||||
|
||||
public CommandResult ExecuteCommand(Quadrant quadrant)
|
||||
internal CommandResult ExecuteCommand(Quadrant quadrant)
|
||||
=> CanExecuteCommand() ? ExecuteCommandCore(quadrant) : CommandResult.Ok;
|
||||
|
||||
protected abstract CommandResult ExecuteCommandCore(Quadrant quadrant);
|
||||
|
||||
public virtual void Repair()
|
||||
internal virtual void Repair()
|
||||
{
|
||||
if (IsDamaged)
|
||||
{
|
||||
@@ -47,7 +49,7 @@ namespace SuperStarTrek.Systems
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool Repair(float repairWorkDone)
|
||||
internal virtual bool Repair(float repairWorkDone)
|
||||
{
|
||||
if (IsDamaged)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using SuperStarTrek.Commands;
|
||||
using SuperStarTrek.Objects;
|
||||
using SuperStarTrek.Resources;
|
||||
using SuperStarTrek.Space;
|
||||
|
||||
namespace SuperStarTrek.Systems
|
||||
@@ -11,7 +12,7 @@ namespace SuperStarTrek.Systems
|
||||
private readonly Output _output;
|
||||
private readonly Input _input;
|
||||
|
||||
public WarpEngines(Enterprise enterprise, Output output, Input input)
|
||||
internal WarpEngines(Enterprise enterprise, Output output, Input input)
|
||||
: base("Warp Engines", Command.NAV, output)
|
||||
{
|
||||
_enterprise = enterprise;
|
||||
@@ -39,6 +40,8 @@ namespace SuperStarTrek.Systems
|
||||
_enterprise.PhotonTubes.ReplenishTorpedoes();
|
||||
}
|
||||
|
||||
_enterprise.Quadrant.Display(Strings.NowEntering);
|
||||
|
||||
return CommandResult.Elapsed(timeElapsed);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,13 +14,13 @@ namespace SuperStarTrek.Utils
|
||||
_fromY = fromY;
|
||||
}
|
||||
|
||||
public static DirectionAndDistance From(Coordinates coordinates) => From(coordinates.X, coordinates.Y);
|
||||
internal static DirectionAndDistance From(Coordinates coordinates) => From(coordinates.X, coordinates.Y);
|
||||
|
||||
public static DirectionAndDistance From(float x, float y) => new DirectionAndDistance(x, y);
|
||||
internal static DirectionAndDistance From(float x, float y) => new DirectionAndDistance(x, y);
|
||||
|
||||
public (float Direction, float Distance) To(Coordinates coordinates) => To(coordinates.X, coordinates.Y);
|
||||
internal (float Direction, float Distance) To(Coordinates coordinates) => To(coordinates.X, coordinates.Y);
|
||||
|
||||
public (float Direction, float Distance) To(float x, float y)
|
||||
internal (float Direction, float Distance) To(float x, float y)
|
||||
{
|
||||
var deltaX = x - _fromX;
|
||||
var deltaY = y - _fromY;
|
||||
@@ -45,7 +45,7 @@ namespace SuperStarTrek.Utils
|
||||
// 8430 PRINT"DIRECTION =";C1+(((ABS(X)-ABS(A))+ABS(X))/ABS(X)):GOTO8460
|
||||
// 8450 PRINT"DIRECTION =";C1+(ABS(X)/ABS(A))
|
||||
// 8460 PRINT"DISTANCE =";SQR(X^2+A^2):IFH8=1THEN1990
|
||||
private float GetDirection(float deltaX, float deltaY)
|
||||
private static float GetDirection(float deltaX, float deltaY)
|
||||
{
|
||||
var deltaXDominant = Math.Abs(deltaX) > Math.Abs(deltaY);
|
||||
var fractionalPart = deltaXDominant ? deltaY / deltaX : -deltaX / deltaY;
|
||||
@@ -59,7 +59,7 @@ namespace SuperStarTrek.Utils
|
||||
return direction < 1 ? direction + 8 : direction;
|
||||
}
|
||||
|
||||
private float GetDistance(float deltaX, float deltaY) =>
|
||||
private static float GetDistance(float deltaX, float deltaY) =>
|
||||
(float)Math.Sqrt(Math.Pow(deltaX, 2) + Math.Pow(deltaY, 2));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user