From fbe47d4c2b0a734be3fd7bd120536e46cc455655 Mon Sep 17 00:00:00 2001
From: Darren Cardenas <53984972+darrencardenas@users.noreply.github.com>
Date: Sun, 18 Apr 2021 15:43:04 -0400
Subject: [PATCH] Ported Banner to Java.
---
06 Banner/java/Banner.java | 224 +++++++++++++++++++++++++++++++++++++
1 file changed, 224 insertions(+)
create mode 100644 06 Banner/java/Banner.java
diff --git a/06 Banner/java/Banner.java b/06 Banner/java/Banner.java
new file mode 100644
index 00000000..8c4e1c61
--- /dev/null
+++ b/06 Banner/java/Banner.java
@@ -0,0 +1,224 @@
+import java.util.Scanner;
+import java.util.HashMap;
+import java.util.Map;
+import java.lang.Math;
+
+/**
+ * Game of Banner
+ *
+ * Based on the BASIC game of Banner here
+ * https://github.com/coding-horror/basic-computer-games/blob/main/06%20Banner/banner.bas
+ *
+ * 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 symbolData = new HashMap();
+ 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