home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib37b.dsk / MAGIC.SQUARES.bas < prev    next >
BASIC Source File  |  2023-02-26  |  2KB  |  43 lines

  1. 10  REM  ************************
  2. 20  REM  * MAGIC.SQUARES        *
  3. 30  REM  * BY MARK COHEN        *
  4. 40  REM  * COPYRIGHT(C) 1989    *
  5. 50  REM  * MINDCRAFT PUBL. CORP.*
  6. 60  REM  * CONCORD, MA 01742    *
  7. 70  REM  ************************
  8. 80  REM 
  9. 90  REM  INITIALIZATION
  10. 100  REM  MD=MAX # DIGITS INPUT
  11. 110  TEXT :MAX = 9:MD =  LEN( STR$(MAX))
  12. 120  REM 
  13. 130  REM   DEFINE 'MOD' FUNCTION
  14. 140  DEF  FN MOD(W) = W - INT(W/L) *L: REM 
  15. 150  REM  PROCESS MAGIC SQUARES **** MAINLINE ****
  16. 160  REM  READ SIZE, GENERATE SQUARE TIL <CR> HIT
  17. 170  GOSUB 300
  18. 180  IF L >0  THEN  GOSUB 220: GOSUB 320: GOTO 180
  19. 190  HOME : PRINT : INVERSE : PRINT "ENDING MAGIC SQUARES": NORMAL : FOR I = 1 TO 500: NEXT : END 
  20. 200  REM  GENERATE SQUARE SIZE L **** SUBR ****
  21. 210  REM  R=ROW C=COLUMN
  22. 220  HOME : INVERSE : PRINT "MAGIC SQUARE: SIZE ";L: NORMAL : PRINT 
  23. 230 I =  INT(L/2) -1:S = 0
  24. 240  FOR R = 1 TO L: FOR C = 1 TO L:N = L * FN MOD(R +C +I) + FN MOD(R +2 *C -2) +1: PRINT  LEFT$("    ",4 - LEN( STR$(N))) + STR$(N);:S = S +(R = C) *N: NEXT C: PRINT : NEXT R: REM  4 SPACES
  25. 250  PRINT : PRINT "SUM = ";S
  26. 260  POKE  -16368,0
  27. 270  PRINT : INVERSE : PRINT "PRESS ANY KEY TO CONTINUE"
  28. 280 K =  PEEK( -16384): IF K <127 GOTO 280
  29. 290  POKE  -16368,0: NORMAL : RETURN 
  30. 300  REM  INPUT SIZE (<CR> TO SIGNAL END) **** SUBR ****
  31. 310  REM  RETURN VALUE OF L=0 FOR END
  32. 320  HOME : VTAB 22: PRINT "(RETURN TO QUIT)"
  33. 330  HTAB 6: VTAB 1: PRINT "MAGIC SQUARES BY MARK COHEN": HTAB 1: PRINT "COPYRIGHT(C) 1989 MINDCRAFT PUBL. CORP.": PRINT : HTAB 1: INPUT " LENGTH (ODD#):";L$
  34. 340 LL =  LEN(L$)
  35. 350  IF LL = 0  THEN L = 0: RETURN : REM  <CR ENTERED
  36. 360  IF LL >MD  THEN  GOSUB 430: GOTO 320: REM  STRING ENTERED TOO LONG
  37. 370 ER = 0: FOR I = 1 TO LL:C$ =  MID$ (L$,I,1): IF C$ <"0"  OR C$ >"9"  THEN ER = 1:I = LL: REM  CHECK THAT ONLY DIGITS WERE ENTERED
  38. 380  NEXT I
  39. 390  IF ER  THEN  GOSUB 430: GOTO 320
  40. 400 L =  VAL(L$)
  41. 410 RM = L - INT(L/2) *2: IF L >MAX  OR RM = 0  THEN  GOSUB 430: GOTO 320: REM  CHECK IF INPUT VAL IS EVEN OR LARGER THAN MAX ALLOWED
  42. 420  RETURN 
  43. 430  PRINT : PRINT "BAD LENGTH": FOR I = 1 TO 1000: NEXT : RETURN