某日闲来无事做的一个数独小游戏。目前只装载了一道题。
有选择难度、抽取题目的功能。如果后续需要升级可以搞个文档存题目,然后读文档载入更多数独题目。
顺便说一句,没做UI(因为懒),因此看上去有点费眼睛
啊,还有,判断数独正确性的代码段完全没优化(同样因为懒)。不过能用。如果各位嫌弃长长的代码段太难看可以自己优化下。
闲的没事玩玩数独挺有意思的。
#include#include #include using namespace std; struct mymove{//记录每一步操作 int x; int y; int digit; mymove(int a,int b,int c){ x=a,y=b,digit=c;//设置该步操作的位置和填的数 } }; class desktop{ private: clock_t c_start,c_end; int sudoku[10][10];//当前数独内容 stack opback;//回溯操作历史 int level;//当前难度 int num[9];//每个难度中的题库数量 int puzzlebank[29][10][10]; //数独谜题 其中所有难度的数独题存在一起,第二个第三个下标存储谜题内容 int check(){//返回0表示正常,返回1表示完成数独,返回-1表示有错误 int tool[9]={0,0,0,0,0,0,0,0,0};//存储1~9数字存在的数量 int flag=1; int i,j; for(i=0;i<3;i++)//检查左上 for(j=0;j<3;j++){ int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(i=0;i<9;i++) if(tool[i]>1)//数独填错了 return -1; else if(tool[i]==0)//数独未完成 flag=0; for(i=0;i<9;i++) tool[i]=0; for(i=0;i<3;i++)//检查中上 for(j=3;j<6;j++){ int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(i=0;i<9;i++) if(tool[i]>1)//数独填错了 return -1; else if(tool[i]==0)//数独未完成 flag=0; for(i=0;i<9;i++) tool[i]=0; for(i=0;i<3;i++)//检查右上 for(j=6;j<9;j++){ int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(i=0;i<9;i++) if(tool[i]>1)//数独填错了 return -1; else if(tool[i]==0)//数独未完成 flag=0; for(i=0;i<9;i++) tool[i]=0; for(i=3;i<6;i++)//检查左中 for(j=0;j<3;j++){ int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(i=0;i<9;i++) if(tool[i]>1)//数独填错了 return -1; else if(tool[i]==0)//数独未完成 flag=0; for(i=0;i<9;i++) tool[i]=0; for(i=3;i<6;i++)//检查中间 for(j=3;j<6;j++){ int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(i=0;i<9;i++) if(tool[i]>1)//数独填错了 return -1; else if(tool[i]==0)//数独未完成 flag=0; for(i=0;i<9;i++) tool[i]=0; for(i=3;i<6;i++)//检查右中 for(j=6;j<9;j++){ int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(i=0;i<9;i++) if(tool[i]>1)//数独填错了 return -1; else if(tool[i]==0)//数独未完成 flag=0; for(i=0;i<9;i++) tool[i]=0; for(i=6;i<9;i++)//检查左下 for(j=0;j<3;j++){ int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(i=0;i<9;i++) if(tool[i]>1)//数独填错了 return -1; else if(tool[i]==0)//数独未完成 flag=0; for(i=0;i<9;i++) tool[i]=0; for(i=6;i<9;i++)//检查中下 for(j=3;j<6;j++){ int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(i=0;i<9;i++) if(tool[i]>1)//数独填错了 return -1; else if(tool[i]==0)//数独未完成 flag=0; for(i=0;i<9;i++) tool[i]=0; for(i=6;i<9;i++)//检查右下 for(j=6;j<9;j++){ int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(i=0;i<9;i++) if(tool[i]>1)//数独填错了 return -1; else if(tool[i]==0)//数独未完成 flag=0; for(i=0;i<9;i++) tool[i]=0; //检索所有的3x3块 int k; for(i=0;i<9;i++){ for(j=0;j<9;j++){//检查行 int pos=sudoku[i][j]-1; if(pos>=0) tool[pos]++; } for(j=0;j<9;j++) if(tool[j]>1)//数独填错了 return -1; else if(tool[j]==0)//数独未完成 flag=0; for(j=0;j<9;j++)//重新初始化 tool[j]=0; for(j=0;j<9;j++){//检查列 int pos=sudoku[j][i]-1; if(pos>=0) tool[pos]++; } for(j=0;j<9;j++) if(tool[j]>1)//数独填错了 return -1; else if(tool[j]==0)//数独未完成 flag=0; for(j=0;j<9;j++)//重新初始化 tool[j]=0; } return flag; } void show(){//打印当前数独迷阵 int i,j,k,t; for(k=0;k<9;k++){ for(i=0;i<37;i++) cout<<"-"; cout< >c; while(1){ if(c>='1'&&c<='9') return c-48; else{ cout<<"请输入正确的数字!"< {0,0,4,8,0,5,0,3,0},{5,2,8,0,0,0,0,0,4}, {0,0,0,4,7,0,0,0,2},{6,3,0,0,0,0,5,0,0},{0,0,5,1,9,0,0,4,0},{0,0,0,0,3,8,9,0,0}, {0,9,2,0,0,3,0,1,0},{0,0,0,0,5,7,4,0,3},{3,5,0,0,1,0,0,0,0}}; i=0; memcpy(&puzzlebank[num[i]-1][0][0],&puzzletemp[0][0],sizeof(puzzletemp));//拷贝 } void Menu(){ cout<<" 输入数字选择功能: "< 0) for(i=0;i



