#include <iostream>
#include <cstring>
#include <cstdio>
#include <time.h>
#include <cstdlib>
#include<windows.h>
using namespace std;
int a[15][15],ans_pre,ans[15][15],b[15][15];
bool square[10][10],lie[10][10],hang[10][10],flag[15][15];
bool check;
bool f[15];
int c[15];
int difficult;
void SetColor(unsigned short ForeColor=7,unsigned short BackGroundColor=0)
{
HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor);
}
int ge(int x,int y)
{
return(((x-1)/3)*3+(y-1)/3+1);
}
int print(){
SetColor(15);
cout<<"\n ";
for(int i=1;i<=9;i++){
cout<<i<<" ";
}
cout<<endl;
printf(" ㄘ━━━┳━━━┳━━━");
SetColor(9);
printf("┳");
SetColor(15);
printf("━━━┳━━━┳━━━");
SetColor(9);
printf("┳");
SetColor(15);
printf("━━━┳━━━┳━━━┓");
cout<<"\t\t\ta -- 输入指定位置的值";
cout<<endl;
for(int i=1;i<=9;i++)
{
cout<<" "<<i;
for(int j=1;j<=9;j++)
{
if(a[i][j]==0)
{
if(j==4||j==7) SetColor(9);
cout<<"┃ ";
SetColor(15);
if (j==9) cout<<"┃";
}else
{
if(j==4||j==7) SetColor(9);
cout<<"┃ ";
SetColor(15);
if(b[i][j]==0) SetColor(4);
cout<<a[i][j]<<" ";
SetColor(15);
if (j==9) cout<<"┃";
}
}
cout<<endl;
if(i==3||i==6)
{
SetColor(9);
cout<<" ┣━━━╋━━━╋━━━";
cout<<"╋";
cout<<"━━━╋━━━╋━━━";
cout<<"╋" ;
cout<<"━━━╋━━━╋━━━┫";
SetColor(15);
if(i==6){
cout<<"\t\t\td -- 再来一局";
}
SetColor(9);
cout<<endl;
continue;
}
if(i!=9)
{
cout<<" ┣━━━╋━━━╋━━━";
SetColor(9);
cout<<"╋";
SetColor(15);
cout<<"━━━╋━━━╋━━━";
SetColor(9);
cout<<"╋" ;
SetColor(15);
cout<<"━━━╋━━━╋━━━┫";
if(i==2){
cout<<"\t\t\tb -- 撤回上一个值";
}
if(i==4){
cout<<"\t\t\tc -- 查看答案";
}
if(i==8){
cout<<"\t\t\te -- 退出游戏";
}
cout<<endl;
}
else
{
SetColor(15);
printf(" ┗━━━┻━━━┻━━━");
SetColor(9);
printf("┻");
SetColor(15);
printf("━━━┻━━━┻━━━");
SetColor(9);
printf("┻");
SetColor(15);
printf("━━━┻━━━┻━━━┛\n");
}
SetColor(15);
}
}
int print_y(){
SetColor(15);
cout<<"\n ";
for(int i=1;i<=9;i++){
cout<<i<<" ";
}
cout<<endl;
printf(" ㄘ━━━┳━━━┳━━━");
SetColor(9);
printf("┳");
SetColor(15);
printf("━━━┳━━━┳━━━");
SetColor(9);
printf("┳");
SetColor(15);
printf("━━━┳━━━┳━━━┓");
cout<<"\t\t\ta -- 输入指定位置的值";
cout<<endl;
for(int i=1;i<=9;i++)
{
cout<<" "<<i;
for(int j=1;j<=9;j++)
{
if(ans[i][j]==0)
{
if(j==4||j==7) SetColor(9);
cout<<"┃ ";
SetColor(15);
if (j==9) cout<<"┃";
}else
{
if(j==4||j==7) SetColor(9);
cout<<"┃ ";
SetColor(15);
if(b[i][j]==0) SetColor(4);
cout<<ans[i][j]<<" ";
SetColor(15);
if (j==9) cout<<"┃";
}
}
cout<<endl;
if(i==3||i==6)
{
SetColor(9);
cout<<" ┣━━━╋━━━╋━━━";
cout<<"╋";
cout<<"━━━╋━━━╋━━━";
cout<<"╋" ;
cout<<"━━━╋━━━╋━━━┫";
SetColor(15);
if(i==6){
cout<<"\t\t\td -- 再来一局";
}
SetColor(9);
cout<<endl;
continue;
}
if(i!=9)
{
cout<<" ┣━━━╋━━━╋━━━";
SetColor(9);
cout<<"╋";
SetColor(15);
cout<<"━━━╋━━━╋━━━";
SetColor(9);
cout<<"╋" ;
SetColor(15);
cout<<"━━━╋━━━╋━━━┫";
if(i==2){
cout<<"\t\t\tb -- 撤回上一个值";
}
if(i==4){
cout<<"\t\t\tc -- 查看答案";
}
if(i==8){
cout<<"\t\t\te -- 退出游戏";
}
cout<<endl;
}
else
{
SetColor(15);
printf(" ┗━━━┻━━━┻━━━");
SetColor(9);
printf("┻");
SetColor(15);
printf("━━━┻━━━┻━━━");
SetColor(9);
printf("┻");
SetColor(15);
printf("━━━┻━━━┻━━━┛\n");
}
SetColor(15);
}
}
int dfs(int x,int y)
{
if(!check) return 0;
if(x==0&&y==9)
{
// print();
check=false;
return 0;
}
if(a[x][y]==0)
for(int j=1;j<=9;j++)
{
int i=c[j];
if(square[ge(x,y)][i]&&lie[y][i]&&hang[x][i])
{
square[ge(x,y)][i]=false;
lie[y][i]=false;
hang[x][i]=false;
ans[x][y]=i;
if(y==1) dfs(x-1,9);else dfs(x,y-1);
square[ge(x,y)][i]=true;
lie[y][i]=true;
hang[x][i]=true;
if(!check) return 0;
}
}
if(!check) return 0;
if(a[x][y]!=0) if(y==1) dfs(x-1,9);else dfs(x,y-1);
}
int work(int x){
if(x==10)
{
return 0;
}
int i=1;
int y=rand()%9+1;
while(!f[y]) y=rand()%9+1;
f[y]=false;
c[x]=y;
work(x+1);
}
void init(){
srand(time(NULL));
memset(a,0,sizeof(a));
memset(lie,true,sizeof(lie));
memset(hang,true,sizeof(hang));
memset(square,true,sizeof(square));
memset(f,true,sizeof(f));
check=true;
work(1);
memset(a,sizeof(a),0);
check=true;
dfs(9,9);
memcpy(a,ans,sizeof(ans));
// print();
cout<<endl<<endl<<endl<<endl;
SetColor(15);
cout<<"\t\t\t\t****************游戏难度选择***************"<<endl;
SetColor(15);
cout<<"\t\t\t\t<< >>"<<endl;
SetColor(15);
cout<<"\t\t\t\t<< 0 -- 返回 >>"<<endl;
SetColor(2);
cout<<"\t\t\t\t<< 1 -- 简单 >>"<<endl;
SetColor(9);
cout<<"\t\t\t\t<< 2 -- 中等 >>"<<endl;
SetColor(13);
cout<<"\t\t\t\t<< 3 -- 困难 >>"<<endl;
SetColor(15);
cout<<"\t\t\t\t<< >>"<<endl;
SetColor(15);
cout<<"\t\t\t\t*******************************************"<<endl;
printf("\t\t\t\t输入难度等级:");
difficult=0;
while(difficult>3||difficult<1) cin>>difficult;
}
void rule(){
SetColor(3);
cout<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"\t\t\t***********************************数独游戏规则**********************************\n";
SetColor(3);
cout<<"\t\t\t<< >>\n";
SetColor(3);
cout<<"\t\t\t<< 数独游戏在9×9的方格内进行,分为3×3的小方格被称为区。 >>\n";
SetColor(3);
cout<<"\t\t\t<< 数独游戏首先从已经填入数字的格子开始, >>\n";
SetColor(3);
cout<<"\t\t\t<< 用1至9之间的数字填满空格,一个格子只能填入一个数字 >>\n";
SetColor(3);
cout<<"\t\t\t<< 每个数字在每一行只能出现一次; >>\n";
SetColor(3);
cout<<"\t\t\t<< 每个数字在每一列只能出现一次; >>\n";
SetColor(3);
cout<<"\t\t\t<< 每个数字在每一区只能出现一次; >>\n";
SetColor(3);
cout<<"\t\t\t<< 总结这些规则,即每个数字在每一行,每一列和每一区只能出现一次 >>\n";
SetColor(3);
cout<<"\t\t\t<< >>\n";
SetColor(3);
cout<<"\t\t\t*********************************************************************************\n";
SetColor(3);
cout<<"\t\t\t\t\t";
}
void button(){
SetColor(3);
cout<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"\t\t\t************************数独游戏按键说明*****************************\n";
SetColor(3);
cout<<"\t\t\t<< >>\n";
SetColor(3);
cout<<"\t\t\t<< 进入游戏后要输入3个数,所在行、所在列、所在值。 >>\n";
SetColor(3);
cout<<"\t\t\t<< 3个数分别用空格隔开 >>\n";
SetColor(3);
cout<<"\t\t\t<< 输完后用回车键进行确定 >>\n";
SetColor(3);
cout<<"\t\t\t*********************************************************************\n";
SetColor(3);
cout<<"\t\t\t\t\t";
}
void welcome(){
SetColor(3);
cout<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"\t\t\t\t*************欢迎进入数独游戏*************\n";
SetColor(3);
cout<<"\t\t\t\t<< >>\n";
SetColor(3);
cout<<"\t\t\t\t<< a-进入数独游戏 >>\n";
SetColor(3);
cout<<"\t\t\t\t<< b-游戏规则说明 >>\n";
SetColor(3);
cout<<"\t\t\t\t<< c-按键说明 >>\n";
SetColor(3);
cout<<"\t\t\t\t<< d-退出游戏 >>\n";
SetColor(3);
cout<<"\t\t\t\t<< >>\n";
SetColor(3);
cout<<"\t\t\t\t******************************************\n";
SetColor(3);
cout<<"\t\t\t\t\t请输入:";
char a;
cin>>a;
switch(a){
case'a':system("cls");break;
case'b':system("cls");rule();break;
case'c':system("cls");button();break;
case'd':init();
}
}
void run(){
int sum=0;
switch(difficult){
case 1:sum=20;
break;
case 2:sum=40;
break;
case 3:sum=60;
break;
}
int i=1;
while(i<=sum)
{
int x,y;
x=rand()%9+1;
y=rand()%9+1;
while(a[x][y]==0)
{
x=rand()%9+1;
y=rand()%9+1;
}
a[x][y]=0;
i++;
}
}
void success(){
cout<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"\t\t\t************************庆祝****************************\n";
SetColor(15);
cout<<"\t\t\t<< >>\n";
SetColor(13);
cout<<"\t\t\t<< 恭喜你答对了 >>\n";
SetColor(15);
cout<<"\t\t\t<< 总计时为: >>\n";
SetColor(3);
cout<<"\t\t\t<< 12分钟13秒 >>\n";
SetColor(15);
cout<<"\t\t\t<< >>\n";
cout<<"\t\t\t********************************************************\n";
SetColor(15);
cout<<"\t\t\t\t\t";
}
int main()
{
success();
system("pause");
welcome();
init();
run();
system("cls");
memcpy(b,a,sizeof(a));
print();
int xx,yy,zz;
int exitf=0;
char flag;
cout<<" 请选择:";
while(cin>>flag)
{
switch(flag){
case 'a':{
cout<<" 输入坐标(先纵后横)键入值,格式为 x y value\n\n";
cin>>xx>>yy>>zz;
if(xx==0&&yy==0&&zz==0)
{
system("cls");
print_y();
break;
}
if(b[xx][yy]==0) a[xx][yy]=zz;
system("cls");
print();
if(b[xx][yy]!=0)
{
SetColor(4);
cout<<"此处已经被填写.\n";
SetColor(15);
}
break;
}
case 'b':{
zz=0;
if(xx==0&&yy==0&&zz==0)
{
system("cls");
print_y();
break;
}
if(b[xx][yy]==0) a[xx][yy]=zz;
system("cls");
print();
if(b[xx][yy]!=0)
{
SetColor(4);
cout<<"此处已经被填写.\n";
SetColor(15);
}
break;
}
case 'c':{
xx=0;
yy=0;
zz=0;
if(xx==0&&yy==0&&zz==0)
{
system("cls");
print_y();
break;
}
if(b[xx][yy]==0) a[xx][yy]=zz;
system("cls");
print();
if(b[xx][yy]!=0)
{
SetColor(4);
cout<<"此处已经被填写.\n";
SetColor(15);
}
break;
}
case 'd':{
system("cls");
welcome();
init();
run();
system("cls");
memcpy(b,a,sizeof(a));
print();
}
case 'e':{
exitf = 1;
break;
}
}
if(exitf==1){
break;
}
cout<<" 请选择:";
}
system("pause");
}
你会看到有四个选项:a、b、c、e;
如果你按“b”:
如果你按“c”:
如果你按“e”,则退出游戏;
如果你按“a”,则出现游戏难度选择界面:
对于上图,如果你按“0”,则返回上一级目录 ;
如果你按1~3,则进入游戏主界面。按“1”时,数独有20个空格,按“2”时,数独有40个空格,按“3”时,数独有60个空格。
如果按“a”,这开始输入要填数字的横纵坐标和其值,。 输入后的值用红色标注,区分刚开始自动生成的字符;如果输入的位置原题中就有数字则会有“此处已经被填写”的提示。
如果获胜则出现图3.9并且生成总答题时间。
如果按“c”,则根据DFS算法输出数独答案:
注明:人机交互实验1