퍼즐 그림 맞추기
puzzle-game.bas
설명
청기백기와 같은 SVGAQB 틀 위에 만든 3×3 슬라이딩 퍼즐입니다.
M3.GIF 화면에서 89×123 조각 8개를 BLKGET으로 떼어 내고, 빈 칸은 BOARD.SPR로 찍습니다.
- 시작 배치는 고정(8 3 5 / 2 1 6 / 4 7 빈칸)입니다.
- 화살표 키는 조각이 움직이는 방향입니다.
- 15초 제한시간 코드가 있지만
GOTO로 건너뛰어 실제로는 동작하지 않습니다. - 조각 좌표는 퍼즐 조각 좌표 계산으로 구했고, 빈 칸 그림은 퍼즐 빈 칸 스프라이트 만들기로 만들었습니다.
소스
DECLARE SUB putgr (x%, y%, z%)DECLARE SUB start ()DEFINT A-ZDECLARE SUB opening ()DECLARE SUB gifload (GIFFILENAME$)REM $INCLUDE: 'svgaqb10.bi'DIM SHARED GIFPAL AS STRING * 768DIM up$, dn$, lt$, rt$up$ = CHR$(0) + CHR$(72)dn$ = CHR$(0) + CHR$(80)lt$ = CHR$(0) + CHR$(75)rt$ = CHR$(0) + CHR$(77)DIM SHARED gr0(5477) AS INTEGERDIM SHARED gr1(5477) AS INTEGERDIM SHARED gr2(5477) AS INTEGERDIM SHARED gr3(5477) AS INTEGERDIM SHARED gr4(5477) AS INTEGERDIM SHARED gr5(5477) AS INTEGERDIM SHARED gr6(5477) AS INTEGERDIM SHARED gr7(5477) AS INTEGERDIM SHARED gr8(5477) AS INTEGERDIM graph(1 TO 3, 1 TO 3) AS INTEGERVMODE = VIDEOMODEGET RES640 DIM SHARED delay AS LONG SCREEN 0, 0, 0 start VMODE = VIDEOMODEGET RES640DIM x, y, nx, ny AS INTEGERx = 3: y = 3: nx = 3: ny = 3DIM checkcode, gum AS INTEGERDEF SEG = VARSEG(gr0(0))BLOAD "board.spr", VARPTR(gr0(0))DEF SEGa:limi = 15gifload "logo.gif" WHILE INKEY$ = "" WENDgifload "m3.GIF "blkget 199, 19, 287, 141, gr1(0)blkget 289, 19, 377, 141, gr2(0)blkget 379, 19, 467, 141, gr3(0)blkget 199, 143, 287, 265, gr4(0)blkget 289, 143, 377, 265, gr5(0)blkget 379, 143, 467, 265, gr6(0)blkget 199, 267, 287, 389, gr7(0)blkget 289, 267, 377, 389, gr8(0)WHILE INKEY$ = ""WENDFOR i = 1 TO 3FOR j = 1 TO 3drwbox 1, 1, 108 + 90 * j, 124 * i - 106, 198 + 90 * j, 18 + 124 * iNEXT j, igraph(1, 1) = 8graph(2, 1) = 3graph(3, 1) = 5graph(1, 2) = 2graph(2, 2) = 1graph(3, 2) = 6graph(1, 3) = 4graph(2, 3) = 7graph(3, 3) = 0FOR i = 1 TO 3FOR j = 1 TO 3putgr j, i, graph(j, i)NEXT j, itimecheck$ = TIME$WHILE checkcode = 0a$ = INKEY$IF a$ = "q" OR a$ = "Q" THENa$ = ""checkcode = 1END IFIF a$ = up$ OR a$ = dn$ OR a$ = lt$ OR a$ = rt$ THEN IF a$ = up$ AND y <> 3 THEN ny = y + 1 IF a$ = dn$ AND y <> 1 THEN ny = y - 1 IF a$ = rt$ AND x <> 1 THEN nx = x - 1 IF a$ = lt$ AND x <> 3 THEN nx = x + 1 putgr nx, ny, 0 putgr x, y, graph(nx, ny) graph(x, y) = graph(nx, ny) graph(nx, ny) = 0 x = nx y = nyEND IFa$ = ""FOR i = 1 TO 3FOR j = 1 TO 3gum = gum + 1IF graph(j, i) = gum THEN sum = sum + 1NEXT j, iIF sum = 8 THEN checkcode = 3gum = 0: sum = 0GOTO c:IF timecheck$ <> TIME$ THEN limi = limi - 1 IF limi = 0 THEN checkcode = 1 ttt$ = STR$(limi) IF LEN(ttt$) = 1 THEN ttt$ = "0" + ttt$ drwstring 1, 1, 255, ttt$, 28, 370 timecheck$ = TIME$ END IFc:WENDIF checkcode = 3 THENgifload "m3.gif"WHILE INKEY$ = ""WENDEND IFIF checkcode = 1 THENa$ = ""drwstring 1, 1, 255, "You are Failed... Time Over...", 320, 200drwstring 1, 1, 255, "Press AnyKey.......", 320, 220WHILE INKEY$ = ""WENDEND IFcheckcode = 0GOTO a: VIDEOMODESET VMODEDEFSNG A-ZSUB gifload (GIFFILENAME$) DEFINT A-Z FOR i = 1 TO 768 MID$(GIFPAL, i, 1) = CHR$(63) NEXT i PALSET GIFPAL, 0, 255 OK = GIFGETINFO(GIFFILENAME$, XSIZE, YSIZE, NUMCOL, GIFPAL) IF OK = 1 THEN FIXIT = 0 FOR a = 1 TO NUMCOL * 3 STEP 3 R = ASC(MID$(GIFPAL, a, 1)) G = ASC(MID$(GIFPAL, a + 1, 1)) B = ASC(MID$(GIFPAL, a + 2, 1)) IF R > 63 THEN FIXIT = 1 EXIT FOR END IF IF G > 63 THEN FIXIT = 1 EXIT FOR END IF IF B > 63 THEN FIXIT = 1 EXIT FOR END IF NEXT a IF FIXIT = 1 THEN FOR a = 1 TO NUMCOL * 3 c = ASC(MID$(GIFPAL, a, 1)) MID$(GIFPAL, a, 1) = CHR$(c \ 4) NEXT a END IF OK = GIFPUT(1, 0, 0, GIFFILENAME$) PALSET GIFPAL, 0, 255 IF OK <> 1 THEN SOUND 100, 5 END IF END IFEND SUBSUB putgr (x, y, z)cx = 109 + 90 * xcy = 124 * y - 105IF z = 1 THEN blkput 1, cx, cy, gr1(0)IF z = 2 THEN blkput 1, cx, cy, gr2(0)IF z = 3 THEN blkput 1, cx, cy, gr3(0)IF z = 4 THEN blkput 1, cx, cy, gr4(0)IF z = 5 THEN blkput 1, cx, cy, gr5(0)IF z = 6 THEN blkput 1, cx, cy, gr6(0)IF z = 7 THEN blkput 1, cx, cy, gr7(0)IF z = 8 THEN blkput 1, cx, cy, gr8(0)IF z = 0 THEN blkput 1, cx, cy, gr0(0)END SUBSUB start IF WHICHVGA = 0 THEN PRINT "Unknown graphic Card..." PRINT "Sorry!!!" STOP END IF IF WHICHMEM < 512 THEN PRINT "Not enough Video Memory." STOP END IF IF WHICHCPU = 286 OR WHICHCPU = 86 THEN PRINT "This Computer requires 30386 CPU at leat" STOP END IF PRINT "Your CPU is"; WHICHCPU PRINT "SPEED CHECKING.....Please Wait..." PRINT "OK.... Press Any key..........." WHILE INKEY$ = "" WENDEND SUB