[comp.lang.pascal] Algorithm to Count Hexes

elder@wpafb-info5.af.mil (07/12/89)

I am working on a game written in Turbo Pascal.  The game board consists
of hexes with the columns 'numbered' with letters and the rows 'numbered'
with digits.  I have been trying to wtite a routine which is given two hex
positions and will return the minimum number of hexes inbetween, i.e., the
shortest "hex moves" between two hexes.  Has anyone written a routine like
this before.  So far I have not had any success at getting my code to
work for all combinations of hexes.  I know I don't have a correct algorithm
(since it is not working).  Can anyone offer any assistance?

Greg Elder
elder@wpafb-info7.arpa

malloy@nprdc.arpa (Sean Malloy) (07/12/89)

In article <20217@adm.BRL.MIL> elder@wpafb-info5.af.mil writes:
>I am working on a game written in Turbo Pascal.  The game board consists
>of hexes with the columns 'numbered' with letters and the rows 'numbered'
>with digits.  I have been trying to wtite a routine which is given two hex
>positions and will return the minimum number of hexes inbetween, i.e., the
>shortest "hex moves" between two hexes.  Has anyone written a routine like
>this before.  So far I have not had any success at getting my code to
>work for all combinations of hexes.  I know I don't have a correct algorithm
>(since it is not working).  Can anyone offer any assistance?

If, instead of the 'letter+number' hexid, you use the hex numbering
system pioneered by (I think) SPI:

      ____        ____        ____        ____        ____        
     /0101\      /0301\      /0501\      /0701\      /0901\      
    /      \____/      \____/      \____/      \____/      \____ 
    \      /0201\      /0401\      /0601\      /0801\      /1001\ 
     \____/      \____/      \____/      \____/      \____/      \
     /0102\      /0302\      /0502\      /0702\      /0902\      /
    /      \____/      \____/      \____/      \____/      \____/ 
    \      /0202\      /0402\      /0602\      /0802\      /1002\ 
     \____/      \____/      \____/      \____/      \____/      \
     /0103\      /0303\      /0503\      /0703\      /0903\      /
    /      \____/      \____/      \____/      \____/      \____/ 
    \      /0203\      /0403\      /0603\      /0803\      /1003\ 
     \____/      \____/      \____/      \____/      \____/      \
     /0104\      /0304\      /0504\      /0704\      /0904\      /
    /      \____/      \____/      \____/      \____/      \____/ 
    \      /0204\      /0404\      /0604\      /0804\      /1004\ 
     \____/      \____/      \____/      \____/      \____/      \
     /0105\      /0305\      /0505\      /0705\      /0905\      /
    /      \____/      \____/      \____/      \____/      \____/ 
    \      /0205\      /0405\      /0605\      /0805\      /1005\ 
     \____/      \____/      \____/      \____/      \____/      \
          \      /    \      /    \      /    \      /    \      /
           \____/      \____/      \____/      \____/      \____/ 

you can use a relatively simple algorithm to count hex distances (if
this isn't legal Pascal, bear with me -- I haven't done any
programming in Pascal for over three years, and I'm rusty):

FUNCTION Hex_Dist(hex1,hex2:integer):integer;
VAR
    temp1,temp2 : integer;
BEGIN
  temp1 := abs((hex1 DIV 100) - (hex2 DIV 100));
  temp2 := abs((hex1 MOD 100) - (hex2 MOD 100));
  if temp1 > temp2 then Hex_Dist := temp1
		   else Hex_Dist := (temp1 DIV 2) + temp2;
END; {Hex_Dist}



 Sean Malloy					| "The proton absorbs a photon
 Navy Personnel Research & Development Center	| and emits two morons, a
 San Diego, CA 92152-6800			| lepton, a boson, and a
 malloy@nprdc.navy.mil				| boson's mate. Why did I ever
						| take high-energy physics?"