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 **************************** >