Here is the BASIC source code:
(define battle '(
(1020 rem -- battle written by ray westergard 1 / 7 )
(1030 rem copyright 1971 by the regents of the univ of calif )
(1040 rem produced at the lawrence hall of science berkeley )
(1050 dim f (6 6) )
(1060 dim w (6 6) )
(1070 dim u (4) )
(1080 dim v (4) )
(1090 dim t (6) )
(1100 dim l (3) )
(1110 for x = 1 to 6 )
(1120 for y = 1 to 6 )
(1130 let f (x y) = 0 )
(1140 next y )
(1150 next x )
(1160 for i0 = 1 to 3 )
(1170 let n = (4 - i0) )
(1180 for j0 = 1 to 2 )
(1190 let a = int (((6 * rnd (1)) + 1)) )
(1200 let b = int (((6 * rnd (1)) + 1)) )
(1210 let d = int (((4 * rnd (1)) + 1)) )
(1220 if (f (a b) > 0) then 1190 )
(1230 let m = 0 )
(1240 on d goto 1250 1470 1750 1970 )
(1250 let v (1) = b )
(1260 let v (2) = 7 )
(1270 let v (3) = 7 )
(1280 for k0 = 1 to n )
(1290 if (m > 1) then 1350 )
(1300 if (v (k0) = 6) then 1340 )
(1310 if (f (a (v (k0) + 1)) > 0) then 1340 )
(1320 let v ((k0 + 1)) = (v (k0) + 1) )
(1330 goto 1410 )
(1340 let m = 2 )
(1350 if ((v (1) < v (2)) and (v (1) < v (3))) then let z = v (1) )
(1360 if ((v (2) < v (1)) and (v (2) < v (3))) then let z = v (2) )
(1370 if ((v (3) < v (1)) and (v (3) < v (2))) then let z = v (3) )
(1380 if (z = 1) then 1190 )
(1390 if (f (a (z - 1)) > 0) then 1190 )
(1400 let v ((k0 + 1)) = (z - 1) )
(1410 next k0 )
(1420 let f (a b) = ((9 - (2 * i0)) - j0) )
(1430 for k1 = 1 to n )
(1440 let f (a v ((k1 + 1))) = f (a b) )
(1450 next k1 )
(1460 goto 2280 )
(1470 let u (1) = a )
(1480 let v (1) = b )
(1490 let u (2) = 0 )
(1500 let u (3) = 0 )
(1510 let v (2) = 0 )
(1520 let v (3) = 0 )
(1530 for k2 = 1 to n )
(1540 if (m > 1) then 1620 )
(1550 if ((u (k2) = 1) or (v (k2) = 1)) then 1610 )
(1560 if (f ((u (k2) - 1) (v (k2) - 1)) > 0) then 1610 )
(1570 if ((f ((u (k2) - 1) v (k2)) > 0) and (f ((u (k2) - 1) v (k2)) = f (u (k2) (v (k2) - 1)))) then 1610 )
(1580 let u ((k2 + 1)) = (u (k2) - 1) )
(1590 let v ((k2 + 1)) = (v (k2) - 1) )
(1600 goto 1730 )
(1610 let m = 2 )
(1620 if ((u (1) > u (2)) and (u (1) > u (3))) then let z1 = u (1) )
(1630 if ((u (2) > u (1)) and (u (2) > u (3))) then let z1 = u (2) )
(1640 if ((u (3) > u (1)) and (u (3) > u (2))) then let z1 = u (3) )
(1650 if ((v (1) > v (2)) and (v (1) > v (3))) then let z2 = v (1) )
(1660 if ((v (2) > v (1)) and (v (2) > v (3))) then let z2 = v (2) )
(1670 if ((v (3) > v (1)) and (v (3) > v (2))) then let z2 = v (3) )
(1680 if ((z1 = 6) or (z2 = 6)) then 1190 )
(1690 if (f ((z1 + 1) (z2 + 1)) > 0) then 1190 )
(1700 if ((f (z1 (z2 + 1)) > 0) and (f (z1 (z2 + 1)) = f ((z1 + 1) z2))) then 1190 )
(1710 let u ((k2 + 1)) = (z1 + 1) )
(1720 let v ((k2 + 1)) = (z2 + 1) )
(1730 next k2 )
(1740 goto 2240 )
(1750 let u (1) = a )
(1760 let u (2) = 7 )
(1770 let u (3) = 7 )
(1780 for k3 = 1 to n )
(1790 if (m > 1) then 1850 )
(1800 if (u (k3) = 6) then 1840 )
(1810 if (f ((u (k3) + 1) b) > 0) then 1840 )
(1820 let u ((k3 + 1)) = (u (k3) + 1) )
(1830 goto 1910 )
(1840 let m = 2 )
(1850 if ((u (1) < u (2)) and (u (1) < u (3))) then let z = u (1) )
(1860 if ((u (2) < u (1)) and (u (2) < u (3))) then let z = u (2) )
(1870 if ((u (3) < u (1)) and (u (3) < u (2))) then let z = u (3) )
(1880 if (z = 1) then 1190 )
(1890 if (f ((z - 1) b) > 0) then 1190 )
(1900 let u ((k3 + 1)) = (z - 1) )
(1910 next k3 )
(1920 let f (a b) = ((9 - (2 * i0)) - j0) )
(1930 for k4 = 1 to n )
(1940 let f (u ((k4 + 1)) b) = f (a b) )
(1950 next k4 )
(1960 goto 2280 )
(1970 let u (1) = a )
(1980 let v (1) = b )
(1990 let u (2) = 7 )
(2000 let u (3) = 7 )
(2010 let v (2) = 0 )
(2020 let v (3) = 0 )
(2030 for k5 = 1 to n )
(2040 if (m > 1) then 2120 )
(2050 if ((u (k5) = 6) or (v (k5) = 1)) then 2110 )
(2060 if (f ((u (k5) + 1) (v (k5) - 1)) > 0) then 2110 )
(2070 if ((f ((u (k5) + 1) v (k5)) > 0) and (f ((u (k5) + 1) v (k5)) = f (u (k5) (v (k5) - 1)))) then 2110 )
(2080 let u ((k5 + 1)) = (u (k5) + 1) )
(2090 let v ((k5 + 1)) = (v (k5) - 1) )
(2100 goto 2230 )
(2110 let m = 2 )
(2120 if ((u (1) < u (2)) and (u (1) < u (3))) then let z1 = u (1) )
(2130 if ((u (2) < u (1)) and (u (2) < u (3))) then let z1 = u (2) )
(2140 if ((u (3) < u (1)) and (u (3) < u (2))) then let z1 = u (3) )
(2150 if ((v (1) > v (2)) and (v (1) > v (3))) then let z2 = v (1) )
(2160 if ((v (2) > v (1)) and (v (2) > v (3))) then let z2 = v (2) )
(2170 if ((v (3) > v (1)) and (v (3) > v (2))) then let z2 = v (3) )
(2180 if ((z1 = 1) or (z2 = 6)) then 1190 )
(2190 if (f ((z1 - 1) (z2 + 1)) > 0) then 1190 )
(2200 if ((f (z1 (z2 + 1)) > 0) and (f (z1 (z2 + 1)) = f ((z1 - 1) z2))) then 1190 )
(2210 let u ((k5 + 1)) = (z1 - 1) )
(2220 let v ((k5 + 1)) = (z2 + 1) )
(2230 next k5 )
(2240 let f (a b) = ((9 - (2 * i0)) - j0) )
(2250 for k6 = 1 to n )
(2260 let f (u ((k6 + 1)) v ((k6 + 1))) = f (a b) )
(2270 next k6 )
(2280 next j0 )
(2290 next i0 )
(2300 for i3 = 1 to 6 )
(2310 for j3 = 1 to 6 )
(2320 let w (i3 j3) = 0 )
(2330 next j3 )
(2340 next i3 )
(2350 for i4 = 1 to 3 )
(2360 let l (i4) = 0 )
(2370 next i4 )
(2380 let t (1) = 2 )
(2390 let t (2) = 2 )
(2400 let t (3) = 1 )
(2410 let t (4) = 1 )
(2420 let t (5) = 0 )
(2430 let t (6) = 0 )
(2440 let s = 0 )
(2450 let h = 0 )
(2455 rem modified by lrw 4/9/04 so game is only 2/3 pointless instead of 9/10 pointless :)
(2460 print )
(2465 print " 1 2 3 4 5 6")
(2470 for i5 = 1 to 6 )
(2475 print! i5 " ")
(2480 for j5 = 1 to 6 )
(2490 if (w (i5 j5) < 1) then print! ". ")
(2495 if (w (i5 j5) > 0) then print! w (i5 j5) " ")
(2500 next j5 )
(2510 print )
(2520 next i5 )
(2530 print )
(2540 input "ROW" y )
(2550 input "COLUMN" x )
(2560 if (((x < 1) or (x > 6)) or (int (x) <> abs (x))) then 2580 )
(2570 if (((y > 0) and (y < 7)) and (int (y) = abs (y))) then 2600 )
(2580 print "INVALID INPUT. TRY AGAIN." )
(2590 goto 2540 )
(2600 let r = y )
(2610 let c = x )
(2620 if (f (r c) > 0) then 2660 )
(2630 let s = (s + 1) )
(2640 print "SPLASH! TRY AGAIN." )
(2650 goto 2540 )
(2660 if (t (f (r c)) < 4) then 2710 )
(2670 print "THERE USED TO BE A SHIP AT THAT POINT, BUT YOU SUNK IT." )
(2680 print "SPLASH! TRY AGAIN." )
(2690 let s = (s + 1) )
(2700 goto 2540 )
(2710 if (w (r c) > 0) then 2790 )
(2720 let h = (h + 1) )
(2730 let w (r c) = f (r c) )
(2740 print "A DIRECT HIT ON SHIP NUMBER " f (r c) )
(2750 let t (f (r c)) = (t (f (r c)) + 1) )
(2760 if (t (f (r c)) >= 4) then 2840 )
(2770 print "TRY AGAIN." )
(2780 goto 2460 )
(2790 print "YOU ALREADY PUT A HOLE IN SHIP NUMBER " f (r c) )
(2800 print "AT THAT POINT." )
(2810 print "SPLASH! TRY AGAIN." )
(2820 let s = (s + 1) )
(2830 goto 2460 )
(2840 let l ((int (((f (r c) - 1) / 2)) + 1)) = (l ((int (((f (r c) - 1) / 2)) + 1)) + 1) )
(2850 print "AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS." )
(2860 print "SO FAR, THE BAD GUYS HAVE LOST" )
(2870 print! l (1) " DESTROYER(S), " l (2) " CRUISER(S), AND " )
(2880 print l (3) " AIRCRAFT CARRIER(S)." )
(2890 print "YOUR CURRENT SPLASH/HIT RATIO IS " (s / h) )
(2900 if (((l (1) + l (2)) + l (3)) < 6) then 2460 )
(2910 print )
(2920 print "YOU HAVE TOTALLY WIPED OUT THE BAD GUYS' FLEET" )
(2930 print "WITH A FINAL SPLASH/HIT RATIO OF " (s / h) )
(2940 if ((s / h) > 0) then 2960 )
(2950 print "CONGRATULATIONS -- A DIRECT HIT EVERY TIME." )
(2960 print )
(2970 print "****************************" )
(2980 print )
(2990 end )))
Here is a sample run:
> (basic-run battle)
1 2 3 4 5 6
1 . . . . . .
2 . . . . . .
3 . . . . . .
4 . . . . . .
5 . . . . . .
6 . . . . . .
ROW? 3
COLUMN? 3
A DIRECT HIT ON SHIP NUMBER 5
TRY AGAIN.
1 2 3 4 5 6
1 . . . . . .
2 . . . . . .
3 . . 5 . . .
4 . . . . . .
5 . . . . . .
6 . . . . . .
ROW? 2
COLUMN? 2
SPLASH! TRY AGAIN.
ROW? 1
COLUMN? 1
SPLASH! TRY AGAIN.
ROW? 4
COLUMN? 4
SPLASH! TRY AGAIN.
ROW? 4
COLUMN? 3
A DIRECT HIT ON SHIP NUMBER 5
TRY AGAIN.
1 2 3 4 5 6
1 . . . . . .
2 . . . . . .
3 . . 5 . . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 2
COLUMN? 3
A DIRECT HIT ON SHIP NUMBER 5
TRY AGAIN.
1 2 3 4 5 6
1 . . . . . .
2 . . 5 . . .
3 . . 5 . . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 1
COLUMN? 3
A DIRECT HIT ON SHIP NUMBER 3
TRY AGAIN.
1 2 3 4 5 6
1 . . 3 . . .
2 . . 5 . . .
3 . . 5 . . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 1
COLUMN? 4
A DIRECT HIT ON SHIP NUMBER 3
TRY AGAIN.
1 2 3 4 5 6
1 . . 3 3 . .
2 . . 5 . . .
3 . . 5 . . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 1
COLUMN? 5
A DIRECT HIT ON SHIP NUMBER 3
AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS.
SO FAR, THE BAD GUYS HAVE LOST
0 DESTROYER(S), 1 CRUISER(S), AND 0 AIRCRAFT CARRIER(S).
YOUR CURRENT SPLASH/HIT RATIO IS 0.5
1 2 3 4 5 6
1 . . 3 3 3 .
2 . . 5 . . .
3 . . 5 . . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 1
COLUMN? 6
A DIRECT HIT ON SHIP NUMBER 4
TRY AGAIN.
1 2 3 4 5 6
1 . . 3 3 3 4
2 . . 5 . . .
3 . . 5 . . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 2
COLUMN? 6
SPLASH! TRY AGAIN.
ROW? 2
COLUMN? 5
A DIRECT HIT ON SHIP NUMBER 4
TRY AGAIN.
1 2 3 4 5 6
1 . . 3 3 3 4
2 . . 5 . 4 .
3 . . 5 . . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 3
COLUMN? 4
A DIRECT HIT ON SHIP NUMBER 4
AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS.
SO FAR, THE BAD GUYS HAVE LOST
0 DESTROYER(S), 2 CRUISER(S), AND 0 AIRCRAFT CARRIER(S).
YOUR CURRENT SPLASH/HIT RATIO IS 0.444444
1 2 3 4 5 6
1 . . 3 3 3 4
2 . . 5 . 4 .
3 . . 5 4 . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 1
COLUMN? 3
THERE USED TO BE A SHIP AT THAT POINT, BUT YOU SUNK IT.
SPLASH! TRY AGAIN.
ROW? 1
COLUMN? 2
A DIRECT HIT ON SHIP NUMBER 2
TRY AGAIN.
1 2 3 4 5 6
1 . 2 3 3 3 4
2 . . 5 . 4 .
3 . . 5 4 . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 2
COLUMN? 1
A DIRECT HIT ON SHIP NUMBER 2
AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS.
SO FAR, THE BAD GUYS HAVE LOST
1 DESTROYER(S), 2 CRUISER(S), AND 0 AIRCRAFT CARRIER(S).
YOUR CURRENT SPLASH/HIT RATIO IS 0.454545
1 2 3 4 5 6
1 . 2 3 3 3 4
2 2 . 5 . 4 .
3 . . 5 4 . .
4 . . 5 . . .
5 . . . . . .
6 . . . . . .
ROW? 3
COLUMN? 1
SPLASH! TRY AGAIN.
ROW? 4
COLUMN? 1
SPLASH! TRY AGAIN.
ROW? 5
COLUMN? 1
SPLASH! TRY AGAIN.
ROW? 6
COLUMN? 1
SPLASH! TRY AGAIN.
ROW? 6
COLUMN? 2
SPLASH! TRY AGAIN.
ROW? 6
COLUMN? 3
A DIRECT HIT ON SHIP NUMBER 6
TRY AGAIN.
1 2 3 4 5 6
1 . 2 3 3 3 4
2 2 . 5 . 4 .
3 . . 5 4 . .
4 . . 5 . . .
5 . . . . . .
6 . . 6 . . .
ROW? 6
COLUMN? 4
SPLASH! TRY AGAIN.
ROW? 5
COLUMN? 4
A DIRECT HIT ON SHIP NUMBER 6
TRY AGAIN.
1 2 3 4 5 6
1 . 2 3 3 3 4
2 2 . 5 . 4 .
3 . . 5 4 . .
4 . . 5 . . .
5 . . . 6 . .
6 . . 6 . . .
ROW? 4
COLUMN? 5
A DIRECT HIT ON SHIP NUMBER 6
TRY AGAIN.
1 2 3 4 5 6
1 . 2 3 3 3 4
2 2 . 5 . 4 .
3 . . 5 4 . .
4 . . 5 . 6 .
5 . . . 6 . .
6 . . 6 . . .
ROW? 3
COLUMN? 6
A DIRECT HIT ON SHIP NUMBER 6
AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS.
SO FAR, THE BAD GUYS HAVE LOST
1 DESTROYER(S), 2 CRUISER(S), AND 1 AIRCRAFT CARRIER(S).
YOUR CURRENT SPLASH/HIT RATIO IS 0.733333
1 2 3 4 5 6
1 . 2 3 3 3 4
2 2 . 5 . 4 .
3 . . 5 4 . 6
4 . . 5 . 6 .
5 . . . 6 . .
6 . . 6 . . .
ROW? 5
COLUMN? 3
A DIRECT HIT ON SHIP NUMBER 5
AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS.
SO FAR, THE BAD GUYS HAVE LOST
1 DESTROYER(S), 2 CRUISER(S), AND 2 AIRCRAFT CARRIER(S).
YOUR CURRENT SPLASH/HIT RATIO IS 0.6875
1 2 3 4 5 6
1 . 2 3 3 3 4
2 2 . 5 . 4 .
3 . . 5 4 . 6
4 . . 5 . 6 .
5 . . 5 6 . .
6 . . 6 . . .
ROW? 6
COLUMN? 6
SPLASH! TRY AGAIN.
ROW? 5
COLUMN? 6
A DIRECT HIT ON SHIP NUMBER 1
TRY AGAIN.
1 2 3 4 5 6
1 . 2 3 3 3 4
2 2 . 5 . 4 .
3 . . 5 4 . 6
4 . . 5 . 6 .
5 . . 5 6 . 1
6 . . 6 . . .
ROW? 4
COLUMN? 6
A DIRECT HIT ON SHIP NUMBER 1
AND YOU SUNK IT. HURRAH FOR THE GOOD GUYS.
SO FAR, THE BAD GUYS HAVE LOST
2 DESTROYER(S), 2 CRUISER(S), AND 2 AIRCRAFT CARRIER(S).
YOUR CURRENT SPLASH/HIT RATIO IS 0.666667
YOU HAVE TOTALLY WIPED OUT THE BAD GUYS' FLEET
WITH A FINAL SPLASH/HIT RATIO OF 0.666667
****************************
>