rem magic squares IM-1 club tape 4 program 1
1  REM MAGIC SQUARES ..BY DON SCHMIDT 9/5/82
2  REM ODD NUMBERS USE DE LA LOUBERE METHOD
3  REM EVEN NUMBERS USE SWAP METHOD
95  REM MATRIX IS LIMITED BY SCREEN SIZE
100  DIM M(8,8)
105  REM GENERATE SEED VALUE
110 VB= INT ( RND(0)*15):V=VB
115  REM  REM GET USERS NUMBER
120  INPUT "WHAT SIZE -(3 TO 8)",N
125  IF N>8 THEN 120
130  IF N/2= INT (N/2) THEN 300: REM EVEN NBR
135  REM  SET START ROW AND COLUMN
140 R=1:C= INT (N/2)+1
150 V=V+1:M(R,C)=V
155  REM  EXIT WHEN MATRIX FULL
160  IF V=N^2+VB THEN 220
165  REM  IF V IS  INTEGER MULTIPLE OF N GO DOWN
170  IF (V-VB)/N= INT ((V-VB)/N) THEN R=R+1: GOTO 150
175  REM MOV MOVE RIGHT AND UP WHEN POSSIBLE
180 C=C+1
185  REM  WRAP AROUND  IF REQ'D
190  IF C>N THEN C=1:R=R-1: GOTO 150
200 R=R-1: IF R>0 THEN 150
210 R=N: GOTO 150
215 :
220  CALL 17046
225  REM  CALC THE MAGIC NUMBER
230 T=((N^3+N)/2)+(VB*N)
240  PRINT "THE MAGIC NUMBER IS ",T: PRINT 
245  REM   PRINT  THE MATRIX
250  FOR R=1 TO N
260  PRINT  USING 290,M(R,1),M(R,2),M(R,3),M(R,4),M(R,5),M(R,6),M(R,7),M(R,8)
270  NEXT R: INPUT "HIT RETURN TO DO AGAIN",R: RUN 
290 :## ## ## ## ## ## ## ##
295 :
300  REM  GENERATE EVEN BASE MATRIX
310  FOR R=1 TO N
320  FOR C=1 TO N
330 V=V+1:M(R,C)=V
340  NEXT C: NEXT R
345 :
350  REM SWAP DIAGON AL
360 LIMIT=N/2:C=N
370  FOR R=1 TO LIMIT
380 T=M(R,R):M(R,R)=M(C,C):M(C,C)=T
390 T=M(C,R):M(C,R)=M(R,C):M(R,C)=T
400 C=C-1: NEXT R
410  IF N=4 THEN 220: REM 4X4 DONE
415 :
420 R=2:X=N: IF N=8 THEN 480
430  REM  6X6  INTERNAL SWAP (HOR + VER)
440  FOR C=1 TO LIMIT
450 T=M(R,C):M(R,C)=M(R,X):M(R,X)=T
460 T=M(C,R):M(C,R)=M(X,R):M(X,R)=T
470 R=R+2:X=X-1: NEXT C: GOTO 220: REM 6X6 DONE
480 C=1:Z=N-1
490  FOR I=1 TO LIMIT
500  IF I=LIMIT THEN R=R-2:Z=Z+2
510 T=M(R,C):M(R,C)=M(R,X):M(R,X)=T
520 T=M(Z,C):M(Z,C)=M(Z,X):M(Z,X)=T
525  REM  8X8 VIRTICAL SWAP
530  IF I=LIMIT THEN R=R-1:Z=Z+1
540 T=M(C,R):M(C,R)=M(X,R):M(X,R)=T
550 T=M(C,Z):M(C,Z)=M(X,Z):M(X,Z)=T
560 R=R+1:C=C+1:X=X-1:Z=Z-1: NEXT I: GOTO 220
900  PRINT "STOP"

