//Sudoku include"sudoku_inc" #define BX 20 #define BY 25 int data[81]; int ldata[81]; int pdata1[81]; int pdata2[81]; int pdata3[81]; int pdata4[81]; pointer m[9]; pointer lm[9]; pointer pm1[9]; pointer pm2[9]; pointer pm3[9]; pointer pm4[9]; int selval=0; int editlock=0; initM(){ int i; for(i=0;i<9;i++){ m[i]=data+i*9; lm[i]=ldata+i*9; pm1[i]=pdata1+i*9; pm2[i]=pdata2+i*9; pm3[i]=pdata3+i*9; pm4[i]=pdata4+i*9; } } clearM(){ int r,c; for(r=0;r<9;r++){ for(c=0;c<9;c++){ m[r][c]=-1; lm[r][c]=0; pm1[r][c]=0; pm2[r][c]=0; pm3[r][c]=0; pm4[r][c]=0; }} } printPos(int r,int c){ int x=0; int y=0; int pc=1; x=BX+13*c; y=BY+12*r; if(c>2) x++;if(c>5) x++; if(r>2) y++;if(r>5) y++; if(m[r][c]==-1) { rect(0,x+1,y+1,x+11,y+10,0); } else if(m[r][c]==0) { text(x+4,y,"X"); } else { if(lm[r][c]==2) textattr(1,1,0); text(x+4,y,m[r][c]); textattr(0,1,0); } if(lm[r][c]==1) { frame(2,x+1,y+1,x+11,y+10,0); } else { frame(0,x+1,y+1,x+11,y+10,0); } if(pm1[r][c]>0){ pmark(x+2,y+6,pm1[r][c],1); pc=0; } if(pm2[r][c]>0){ pmark(x+2,y+6,pm2[r][c],pc); } if(pm3[r][c]>0){ pmark(x+2,y,pm3[r][c],1); pc=0; } if(pm4[r][c]>0){ pmark(x+2,y,pm4[r][c],pc); } } printM(){ int r,c; for(r=0;r<9;r++){ for(c=0;c<9;c++) printPos(r,c); } } saveM(){ dbcreate("SudokuW"); dbwritex(&data,"81i4"); dbwritex(&ldata,"81i4"); dbwritex(&pdata1,"81i4"); dbwritex(&pdata2,"81i4"); dbwritex(&pdata3,"81i4"); dbwritex(&pdata4,"81i4"); dbclose(); } loadM(){ int db,nbr; db=dbopen("SudokuW"); if(db!=0){ nbr=dbreadx(&data,"81i4"); nbr=dbreadx(&ldata,"81i4"); nbr=dbreadx(&pdata1,"81i4"); nbr=dbreadx(&pdata2,"81i4"); nbr=dbreadx(&pdata3,"81i4"); nbr=dbreadx(&pdata4,"81i4"); dbclose(); } printM(); } drawboard() { int r,c; int x=BX; int y=BY; clearg(); for(r=0;r<9;r++){ for(c=0;c<9;c++){ frame(1,x,y,x+12,y+11,0); x=x+13; if(c%3==2) x=x+1; } x=BX; y=y+12; if(r%3==2) y=y+1; } x=BX+1; y=y+5; for(c=0;c<9;c++){ frame(1,x,y,x+12,y+11,0); text(x+4,y,c+1); if(c==0) rect(3,x,y,x+12,y+11,0); x=x+13; } x=45; text(x+3,1,"E"); frame(1,x,2,x+9,11,0); rect(3,x,2,x+9,11,0); x=x+10; text(x+3,1,"P"); frame(1,x,2,x+9,11,0); x=x+10; text(x+1,1,"M"); frame(1,x,2,x+9,11,0); x=x+10; text(x+3,1,"L"); frame(1,x,2,x+9,11,0); x=88; text(x+2,1,"Load"); frame(1,x,2,x+23,11,0); x=x+24; text(x+2,1,"Save"); frame(1,x,2,x+23,11,0); x=x+24; text(x+2,1,"Clear"); frame(1,x,2,x+23,11,0); } chRow(int r,int v){ int i; for(i=0;i<9;i++){ if(m[r][i]==v) return(0); } return(1); } chCol(int c,int v){ int i; for(i=0;i<9;i++){ if(m[i][c]==v) return(0); } return(1); } chSq(int r,int c,int v){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(m[i+r][j+c]==v) return(0); } } return(1); } hasP(int r,int c){ if(pm1[r][c]>0 || pm2[r][c]>0 || pm3[r][c]>0 || pm4[r][c]>0) return 1; return 0; } clearP(int r,int c){ pm1[r][c]=0; pm2[r][c]=0; pm3[r][c]=0; pm4[r][c]=0; } clearVal(int x,int y){ if(editlock==0 && lm[y][x]!=2){ lm[y][x]=0; m[y][x]=-1; } if(editlock==2 && lm[y][x]==1){ lm[y][x]=0; m[y][x]=-1; } if(editlock==3 && lm[y][x]==2){ lm[y][x]=0; m[y][x]=-1; } } setVal(int x,int y,int v){ if(hasP(y,x)){ clearP(y,x); return; } if(m[y][x]!=-1){ clearVal(x,y); return; } if(chRow(y,v) && chCol(x,v) && chSq((y/3)*3,(x/3)*3,v)){ if(editlock==0) lm[y][x]=0; if(editlock==2) lm[y][x]=1; if(editlock==3) lm[y][x]=2; m[y][x]=v; } else{ m[y][x]=0; printPos(y,x); sleep(200); m[y][x]=-1; } } char dc[3]={'n','m','l'}; pack(){ char e='A'; int i; char o,n; string d=""; o=5; e--; for(i=0;i<81;i++){ if(data[i]==-1) { e++; if(e=='Z'){ d=d+e; e='A'-1; } } else{ if(e>('A'-1)) { d=d+e; e='A'-1; } n=dc[ldata[i]]; if(n!=o){d=d+n;o=n;} d=d+data[i]; } } clipset(d); } unpack(string s){ int p,t; int cp=0; char c[250]; t=0; clearM(); strtoc(s,&c); for(p=0;p<81;p++){ if(c[cp]=='l') {t=2;cp++;} else if(c[cp]=='m'){t=1;cp++;} else if(c[cp]=='n') {t=0;cp++;} if(c[cp]>='1' && c[cp]<='9'){ data[p]=c[cp]-'0'; ldata[p]=t; cp++; } else if(c[cp]>='A' && c[cp]<='Z'){ data[p]=-1; ldata[p]=0; c[cp]--; if(c[cp]<'A') cp++; } } printM(); } hPen(int x,int y){ string pc; int a=0; int v=0; v=selval+1; if(x>=45&&x<85&&y>=2&&y<=11){ a=(x-45)/10; x=45+10*editlock; rect(3,x,2,x+9,11,0); editlock=a; x=45+10*editlock; rect(3,x,2,x+9,11,0); } if(x>=88&&y>=2&&y<=11){ a=(x-88)/24; x=88+a*24; rect(3,x,2,x+23,11,0); sleep(200); rect(3,x,2,x+23,11,0); if(a==0) { if(confirm("Load puzzle from clipboard?")) pc=clipget(); if(pc!="") unpack(pc); } else if(a==1) { pack(); alert("Puzzle saved in clipboard."); } else if(a==2){ if(confirm("Clear puzzle?")){ clearM(); printM(); } } } else if (x>=BX&&x<=BX+116&&y>=BY+115&&y<=BY+126){ x=(x-BX)/13; if(x!=selval){ rect(3,BX+1+selval*13,BY+116,BX+1+selval*13+12,BY+116+11,0); selval=x; rect(3,BX+1+selval*13,BY+116,BX+1+selval*13+12,BY+116+11,0); } } else if(x>=(BX-1) && x<=(BX-1)+118 && y>=(BY-1) && y<=(BY-1)+109){ x=x-(BX-1); y=y-(BY-1); if(x>=40)x--;if(x>=80)x--; if(y>=37)y--;if(y>=74)y--; x=x/13; y=y/12; if(editlock==0){ setVal(x,y,v); } if(editlock==1){ if(lm[y][x]==2) return; if(m[y][x]!=-1) return; lm[y][x]=0; if(pm1[y][x]==v) { pm1[y][x]=0; printPos(y,x); return; } if(pm2[y][x]==v) { pm2[y][x]=0; printPos(y,x); return; } if(pm3[y][x]==v) { pm3[y][x]=0; printPos(y,x); return; } if(pm4[y][x]==v) { pm4[y][x]=0; printPos(y,x); return; } if(pm1[y][x]==0) { pm1[y][x]=v; } else if(pm2[y][x]==0) { pm2[y][x]=v; } else if(pm3[y][x]==0) { pm3[y][x]=v; } else if(pm4[y][x]==0) { pm4[y][x]=v; } } else if(editlock==2){ setVal(x,y,v); } else if(editlock==3){ setVal(x,y,v); } printPos(y,x); } } eventLoop(){ int e; int g=1; while(g){ e=event(1); switch(e){ case 2://p-down hPen(penx(),peny()); break; }} } main() { graph_on(); title("Sudoku"); clear(); hookmenu(1); initM(); clearM(); drawboard(); loadM(); atexit(&saveM); eventLoop(); graph_off(); }