From e1871a1df90591863aa46e5dd66e598ea485e019 Mon Sep 17 00:00:00 2001 From: Paul Holt Date: Thu, 6 Jan 2022 01:59:09 +1100 Subject: [PATCH 1/9] initial jvm gradle build scripts. --- .../build/kotlin/build53Kingkotlinjar-classes.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 buildJvm/build_53_King_kotlin/build/kotlin/build53Kingkotlinjar-classes.txt diff --git a/buildJvm/build_53_King_kotlin/build/kotlin/build53Kingkotlinjar-classes.txt b/buildJvm/build_53_King_kotlin/build/kotlin/build53Kingkotlinjar-classes.txt new file mode 100644 index 00000000..1bd92f25 --- /dev/null +++ b/buildJvm/build_53_King_kotlin/build/kotlin/build53Kingkotlinjar-classes.txt @@ -0,0 +1 @@ +/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/DataEntryValidationException.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/EndOfInputException.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/GameState.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$1.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$2.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$3.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$4.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$5.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$AntiImmigrationRevolution.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$ContinueNextYear.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$ExtremeMismanagement.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$StarvationWithFullTreasury.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$TooManyPeopleDead.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$Win.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome.class \ No newline at end of file From d9cac10ed59c3161943b5d7eb9b5d0fad0c5a7e0 Mon Sep 17 00:00:00 2001 From: Paul Holt Date: Thu, 6 Jan 2022 02:01:18 +1100 Subject: [PATCH 2/9] change King package --- 53_King/kotlin/King.kt | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/53_King/kotlin/King.kt b/53_King/kotlin/King.kt index 71e6d505..169cd6a0 100644 --- a/53_King/kotlin/King.kt +++ b/53_King/kotlin/King.kt @@ -1,3 +1,5 @@ +package king53 + import kotlin.math.abs import kotlin.random.Random import kotlin.system.exitProcess @@ -22,6 +24,7 @@ fun main() { with(gameState) { do { + recalculateLandCost() displayStatus() inputLandSale() @@ -84,6 +87,7 @@ fun loadOldGame(): GameState = GameState().apply { println(" COME ON, YOUR TERM IN OFFICE IS ONLY $yearsRequired YEARS.") retry = true } + } while (retry) print("HOW MUCH DID YOU HAVE IN THE TREASURY? ") @@ -115,6 +119,10 @@ fun loadOldGame(): GameState = GameState().apply { */ sealed class YearOutcome { + /** + * Display output for the end of the year, for each different possible + * year outcome. + */ open fun displayConsequences() { // Default display nothing } @@ -132,7 +140,7 @@ sealed class YearOutcome { object ContinueNextYear : YearOutcome() - class Win(val yearsRequired: Int) : YearOutcome() { + class Win(private val yearsRequired: Int) : YearOutcome() { override fun displayConsequences() { // The misspelling of "successfully" is in the original code. println( @@ -229,12 +237,18 @@ sealed class YearOutcome { * Record data, allow data input, and process the simulation for the game. */ class GameState(val yearsRequired: Int = 8) { + /** * The current year. Years start with zero, but we never * output the current year. */ var currentYear = 0 + /** + * Keep track of each year's crop loss, so we can report increases. + */ + private var lastYearsCropLoss: Int = 0 + /** * Number of countrymen who have died of either pollution * or starvation this year. @@ -535,11 +549,12 @@ class GameState(val yearsRequired: Int = 8) { the population, but does not affect crop losses. */ var cropLoss = ((2000 - landArea) * (rnd + 1.5) / 2.0).toInt() - val cropLossWorse = false if (foreignWorkers > 0) print("OF $plantingArea SQ. MILES PLANTED,") if (plantingArea <= cropLoss) cropLoss = plantingArea + val cropLossWorse = cropLoss > lastYearsCropLoss + lastYearsCropLoss = cropLoss println(" YOU HARVESTED ${plantingArea - cropLoss} SQ. MILES OF CROPS.") if (cropLoss > 0) { From f4a71b965b5f0e661d00aade832aa86963a8cd5a Mon Sep 17 00:00:00 2001 From: Paul Holt Date: Thu, 6 Jan 2022 02:02:29 +1100 Subject: [PATCH 3/9] remove build artifacts accidentally added --- .../build/kotlin/build53Kingkotlinjar-classes.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 buildJvm/build_53_King_kotlin/build/kotlin/build53Kingkotlinjar-classes.txt diff --git a/buildJvm/build_53_King_kotlin/build/kotlin/build53Kingkotlinjar-classes.txt b/buildJvm/build_53_King_kotlin/build/kotlin/build53Kingkotlinjar-classes.txt deleted file mode 100644 index 1bd92f25..00000000 --- a/buildJvm/build_53_King_kotlin/build/kotlin/build53Kingkotlinjar-classes.txt +++ /dev/null @@ -1 +0,0 @@ -/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/DataEntryValidationException.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/EndOfInputException.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/GameState.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$1.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$2.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$3.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$4.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt$loadOldGame$1$5.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/KingKt.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$AntiImmigrationRevolution.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$ContinueNextYear.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$ExtremeMismanagement.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$StarvationWithFullTreasury.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$TooManyPeopleDead.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome$Win.class:/home/paul/Projects/basic-computer-games/buildJvm/build_53_King_kotlin/build/classes/kotlin/main/king53/YearOutcome.class \ No newline at end of file From b473fffc4a3720d78c79abc1d1763c85321f2328 Mon Sep 17 00:00:00 2001 From: Paul Holt Date: Sat, 8 Jan 2022 00:44:18 +1100 Subject: [PATCH 4/9] formatted version of battle.bas --- 09_Battle/battle_formatted.bas | 223 +++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 09_Battle/battle_formatted.bas diff --git a/09_Battle/battle_formatted.bas b/09_Battle/battle_formatted.bas new file mode 100644 index 00000000..9c292bd9 --- /dev/null +++ b/09_Battle/battle_formatted.bas @@ -0,0 +1,223 @@ +5 PRINT TAB(33);"BATTLE" +7 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +10 REM -- BATTLE WRITTEN BY RAY WESTERGARD 10/70 +20 REM COPYRIGHT 1971 BY THE REGENTS OF THE UNIV. OF CALIF. +30 REM PRODUCED AT THE LAWRENCE HALL OF SCIENCE, BERKELEY +40 DIM PLAYFIELD(6,6),HITS(6,6),ROW(4),COLUMN(4),SHIP_HITS(6),LOSSES(3) + +50 FOR X=1 TO 6 + 51 FOR Y=1 TO 6 + 52 PLAYFIELD(X,Y)=0 + 53 NEXT Y +54 NEXT X + +60 FOR I=1 TO 3 + 70 N=4-I + 80 FOR J=1 TO 2 + + 90 A=INT(6*RND(1)+1) + 100 B=INT(6*RND(1)+1) + 110 D=INT(4*RND(1)+1) + + 120 IF PLAYFIELD(A,B)>0 THEN 90 + 130 M=0 + 140 ON D GOTO 150,340,550,740 + + 150 COLUMN(1)=B + 160 COLUMN(2)=7:COLUMN(3)=7 + 170 FOR K=1 TO N + 180 IF M>1 THEN 240 + 190 IF COLUMN(K)=6 THEN 230 + 200 IF PLAYFIELD(A,COLUMN(K)+1)>0 THEN 230 + 210 COLUMN(K+1)=COLUMN(K)+1 + 220 GOTO 280 + 230 M=2 + 240 IF COLUMN(1)0 THEN 90 + 270 COLUMN(K+1)=Z-1 + 280 NEXT K + 290 PLAYFIELD(A,B)=9-2*I-J + 300 FOR K=1 TO N + 310 PLAYFIELD(A,COLUMN(K+1))=PLAYFIELD(A,B) + 320 NEXT K + 330 GOTO 990 + + 340 ROW(1)=A + 350 COLUMN(1)=B + 360 ROW(2)=0:ROW(3)=0:COLUMN(2)=0:COLUMN(3)=0 + 370 FOR K=1 TO N + 380 IF M>1 THEN 460 + 390 IF ROW(K)=1 OR COLUMN(K)=1 THEN 450 + 400 IF PLAYFIELD(ROW(K)-1,COLUMN(K)-1)>0 THEN 450 + 410 IF PLAYFIELD(ROW(K)-1,COLUMN(K))>0 AND PLAYFIELD(ROW(K)-1,COLUMN(K))=PLAYFIELD(ROW(K),COLUMN(K)-1) THEN 450 + 420 ROW(K+1)=ROW(K)-1 + 430 COLUMN(K+1)=COLUMN(K)-1 + 440 GOTO 530 + 450 M=2 + 460 IF ROW(1)>ROW(2) AND ROW(1)>ROW(3) THEN Z1=ROW(1) + 462 IF ROW(2)>ROW(1) AND ROW(2)>ROW(3) THEN Z1=ROW(2) + 464 IF ROW(3)>ROW(1) AND ROW(3)>ROW(2) THEN Z1=ROW(3) + 470 IF COLUMN(1)>COLUMN(2) AND COLUMN(1)>COLUMN(3) THEN Z2=COLUMN(1) + 474 IF COLUMN(2)>COLUMN(1) AND COLUMN(2)>COLUMN(3) THEN Z2=COLUMN(2) + 476 IF COLUMN(3)>COLUMN(1) AND COLUMN(3)>COLUMN(2) THEN Z2=COLUMN(3) + + 480 IF Z1=6 OR Z2=6 THEN 90 + 490 IF PLAYFIELD(Z1+1,Z2+1)>0 THEN 90 + 500 IF PLAYFIELD(Z1,Z2+1)>0 AND PLAYFIELD(Z1,Z2+1)=PLAYFIELD(Z1+1,Z2) THEN 90 + + 510 ROW(K+1)=Z1+1 + 520 COLUMN(K+1)=Z2+1 + 530 NEXT K + 540 GOTO 950 + + 550 ROW(1)=A + 560 ROW(2)=7:ROW(3)=7 + 570 FOR K=1 TO N + 580 IF M>1 THEN 640 + 590 IF ROW(K)=6 THEN 630 + 600 IF PLAYFIELD(ROW(K)+1,B)>0 THEN 630 + 610 ROW(K+1)=ROW(K)+1 + 620 GOTO 680 + 630 M=2 + 640 IF ROW(1)0 THEN 90 + + 670 ROW(K+1)=Z-1 + 680 NEXT K + 690 PLAYFIELD(A,B)=9-2*I-J + 700 FOR K=1 TO N + 710 PLAYFIELD(ROW(K+1),B)=PLAYFIELD(A,B) + 720 NEXT K + 730 GOTO 990 + + 740 ROW(1)=A + 750 COLUMN(1)=B + 760 ROW(2)=7:ROW(3)=7 + 770 COLUMN(2)=0:COLUMN(3)=0 + 780 FOR K=1 TO N + 790 IF M>1 THEN 870 + 800 IF ROW(K)=6 OR COLUMN(K)=1 THEN 860 + 810 IF PLAYFIELD(ROW(K)+1,COLUMN(K)-1)>0 THEN 860 + 820 IF PLAYFIELD(ROW(K)+1,COLUMN(K))>0 AND PLAYFIELD(ROW(K)+1,COLUMN(K))=PLAYFIELD(ROW(K),COLUMN(K)-1) THEN 860 + 830 ROW(K+1)=ROW(K)+1 + 840 COLUMN(K+1)=COLUMN(K)-1 + 850 GOTO 940 + 860 M=2 + 870 IF ROW(1)COLUMN(2) AND COLUMN(1)>COLUMN(3) THEN Z2=COLUMN(1) + 882 IF COLUMN(2)>COLUMN(1) AND COLUMN(2)>COLUMN(3) THEN Z2=COLUMN(2) + 884 IF COLUMN(3)>COLUMN(1) AND COLUMN(3)>COLUMN(2) THEN Z2=COLUMN(3) + + 890 IF Z1=1 OR Z2=6 THEN 90 + 900 IF PLAYFIELD(Z1-1,Z2+1)>0 THEN 90 + 910 IF PLAYFIELD(Z1,Z2+1)>0 AND PLAYFIELD(Z1,Z2+1)=PLAYFIELD(Z1-1,Z2) THEN 90 + + 920 ROW(K+1)=Z1-1 + 930 COLUMN(K+1)=Z2+1 + 940 NEXT K + + 950 PLAYFIELD(A,B)=9-2*I-J + 960 FOR K=1 TO N + 970 PLAYFIELD(ROW(K+1),COLUMN(K+1))=PLAYFIELD(A,B) + 980 NEXT K + + 990 NEXT J +1000 NEXT I + +1010 PRINT +1020 PRINT "THE FOLLOWING CODE OF THE BAD GUYS' FLEET DISPOSITION" +1030 PRINT "HAS BEEN CAPTURED BUT NOT DECODED:" +1040 PRINT +1050 FOR I=1 TO 6 + 1051 FOR J=1 TO 6 + 1052 HITS(I,J)=PLAYFIELD(J,I) + 1053 NEXT J +1054 NEXT I +1060 FOR I=1 TO 6 + 1061 FOR J=1 TO 6 + 1062 PRINT HITS(I,J); + 1063 NEXT J + 1064 PRINT +1065 NEXT I +1070 PRINT +1080 PRINT "DE-CODE IT AND USE IT IF YOU CAN" +1090 PRINT "BUT KEEP THE DE-CODING METHOD A SECRET." +1100 PRINT +1110 FOR I=1 TO 6 + 1111 FOR J=1 TO 6 + 1112 HITS(I,J)=0 + 1113 NEXT J +1114 NEXT I +1120 FOR I=1 TO 3 + 1121 LOSSES(I)=0 +1122 NEXT I + +1130 SHIP_HITS(1)=2:SHIP_HITS(2)=2 +1140 SHIP_HITS(3)=1:SHIP_HITS(4)=1 +1150 SHIP_HITS(5)=0:SHIP_HITS(6)=0 +1160 S=0:HITS=0 + +1170 PRINT "START GAME" + +1180 INPUT X,Y +1190 IF X<1 OR X>6 OR INT(X)<>ABS(X) THEN 1210 +1200 IF Y>0 AND Y<7 AND INT(Y)=ABS(Y) THEN 1230 +1210 PRINT "INVALID INPUT. TRY AGAIN." +1220 GOTO 1180 + +1230 R=7-Y +1240 C=X +1250 IF PLAYFIELD(R,C)>0 THEN 1290 +1260 S=S+1 +1270 PRINT "SPLASH! TRY AGAIN." +1280 GOTO 1180 + +1290 IF SHIP_HITS(PLAYFIELD(R,C))<4 THEN 1340 +1300 PRINT "THERE USED TO BE A SHIP AT THAT POINT, BUT YOU SUNK IT." +1310 PRINT "SPLASH! TRY AGAIN." +1320 S=S+1 +1330 GOTO 1180 + +1340 IF HITS(R,C)>0 THEN 1420 +1350 HITS=HITS+1 +1360 HITS(R,C)=PLAYFIELD(R,C) +1370 PRINT "A DIRECT HIT ON SHIP NUMBER";PLAYFIELD(R,C) +1380 SHIP_HITS(PLAYFIELD(R,C))=SHIP_HITS(PLAYFIELD(R,C))+1 +1390 IF SHIP_HITS(PLAYFIELD(R,C))>=4 THEN 1470 +1400 PRINT "TRY AGAIN." +1410 GOTO 1180 + +1420 PRINT "YOU ALREADY PUT A HOLE IN SHIP NUMBER";PLAYFIELD(R,C); +1430 PRINT "AT THAT POINT." +1440 PRINT "SPLASH! TRY AGAIN." +1450 S=S+1 +1460 GOTO 1180 + +1470 LOSSES((INT(PLAYFIELD(R,C)-1)/2)+1)=LOSSES((INT(PLAYFIELD(R,C)-1)/2)+1)+1 + +1480 PRINT "AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS." +1490 PRINT "SO FAR, THE BAD GUYS HAVE LOST" +1500 PRINT LOSSES(1);"DESTROYER(S),";LOSSES(2);"CRUISER(S), AND"; +1510 PRINT LOSSES(3);"AIRCRAFT CARRIER(S)." +1520 PRINT "YOUR CURRENT SPLASH/HIT RATIO IS";S/HITS +1530 IF (LOSSES(1)+LOSSES(2)+LOSSES(3))<6 THEN 1180 + +1540 PRINT +1550 PRINT "YOU HAVE TOTALLY WIPED OUT THE BAD GUYS' FLEET" +1560 PRINT "WITH A FINAL SPLASH/HIT RATIO OF";S/HITS +1570 IF S/HITS>0 THEN 1590 +1580 PRINT "CONGRATULATIONS -- A DIRECT HIT EVERY TIME." +1590 PRINT +1600 PRINT "****************************" +1610 PRINT +1620 GOTO 50 +1630 END From d7b8976a20e5243f776efdf730790e204dbe3713 Mon Sep 17 00:00:00 2001 From: Paul Holt Date: Sat, 8 Jan 2022 01:45:49 +1100 Subject: [PATCH 5/9] All games now have the correct gameMain defined in gradle.properties --- 89_Tic-Tac-Toe/java/src/{TicTacToe2.java => TicTacToe.java} | 2 +- 89_Tic-Tac-Toe/kotlin/{TicTacToe2.kt => TicTacToe.kt} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename 89_Tic-Tac-Toe/java/src/{TicTacToe2.java => TicTacToe.java} (99%) rename 89_Tic-Tac-Toe/kotlin/{TicTacToe2.kt => TicTacToe.kt} (100%) diff --git a/89_Tic-Tac-Toe/java/src/TicTacToe2.java b/89_Tic-Tac-Toe/java/src/TicTacToe.java similarity index 99% rename from 89_Tic-Tac-Toe/java/src/TicTacToe2.java rename to 89_Tic-Tac-Toe/java/src/TicTacToe.java index bda3793c..c8fa2d03 100644 --- a/89_Tic-Tac-Toe/java/src/TicTacToe2.java +++ b/89_Tic-Tac-Toe/java/src/TicTacToe.java @@ -4,7 +4,7 @@ import java.util.Random; /** * @author Ollie Hensman-Crook */ -public class TicTacToe2 { +public class TicTacToe { public static void main(String[] args) { Board gameBoard = new Board(); Random compChoice = new Random(); diff --git a/89_Tic-Tac-Toe/kotlin/TicTacToe2.kt b/89_Tic-Tac-Toe/kotlin/TicTacToe.kt similarity index 100% rename from 89_Tic-Tac-Toe/kotlin/TicTacToe2.kt rename to 89_Tic-Tac-Toe/kotlin/TicTacToe.kt From a1bc1b4fd9841cad7c2ebbb4c74e184ddd263e20 Mon Sep 17 00:00:00 2001 From: Paul Holt Date: Sat, 8 Jan 2022 01:57:12 +1100 Subject: [PATCH 6/9] oops revert renaming TicTacToe2 --- 89_Tic-Tac-Toe/java/src/{TicTacToe.java => TicTacToe2.java} | 2 +- 89_Tic-Tac-Toe/kotlin/{TicTacToe.kt => TicTacToe2.kt} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename 89_Tic-Tac-Toe/java/src/{TicTacToe.java => TicTacToe2.java} (99%) rename 89_Tic-Tac-Toe/kotlin/{TicTacToe.kt => TicTacToe2.kt} (100%) diff --git a/89_Tic-Tac-Toe/java/src/TicTacToe.java b/89_Tic-Tac-Toe/java/src/TicTacToe2.java similarity index 99% rename from 89_Tic-Tac-Toe/java/src/TicTacToe.java rename to 89_Tic-Tac-Toe/java/src/TicTacToe2.java index c8fa2d03..bda3793c 100644 --- a/89_Tic-Tac-Toe/java/src/TicTacToe.java +++ b/89_Tic-Tac-Toe/java/src/TicTacToe2.java @@ -4,7 +4,7 @@ import java.util.Random; /** * @author Ollie Hensman-Crook */ -public class TicTacToe { +public class TicTacToe2 { public static void main(String[] args) { Board gameBoard = new Board(); Random compChoice = new Random(); diff --git a/89_Tic-Tac-Toe/kotlin/TicTacToe.kt b/89_Tic-Tac-Toe/kotlin/TicTacToe2.kt similarity index 100% rename from 89_Tic-Tac-Toe/kotlin/TicTacToe.kt rename to 89_Tic-Tac-Toe/kotlin/TicTacToe2.kt From a7f05d150183fb35e890b3d53aa70381e873e9d2 Mon Sep 17 00:00:00 2001 From: Paul Holt Date: Sat, 8 Jan 2022 02:15:40 +1100 Subject: [PATCH 7/9] README.md --- buildJvm/README.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 buildJvm/README.md diff --git a/buildJvm/README.md b/buildJvm/README.md new file mode 100644 index 00000000..f0046ab3 --- /dev/null +++ b/buildJvm/README.md @@ -0,0 +1,63 @@ +# JVM gradle scripts + +## Quickstart + +Build all the games: + + cd buildJvm + ./gradlew -q assemble installDist distributeBin distributeLib + +Then, run a game + +### Mac or linux: + + build/distrib/bin/build_53_King_kotlin + +### Windows +[not tested yet] + + build\distrib\bin\build_53_King_kotlin.bat + +You will need to install openjdk 17, because some games use advanced Java features. +We should be using version 17 anyway, because anything less than 17 is deprecated. + +--- +## Adding a new game + +These are build scripts for all JVM games contributed so far. +New games can be added by: +- Creating a `build_NUMBER_NAME_[java/kotlin]` directory +- Adding a `build.gradle` file to that directory. +All `build.gradle` files under `build_NUMBER_*` should be nearly identical, unless +there is some special requirement. +- Adding a `gradle.properties` file to that directory, defining the source +directory for the java or kotlin file, and the class that contains the `main` method. + +The `build.gradle` file will normally be identical to this: + + plugins { + id 'application' + } + + sourceSets { + main { + java { + srcDirs "../../$gameSource" + } + } + } + + repositories { + mavenCentral() + } + + application { + mainClass = gameMain + } + +And the `gradle.properties` file should look like this: + + gameSource=91_Train/java/src + gameMain=Train + +where `gameSource` is the root of the source code directory, and `gameMain` is the main class. From 9f1b12d61cb883247efc021659778c9921b07527 Mon Sep 17 00:00:00 2001 From: Paul Holt Date: Sat, 8 Jan 2022 02:26:18 +1100 Subject: [PATCH 8/9] Delete old and experimental code --- 09_Battle/battle_formatted.bas | 223 --------------------------------- 1 file changed, 223 deletions(-) delete mode 100644 09_Battle/battle_formatted.bas diff --git a/09_Battle/battle_formatted.bas b/09_Battle/battle_formatted.bas deleted file mode 100644 index 9c292bd9..00000000 --- a/09_Battle/battle_formatted.bas +++ /dev/null @@ -1,223 +0,0 @@ -5 PRINT TAB(33);"BATTLE" -7 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" -10 REM -- BATTLE WRITTEN BY RAY WESTERGARD 10/70 -20 REM COPYRIGHT 1971 BY THE REGENTS OF THE UNIV. OF CALIF. -30 REM PRODUCED AT THE LAWRENCE HALL OF SCIENCE, BERKELEY -40 DIM PLAYFIELD(6,6),HITS(6,6),ROW(4),COLUMN(4),SHIP_HITS(6),LOSSES(3) - -50 FOR X=1 TO 6 - 51 FOR Y=1 TO 6 - 52 PLAYFIELD(X,Y)=0 - 53 NEXT Y -54 NEXT X - -60 FOR I=1 TO 3 - 70 N=4-I - 80 FOR J=1 TO 2 - - 90 A=INT(6*RND(1)+1) - 100 B=INT(6*RND(1)+1) - 110 D=INT(4*RND(1)+1) - - 120 IF PLAYFIELD(A,B)>0 THEN 90 - 130 M=0 - 140 ON D GOTO 150,340,550,740 - - 150 COLUMN(1)=B - 160 COLUMN(2)=7:COLUMN(3)=7 - 170 FOR K=1 TO N - 180 IF M>1 THEN 240 - 190 IF COLUMN(K)=6 THEN 230 - 200 IF PLAYFIELD(A,COLUMN(K)+1)>0 THEN 230 - 210 COLUMN(K+1)=COLUMN(K)+1 - 220 GOTO 280 - 230 M=2 - 240 IF COLUMN(1)0 THEN 90 - 270 COLUMN(K+1)=Z-1 - 280 NEXT K - 290 PLAYFIELD(A,B)=9-2*I-J - 300 FOR K=1 TO N - 310 PLAYFIELD(A,COLUMN(K+1))=PLAYFIELD(A,B) - 320 NEXT K - 330 GOTO 990 - - 340 ROW(1)=A - 350 COLUMN(1)=B - 360 ROW(2)=0:ROW(3)=0:COLUMN(2)=0:COLUMN(3)=0 - 370 FOR K=1 TO N - 380 IF M>1 THEN 460 - 390 IF ROW(K)=1 OR COLUMN(K)=1 THEN 450 - 400 IF PLAYFIELD(ROW(K)-1,COLUMN(K)-1)>0 THEN 450 - 410 IF PLAYFIELD(ROW(K)-1,COLUMN(K))>0 AND PLAYFIELD(ROW(K)-1,COLUMN(K))=PLAYFIELD(ROW(K),COLUMN(K)-1) THEN 450 - 420 ROW(K+1)=ROW(K)-1 - 430 COLUMN(K+1)=COLUMN(K)-1 - 440 GOTO 530 - 450 M=2 - 460 IF ROW(1)>ROW(2) AND ROW(1)>ROW(3) THEN Z1=ROW(1) - 462 IF ROW(2)>ROW(1) AND ROW(2)>ROW(3) THEN Z1=ROW(2) - 464 IF ROW(3)>ROW(1) AND ROW(3)>ROW(2) THEN Z1=ROW(3) - 470 IF COLUMN(1)>COLUMN(2) AND COLUMN(1)>COLUMN(3) THEN Z2=COLUMN(1) - 474 IF COLUMN(2)>COLUMN(1) AND COLUMN(2)>COLUMN(3) THEN Z2=COLUMN(2) - 476 IF COLUMN(3)>COLUMN(1) AND COLUMN(3)>COLUMN(2) THEN Z2=COLUMN(3) - - 480 IF Z1=6 OR Z2=6 THEN 90 - 490 IF PLAYFIELD(Z1+1,Z2+1)>0 THEN 90 - 500 IF PLAYFIELD(Z1,Z2+1)>0 AND PLAYFIELD(Z1,Z2+1)=PLAYFIELD(Z1+1,Z2) THEN 90 - - 510 ROW(K+1)=Z1+1 - 520 COLUMN(K+1)=Z2+1 - 530 NEXT K - 540 GOTO 950 - - 550 ROW(1)=A - 560 ROW(2)=7:ROW(3)=7 - 570 FOR K=1 TO N - 580 IF M>1 THEN 640 - 590 IF ROW(K)=6 THEN 630 - 600 IF PLAYFIELD(ROW(K)+1,B)>0 THEN 630 - 610 ROW(K+1)=ROW(K)+1 - 620 GOTO 680 - 630 M=2 - 640 IF ROW(1)0 THEN 90 - - 670 ROW(K+1)=Z-1 - 680 NEXT K - 690 PLAYFIELD(A,B)=9-2*I-J - 700 FOR K=1 TO N - 710 PLAYFIELD(ROW(K+1),B)=PLAYFIELD(A,B) - 720 NEXT K - 730 GOTO 990 - - 740 ROW(1)=A - 750 COLUMN(1)=B - 760 ROW(2)=7:ROW(3)=7 - 770 COLUMN(2)=0:COLUMN(3)=0 - 780 FOR K=1 TO N - 790 IF M>1 THEN 870 - 800 IF ROW(K)=6 OR COLUMN(K)=1 THEN 860 - 810 IF PLAYFIELD(ROW(K)+1,COLUMN(K)-1)>0 THEN 860 - 820 IF PLAYFIELD(ROW(K)+1,COLUMN(K))>0 AND PLAYFIELD(ROW(K)+1,COLUMN(K))=PLAYFIELD(ROW(K),COLUMN(K)-1) THEN 860 - 830 ROW(K+1)=ROW(K)+1 - 840 COLUMN(K+1)=COLUMN(K)-1 - 850 GOTO 940 - 860 M=2 - 870 IF ROW(1)COLUMN(2) AND COLUMN(1)>COLUMN(3) THEN Z2=COLUMN(1) - 882 IF COLUMN(2)>COLUMN(1) AND COLUMN(2)>COLUMN(3) THEN Z2=COLUMN(2) - 884 IF COLUMN(3)>COLUMN(1) AND COLUMN(3)>COLUMN(2) THEN Z2=COLUMN(3) - - 890 IF Z1=1 OR Z2=6 THEN 90 - 900 IF PLAYFIELD(Z1-1,Z2+1)>0 THEN 90 - 910 IF PLAYFIELD(Z1,Z2+1)>0 AND PLAYFIELD(Z1,Z2+1)=PLAYFIELD(Z1-1,Z2) THEN 90 - - 920 ROW(K+1)=Z1-1 - 930 COLUMN(K+1)=Z2+1 - 940 NEXT K - - 950 PLAYFIELD(A,B)=9-2*I-J - 960 FOR K=1 TO N - 970 PLAYFIELD(ROW(K+1),COLUMN(K+1))=PLAYFIELD(A,B) - 980 NEXT K - - 990 NEXT J -1000 NEXT I - -1010 PRINT -1020 PRINT "THE FOLLOWING CODE OF THE BAD GUYS' FLEET DISPOSITION" -1030 PRINT "HAS BEEN CAPTURED BUT NOT DECODED:" -1040 PRINT -1050 FOR I=1 TO 6 - 1051 FOR J=1 TO 6 - 1052 HITS(I,J)=PLAYFIELD(J,I) - 1053 NEXT J -1054 NEXT I -1060 FOR I=1 TO 6 - 1061 FOR J=1 TO 6 - 1062 PRINT HITS(I,J); - 1063 NEXT J - 1064 PRINT -1065 NEXT I -1070 PRINT -1080 PRINT "DE-CODE IT AND USE IT IF YOU CAN" -1090 PRINT "BUT KEEP THE DE-CODING METHOD A SECRET." -1100 PRINT -1110 FOR I=1 TO 6 - 1111 FOR J=1 TO 6 - 1112 HITS(I,J)=0 - 1113 NEXT J -1114 NEXT I -1120 FOR I=1 TO 3 - 1121 LOSSES(I)=0 -1122 NEXT I - -1130 SHIP_HITS(1)=2:SHIP_HITS(2)=2 -1140 SHIP_HITS(3)=1:SHIP_HITS(4)=1 -1150 SHIP_HITS(5)=0:SHIP_HITS(6)=0 -1160 S=0:HITS=0 - -1170 PRINT "START GAME" - -1180 INPUT X,Y -1190 IF X<1 OR X>6 OR INT(X)<>ABS(X) THEN 1210 -1200 IF Y>0 AND Y<7 AND INT(Y)=ABS(Y) THEN 1230 -1210 PRINT "INVALID INPUT. TRY AGAIN." -1220 GOTO 1180 - -1230 R=7-Y -1240 C=X -1250 IF PLAYFIELD(R,C)>0 THEN 1290 -1260 S=S+1 -1270 PRINT "SPLASH! TRY AGAIN." -1280 GOTO 1180 - -1290 IF SHIP_HITS(PLAYFIELD(R,C))<4 THEN 1340 -1300 PRINT "THERE USED TO BE A SHIP AT THAT POINT, BUT YOU SUNK IT." -1310 PRINT "SPLASH! TRY AGAIN." -1320 S=S+1 -1330 GOTO 1180 - -1340 IF HITS(R,C)>0 THEN 1420 -1350 HITS=HITS+1 -1360 HITS(R,C)=PLAYFIELD(R,C) -1370 PRINT "A DIRECT HIT ON SHIP NUMBER";PLAYFIELD(R,C) -1380 SHIP_HITS(PLAYFIELD(R,C))=SHIP_HITS(PLAYFIELD(R,C))+1 -1390 IF SHIP_HITS(PLAYFIELD(R,C))>=4 THEN 1470 -1400 PRINT "TRY AGAIN." -1410 GOTO 1180 - -1420 PRINT "YOU ALREADY PUT A HOLE IN SHIP NUMBER";PLAYFIELD(R,C); -1430 PRINT "AT THAT POINT." -1440 PRINT "SPLASH! TRY AGAIN." -1450 S=S+1 -1460 GOTO 1180 - -1470 LOSSES((INT(PLAYFIELD(R,C)-1)/2)+1)=LOSSES((INT(PLAYFIELD(R,C)-1)/2)+1)+1 - -1480 PRINT "AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS." -1490 PRINT "SO FAR, THE BAD GUYS HAVE LOST" -1500 PRINT LOSSES(1);"DESTROYER(S),";LOSSES(2);"CRUISER(S), AND"; -1510 PRINT LOSSES(3);"AIRCRAFT CARRIER(S)." -1520 PRINT "YOUR CURRENT SPLASH/HIT RATIO IS";S/HITS -1530 IF (LOSSES(1)+LOSSES(2)+LOSSES(3))<6 THEN 1180 - -1540 PRINT -1550 PRINT "YOU HAVE TOTALLY WIPED OUT THE BAD GUYS' FLEET" -1560 PRINT "WITH A FINAL SPLASH/HIT RATIO OF";S/HITS -1570 IF S/HITS>0 THEN 1590 -1580 PRINT "CONGRATULATIONS -- A DIRECT HIT EVERY TIME." -1590 PRINT -1600 PRINT "****************************" -1610 PRINT -1620 GOTO 50 -1630 END From e666dcfbdcca28040ed96f89560720b4d597d0a9 Mon Sep 17 00:00:00 2001 From: Paul Holt Date: Sat, 8 Jan 2022 02:26:18 +1100 Subject: [PATCH 9/9] Delete old and experimental code --- 09_Battle/battle_formatted.bas | 223 --------------------------------- 1 file changed, 223 deletions(-) delete mode 100644 09_Battle/battle_formatted.bas diff --git a/09_Battle/battle_formatted.bas b/09_Battle/battle_formatted.bas deleted file mode 100644 index 9c292bd9..00000000 --- a/09_Battle/battle_formatted.bas +++ /dev/null @@ -1,223 +0,0 @@ -5 PRINT TAB(33);"BATTLE" -7 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" -10 REM -- BATTLE WRITTEN BY RAY WESTERGARD 10/70 -20 REM COPYRIGHT 1971 BY THE REGENTS OF THE UNIV. OF CALIF. -30 REM PRODUCED AT THE LAWRENCE HALL OF SCIENCE, BERKELEY -40 DIM PLAYFIELD(6,6),HITS(6,6),ROW(4),COLUMN(4),SHIP_HITS(6),LOSSES(3) - -50 FOR X=1 TO 6 - 51 FOR Y=1 TO 6 - 52 PLAYFIELD(X,Y)=0 - 53 NEXT Y -54 NEXT X - -60 FOR I=1 TO 3 - 70 N=4-I - 80 FOR J=1 TO 2 - - 90 A=INT(6*RND(1)+1) - 100 B=INT(6*RND(1)+1) - 110 D=INT(4*RND(1)+1) - - 120 IF PLAYFIELD(A,B)>0 THEN 90 - 130 M=0 - 140 ON D GOTO 150,340,550,740 - - 150 COLUMN(1)=B - 160 COLUMN(2)=7:COLUMN(3)=7 - 170 FOR K=1 TO N - 180 IF M>1 THEN 240 - 190 IF COLUMN(K)=6 THEN 230 - 200 IF PLAYFIELD(A,COLUMN(K)+1)>0 THEN 230 - 210 COLUMN(K+1)=COLUMN(K)+1 - 220 GOTO 280 - 230 M=2 - 240 IF COLUMN(1)0 THEN 90 - 270 COLUMN(K+1)=Z-1 - 280 NEXT K - 290 PLAYFIELD(A,B)=9-2*I-J - 300 FOR K=1 TO N - 310 PLAYFIELD(A,COLUMN(K+1))=PLAYFIELD(A,B) - 320 NEXT K - 330 GOTO 990 - - 340 ROW(1)=A - 350 COLUMN(1)=B - 360 ROW(2)=0:ROW(3)=0:COLUMN(2)=0:COLUMN(3)=0 - 370 FOR K=1 TO N - 380 IF M>1 THEN 460 - 390 IF ROW(K)=1 OR COLUMN(K)=1 THEN 450 - 400 IF PLAYFIELD(ROW(K)-1,COLUMN(K)-1)>0 THEN 450 - 410 IF PLAYFIELD(ROW(K)-1,COLUMN(K))>0 AND PLAYFIELD(ROW(K)-1,COLUMN(K))=PLAYFIELD(ROW(K),COLUMN(K)-1) THEN 450 - 420 ROW(K+1)=ROW(K)-1 - 430 COLUMN(K+1)=COLUMN(K)-1 - 440 GOTO 530 - 450 M=2 - 460 IF ROW(1)>ROW(2) AND ROW(1)>ROW(3) THEN Z1=ROW(1) - 462 IF ROW(2)>ROW(1) AND ROW(2)>ROW(3) THEN Z1=ROW(2) - 464 IF ROW(3)>ROW(1) AND ROW(3)>ROW(2) THEN Z1=ROW(3) - 470 IF COLUMN(1)>COLUMN(2) AND COLUMN(1)>COLUMN(3) THEN Z2=COLUMN(1) - 474 IF COLUMN(2)>COLUMN(1) AND COLUMN(2)>COLUMN(3) THEN Z2=COLUMN(2) - 476 IF COLUMN(3)>COLUMN(1) AND COLUMN(3)>COLUMN(2) THEN Z2=COLUMN(3) - - 480 IF Z1=6 OR Z2=6 THEN 90 - 490 IF PLAYFIELD(Z1+1,Z2+1)>0 THEN 90 - 500 IF PLAYFIELD(Z1,Z2+1)>0 AND PLAYFIELD(Z1,Z2+1)=PLAYFIELD(Z1+1,Z2) THEN 90 - - 510 ROW(K+1)=Z1+1 - 520 COLUMN(K+1)=Z2+1 - 530 NEXT K - 540 GOTO 950 - - 550 ROW(1)=A - 560 ROW(2)=7:ROW(3)=7 - 570 FOR K=1 TO N - 580 IF M>1 THEN 640 - 590 IF ROW(K)=6 THEN 630 - 600 IF PLAYFIELD(ROW(K)+1,B)>0 THEN 630 - 610 ROW(K+1)=ROW(K)+1 - 620 GOTO 680 - 630 M=2 - 640 IF ROW(1)0 THEN 90 - - 670 ROW(K+1)=Z-1 - 680 NEXT K - 690 PLAYFIELD(A,B)=9-2*I-J - 700 FOR K=1 TO N - 710 PLAYFIELD(ROW(K+1),B)=PLAYFIELD(A,B) - 720 NEXT K - 730 GOTO 990 - - 740 ROW(1)=A - 750 COLUMN(1)=B - 760 ROW(2)=7:ROW(3)=7 - 770 COLUMN(2)=0:COLUMN(3)=0 - 780 FOR K=1 TO N - 790 IF M>1 THEN 870 - 800 IF ROW(K)=6 OR COLUMN(K)=1 THEN 860 - 810 IF PLAYFIELD(ROW(K)+1,COLUMN(K)-1)>0 THEN 860 - 820 IF PLAYFIELD(ROW(K)+1,COLUMN(K))>0 AND PLAYFIELD(ROW(K)+1,COLUMN(K))=PLAYFIELD(ROW(K),COLUMN(K)-1) THEN 860 - 830 ROW(K+1)=ROW(K)+1 - 840 COLUMN(K+1)=COLUMN(K)-1 - 850 GOTO 940 - 860 M=2 - 870 IF ROW(1)COLUMN(2) AND COLUMN(1)>COLUMN(3) THEN Z2=COLUMN(1) - 882 IF COLUMN(2)>COLUMN(1) AND COLUMN(2)>COLUMN(3) THEN Z2=COLUMN(2) - 884 IF COLUMN(3)>COLUMN(1) AND COLUMN(3)>COLUMN(2) THEN Z2=COLUMN(3) - - 890 IF Z1=1 OR Z2=6 THEN 90 - 900 IF PLAYFIELD(Z1-1,Z2+1)>0 THEN 90 - 910 IF PLAYFIELD(Z1,Z2+1)>0 AND PLAYFIELD(Z1,Z2+1)=PLAYFIELD(Z1-1,Z2) THEN 90 - - 920 ROW(K+1)=Z1-1 - 930 COLUMN(K+1)=Z2+1 - 940 NEXT K - - 950 PLAYFIELD(A,B)=9-2*I-J - 960 FOR K=1 TO N - 970 PLAYFIELD(ROW(K+1),COLUMN(K+1))=PLAYFIELD(A,B) - 980 NEXT K - - 990 NEXT J -1000 NEXT I - -1010 PRINT -1020 PRINT "THE FOLLOWING CODE OF THE BAD GUYS' FLEET DISPOSITION" -1030 PRINT "HAS BEEN CAPTURED BUT NOT DECODED:" -1040 PRINT -1050 FOR I=1 TO 6 - 1051 FOR J=1 TO 6 - 1052 HITS(I,J)=PLAYFIELD(J,I) - 1053 NEXT J -1054 NEXT I -1060 FOR I=1 TO 6 - 1061 FOR J=1 TO 6 - 1062 PRINT HITS(I,J); - 1063 NEXT J - 1064 PRINT -1065 NEXT I -1070 PRINT -1080 PRINT "DE-CODE IT AND USE IT IF YOU CAN" -1090 PRINT "BUT KEEP THE DE-CODING METHOD A SECRET." -1100 PRINT -1110 FOR I=1 TO 6 - 1111 FOR J=1 TO 6 - 1112 HITS(I,J)=0 - 1113 NEXT J -1114 NEXT I -1120 FOR I=1 TO 3 - 1121 LOSSES(I)=0 -1122 NEXT I - -1130 SHIP_HITS(1)=2:SHIP_HITS(2)=2 -1140 SHIP_HITS(3)=1:SHIP_HITS(4)=1 -1150 SHIP_HITS(5)=0:SHIP_HITS(6)=0 -1160 S=0:HITS=0 - -1170 PRINT "START GAME" - -1180 INPUT X,Y -1190 IF X<1 OR X>6 OR INT(X)<>ABS(X) THEN 1210 -1200 IF Y>0 AND Y<7 AND INT(Y)=ABS(Y) THEN 1230 -1210 PRINT "INVALID INPUT. TRY AGAIN." -1220 GOTO 1180 - -1230 R=7-Y -1240 C=X -1250 IF PLAYFIELD(R,C)>0 THEN 1290 -1260 S=S+1 -1270 PRINT "SPLASH! TRY AGAIN." -1280 GOTO 1180 - -1290 IF SHIP_HITS(PLAYFIELD(R,C))<4 THEN 1340 -1300 PRINT "THERE USED TO BE A SHIP AT THAT POINT, BUT YOU SUNK IT." -1310 PRINT "SPLASH! TRY AGAIN." -1320 S=S+1 -1330 GOTO 1180 - -1340 IF HITS(R,C)>0 THEN 1420 -1350 HITS=HITS+1 -1360 HITS(R,C)=PLAYFIELD(R,C) -1370 PRINT "A DIRECT HIT ON SHIP NUMBER";PLAYFIELD(R,C) -1380 SHIP_HITS(PLAYFIELD(R,C))=SHIP_HITS(PLAYFIELD(R,C))+1 -1390 IF SHIP_HITS(PLAYFIELD(R,C))>=4 THEN 1470 -1400 PRINT "TRY AGAIN." -1410 GOTO 1180 - -1420 PRINT "YOU ALREADY PUT A HOLE IN SHIP NUMBER";PLAYFIELD(R,C); -1430 PRINT "AT THAT POINT." -1440 PRINT "SPLASH! TRY AGAIN." -1450 S=S+1 -1460 GOTO 1180 - -1470 LOSSES((INT(PLAYFIELD(R,C)-1)/2)+1)=LOSSES((INT(PLAYFIELD(R,C)-1)/2)+1)+1 - -1480 PRINT "AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS." -1490 PRINT "SO FAR, THE BAD GUYS HAVE LOST" -1500 PRINT LOSSES(1);"DESTROYER(S),";LOSSES(2);"CRUISER(S), AND"; -1510 PRINT LOSSES(3);"AIRCRAFT CARRIER(S)." -1520 PRINT "YOUR CURRENT SPLASH/HIT RATIO IS";S/HITS -1530 IF (LOSSES(1)+LOSSES(2)+LOSSES(3))<6 THEN 1180 - -1540 PRINT -1550 PRINT "YOU HAVE TOTALLY WIPED OUT THE BAD GUYS' FLEET" -1560 PRINT "WITH A FINAL SPLASH/HIT RATIO OF";S/HITS -1570 IF S/HITS>0 THEN 1590 -1580 PRINT "CONGRATULATIONS -- A DIRECT HIT EVERY TIME." -1590 PRINT -1600 PRINT "****************************" -1610 PRINT -1620 GOTO 50 -1630 END