Classic Computer Magazine Archive COMPUTE! ISSUE 76 / SEPTEMBER 1986 / PAGE 31

Beehive

Steve Michel

To avoid getting stung in this delightful strategy game, you'll need to plan ahead. The original version of "Beehive" was written for the 512K Amiga. We've added fresh translations for the Commodore 64 (and 128 in 64 mode), Apple II series, IBM PC/PCjr, and Atari 400, 800, XL, and XE. The IBM PC/PCjr game requires a color/graphics card and BASICA for the PC, and Cartridge BASIC for the PCjr. The Atari version requires at least 32K of memory and a joystick. The Commodore version requires a joystick. The Apple II version requires a joystick and color monitor, and runs on any Apple II-series computer with either ProDOS or DOS 3.3.


"Beehive" is a two-player strategy game that requires you to concentrate fully and develop long-range planning skills. The game board consists of 121 hexagons arranged in a sloping 11x11 matrix. The name derives from the playing field's resemblance to the geometric precision of a honeycomb. The first player is assigned the left and right borders of the honeycomb, while the second player is assigned the top and bottom edges.

The object of the game is deceptively simple. Each player tries to connect a continuous line from one of his or her borders to the other. If you are player 1, for instance, you need to connect the left border with the right. The players alternate turns, filling in cells of the honeycomb one at a time. While attempting to complete your own course, you must also try to block your opponent's way, and this requires strategic thinking. The first player to connect both borders wins the game. As a reward, tiny bee faces appear along the line of connection, clearly marking the path to victory.

Entering The Game

Type in the program listing for your computer, referring to the special notes below. When you have saved a copy of the game, type RUN and press RETURN. Beehive begins by asking for the name of each player. After both players have entered their names, the beehive grid is drawn and play begins. In the Amiga and IBM PC/PCjr versions, the computer determines randomly which player should take the first turn; in other versions, player 1 always goes first. In the Amiga version, each player takes a turn by moving the mouse pointer to the desired cell and pressing the left mouse button once. Other versions substitute joystick or keyboard controls for the mouse (see below).

When you choose a cell, it is filled with a solid circle and your turn ends. While connecting your own borders, you should also be trying to prevent the other player from making a connection. Play continues until one player or the other completes a continuous line from one border to the other. At this point a victor is declared, and bee faces replace the circles along the entire winning route.

Winning Strategies

Like most two-player games, Beehive adjusts itself to the skill of the players. The basic concept is simple enough that even small children can enjoy playing. But when two knowledgeable players are matched, play proceeds at a much higher level. The flexibility of the game allows many different strategies.

Here are some important points for beginners to keep in mind. To begin with, your first move does not have to occur in one of your border rows. In fact, you can often establish a better strategic position by starting somewhere near the middle of the playing field. In a typical game you will have to swing back and forth between an expanding, offensive posture and a defensive, blocking posture. The middle areas accommodate both strategies well.

Second, it is not necessary that all of your cells be connected. That is, a new cell doesn't necessarily have to touch one of your existing cells. Any empty cell in the hive is fair game for either player, and it's often advantageous to space out your cells to allow multiple paths between borders. Starting multiple pathways makes it harder for an opponent to block your progress completely.

Finally, keep in mind that the hexagonal shape of each cell permits you to move in six different directions. Try not to get locked into a strict, straight-line strategy too often. Any pathway that connects both borders is legal, and in many cases the winning path will be quite roundabout.

Amiga Version

Before you begin typing in the Amiga version (Program 1), notice the small arrows marking the end of the line. They are not intended to be typed (in fact, we deliberately chose a character that's not available from the Amiga's keyboard). Instead, wherever you see an arrow in the listing, press RETURN or move the cursor off the line to enter it into memory.

The Amiga version of Beehive includes synthesized speech. Either player can toggle the speech effects on or off at any time. Press the left button once: A small box appears, indicating the current speech status. If speech was turned on, it is now turned off, and vice versa. Press the left button again to erase the speech box and resume the game.

Commodore 64/128 Version

The Commodore version (Program 2) runs on a Commodore 64 or Commodore 128 in 64 mode; it requires a joystick. Plug the joystick into port I and use it to move the bee-shaped pointer onto the desired cell. To select a cell, press the fire button.

Atari Version

Atari Beehive (Program 3) requires a joystick and runs on any Atari 400, 800, XL, or XE computer with at least 32K of memory. Plug the joystick into port 1. Move the pointer over the cell you wish to occupy, then press the fire button to select it.

Apple II Version

The Apple II version of Beehive (Program 4) runs on any Apple II-series computer, under DOS 3.3 or ProDOS. A color monitor and joystick are required. To select a cell, move the pointer onto it, then press the button.

IBM PC/PCjr Version

IBM Beehive (Program 5) requires a color/graphics card and BASICA for the IBM PC, and Cartridge BASIC for the PCjr. Keyboard controls are used to move the bee-shaped pointer around the playing field and to select a cell. Use the arrow keys to move left, right, up or down. When the pointer is above the desired cell, press the space bar to select it.


Program 1: Beehive For Amiga

Please refer to the typing instructions in the article before entering this listing.

CLS
talk$="": GOSUB talk
GOSUB init
GOSUB getnames
start:
CLS: RANDOMIZE TIMER
markers = 0: winner = 0: prev.player = 0
player = INT(2*RND(1)+1)
FOR j=1 TO 11: FOR k=1 TO 31: hive%(j,k)=0: NEXT k: NEXT j
FOR j=1 TO 20: pathlen(j) = 0: NEXT j
FOR j=1 TO 65: path%(j) = 0: used%(j) = 0: node%(j) = 0: NEXT j
GOSUB drawscreen
BREAK ON: ON BREAK GOSUB closeup

main:
IF prev.player <> player THEN
COLOR 4
LOCATE 1,2: PRINT "Player:"
LOCATE 1,2: PRINT "Player: ";
COLOR colr(player): PRINT LEFT$(player$ (player), 15)
talk$=player$(player): GOSUB talk
prev.player = player
END IF
WHILE MOUSE (0) = 0
x = MOUSE (0)
a$=INKEY$:IF a$=" " THEN GOSUB readkey
WEND
GOSUB checkmouse
IF used THEN main
GOSUB checkline
IF possible = 1 THEN GOSUB checkwinner
LOCATE 3,2: PRINT "            "
IF winner = 1 THEN drawpath
IF player = 1 THEN
player = 2
ELSE
player = 1
END IF
GOTO main

init:
CLS:colr(1) = 2:colr (2) = 3
DIM colcor%(11):FOR j = 1 TO 11:READ colcor%(j):NEXT j
DATA 5,4,4,3,3,2,2,1,1,0,0
DIM row.inc%(6),col.inc%(6)
FOR j= 1 TO 6:READ row.inc%(j),col.inc%(j):NEXT j
DATA -1,-1,0,1,1,1,1,0,0,-1,-1,-1
DIM hive%(11,31)
DIM used%(65), node%(65), path%(65), pathlen(20)
SCREEN 1,640,200,3,2
WINDOW 1,"BEE HIVE",,16,1
GOSUB setcolor
DIM hexa(100),ball1(100),ball2(100),eyes1(100),eyes2(100)
LINE (30,10)-(12,15),7: LINE - STEP (0,10) ,7: LINE - STEP (18,5),7
LINE- STEP (18,-5),7: LINE - STEP (0,-10) ,7: LINE - STEP (-18,-5), 7
LINE (30,11)-(13,15),6: LINE - STEP (0,9),6: LINE - STEP (17,5),6
LINE - STEP (16,-4),6:LINE - STEP (0,-10),6:LINE - STEP (-17,-4),6
GET(12,10)-(48,30),hexa
CLS:CIRCLE(30,20),11,colr(1):PAINT(30, 20),colr(1):GET(20,9)-(40,31),ball1
GOSUB parts:GET(18, 12)-(42,30),eyes1
CLS: CIRCLE(30,20),11,colr(2):PAINT(30,20),colr(2):GET (20,9)-(40,31),ball2
GOSUB parts:GET(18,12)-(42,30),eyes2:CLS
RETURN

parts:
CIRCLE(25,19),4,1:CIRCLE(35,19),4,1
PAINT(25,19),1:PAINT(35,19),1
PSET (29,17):LINE - STEP (-5,-5):LINE - STEP (-5,3)
PSET (31,17):LINE - STEP (5,-5):LINE - STEP (5,3)
CIRCLE(30,24),2,1:PAINT(30,24),1
RETURN

getnames:
COLOR 4
CLS: talk$="WELCOME TO BEEE HIVE": GOSUB talk
a$ = "What is the name of player 1 ": PRINT
PRINT a$;: talk$=a$: GOSUB talk:INPUT player$(1)
a$ = "What is the name of player 2 ": PRINT
PRINT a$;: talk$=a$: GOSUB talk:INPUT player$(2)
talk$="Press space bar to turn speech off or on during game."
LOCATE 15,14:PRINT talk$
GOSUB talk:CLS:RETURN

drawscreen:
CLS: y = 7
FOR r =1 TO 11
x = 180 - r * 18
FOR c =1 TO 11
x = x+ 36
PUT (x,y),hexa,OR
NEXT c
y=y+15
NEXT r
PSET (595,12),2: GOSUB upndown:LINE -STEP (0,10),2
PSET (596,12),2: GOSUB upndown:LINE -STEP (0,10),2
PSET (597,12),2: GOSUB upndown:LINE -STEP (0,10),2
PSET (194,12),2: GOSUB upndown:LINE -STEP (0,10),2
PSET (195,12),2: GOSUB upndown:LINE -STEP (0,10),2
PSET (196,12),2: GOSUB upndown:LINE -STEP (0,10),2
y1=-5: y2=5: PSET (198,9),3: GOSUB across
PSET (198,10),3: GOSUB across
PSET (199,11),3: GOSUB across
y1=5: y2=-5: PSET (19,173),3: GOSUB across
PSET (19,174),3: GOSUB across
PSET (19,175),3: GOSUB across
RETURN

upndown:
FOR j = 1 TO 10
LINE -STEP (0, 10),colr(1)
LINE -STEP (-18,5),colr(1)
NEXT j
RETURN

across:
FOR j =1 TO 11
LINE -STEP (18,y1),colr(2)
LINE -STEP (18,y2),colr(2)
NEXT j
RETURN

checkmouse:
x = MOUSE(3): y = MOUSE(4)
offset = 0: used = 0
yr = INT(y/15+.5): row = yr: yr= yr * 15
IF INT(yr/2) = yr/2 THEN offset= 18
xr = INT ((x-offset)/36+.5): col= xr: xr = xr * 36+ offset
IF row < 1 OR row > 11 THEN
used = 1
RETURN
END IF
col = col - colcor%(row)
IF  col < 1 OR col > 11 THEN
used = 1
RETURN
END IF
rowhive = row: colhive = 10+2*col-row
IF hive%(row, colhive) <> 0 THEN
used =1
RETURN
END IF
markers = markers + 1
hive%(row,colhive) = player
IF player = 1 THEN
PUT (xr-10,yr-9),ball1,OR
ELSE
PUT (xr-10,yr-9),ball2,OR
END IF
RETURN

checkline:
possible=1
IF player = 2 THEN
FOR row = 1 TO 6: ff=0: fb=0
FOR col = 1 TO 11: colhive-10+2*col-row
IF hive%(row,colhive)=player THEN ff=1
colhive = 10+2*(col)-(12-row)
IF hive%(12-row,colhive)=player THEN fb=1
NEXT col
IF ff=0 OR fb=0 THEN
possible = 0
row = 1E+09
END IF
NEXT row
ELSE
FOR col =1 TO 6: ff=0: fb=0
FOR row =1 TO 11: colhive=10+2*col-row
IF hive%(row, colhive)=player THEN ff=1
colhive = 10+2*(12-col)-row
IF hive%(row, colhive)=player THEN fb=1
NEXT row
IF ff=0 OR fb=0 THEN
possible = 0
col = 1E+09
END IF
NEXT col
END IF
RETURN

checkwinner:
LOCATE 3,2: COLOR 4: PRINT "Checking..."
used.cntr = 0: winner = 0: node.cntr = 0: node.total = 0: counter = 0
IF player = 1 THEN check1
FOR col =1 TO 11: row = 1
IF hive%(row,10+2*col-row) <> player THEN skip2
noderow= row:nodecol = col: G0SUB usedlookup
IF used.flag = 1 THEN skip2
node.total = 1: path.total = 1:counter = 1
path%(1) = 100 * noderow + nodecol
GOSUB checkpath
IF winner = 1 THEN col = 1E+09
skip2:
NEXT col
RETURN

check1:
FOR row = 1 TO 11: col = 1
IF hive%(row,10+2*col-row) <> player THEN skip1
noderow = row: nodecol = col: GOSUB usedlookup
IF used.flag = 1 THEN skip1
node.total = 1: path.total = 1:counter = 1
path%(1) = 100 * noderow + nodecol
GOSUB checkpath
IF winner = 1 THEN row = 1E+09
skip1:
NEXT row
RETURN

usedlookup:
used.flag = 0: search = 100 * noderow + nodecol
lk = 0: IF used.cntr = 0 THEN skipsearch
FOR lk = 1 TO used.cntr
IF search = used%(lk) THEN
used.flag = 1
lk = 1E+09
END IF
NEXT lk
skipsearch:
IF used.flag = 0 THEN
used.cntr = used.cntr+1
used%(used.cntr) = search
END IF
RETURN

checkpath:
node.cntr = 0
FOR nc = 1 TO 6
noderow = noderow + row.inc%(nc): nodecol = nodecol + col.inc%(nc)
IF noderow < 1 OR noderow > 11 0R nodecol < 1 OR nodecol > 11 THEN skipnode
IF hive%(noderow,10+2*nodecol-noderow) <> player THEN skipnode
GOSUB usedlookup: IF used.flag =1 THEN skipnode
node.cntr = node.cntr + 1
node.total = node.total + 1 : node%(node.total) = 100 * noderow +nodecol
IF (player = 2 AND noderow = 11) OR (player = 1 AND nodecol = 11) THEN
winner = 1
path.total = path.total + 1
path%(path.total) = 100 * noderow + nodecol
nc = 1E+09
END IF
skipnode:
NEXT nc
IF winner = 1 THEN RETURN
IF node.cntr = 0  AND node.total= 0 THEN RETURN
IF node.cntr = 0 THEN
path.total = path.total - pathlen(counter)
pathlen(counter) = 0
counter = counter - 1
END IF
IF node.cntr > 1 THEN counter =counter + node.cntr - 1
noderow = INT(node%(node.total)/100)
nodecol = node%(node.total) - 100 * noderow
path.total = path.total + 1
pathlen(counter) = pathlen(counter) + 1
path%(path.total) = node%(node.total)
node.total = node.total - 1
GOTO checkpath

drawpath:
LOCATE 1,1: PRINT "                         ":COLOR 4
LOCATE 1,1: PRINT "THE WINNER: ";: COLOR colr(player):PRINT player$(player);
a$ = "THE WINNER IS " + player$(player): talk$=a$: GOSUB talk
FOR j = 1 TO path.total : offset= 0
row = INT (path%(j)/100): col = path%(j) - 100*row + colcor% (row)
IF row/2 = INT(row/2) THEN offset = 18
xr = col * 36 + offset: yr = row* 15
IF player = 1 THEN
PUT (xr-10,yr-9),ball1,XOR
PUT (xr-12,yr-5),eyes1,OR
ELSE
PUT (xr-10,yr-9),ball2,XOR
PUT (xr-12,yr-5),eyes2,OR
END IF
NEXT j

goagain:
LINE (419,139)-(625,186),7,b: LINE (420,140)-(624,185),7,b
LINE (421,141)-(623,184),4,bf: COLOR 6
LOCATE 19,55: a$ = " WANT TO PLAY AGAIN ? ": PRINT  a$;
LINE (431,162)-(487,180),7,bf: LOCATE 22,56: PRINT " YES ";
LINE (567,162)-(615,180),7,bf: LOCATE 22,73: PRINT " NO ";
talk$=a$: GOSUB talk

waiter:
WHILE MOUSE(0) <> 1
WEND
x  MOUSE(3): y = MOUSE(4)
IF y < 162 OR y > 180 THEN waiter
IF x > 430 AND x < 488 THEN start
IF x > 566 AND x < 616 THEN closeup
GOTO waiter

setcolor:
PALETTE 0,.3,.3,.3   'grey
PALETTE 1,0,0,0      'black
PALETTE 2,0,1,0      'green
PALETTE 3,0,0,1      'blue
PALETTE 4,1,1,1      'white
PALETTE 5,0,1,1      'aqua
PALETTE 6,1,1,0      'yellow
PALETTE 7,.8,.2,0    'red
RETURN

closeup:
PALETTE 0,.1,.1,.1   'blue
PALETTE 1,1,1,1      'white
PALETTE 2,0,0,0      'black
PALETTE 3,.85,.2,0   'red
WINDOW CLOSE 1
SCREEN CLOSE 1
STOP

readkey:
WINDOW 4,"Speech",(250,70)-(390,110),16,1
IF TalkFlag=1 THEN
talk$="Now I can talk."
PRINT talk$
TalkFlag=1-TalkFlag
GOSUB talk
GOTO clearmouse
END IF
IF TalkFlag=0 THEN
talk$="OK, I'll be quiet."
PRINT talk$
GOSUB talk
TalkFlag=1-TalkFlag
END IF

clearmouse:
WHILE MOUSE(0)<>0:WEND
PRINT "Press button once"
PRINT "to continue..."
WHILE MOUSE(0)<>1:WEND
WHILE INKEY$<>"":WEND
WINDOW CLOSE 4
RETURN

talk:
IF TalkFlag=0 THEN SAY TRANSLATE$(talk$)
RETURN

Program 2: Commodore 64/128 Beehive

Version by Kevin Mykytyn, Editorial Programmer

For instructions on entering this listing, please refer to "COMPUTE!'s Guide to Typing In Programs" in this issue of COMPUTE!.

EF 10 POKE 56,48:CLR:GOTO 80
RK 20 GOSUB 560
QK 30 JV=15-(PEEK(56321)AND15)-128*((PEEK(56321)AND16)<>16):
      IFJV>127THENRETURN
AX 40 IF JV=0 THEN 30
FF 50 TX=X:TY=Y:TX=TX+X(JV):TY=TY+Y(JV)
HK 60 IF TX<1 OR TX>11 OR TY<1 OR TY>11 THEN 30
BQ 70 X=TX:Y=TY:GOSUB 560:GOTO 30
XQ 80 GOSUB 170:GOSUB 530
RM 90 POKE 53280,5:POKE 53281,5:PRINT"{CLR}{6 DOWN}{6 RIGHT}";:GOSUB 470:POKE 53269,1
SC 100 INPUT"{BLK}{3 DOWN}{2 RIGHT}ENTER YOUR NAME PLAYER ONE";PN$(1)
SR 110 INPUT "{DOWN}{2 RIGHT}ENTER YOUR NAME PLAYER TWO";PN$(2):POKE 53269,0
QC 120 GOSUB 400:FOR A=1 TO 2:PN$(A)=LEFT$(PN$(A),15):NEXT:X=1:P=1:UN=1:Y=1
HM 130 B$="YOUR TURN ":GOSUB 1160
RM 140 GOSUB 20:SP=1397+40*Y+X*2-Y
MM 150 IF PEEK(SP)<>32 THEN F=10:GOSUB 580:GOTO 140
AK 160 BD(X,Y)=UN:POKE SP,81:POKE SP+54272,7*(P-1):GOSUB590:GOSUB610:P=3-P:GOTO130
KF 170 ML$="[<I>]"+CHR$(8)+"[<X>]<"+CHR$(3)+"[<2>]XJ"+CHR$(16)+
       CHR$(248)+"L[<B>][<T>]":POKE 835,0
SK 180 POKE 836,208:POKE 830,0:POKE 831,216:POKE 828,0:POKE 829,56:POKE 56334,0
SP 190 POKE 1,51:ML$=ML$:SYS(PEEK(51)+256*PEEK(52)):POKE 1,55:POKE 56334,1
GF 200 FOR I=12568 TO 12631:READ J:POKE I,J:NEXT:POKE 53272,28
AP 210 FOR A=0 TO 10:READ X(A),Y(A):NEXT A:FOR A=832 TO 895:READ B:POKE A,B:NEXT
JE 220 POKE 53276,1:POKE 2040,13:POKE 53287,7:POKE 53285,0:RETURN
ER 230 DATA 231,126,24,24,24,24,126,231
RC 240 DATA 0,0,0,0,0,0,126,231
SC 250 DATA 231,126,0,0,0,0,0,0
HR 260 DATA 7,30,24,24,24,24,126,231
DA 270 DATA 7,30,24,24,24,24,30,7
MF 280 DATA 224,120,24,24,24,24,120,224
RA 290 DATA 231,126,24,24,24,24,120,224
JA 300 DATA 195,36,126,219,255,126,36,24
PH 310 DATA 0,0,0,-1,0,1,0,0,-1,0,0,0,0,0,0,0,1,0,0,0,0,0
CQ 320 DATA 0,0,0,0,0,0,0,16
CS 330 DATA 0,0,65,80,0,65,164,20
JR 340 DATA 70,100,1,150,100,1,165,144
JM 350 DATA 0,106,64,5,105,0,26,170
GB 360 DATA 64,21,153,144,26,86,80,5
SE 370 DATA 5,144,0,2,96,0,1,160
SH 380 DATA 0,0,0,0,0,0,0,0
JG 390 DATA 0,0,0,0,0,0,0,53
GH 400 PRINT"{CLR}{8 DOWN}"SPC(13)"{RVS}{BLK}{YEL}[<J>]{23 SPACES}
       {BLK}"
CB 410 PRINT SPC(12)"{BLK}{RVS}{OFF}";:FOR A=1 TO 11:
       PRINT "{WHT}$ ";:NEXT A:PRINT" {BLK}{RVS}{OFF}"
BC 420 FOR A=1 TO 11
QA 430 PRINTSPC(12-A)"{BLK}{RVS}{OFF}{WHT}& ";:
       FOR B=1 TO 10:PRINT"# ";:NEXT:PRINT"){RVS}{BLK}{OFF}":NEXTA
GP 440 PRINT "{BLK}{RVS}{OFF}{2 SPACES}";:FOR A=1 TO 11:
       PRINT"{WHT}% ";:NEXT:PRINT "{LEFT}{BLK}{RVS}{OFF}"
FM 450 PRINT "{BLK}{YEL}{RVS}{23 SPACES}{OFF}[<H>]{BLK}":PRINT "{HOME}{7 SPACES}";
XJ 460 POKE 1827,39:POKE 56099,1:POKE 1459,40:POKE 55731,1
GH 470 PRINT "{BLK}{RVS}[<K>]{2 SPACES}{OFF}{9 SPACES}{RVS}[<K>]{OFF}[<K>]
       {RVS}[<K>]{OFF}[<K>]{BLK}"SPC(24)"{RVS}[<K>]{OFF}[<K>]{RVS}[<K>]{OFF}[<K>]"
       SPC(8)"{RVS}[<K>]{OFF}[<K>]{RVS}[<K>]{OFF}[<K>]"SPC(24);
MJ 480 PRINT "{RVS}[<K>]{OFF}[<K>]{RVS}[<K>]{OFF}[<K>]{RVS}[<K>][<D>][<I>]{OFF}[<V>]
       {RVS}[<K>][<D>][<I>]{OFF}[<V>]{RVS}[<K>]{OFF}[<K>]{RVS}[<K>]{OFF}[<K>] {RVS}
       [<F>][<D>]{OFF} {RVS}[<K>]{OFF}[<K>]{RVS}[<K>]{OFF}[<K>]{RVS}[<K>]
       [<D>][<I>]{OFF}[<V>]"SPC(12)"{RVS}[<K>]{2 SPACES}{OFF} {RVS}[<K>][<C>]";
PP 490 PRINT "{OFF}[<F>] {RVS}[<K>][<C>]{OFF}[<F>] {RVS}[<K>]
       {2 SPACES}{OFF}[<K>] {RVS}[<K>]{OFF}[<K>] {RVS}[<K>]{OFF}[<K>]{RVS}[<K>]
       {OFF}[<K>]{RVS}[<K>][<C>]{OFF}[<F>]{YEL}"SPC(13)"
       {RVS}[<K>]{OFF}[<K>]{RVS}[<K>]{OFF}[<K>]{RVS}[<K>]
       {OFF}[<K>]{2 SPACES}{RVS}[<K>]{OFF}[<K>]{2 SPACES}{RVS}[<K>]";
HD 500 PRINT "{OFF}[<K>]{RVS}[<K>]{OFF}[<K>] {RVS}[<K>]{OFF}
       [<K>] [<C>]{RVS}[<C>][<V>]{OFF}[<V>]{RVS}[<K>]{OFF}[<K>]
       {BLK}"SPC(14)"{RVS}[<K>]{OFF}[<K>]{RVS}[<K>]{OFF}
       [<K>][<C>]{RVS}[<2 I>]{OFF}[<V>][<C>]{RVS}[<2 I>]{OFF}
       [<V>]{RVS}[<K>]{OFF}[<K>]{RVS}[<K>]{OFF}[<K>] {RVS}
       [<2 I>]{OFF} ";
FC 510 PRINT " [<C>][<V>] [<C>]{RVS}[<2 I>]{OFF}[<V>]"SPC(12)"{RVS}[<K>]
       {2 SPACES}{OFF}"SPC(9)"{RVS}[<K>]{OFF}[<K>]{RVS}[<K>]{OFF}[<K>]":
SH 520 POKE 53248,30:POKE 53264,1:POKE 53249,150:RETURN
JF 530 FOR A=54272 TO 54295:POKE A,0:NEXT:POKE 54296,15:POKE 54277,25
MX 540 DIM TA(11,11,2),EH(61),EV(61)
SE 550 DIM BD(11,11),SH(50),SV(50):SP$="{RVS}":FOR A=1 TO 20:SP$=SP$+" ":
       NEXT:RETURN
KM 560 POKE 53249,0:TX=X*16+(11-Y)*8+36:POKE 53248,TX AND 255
PS 570 POKE 53264,-(TX>255):POKE 53249,Y*8+120:POKE 53269,1:RETURN
BM 580 POKE 54273,F:POKE 54276,16:POKE 54276,17:RETURN
XQ 590 POKE54273,10:POKE54276,64:POKE54276,65:FORZZ=15TO1STEP-.3:
       POKE54275,ZZ:NEXT
HP 600 RETURN
PG 610 CH=X:CV=Y:LC=0:RC=0:FOR X=-1 TO 1:TH=CH+X
JK 620 TV=CV-1-(X=1):GOSUB 780
JG 630 TV=CV-(X>-1):GOSUB 780
BK 640 NEXT
PM 650 IF P=1 AND CH=1 OR P=2 AND CV=1 THEN LC=1
EK 660 IF P=1 AND CH=11 OR P=2 AND CV=11 THEN RC=2
QJ 670 CC=LC+RC:IF CC=3 THEN BD(CH,CV)=UN+1:GOTO 850
JA 680 IF CC=0 THEN 770
BS 690 SP=0:SH(0)=CH:SV(0)=CV
AM 700 IF SP=-1 THEN 770
RC 710 DH=SH(SP):DV=SV(SP):SP=SP-1
CH 720 BD(DH,DV)=UN+CC
EP 730 FOR X=-1 TO 1:TH=DH+X
FJ 740 TV=DV-1-(X=1):GOSUB 820
JH 750 TV=DV-(X>-1):GOSUB 820
MC 760 NEXT:GOTO 700
ED 770 X=CH:Y=CV:UN=5-UN:RETURN
DD 780 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
DP 790 IF BD(TH,TV)=UN+1 THEN LC=1
PS 800 IF BD(TH,TV)=UN+2 THEN RC=2
SK 810 RETURN
SA 820 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
FP 830 IF BD(TH,TV)=UN THEN SP=SP+1:SH(SP)=TH:SV(SP)=TV
CM 840 RETURN
PM 850 POKE 53248,33:POKE 53264,1:POKE 53249,195
PS 860 FOR ZZ=1 TO 20:POKE 646,ZZ:B$=" YOU WIN ":GOSUB 1170:NEXT:GOSUB 1160
CQ 870 FOR CC=1 TO 2:FE=1:LE=1:EH(1)=CH:EV(1)=CV:EF=0:L=1
HA 880 CD=CH:IF P=2 THEN CD=CV
KF 890 IF CC=1 AND CD=1 OR CC=2 AND CD=11 THEN HH(CC)=0:GOTO 990
HB 900 NE=LE:E=FE
RA 910 DH=EH(E):DV=EV(E)
JQ 920 FOR X=-1 TO 1:TH=DH+X:TV=DV-1-(X=1):GOSUB 1090:TV=DV-(X>-1):GOSUB 1090:NEXT
GM 930 IF EF=1 THEN 990
XS 940 IF (E=LE) THEN 970
EK 950 E=E+1:IF E=61 THEN E=1
XA 960 GOTO 910
CM 970 FE=LE+1:LE=NE:IF FE=61 THEN FE=1
EC 980 L=L+1:GOTO 900
AE 990 NEXT:FOR CC=1 TO 2:DH=HH(CC):DV=VV(CC):L=TA(DH,DV,CC):IF DH=0 THEN 1040
BF 1000 POKE781,DV+9:POKE782,DH*2-DV+13:POKE783,0:SYS 65520:
        PRINT"{OFF}[<6>]*":GOSUB 590
ED 1010 IF L=1 THEN 1040
QQ 1020 FORX=-1 TO 1:TH=DH+X:TV=DV-1-(X=1):GOSUB1060:TV=DV-(X>-1):GOSUB1060:NEXT
KM 1030 L=L-1:DH=AH:DV=AV:GOTO 1000
EA 1040 NEXT:POKE781,CV+9:POKE782,CH*2-CV+13:POKE783,0:SYS65520:
        PRINT"[<6>]*":GOSUB590
HH 1050 GOTO 1190
AC 1060 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
MF 1070 IF TA(TH,TV,CC)=L-1 THEN AH=TH:AV=TV
XF 1080 RETURN
KB 1090 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
QJ 1100 IF BD(TH,TV)<>UN+CC OR TA(TH,TV,CC)<>0 THEN RETURN
FB 1110 TA(TH,TV,CC)=L:NE=NE+1:IF NE=61 THEN NE=1
FF 1120 EH(NE)=TH:EV(NE)=TV
SD 1130 CD=TH:IF P=2 THEN CD=TV
DP 1140 IF CC=1 AND CD=1 OR CC=2 AND CD=11 THEN EF=1:HH(CC)=TH:VV(CC)=TV
SK 1150 RETURN
KH 1160 POKE 646,7*(P-1)
FR 1170 POKE 214,23:PRINT:A$=LEFT$(SP$,(16-LEN(PN$(P))/2))+B$+PN$(P)
JA 1180 PRINT " "A$;LEFT$(SP$,40-LEN(A$));:RETURN
CQ 1190 POKE 214,23:PRINT:PRINT "{WHT}{13 SPACES}{RVS}PRESS FIREBUTTON{OFF}{10 SPACES}";
PE 1200 WAIT 56321,16,16:POKE 214,23:PRINT:PRINT SPC(12)"{OFF}{20 SPACES}";
AR 1210 FOR A=1 TO 11:FOR B=1 TO 11:FOR C=1 TO 2:TA(A,B,C)=0:BD(A,B)=0
XA 1220 NEXT C,B,A:POKE 53269,0:GOTO 120

Program 3: Atari Beehive

Version by Kevin Mykytyn, Editorial Programmer

For instructions on entering this listing, please refer to "COMPUTE!'s Guide to Typing In Programs" in this issue of COMPUTE!.

BI 10 POKE 106,95:GOSUB 2000:GOTO 80
LG 20 FL=0:GOSUB 560
NK 30 JV=15-STICK(0)+128*(STRIG(0)=0):IF JV>127 THEN RETURN
JC 40 IF JV=0 THEN 30
NP 50 POKE 77,0:TX=X:TY=Y:TX=TX+X(JV):TY=TY+Y(JV)
DG 60 IF TX<1 OR TX>11 OR TY<1 OR TY>11 THEN 30
IJ 70 X=TX:Y=TY:FL=0:GOSUB 560:GOTO 30
FK 80 GOSUB 530:GOSUB 170:PRINT "{CLEAR}"
OC 90 DIM T$(30),TM$(30),NAME$(40),LENGTH(2):FOR A=1 TO 40:NAME$(A,A)="":NEXT A:
      POSITION 17,10:PRINT "BEEHIVE"
HE 100 FOR A=1 TO 2:PRINT "{2 DOWN}ENTER YOUR NAME PLAYER ";A;" ";:INPUT T$
EC 101 IF T$="" THEN T$=" "
OB 105 IF LEN(T$)>15 THEN T$=T$(1,15)
NA 106 LENGTH(A)=LEN(T$)
EC 110 NAME$((A-1)*15+1,(A-1)*15+LEN(T$))=T$:NEXT A:OY=1
OL 120 GOSUB 400:X=1:P=1:UN=1:Y=1
EB 140 T$="YOUR TURN ":GOSUB 4000:POKE 712,150-98*(P=2)
AG 145 GOSUB 20:LOCATE X*2-Y+14,Y+5,SP:POSITION X*2-Y+14,Y+5:PRINT CHR$(SP)
LO 150 IF SP<>32 THEN SOUND 1,100,12,15:FOR TD=1 TO 50:NEXT TD:SOUND 1,0,0,0:GOTO 140
NL 160 BD(X,Y)=UN:POSITION X*2-Y+14,Y+5:PRINT CHR$(42+P):GOSUB 590
CP 162 GOSUB 610:P=3-P:GOTO 140
EC 170 FOR A=0 TO 1023:POKE 24576+A,PEEK(57344+A):NEXT A
GM 175 FOR A=25600 TO 25856:POKE A,0:NEXT A
CP 180 FOR I=24600 TO 24703:READ J:POKE I,J:NEXT I
IN 210 FOR A=0 TO 10:READ X,Y:X(A)=X:Y(A)=Y:NEXT A
KP 220 POKE 54279,64:POKE 53277,3:POKE 559,62:POKE 623,1:POKE 704,0:RETURN
NJ 230 DATA 231,126,24,24,24,24,126,231
DD 240 DATA 0,0,0,0,0,0,126,231
DE 250 DATA 231,126,0,0,0,0,0,0
EH 260 DATA 7,30,24,24,24,24,126,231
LD 270 DATA 7,30,24,24,24,24,30,7
NG 280 DATA 224,120,24,24,24,24,120,224
NL 290 DATA 231,126,24,24,24,24,120,224
CC 300 DATA 195,36,126,219,255,126,36,24
GK 301 DATA 0,40,170,170,170,170,40,0
LL 302 DATA 0,20,85,85,85,85,20,0
LI 303 DATA 2,2,8,8,32,32,128,128
KC 304 DATA 85,0,0,0,0,0,0,0
KD 305 DATA 0,0,0,0,0,0,0,85
MI 310 DATA 0,0,0,-1,0,1,0,0,-1,0,0,0,0,0,0,0,1,0,0,0,0,0
KE 400 GOSUB 2000:POKE 756,96:POKE 752,1:DL=PEEK(560)+256*PEEK(561):
       POKE DL+6,7:POKE DL+3,71
NO 405 POSITION 5,0:PRINT "* BEEHIVE *":POSITION 15,4:PRINT "////////////////////////"
FF 410 PRINT SPC$(1,12);"-";:FOR A=1 TO 11:PRINT "$ ";:NEXT A:PRINT " -"
DB 420 FOR A=1 TO 11
MO 430 PRINT SPC$(1,12-A);"-& ";:FOR B=1 TO 10:PRINT "# ";:NEXT B:PRINT ")-":NEXT A
CB 440 PRINT "-  ";:FOR A=1 TO 11:PRINT "% ";:NEXT A:PRINT "{LEFT}-"
CJ 450 PRINT "........................":POSITION 4,16:PRINT "'":
       POSITION 36,6:PRINT "(":RETURN
DH 530 DIM TA(11,35),EH(61),EV(61),BD(11,11),SH(50),SV(50),SP$(20),X(10),Y(10),
       SPC$(20),HH(15),VV(15)
GC 535 POKE 752,1:POSITION 14,10:PRINT "PLEASE WAIT"
PH 540 GOSUB 3000:FOR A=1 TO 20:SP$(A,A)="-":SPC$(A,A)=" ":NEXT A:RETURN
EM 560 LB=PEEK(88):HB=PEEK(89):POKE 752,1:POKE 89,100:POKE 88,OY*8+99:POSITION 0,0:
       PRINT "{8 SPACES}":IF FL THEN 575
ID 570 POKE 53248,X*8+(11-Y)*4+61:POKE 88,Y*8+99:POSITION 0,0:PRINT "x{.}P8,&# "
BM 575 POKE 88,LB:POKE 89,HB:OY=Y:RETURN
OP 590 FOR T=15 TO 0 STEP -0.4:SOUND 1,100,10,T:NEXT T:RETURN
JL 610 CH=X:CV=Y:LC=0:RC=0:FOR X=-1 TO 1:TH=CH+X
BB 620 TV=CV-1+(X=1):GOSUB 780
OC 630 TV=CV+(X>-1):GOSUB 780
DB 640 NEXT X
BK 650 IF P=1 AND CH=1 OR P=2 AND CV=1 THEN LC=1
IE 660 IF P=1 AND CH=11 OR P=2 AND CV=11 THEN RC=2
BA 670 CC=LC+RC:IF CC=3 THEN BD(CH,CV)=UN+1:GOTO 850
ON 680 IF CC=0 THEN 770
AH 690 SP=0:SH(0)=CH:SV(0)=CV
DB 700 IF SP=-1 THEN 770
LJ 710 DH=SH(SP):DV=SV(SP):SP=SP-1
FD 720 BD(DH,DV)=UN+CC
GK 730 FOR X=-1 TO 1:TH=DH+X
BA 740 TV=DV-1+(X=1):GOSUB 820
OB 750 TV=DV+(X>-1):GOSUB 820
DO 760 NEXT X:GOTO 700
GA 770 X=CH:Y=CV:UN=5-UN:RETURN
MG 780 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
OA 790 IF BD(TH,TV)=UN+1 THEN LC=1
OA 800 IF BD(TH,TV)=UN+2 THEN RC=2
HJ 810 RETURN
MB 820 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
MB 830 IF BD(TH,TV)=UN THEN SP=SP+1:SH(SP)=TH:SV(SP)=TV
HM 840 RETURN
GA 850 FL=1:GOSUB 560:T$="YOU WIN ":GOSUB 4000:FOR A=255 TO 0 STEP -1:POKE 712,A:NEXT A
HA 860 POSITION 0,20:PRINT "{15 SPACES}SEARCHING{13 SPACES}"
BP 870 FOR CC=1 TO 2:FE=1:LE=1:EH(1)=CH:EV(1)=CV:EF=0:L=1
AD 880 CD=CH:IF P=2 THEN CD=CV
JD 890 IF CC=1 AND CD=1 OR CC=2 AND CD=11 THEN HH(CC)=0:GOTO 990
EB 900 NE=LE:E=FE
MI 910 DH=EH(E):DV=EV(E)
MK 920 FOR X=-1 TO 1:TH=DH+X:TV=DV-1+(X=1):GOSUB 1090:TV=DV+(X>-1):GOSUB 1090:NEXT X
PF 930 IF EF=1 THEN 990
FP 940 IF (E=LE) THEN 970
FF 950 E=E+1:IF E=61 THEN E=1
HC 960 GOTO 910
BA 970 FE=LE+1:LE=NE:IF FE=61 THEN FE=1
NO 980 L=L+1:GOTO 900
AO 990 NEXT CC:FOR CC=1 TO 2:DH=HH(CC):DV=VV(CC):L=TA(DH,DV*3+CC):IF DH=0 THEN 1040
CI 1000 POSITION DH*2-DV+14,DV+5:PRINT "*":GOSUB 590
PP 1010 IF L=1 THEN 1040
OM 1020 FOR X=-1 TO 1:TH=DH+X:TV=DV-1+(X=1):GOSUB 1060:TV=DV+(X>-1):GOSUB 1060:NEXT X
FP 1030 L=L-1:DH=AH:DV=AV:GOTO 1000
CI 1040 NEXT CC:POSITION CH*2-CV+14,CV+5:PRINT "*":GOSUB 590
MH 1050 GOTO 1160
OO 1060 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
ON 1070 IF TA(TH,TV*3+CC)=L-1 THEN AH=TH:AV=TV
KJ 1080 RETURN
PB 1090 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
CI 1100 IF BD(TH,TV)<>UN+CC OR TA(TH,TV*3+CC)<>0 THEN RETURN
NL 1110 TA(TH,TV*3+CC)=L:NE=NE+1:IF NE=61 THEN NE=1
KO 1120 EH(NE)=TH:EV(NE)=TV
EK 1130 CD=TH:IF P=2 THEN CD=TV
OG 1140 IF CC=1 AND CD=1 OR CC=2 AND CD=11 THEN EF=1:HH(CC)=TH:VV(CC)=TV
KH 1150 RETURN
JF 1160 POSITION 0,20:PRINT "{12 SPACES}PRESS FIREBUTTON{8 SPACES}"
AM 1165 IF STRIG(0)<>0 THEN 1165
IK 1170 POSITION 0,20:PRINT "{36 SPACES}":GOSUB 3000:GOTO 120
GE 2000 GRAPHICS 0:POKE 710,15:POKE 709,0:POKE 708,45:POKE 54279,96:
        POKE 559,62:POKE 704,102:RETURN
DI 3000 FOR A=1 TO 11:FOR B=1 TO 35:TA(A,B)=0:NEXT B:NEXT A:
        FOR A=1 TO 11:FOR B=1 TO 11:BD(A,B)=0:NEXT B:NEXT A
KE 3010 RETURN
PL 4000 TM$=T$:TM$(LEN(T$)+1,LEN(T$)+LENGTH(P))=NAME$((P-1)*15+1,(P-1)*15+LENGTH(P))
AJ 4005 POSITION 2,20:PRINT "{33 SPACES}"
FL 4010 POSITION 19-LEN(TM$)/2,20:PRINT TM$:RETURN

Note: As originally listed in the magazine, the game board interior would not be display properly. In line 10, the original code did a "POKE 106,96" which sets the top area of RAM. The author proceeded to use the space above that for the new character set used to draw the board. However, both clearing the screen or setting the graphics mode clears the frist 64 bytes above the top area, so part of the character set was erased. I've altered the line and checksum to account for this.

Also note that this program uses artifacting to generate the colors of the chosen cells. If you are running this in an emulator, you may have to turn artifacting on to see the colors properly.


Program 4: Apple II Beehive

Version by Tim Victor, Editorial Programmer

For instructions on entering this listing, please refer to "COMPUTE!'s Guide to Typing In Programs' in this issue of COMPUTE!.

0D 100 LOMEM:16384:DIM BD(11,11),SH(50),SV(50),TA(11,11,2),EH(61),EV(61)
6F 110 FOR A=768 TO A+88:READ D:POKE A,D:NEXT:READ D:IF D<>-1 THEN 1070
A6 120 FOR A=35328 TO A+7:POKE A,0:NEXT
38 130 FOR A=35840 TO A+79:READ D:POKE A,D:NEXT:READ D:IF D<>-1 THEN 1070
44 140 TEXT:HOME:FOR I=1 TO 2
3D 150 PRINT "PLAYER "I"'S NAME:";:INPUT "";A$:NN$(I)=LEFT$(A$,24):NEXT
87 160 POKE 6,0:POKE 7,138:IF PEEK(190*256)<>76 THEN POKE 54,0:POKE 55,3:
       CALL 1002:GOTO 180
B6 170 PRINT CHR$(4);"PR#A$300"
59 180 GOSUB 850
FD 190 P=1:UN=1:NH=6:NV=6:CH=6:CV=6:GOSUB 930
7A 200 HTAB 1:VTAB 21:CALL -868:PRINT NN$(P)"'";:S=ASC(RIGHT$(NN$(P),1)):
       IF S-32*(S>96)<>83 THEN PRINT "S";
C9 210 PRINT " TURN":VTAB 20:HTAB 1:PRINT CHR$(96+P)
99 220 IF PEEK(49249)>127 THEN 290
A3 230 IF PDL(0)<90 THEN NH=NH-1:IF NH<1 THEN NH=1
23 240 IF PDL(0)>165 THEN NH=NH+1:IF NH>11 THEN NH=11
21 250 IF PDL(1)<90 THEN NV=NV-1:IF NV<1 THEN NV=1
9B 260 IF PDL(1)>165 THEN NV=NV+1:IF NV>11 THEN NV=11
EC 270 IF CH<>NH OR CV<>NV THEN GOSUB 960:CH=NH:CV=NV:GOSUB 930
1E 280 GOTO 220
FE 290 IF BD(CH,CV)<>0 THEN PRINT CHR$(7);:GOTO 230
CB 300 BD(CH,CV)=UN
07 310 GOSUB 960:GOSUB 930
8D 320 IF PEEK(49249)>127 THEN 320
D7 330 LC=0:RC=0:FOR X=-1 TO 1:TH=CH+X
E7 340 TV=CV-1+(X=1):GOSUB 500
06 350 TV=CV+(X>-1):GOSUB 500
07 360 NEXT
5B 370 IF P=1 AND CH=1 OR P=2 AND CV=1 THEN LC=1
9C 380 IF P=1 AND CH=11 OR P=2 AND CV=11 THEN RC=2
7E 390 CC=LC+RC:IF CC=3 THEN 570
D1 400 IF CC=0 THEN 490
68 410 SP=0:SH(0)=CH:SV(0)=CV
C0 420 IF SP=-1 THEN 490
2D 430 DH=SH(SP):DV=SV(SP):SP=SP-1
38 440 BD(DH,DV)=UN+CC
C9 450 FOR X=-1 TO 1:TH=DH+X
2F 460 TV=DV-1+(X=1):GOSUB 540
4C 470 TV=DV+(X>-1):GOSUB 540
70 480 NEXT:GOTO 420
1D 490 P=3-P:UN=5-UN:GOTO 200
FE 500 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
2A 510 IF BD(TH,TV)=UN+1 THEN LC=1
37 520 IF BD(TH,TV)=UN+2 THEN RC=2
1B 530 RETURN
07 540 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
D5 550 IF BD(TH,TV)=UN THEN SP=SP+1:SH(SP)=TH:SV(SP)=TV
21 560 RETURN
80 570 GOSUB 960:VTAB 21:HTAB 1:CALL - 868:PRINT NN$(P)" WINS!":
       PRINT "CHECKING BOARD"
1E 580 FOR CC=1 TO 2:FE=1:LE=1:EH(1)=CH:EV(1)=CV:EF=0:L=1
C1 590 CD=CH:IF P=2 THEN CD=CV
CD 600 IF CC=1 AND CD=1 OR CC=2 AND CD=11 THEN HH(CC)=0:GOTO 700
4D 610 NE=LE:E=FE
D5 620 DH=EH(E):DV=EV(E)
D9 630 FOR X =-1 TO 1:TH=DH+X:TV=DV-1+(X=1):GOSUB 780:TV=DV+(X>-1):
       GOSUB 780:NEXT
FB 640 IF EF=1 THEN 700
19 650 IF (E=LE) THEN 680
5E 660 E=E+1:IF E=61 THEN E=1
22 670 GOTO 620
F1 680 FE=LE+1:LE=NE:IF FE=61 THEN FE=1
55 690 L=L+1:GOTO 610
0B 700 NEXT:FOR CC=1 TO 2:DH=HH(CC):DV=VV(CC):L=TA(DH,DV,CC):IF DH=0 THEN 740
B0 710 HTAB DH*2-DV+14:VTAB DV+5:PRINT CHR$(105);:IF L=1 THEN 740
C9 720 FOR X=-1 TO 1:TH=DH+X:TV=DV-1+(X=1):GOSUB 750:TV=DV+(X>-1):GOSUB 750:NEXT
3C 730 L=L-1:DH=AH:DV=AV:GOTO 710
1C 740 NEXT:HTAB CH*2-CV+14:VTAB CV+5:PRINT CHR$(105);:GOSUB 1010:GOTO 180
0B 750 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
DD 760 IF TA(TH,TV,CC)=L-1 THEN AH=TH:AV=TV
25 770 RETURN
11 780 IF TH<1 OR TH>11 OR TV<1 OR TV>11 THEN RETURN
9F 790 IF BD(TH,TV)<>UN+CC OR TA(TH,TV,CC)<>0 THEN RETURN
76 800 TA(TH,TV,CC)=L:NE=NE+1:IF NE=61 THEN NE=1
89 810 EH(NE)=TH:EV(NE)=TV
1D 820 CD=TH:IF P=2 THEN CD=TV
11 830 IF CC=1 AND CD=1 OR CC=2 AND CD=11 THEN EF=1:HH(CC)=TH:VV(CC)=TV
20 840 RETURN
F9 850 HGR:HOME:FOR I=6 TO 16:VTAB I:HTAB 20-I
95 860 FOR J=1 TO 11:PRINT CHR$(96);CHR$(32);:NEXT:PRINT CHR$(96);
B0 870 FOR J=0 TO 1:HTAB 18-I+J:PRINT CHR$(99+J+2*(I<>2*INT(I/2)));:
       HTAB 43-I+J:PRINT CHR$(99+J+2*(I=2*INT(I/2)));:NEXT
6A 880 NEXT:HCOLOR=4:FOR I=0 TO 4:HPLOT 92+I,38 TO 14+I,127:
       HPLOT 255+I,38 TO 177+I,127:NEXT
08 890 VTAB 5:HTAB 13:PRINT CHR$(101);
E6 900 FOR J=1 TO 12:PRINT CHR$(103);CHR$(104);:NEXT:PRINT CHR$(99);
22 910 VTAB 17:HTAB 2:PRINT CHR$(102);
0E 920 FOR J=1 TO 12:PRINT CHR$(104);CHR$(103);:NEXT:PRINT CHR$(100);:RETURN
A8 930 HCOLOR=7
F4 940 GV=CV*8+32:GH=92+7*(CH*2-CV)
8F 950 HPLOT GH,GV TO GH+4,GV TO GH+7,GV+4 TO GH+4,GV+7 TO GH,GV+7 TO
       GH-3,GV+3 TO GH,GV:RETURN
5D 960 HCOLOR=4:GOSUB 940
5A 970 VTAB CV+5:HTAB 14+CH*2-CV:A$=CHR$(32)
F2 980 IF BD(CH, CV)>3 THEN A$=CHR$(97+(CV<>2*INT(CV/2))):GOTO 1000
E2 990 IF BD(CH,CV)>0 THEN A$=CHR$(98-(CV<>2*INT(CV/2)))
FD 1000 PRINT A$;:RETURN
85 1010 VTAB 22:HTAB 1:PRINT "PRESS KEY TO QUIT, BUTTON TO PLAY AGAIN"
ED 1020 IF PEEK(49249)>127 THEN 1050
82 1030 IF PEEK(49152)<128 THEN 1020
5F 1040 POKE 49168,0:NORMAL:END
EA 1050 HGR:FOR I=1 TO 11:FOR J=1 TO 11:BD(I,J)=0:TA(I,J,1)=0:
        TA(I,J,2)=0:NEXT:NEXT
E9 1060 RETURN
2F 1070 PRINT "ERROR IN DATA STATEMENTS":END
B2 1080 DATA 216,120,133,69,134,70,132,71,166,7,10
FA 1090 DATA 10,176,4,16,62,48,4,16,1,232,232
F6 1100 DATA 10,134,27,24,101,6,133,26,144,2,230
93 1110 DATA 27,165,40,133,8,165,41,41,3,5,230
BA 1120 DATA 133,9,162,8,160,0,177,26,36,50,48
31 1130 DATA 2,73,127,164,36,145,8,230,26,208,2
C2 1140 DATA 230,27,165,9,24,105,4,133,9,202,208
69 1150 DATA 226,165,69,166,70,164,71,88,76,240,253
05 1160 DATA 255
25 1170 DATA -1
CE 1180 DATA 193,182,156,156,156,156,182,193,128,136,170
0A 1190 DATA 170,170,170,136,128,128,148,213,213,213,213
FC 1200 DATA 148,128,128,128,192,192,192,208,208,148,138
A4 1210 DATA 138,130,130,128,128,128,128,128,128,128,128
EA 1220 DATA 160,160,168,168,148,133,133,129,129,129,128
BB 1230 DATA 128,128,128,170,170,170,170,128,128,128,128
C7 1240 DATA 213,213,213,213,128,128,193,162,156,201,201
25 1250 DATA 190,156,136
23 1260 DATA -1

Program 5: IBM PC/PCjr Beehive

Version by Patrick Parrish, Programming Supervisor

For instructions on entering this listing, please refer to "COMPUTE!'s Guide to Typing In Programs" in this issue of COMPUTE!.

MI 10 KEY OFF:DEF SEG=0:POKE 1047,PEEK (1047) OR 64:GOTO 20
JD 20 GOSUB 350
LC 30 GOSUB 650
NP 40 REM START
QL 50 RANDOMIZE TIMER
HB 60 WINNER=0:PREV.PLAYER=0:ROW=6:COL=6:CB=146:RB=89
MC 70 PLAYER=INT(2*RND+1)
JG 80 LOCATE 12,11:PRINT "Please wait a moment"
KJ 90 FOR J=1 TO 11:FOR K=1 TO 11:HIVE%(J,K)=0:NEXT K:NEXTJ
HG 100 FOR J=1 TO 20:PATHLEN(J)=0:NEXT J
AA 110 FOR J=1 TO 65:PATH%(J)=0:USED%(J)=0:NODE%(J)=0:NEXT J
II 120 GOSUB 700:LOCATE 24,1:PRINT "Player:";
AE 130 REM MAIN
PC 140 IF PREV.PLAYER=PLAYER THEN 170
EP 150 LOCATE 24,8:PRINT "{15 SPACES}";:LOCATE 24,8:PRINT PLAYER$(PLAYER);:
       IF PLAYER=1 THEN PUT(270,130),EYES1,PSET ELSE PUT(270,130),EYES2,PSET
NH 160 PREV.PLAYER=PLAYER
MN 170 PUT(CB,RB),BEE
DN 180 DEF SEG=0:POKE 1050,PEEK(1052)
OK 190 A$=RIGHT$(INKEY$,1):IF LEN(A$)=0 THEN 190
PO 200 PUT(CB,RB),BEE:OCOL=COL:OROW=ROW
MN 210 IF A$=CHR$(77) THEN ROW=ROW+1:COL=COL+1:
       IF ROW>11 OR COL>11 THEN ROW=OROW:COL=OCOL ELSE RB=RB+15:CB=CB+9
CB 220 IF A$=CHR$(75) THEN ROW=ROW-1:COL=COL-1:
       IF ROW<1 OR COL<1 THEN ROW=OROW:COL=OCOL ELSE RB=RB-15:CB=CB-9
CH 230 IF A$=CHR$(72) THEN ROW=ROW-1-(ROW=1):IF ROW<>OROW THEN CB=CB+9:RB=RB-15
HD 240 IF A$=CHR$(80) THEN ROW=ROW+1+(ROW=11):IF ROW<>OROW THEN CB=CB-9:RB=RB+15
MK 250 PUT (CB,RB),BEE
PA 260 IF A$=" " THEN GOSUB 1050 ELSE 180
BB 270 IF USED THEN PUT(CB,RB),BEE:GOTO 140
OG 280 OROW=ROW:OCOL=COL:GOSUB 1110
NG 290 IF POSSIBLE=1 THEN GOSUB 1290
IH 300 IF WINNER=1 THEN 1880
PD 310 LOCATE 24,1:PRINT "Player:";
CC 320 IF PLAYER=1 THEN PLAYER=2 ELSE PLAYER=1
BC 330 ROW=OROW:COL=OCOL:GOTO 140
LO 340 REM INIT
AC 350 CLS:COLR(1)=2:COLR(2)=3
EA 360 DIM ROW.INC%(6),COL.INC%(6)
DH 370 FOR J=1 TO 6:READ ROW.INC%(J),COL.INC%(J):NEXT J
NK 380 DATA -1,-1,0,1,1,1,1,0,0,-1,-1,-1
GP 390 DIM HIVE%(11,11)
EA 400 DIM USED%(65),NODE%(65),PATH%(65),PATHLEN(20)
HK 410 SCREEN 1:COLOR 1,2:DEFINT B
IN 420 DIM HEXA(100),BALL1(100),BALL2(100),EYES1(100),EYES2(100)
NH 430 LINE (30,10)-(21,15),3:LINE-STEP (0,10),3:LINE-STEP (9,5),3
PB 440 LINE-STEP (9,-5),3:LINE-STEP (0,-10),3:LINE-STEP (-9,-5),3
NI 450 LINE (30, 11)-(22,16),2:LINE-STEP (0,9),2:LINE-STEP(8,4),2
JB 460 LINE-STEP (7,-4),6:LINE-STEP(0,-10),6:LINE-STEP (-7,-4),6
FP 470 GET (21,10)-(39,30),HEXA
HE 480 CLS:CIRCLE(30,20),5,COLR(1):PAINT(30,20),COLR(1):GET(25,16)-(35,24),BALL1
HG 490 GOSUB 580:GET (23,12)-(37,25),EYES1
BJ 500 CLS:CIRCLE(30,20),5,COLR(2):PAINT(30,20),COLR(2):GET(25,16)-(35,24),BALL2
MC 510 GOSUB 580:GET(23,12)-(37,25),EYES2:CLS
OA 520 READ X,Y:E=(4+INT((X+7)/8)*Y)/2:DIM BEE(E):BEE(0)=X:BEE(1)=Y:
       FOR I=2 TO E:READ A$:BEE(I)=VAL("&H"+A$):NEXT
JL 530 DATA 26,6,828,A,5AA,802A,95AA,80AA
HK 540 DATA 952A,AA,8002,A0,1500,0,0,0
NP 550 DATA 500,0,0
NL 560 RETURN
BN 570 REM PARTS
KF 560 CIRCLE(26,19),2,1:CIRCLE(34,19),2,1
EF 590 PAINT(26,19),1:PAINT(34,19),1
IE 600 PSET(29,17):LINE-STEP(-2.5,-5):LINE-STEP (-2.5,3)
OC 610 PSET(31,17):LINE-STEP(2.5,-5):LINE-STEP (2.5,3)
AA 620 CIRCLE(30,24),1,1:PAINT(30,24),1
MG 630 RETURN
DE 640 REM GETNAMES
GB 650 LOCATE 12,16:PRINT "BeeHive":PUT (84,84),EYES1:PUT(192,86),EYES2
HC 660 FOR I=1 TO 2:LOCATE 19+I*2-1,6:PRINT "Player"I"'s name";
MI 670 INPUT PLAYER$(I):PLAYER$(I)=LEFT$(PLAYER$(I),15):NEXT I
IM 660 CLS:RETURN
JC 690 REM DRAWSCREEN
LD 700 CLS:Y=7
MF 710 FOR R=1 TO 11
CD 720 X=90-R*9
EC 730 FOR C=1 TO 11
IO 740 X=X+18
BM 750 PUT(X,Y),HEXA,OR
KN 760 NEXT C
HC 770 Y=Y+15
DH 760 NEXT R
GL 790 PSET (297,12),2:GOSUB 930:LINE-STEP (0,10),2
FH 800 PSET (298,12),2:GOSUB 950:LINE-STEP (0,10),2
GG 810 PSET (299,12),2:GOSUB 930:LINE-STEP (0,10),2
NJ 820 PSET (96,12),2:GOSUB 930:LINE-STEP (0,10),2
NH 830 PSET (97,12),2:GOSUB 950:LINE-STEP (0 10),2
OF 840 PSET (98,12),2:GOSUB 930:LINE-STEP (0 10),2
CB 850 Y1=-5:Y2=5:PSET (99,9),3:GOSUB 990
NL 860 PSET (99,10),3:GOSUB 990
CK 870 PSET (100, 11),3:GOSUB 990
CO 880 Y1=5:Y2=-5:PSET (9,173),3:GOSUB 990
AG 890 PSET (9,174),3:GOSUB 990
AE 900 PSET (9,175),3:GOSUB 990
MF 910 RETURN
QO 920 REM UPNDOWN
HC 930 FOR J=1 TO 10
HC 940 LINE-STEP (0, 10),COLR(1)
CG 950 LINE-STEP (-9,5),COLR(1)
OF 960 NEXT J
NB 970 RETURN
PO 980 REM ACROSS
GF 990 FOR J=1 TO 11
KA 1000 LINE-STEP (9,Y1),COLR(2)
LH 1010 LINE-STEP (9,Y2),COLR(2)
GA 1020 NEXT J
IE 1030 RETURN
PN 1040 REM SET PIECE
NB 1050 USED=0
LF 1060 IF HIVE%(ROW,COL)<>0 THEN USED=1:RETURN
LL 1070 HIVE%(ROW,COL)=PLAYER
FA 1080 PUT (CB,RB),BEE:IF PLAYER=1 THEN PUT(CB+1,RB-1),BALL1 ELSE
        PUT(CB+1,RB-1),BALL2
JG 1090 RETURN
GJ 1100 REM CHECKLINE
BI 1110 POSSIBLE=1
CJ 1120 IF PLAYER=1 THEN 1200
EL 1130 FOR ROW=1 TO 6:FF=0:FB=0
IM 1140 FOR COL=1 TO 11
GJ 1150 IF HIVE%(ROW,COL)=PLAYER THEN FF=1
JC 1160 IF HIVE%(12-ROW,COL)=PLAYER THEN FB=1
LE 1170 NEXT COL
HM 1180 IF FF=0 OR FB=0 THEN POSSIBLE=0:ROW=6
PE 1190 NEXT ROW:RETURN
CK 1200 FOR COL=1 TO 6:FF=0:FB=0
JP 1210 FOR ROW=1 TO 11
FC 1220 IF HIVE%(ROW,COL)=PLAYER THEN FF=1
GP 1230 IF HIVE%(ROW,12-COL)=PLAYER THEN FB=1
OB 1240 NEXT ROW
HD 1250 IF FF=0 OR FB=0 THEN POSSIBLE=0:COL=6
LD 1260 NEXT COL
JE 1270 RETURN
EB 1280 REM CHECKWINNER
OA 1290 LOCATE 24,1:PRINT "Checking...{11 SPACES}";
ED 1300 USED.CNTR=0:WINNER=0:NODE.CNTR=0:NODE.TOTAL=0:COUNTER=0
LO 1310 IF PLAYER=1 THEN 1440
II 1320 FOR COL=1 TO 11:ROW=1
JF 1330 IF HIVE%(ROW,COL)<>PLAYER THEN 1410
NO 1340 NODEROW=ROW:NODECOL=COL:GOSUB 1560
GD 1350 IF USED.FLAG=1 THEN 1410
EG 1360 NODE.TOTAL=1:PATH.TOTAL=1:COUNTER=1
OL 1370 PATH%(1)=100*NODEROW+NODECOL
ML 1380 GOSUB 1650
FJ 1390 IF WINNER=1 THEN COL=11
JP 1400 REM SKIP2
LI 1410 NEXT COL
JJ 1420 RETURN
EL 1430 REM CHECK1
FI 1440 FOR ROW=1 TO 11:COL=1
BB 1450 IF HIVE%(ROW, COL)<>PLAYER THEN 1530
NG 1460 NODEROW=ROW:NODECOL=COL:GOSUB 1560
MO 1470 IF USED.FLAG=1 THEN 1530
FO 1480 NODE.TOTAL=1:PATH.TOTAL=1:COUNTER=1
OD 1490 PATH%(1)=100*NODEROW+NODECOL
KH 1500 GOSUB 1650
KB 1510 IF WINNER=1 THEN ROW=11
JJ 1520 REM SKIP1
OE 1530 NEXT ROW
JB 1540 RETURN
CC 1550 REM USEDLOOKUP
QK 1560 USED.FLAG=0:SEARCH=100*NODEROW+NODECOL
NO 1570 LK=0:IF USED.CNTR=0 THEN 1620
FC 1580 FOR LK=1 TO USED.CNTR
KL 1590 IF SEARCH=USED%(LK) THEN USED.FLAG=1:LK=USED.CNTR
AA 1600 NEXT LK
QP 1610 REM SKIPSEARCH
OA 1620 IF USED.FLAG=0 THEN USED.CNTR=USED.CNTR+1:USED%(USED.CNTR)=SEARCH
JA 1630 RETURN
MH 1640 REM CHECKPATH
NO 1650 NODE.CNTR=0
PK 1660 FOR NC=1 TO 6
AD 1670 NODEROW=NODEROW+ROW.INC%(NC):NODECOL=NODECOL+COL.INC%(NC)
PI 1680 IF NODEROW<1 OR NODEROW>11 OR NODECOL<1 OR NODECOL>11 THEN 1750
JL 1690 IF HIVE%(NODEROW,NODECOL)<>PLAYER THEN 1750
OA 1700 GOSUB 1560:IF USED.FLAG=1 THEN 1750
QO 1710 NODE.CNTR=NODE.CNTR+1
OM 1720 NODE.TOTAL=NODE.TOTAL+1:NODE%(NODE.TOTAL)=100*NODEROW+NODECOL
JA 1730 IF (PLAYER=2 AND NODEROW=11) OR (PLAYER=1 AND NODECOL=11) THEN
        WINNER=1:PATH.TOTAL=PATH.TOTAL+1:PATH%(PATH.TOTAL)=100*NODEROW+NODECOL:
        NC=6
KP 1740 REM SKIPNODE
MH 1750 NEXT NC
JA 1760 IF WINNER=1 THEN RETURN
QO 1770 IF NODE.CNTR=0 AND NODE.TOTAL=0 THEN RETURN
MK 1780 IF NODE.CNTR=0 THEN PATH.TOTAL=PATH.TOTAL-PATHLEN(COUNTER):
        PATHLEN(COUNTER)=0:COUNTER=COUNTER-1
AG 1790 IF NODE.CNTR>1 THEN COUNTER=COUNTER+NODE.CNTR-1
KP 1800 NODEROW=INT(NODE%(NODE.TOTAL)/100)
EM 1810 NODECOL=NODE%(NODE.TOTAL)-100*NODEROW
ED 1820 PATH.TOTAL=PATH.TOTAL+1
GA 1830 PATHLEN(COUNTER)=PATHLEN(COUNTER)+1
GA 1840 PATH%(PATH.TOTAL)=NODE%(NODE.TOTAL)
LL 1850 NODE.TOTAL=NODE.TOTAL-1
BB 1860 GOTO 1650
OJ 1870 REM DRAWPATH
MF 1880 LOCATE 1,1:PRINT "THE WINNER: ";:PRINT PLAYER$(PLAYER);
JH 1890 FOR J=1 TO PATH.TOTAL
MF 1900 ROW=INT(PATH%(J)/100):COL=PATH%(J)-100*ROW:CB=COL*18+38+(6-ROW)*9:
        RB=ROW*15-1
FI 1910 IF PLAYER=1 THEN PUT(CB+1,RB-1),BALL1,XOR:PUT(CB,RB-3),EYES1,OR
        ELSE PUT(CB+1,RB-1),BALL2,XOR:PUT(CB,RB-3),EYES2,OR
HC 1920 NEXT J
IK 1930 REM  GOAGAIN
JM 1940 LOCATE 24,1:PRINT "Want to play again (Y/N)?";
NE 1950 A$=INKEY$:IF A$<>"Y" AND A$<>"N" THEN 1950
LO 1960 IF A$="N" THEN SCREEN 0,0,0:WIDTH 80:END ELSE CLS:GOTO 50