DIM GLOBAL NOTES(8,8), SUDO(8,8), GUESS(8,8) GLOBAL SEL_X,SEL_Y,C_DIGITOFFSET,C_SUDOX,C_SUDOY,C_SUDOGAP TOUCHSCREEN BG SOURCE ROM(3) BG COPY 0,0,20,16 TO 0,0 FLAGS=0 SEL_X=-1 SEL_Y=-1 C_SUDOX=8 C_SUDOY=1 C_SUDOGAP=1 C_DIGITOFFSET=208 C_LEVX=16 C_LEVY=14 'DRAW NUMBERS ON NOTE/GUESS BUTTONS SI=0 FOR I=0 TO 8 SIS=66+(2*I) IF I>=7 THEN ADD SIS,16 SPRITE SI,(I MOD 3)*16,(I\3)*16,SIS SPRITE SI SIZE 1 INC SI SPRITE SI,(I MOD 3)*16,((I\3)*16)+80,SIS SPRITE SI SIZE 1 PAL 1 INC SI NEXT I 'SELECTION RECT SPRITE SPRITE 63,0,0,48 SPRITE 63 SIZE 0 PAL 4 PRIO 1 SPRITE OFF 63 GAMEINDEX=0 GAMECOUNT=2 STARTGAME: TEXT C_LEVX,C_LEVY,STR$(GAMEINDEX+1) CALL READSUDOKU(GAMEINDEX) FOR COL=0 TO 8 FOR ROW=0 TO 8 IF SUDO(COL,ROW)>0 THEN X=-1 Y=-1 CALL TRANSFROM(COL,ROW,X,Y) CELL X,Y,C_DIGITOFFSET+SUDO(COL,ROW) END IF NEXT ROW NEXT COL DO IF TAP THEN CX=INT((TOUCH.X/8)) CY=INT((TOUCH.Y/8)) COL=-1 ROW=-1 X=-1 Y=-1 IF CX<6 AND CY<6 AND (SEL_X>=0 AND SEL_Y>=0) THEN 'TOGGLE NOTE FOR CURRENTLY SELECTED IF GUESS(SEL_X,SEL_Y)=0 AND SUDO(SEL_X,SEL_Y)=0 THEN FI=((CY\2)*3)+(CX\2) FLAGS=NOTES(SEL_X,SEL_Y) CALL TOGGLE(FLAGS,FI) CALL TRANSFROM(SEL_X,SEL_Y,X,Y) CALL SETFLAGS(X,Y,FLAGS) NOTES(SEL_X,SEL_Y)=FLAGS END IF ELSE IF CX<6 AND CY>=10 AND (SEL_X>=0 AND SEL_Y>=0) THEN 'TODO: SET GUESS FOR CURRENTLY SELECTED IF SUDO(SEL_X,SEL_Y)=0 THEN FI=((((CY-10)\2)*3)+(CX\2))+1 IF GUESS(SEL_X,SEL_Y)=FI THEN ' TAPPED ON SAME NUMBER AS IN SQUARE, 'SO CLEAR GUESS CALL SETGUESS(SEL_X,SEL_Y,0,X,Y) ELSE CALL SETGUESS(SEL_X,SEL_Y,FI,X,Y) RESULT=0 CALL CHECKAT(SEL_X,SEL_Y,RESULT) IF RESULT=0 THEN 'INVALID GUESS TINT X,Y PAL 2 ELSE 'VALID GUESS TINT X,Y PAL 3 END IF END IF END IF ELSE IF CX>=C_SUDOX AND CY >=C_SUDOY THEN 'SET SELECTION CALL TRANSTO(TOUCH.X,TOUCH.Y,COL,ROW) CALL TRANSFROM(COL,ROW,X,Y) IF COL>=0 AND ROW>=0 THEN IF SUDO(COL,ROW)=0 THEN SEL_X=COL SEL_Y=ROW SPRITE 63,X*8,Y*8,48 END IF RESULT=0 CALL CHECKWIN(RESULT) IF RESULT=-1 THEN INC GAMEINDEX IF GAMEINDEX=GAMECOUNT THEN GOTO WINNER ELSE GOTO STARTGAME END IF END IF END IF END IF END IF WAIT VBL LOOP WINNER: DO PRINT "WINNER!" WAIT VBL LOOP '============================================ '======================== SUB TRANSTO(X,Y,ROW,COL) '======================== CX=X\8 CY=Y\8 ROW=-1 COL=-1 IF CX=(C_SUDOX+(2*C_SUDOGAP)+9) OR CY>=(C_SUDOY+(2*C_SUDOGAP)+9) THEN EXIT SUB GCOL=(CX-C_SUDOX) \ (C_SUDOGAP+3) COL=((CX-C_SUDOX) MOD (C_SUDOGAP+3))+(3*GCOL) GROW=(CY-C_SUDOY) \ (C_SUDOGAP+3) ROW=((CY-C_SUDOY) MOD (C_SUDOGAP+3))+(3*GROW) END SUB '======================== SUB TRANSFROM(ROW,COL,X,Y) '======================== X=-1 Y=-1 IF ROW<0 OR ROW>=9 OR COL<0 OR COL>=9 THEN EXIT SUB X=C_SUDOX+((COL\3)*(C_SUDOGAP+3))+(COL MOD 3) Y=C_SUDOY+((ROW\3)*(C_SUDOGAP+3))+(ROW MOD 3) END SUB '======================== SUB CHECKWIN(RESULT) '======================== RESULT = 0 FOR Y=0 TO 8 FOR X=0 TO 8 IF GUESS(X,Y)=0 AND SUDO(X,Y)=0 THEN EXIT SUB END IF NEXT X NEXT Y FOR Y=0 TO 8 CALL CHECKROW(Y,RESULT) IF RESULT=0 THEN EXIT SUB NEXT Y FOR X=0 TO 8 CALL CHECKCOL(X,RESULT) IF RESULT=0 THEN EXIT SUB NEXT X FOR B=0 TO 8 CALL CHECKBLOCK(B,RESULT) IF RESULT=0 THEN EXIT SUB NEXT B RESULT = -1 END SUB '======================== SUB CHECKAT(COL,ROW, RESULT) '======================== RESULT=0 BLK=((ROW\3)*3)+(ROW MOD 3) CALL CHECKBLOCK(BLK,RESULT) IF RESULT=0 THEN EXIT SUB END IF CALL CHECKROW(ROW, RESULT) IF RESULT=0 THEN EXIT SUB END IF CALL CHECKCOL(COL, RESULT) IF RESULT=0 THEN EXIT SUB END IF RESULT=-1 END SUB '======================== SUB CHECKROW(ROW,RESULT) '======================== RESULT = 0 BITS = 0 FOR I=0 TO 8 SU=SUDO(I,ROW) IF SU>0 THEN BI=2^(SU-1) BITS=BITS OR BI ELSE GU=GUESS(I,ROW) IF GU>0 THEN BI=2^(GU-1) IF (BITS AND BI)>0 THEN EXIT SUB ELSE BITS=BITS OR BI END IF END IF END IF NEXT I RESULT=-1 END SUB '======================== SUB CHECKCOL(COL,RESULT) '======================== RESULT = 0 BITS = 0 FOR I=0 TO 8 SU=SUDO(COL,I) IF SU>0 THEN BI=2^(SU-1) BITS=BITS OR BI ELSE GU=GUESS(COL,I) IF GU>0 THEN BI=2^(GU-1) IF (BITS AND BI)>0 THEN EXIT SUB ELSE BITS=BITS OR BI END IF END IF END IF NEXT I RESULT=-1 END SUB '======================== SUB CHECKBLOCK(BLOCK,RESULT) '======================== RESULT = 0 BITS = 0 BX=((BLOCK-1) MOD 3) * 3 BY=((BLOCK-1)\3) * 3 FOR Y=0 TO 2 FOR X=0 TO 2 SU=SUDO(BX+X,BY+Y) 'TRACE STR$(BX+X)+","+STR$(BY+Y)+":"+STR$(SU) IF SU>0 THEN BI=2^(SU-1) BITS=BITS OR BI ELSE GU=GUESS(BX+X,BY+Y) BI=2^(GU-1) IF (BITS AND BI)>0 THEN EXIT SUB ELSE BITS=BITS OR BI END IF END IF NEXT X NEXT Y RESULT=-1 END SUB '======================== SUB SETGUESS(COL,ROW,N,X,Y) '======================== X=-1 Y=-1 SU=SUDO(COL,ROW) IF SU=0 THEN GUESS(COL,ROW)=N X=-1 Y=-1 CALL TRANSFROM(COL,ROW,X,Y) IF N=0 THEN CELL X,Y,0 FLAGS=NOTES(COL,ROW) CALL SETFLAGS(X,Y,FLAGS) ELSE BG 0 CELL X,Y,0 BG 1 CELL X,Y,0 BG 0 CELL X,Y,C_DIGITOFFSET+N END IF END IF END SUB '======================== SUB READSUDOKU(INDEX) '======================== RESTORE SUDOKU IF INDEX > 0 THEN DIM DUMMY(8) FOR I=0 TO INDEX-1 FOR J=0 TO 8 READ DUMMY(0),DUMMY(1),DUMMY(2),DUMMY(3),DUMMY(4),DUMMY(5),DUMMY(6),DUMMY(7),DUMMY(8) NEXT J NEXT I END IF FOR J=0 TO 8 READ SUDO(0,J),SUDO(1,J),SUDO(2,J),SUDO(3,J),SUDO(4,J),SUDO(5,J),SUDO(6,J),SUDO(7,J),SUDO(8,J) NEXT J END SUB '======================== SUB TOGGLE(FLAGS,N) '======================== ' N IS 0-BASED FF=2^N IF (FLAGS AND FF)>0 THEN FLAGS=FLAGS AND (%111111111 XOR FF) ELSE FLAGS=FLAGS OR FF END IF END SUB '======================== SUB SETFLAGS(CX,CY,FL) '======================== CI=0 FOR B=0 TO 8 STEP 2 BI=2^B IF (FL AND BI)>0 THEN CI=CI OR (2^(B\2)) END IF NEXT B BG 0 CELL CX,CY,CI CI=0 FOR B=1 TO 7 STEP 2 BI=2^B IF (FL AND BI)>0 THEN CI=CI OR (2^((B-1)\2)) END IF NEXT B BG 1 CELL CX,CY,CI+32 END SUB '============================================ SUDOKU: '---------------------[1] DATA 7,8,6,0,0,1,5,0,0 DATA 9,1,2,0,0,0,0,0,8 DATA 3,0,5,0,6,7,1,0,2 DATA 5,6,0,9,8,0,0,0,0 DATA 4,2,8,0,3,0,0,0,0 DATA 1,0,3,0,0,4,0,0,0 DATA 6,3,1,0,7,8,0,0,0 DATA 2,7,4,0,0,0,6,0,0 DATA 0,0,0,0,0,0,0,0,0 '---------------------[2] DATA 4,0,5,6,1,7,0,2,0 DATA 1,0,7,3,8,2,4,0,0 DATA 8,0,0,9,0,5,6,0,0 DATA 0,0,0,4,0,0,3,0,7 DATA 0,0,0,5,0,1,0,0,0 DATA 5,0,6,8,2,0,9,0,0 DATA 0,4,0,1,3,6,0,0,0 DATA 0,0,0,0,0,0,0,0,0 DATA 6,0,2,7,5,4,0,0,0 '============================================ #1:MAIN PALETTES 013F2A150002010000302010001F0A05 003C2814003F2A15003F2A15003F2A15 #2:9BIT CHARS 00000000000000000000000000000000 00400000000000000000000000000000 00040000000000000000000000000000 00440000000000000000000000000000 00000010000000000000000000000000 00400010000000000000000000000000 00040010000000000000000000000000 00440010000000000000000000000000 00000000004000000000000000000000 00400000004000000000000000000000 00040000004000000000000000000000 00440000004000000000000000000000 00000010004000000000000000000000 00400010004000000000000000000000 00040010004000000000000000000000 00440010004000000000000000000000 00000000000400000000000000000000 00400000000400000000000000000000 00040000000400000000000000000000 00440000000400000000000000000000 00000010000400000000000000000000 00400010000400000000000000000000 00040010000400000000000000000000 00440010000400000000000000000000 00000000004400000000000000000000 00400000004400000000000000000000 00040000004400000000000000000000 00440000004400000000000000000000 00000010004400000000000000000000 00400010004400000000000000000000 00040010004400000000000000000000 00440010004400000000000000000000 00000000000000000000000000000000 00100000000000000000000000000000 00000040000000000000000000000000 00100040000000000000000000000000 00000004000000000000000000000000 00100004000000000000000000000000 00000044000000000000000000000000 00100044000000000000000000000000 00000000001000000000000000000000 00100000001000000000000000000000 00000040001000000000000000000000 00100040001000000000000000000000 00000004001000000000000000000000 00100004001000000000000000000000 00000044001000000000000000000000 00100044001000000000000000000000 FF818181818181FF0000000000000000 01550155015501FFFFFFFFFFFFFFFFFF 00540054005400FEFEFEFEFEFEFEFEFE 0155015501550100FFFFFFFFFFFFFF00 0054005400540000FEFEFEFEFEFEFE00 2424E40404E424242424E40404E42424 2424E70000FF00002424E70000FF0000 24242720202724242424272020272424 24242424242424242424242424242424 0000FF0000FF00000000FF0000FF0000 2424E70000E724242424E70000E72424 00003F202027242400003F2020272424 24242720203F000024242720203F0000 2424E40404FC00002424E40404FC0000 0000FC0404E424240000FC0404E42424 0000FF0000E724240000FF0000E72424 FF80808080808080007F7F7F7F7F7F7F FE0101010101010101FFFFFFFFFFFFFF 00000000000103010000000000000000 00000000008080800000000000000000 00000000000306000000000000000000 0000000000C060C00000000000000000 00000000000306000000000000000000 0000000000C060C00000000000000000 00000000000606070000000000000000 00000000006060E00000000000000000 00000000000706070000000000000000 0000000000E000C00000000000000000 00000000000103070000000000000000 0000000000C000C00000000000000000 00000000000700000000000000000000 0000000000E060C00000000000000000 808080808080807F7F7F7F7F7F7F7FFF 01010101010101FFFFFFFFFFFFFFFFFF 01010700000000000000000000000000 8080E000000000000000000000000000 01030700000000000000000000000000 8000E000000000000000000000000000 00060300000000000000000000000000 6060C000000000000000000000000000 00000000000000000000000000000000 60606000000000000000000000000000 00000700000000000000000000000000 6060C000000000000000000000000000 06060300000000000000000000000000 6060C000000000000000000000000000 01030300000000000000000000000000 80000000000000000000000000000000 00000000000306030000000000000000 0000000000C060C00000000000000000 00000000000306030000000000000000 0000000000C060E00000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 06060300000000000000000000000000 6060C000000000000000000000000000 00060300000000000000000000000000 6060C000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FF818181818181FFFF818181818181FF 00181818180018000000000000000000 006C6C24000000000000000000000000 00247E24247E24000000000000000000 00083E380E3E08000000000000000000 00626408102646000000000000000000 001C34386E643A000000000000000000 00181830000000000000000000000000 000C183030180C000000000000000000 0030180C0C1830000000000000000000 000024187E1824000000000000000000 000018187E1818000000000000000000 00000000181830000000000000000000 000000007E0000000000000000000000 00000000001818000000000000000000 00060C18306040000000000000000000 013D676F77673DFF01010101010101FF 0119391919197FFF01010101010101FF 013D670D19317FFF01010101010101FF 013D670D07673DFF01010101010101FF 0167677F070707FF01010101010101FF 017F617D07077DFF01010101010101FF 011D317D67673DFF01010101010101FF 017F070D193131FF01010101010101FF 013D673D67673DFF01010101010101FF 013D673F07673DFF01010101010101FF 00000018001800000000000000000000 00000018001830000000000000000000 00000C1830180C000000000000000000 0000007E007E00000000000000000000 000030180C1830000000000000000000 003C660C180018000000000000000000 003C666E6E603C000000000000000000 00183C667E6666000000000000000000 007C667C66667C000000000000000000 003C666060663C000000000000000000 00786C66666C78000000000000000000 007E607860607E000000000000000000 007E6078606060000000000000000000 003C606E66663C000000000000000000 0066667E666666000000000000000000 003C181818183C000000000000000000 001E060606663C000000000000000000 00666C78786C66000000000000000000 0060606060607E000000000000000000 0042667E7E6666000000000000000000 0066767E6E6666000000000000000000 003C666666663C000000000000000000 007C667C606060000000000000000000 003C66666A6C3E000000000000000000 007C667C786C66000000000000000000 003E603C06067C000000000000000000 007E1818181818000000000000000000 0066666666663C000000000000000000 00666666663C18000000000000000000 0066667E7E6642000000000000000000 00663C183C6666000000000000000000 0066663C181818000000000000000000 007E0C1830607E000000000000000000 003C303030303C000000000000000000 006030180C0602000000000000000000 003C0C0C0C0C3C000000000000000000 00183C66000000000000000000000000 0000000000007E000000000000000000 0000000000000000FF818181818181FF 00181818180018000000000000000000 006C6C24000000000000000000000000 00247E24247E24000000000000000000 00083E380E3E08000000000000000000 00626408102646000000000000000000 001C34386E643A000000000000000000 00181830000000000000000000000000 000C183030180C000000000000000000 0030180C0C1830000000000000000000 000024187E1824000000000000000000 000018187E1818000000000000000000 00000000181830000000000000000000 000000007E0000000000000000000000 00000000001818000000000000000000 00060C18306040000000000000000000 003C666E76663C000000000000000000 0018381818187E000000000000000000 003C660C18307E000000000000000000 003C660C06663C000000000000000000 0066667E060606000000000000000000 007E607C06067C000000000000000000 001C307C66663C000000000000000000 007E060C183030000000000000000000 003C663C66663C000000000000000000 003C663E06663C000000000000000000 00000018001800000000000000000000 00000018001830000000000000000000 00000C1830180C000000000000000000 0000007E007E00000000000000000000 000030180C1830000000000000000000 003C660C180018000000000000000000 003C666E6E603C000000000000000000 00183C667E6666000000000000000000 007C667C66667C000000000000000000 003C666060663C000000000000000000 00786C66666C78000000000000000000 007E607860607E000000000000000000 007E6078606060000000000000000000 003C606E66663C000000000000000000 0066667E666666000000000000000000 003C181818183C000000000000000000 001E060606663C000000000000000000 00666C78786C66000000000000000000 0060606060607E000000000000000000 0042667E7E6666000000000000000000 0066767E6E6666000000000000000000 003C666666663C000000000000000000 007C667C606060000000000000000000 003C66666A6C3E000000000000000000 007C667C786C66000000000000000000 003E603C06067C000000000000000000 007E1818181818000000000000000000 0066666666663C000000000000000000 00666666663C18000000000000000000 0066667E7E6642000000000000000000 00663C183C6666000000000000000000 0066663C181818000000000000000000 007E0C1830607E000000000000000000 003C303030303C000000000000000000 006030180C0602000000000000000000 003C0C0C0C0C3C000000000000000000 00183C66000000000000000000000000 0000000000007E000000000000000000 #3:MAIN BG 00001410400041004000410040004100 00003B003900390039003F0039003900 39003F003900390039003E0050005100 50005100500051000000380000000000 00003800000000000000380000000000 00003800400041004000410040004100 00003800000000000000380000000000 00003800000000000000380050005100 50005100500051000000380000000000 00003800000000000000380000000000 00003800400041004000410040004100 000037003900390039003A0039003900 39003A00390039003900350050005100 50005100500051000000380000000000 00003800000000000000380000000000 00003800EE00EF00F400E500F300FE00 00003800000000000000380000000000 00003800000000000000380000000000 00000000000000000000380000000000 00003800000000000000380000000000 00003800000000000000000000000000 000037003900390039003A0039003900 39003A003900390039003500E700F500 E500F300F300DA000000380000000000 00003800000000000000380000000000 00003800400041004000410040004100 00003800000000000000380000000000 00003800000000000000380050005100 50005100500051000000380000000000 00003800000000000000380000000000 00003800400041004000410040004100 00003C00390039003900360039003900 390036003900390039003D0050005100 50005100500051000000000000000000 00000000000000000000000000000000 00000000400041004000410040004100 0000000000000000EC00E500F600E500 EC000000000000000000000050005100 50005100500051000000000000000000 00000000000000000000000000000000 00000000