Merge pull request #2 from coding-horror/main

Merge changes from coding-horror/main
This commit is contained in:
Peter Ruderman
2021-04-25 09:55:44 -04:00
committed by GitHub
61 changed files with 2650 additions and 201 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
*/.vs
*/csharp/bin
*/csharp/obj
bin/
obj/
.idea
*.iws
+1
View File
@@ -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
+224
View File
@@ -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
+167
View File
@@ -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
+55
View File
@@ -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); }
}
+175
View File
@@ -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
+5
View File
@@ -0,0 +1,5 @@
.vs
TestResults
bin
obj
+31
View File
@@ -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
+8
View File
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
</Project>
+73
View File
@@ -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;
}
}
}
+23
View File
@@ -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);
}
}
+51
View File
@@ -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);
}
}
}
+186
View File
@@ -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
+52
View File
@@ -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;
}
+245
View File
@@ -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");
}
}
+266
View File
@@ -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
+81
View File
@@ -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;
+81
View File
@@ -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;
+242
View File
@@ -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
+34
View File
@@ -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
+94
View File
@@ -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}.");
}
}
}
+31
View File
@@ -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();
}
}
}
+30
View File
@@ -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();
}
}
}
+8
View File
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>
+10 -13
View File
@@ -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()
{
+12 -12
View File
@@ -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
+33 -32
View File
@@ -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() => "<*>";
+5 -4
View File
@@ -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)
+5 -5
View File
@@ -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;
+5 -2
View File
@@ -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();
+6 -6
View File
@@ -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.'
+50 -28
View File
@@ -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; }
+4 -3
View File
@@ -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
+9 -12
View File
@@ -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));
+22 -16
View File
@@ -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}";
+10 -8
View File
@@ -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));
}
}