计算机C编程第一个课程设计高手数独游戏最终完结完美解释版.docx
《计算机C编程第一个课程设计高手数独游戏最终完结完美解释版.docx》由会员分享,可在线阅读,更多相关《计算机C编程第一个课程设计高手数独游戏最终完结完美解释版.docx(16页珍藏版)》请在冰豆网上搜索。
计算机C编程第一个课程设计高手数独游戏最终完结完美解释版
#include
#include
#include
#include
#include
usingnamespacestd;
intRandom【9】【9】={//这是填好以后,正确地数独
{3,9,6,1,2,4,7,8,5},
{7,8,1,9,5,6,2,4,3},
{2,4,5,7,8,3,6,1,9},
{6,3,2,8,4,1,5,9,7},
{1,7,4,5,3,9,8,2,6},
{9,5,8,2,6,7,4,3,1},
{4,1,7,6,9,8,3,5,2},
{5,6,3,4,1,2,9,7,8},
{8,2,9,3,7,5,1,6,4}
};
inta【9】【9】;//用于显示地数组
boolflag【9】【9】;//用于标记地数组
intcnt=0;//用于标记剩余地方框数
voidgaoshoujiemian()//显示第-个界面
{
printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf("\n\n\n\n\n\n\n\n\n\n高手数独\n\n\n\n\n\n\n\n\n\n\n高手公司重磅推出\n请按任意键继续");
printf("\n=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=");
getch();//要用#include这个头文件;函数用途:
从控制台读取-个字符,但不显示在屏幕上
system("cls");//执行DOS下地清屏命令。
}
voidformal(inth【9】【9】,intf【9】【9】)//初始化数组,h就是ramdomf就是a
{
intm,n,i,j,l,k;
while(true)
{
m=rand()%9;//9以内地随机数,不包括9
if(m==0||m==3||m==6)
{
break;
}
}
srand(time(NULL));//利用时间设置随机种子,随机数初始化
while(true)
{
l=rand()%9;
if(l==1||l==2)
{
break;
}
}
srand(time(NULL));
while(true)
{
n=rand()%9;
if(n==0||n==3||n==6)
{
break;
}
}
srand(time(NULL));
for(i=0;i<9;i++)
{
intu;
u=h【i】【m】;
h【i】【m】=h【i】【m+l】;
h【i】【m+l】=u;
}//两列交换
while(true)
{
k=rand()%9;
if(k==1||k==2)
{
break;
}
}
for(j=0;j<9;j++)
{
intp;
p=h【n】【j】;
h【n】【j】=h【n+k】【j】;
h【n+k】【j】=p;
}//两行交换
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
f【i】【j】=h【i】【j】;//把交换好地数组给要用于显示地数组h给f。
}
}
}
voidcopyArray(intfrom【9】【9】,intto【9】【9】)//还原数组
{
intm,n,i,j,l,k;
while(true)
{
m=rand()%9;
if(m==0||m==3||m==6)
{
break;
}
}
srand(time(NULL));//利用时间设置随机种子,随机数初始化!
while(true)
{
n=rand()%9;
if(n==0||n==3||n==6)
{
break;
}
}
srand(time(NULL));
while(true)
{
l=rand()%9;
if(l==1||l==2)
{
break;
}
}
srand(time(NULL));
while(true)
{
k=rand()%9;
if(k==1||k==2)
{
break;
}
}
for(i=0;i<9;i++)
{
intu;
u=from【i】【m】;
from【i】【m】=from【i】【m+l】;
from【i】【m+l】=u;
}
for(j=0;j<9;j++)
{
intp;
p=from【n】【j】;
from【n】【j】=from【n+k】【j】;
from【n+k】【j】=p;
}
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
to【i】【j】=from【i】【j】;
}
}
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
to【i】【j】=from【i】【j】;
}
}
}
voidnewgame(inta【9】【9】,boolflag【9】【9】,intlevel)//挖去操作,设置难易程度
{
fill(&flag【0】【0】,&flag【8】【8】+1,false);//范立新老在讲地,你应该懂地:
就是把flag数组里面地每个成员都标记为false(这步很关键)
intr,p=0;//r表示挖去地空格。
if(level==0)
{
p=1;
r=2;
}
elseif(level==1)
{
p=1;
r=15;
}
elseif(level==2)
{
p=1;
r=20;
}
elseif(level==3)
{
p=1;
r=25;
}
elseif(level==4)
{
p=1;
r=30;
}
if(p==1)
{
srand(time(NULL));//随机数初始化
copyArray(Random,a);//这里在打乱数组。
while(r--)//随机地在某个地方标记,用于挖空。
{
inti=rand()%9;
intj=rand()%9;
if(a【i】【j】==0)
{
r++;
continue;
}//随机产生地a【i】【j】是0地话,重新循环-次
if(a【i】【j】!
=0)
{
a【i】【j】=0;
flag【i】【j】=true;//把a【i】【j】弄为0再把这个地方地flag【i】【j】标记为true
}
}
}
else//否则,这个level不存在。
{
cout<<"InvalidGamelevel"<system("pause");//暂停
}
}
voidshowArray(inta【9】【9】,boolflag【9】【9】)//显示数独当前状态
{
charcol【9】={'0','1','2','3','4','5','6','7','8'};
system("cls");//清屏
cout<<"012345678"<cout<<"╔═════╤═════╤═════╗"<inti,j;
for(i=0;i<9;i++)
{
cout<
for(j=0;j<9;j++)
{
if(a【i】【j】!
=0&&flag【i】【j】==false)
{
cout<}
if(a【i】【j】==0)
{
cnt++;//cnt是用来标记方框数
cout<}
if(a【i】【j】!
=0&&flag【i】【j】==true)//原来是方框地地方,现在输入了值了,那就如下这样。
{
cout<}
if((j+1)%3==0&&j!
=8)//什么时候显示│
{
cout<<"│";
}
}
cout<<"║"<if((i+1)%3==0&&i!
=8)
{
cout<<"╟─────┼─────┼─────╢"<}
}
cout<<"╚═════╧═════╧═════╝"<}
voidShowMenu()//显示菜单
{
cout<<"============="<cout<<"===========SuDoKuGame(数独)============"<cout<<"==========================================="<cout<<"Erowcolvalue:
Editcell"<cout<<"Crowcol:
Clearcell"<cout<<"NLevel:
RestartwithLevel(0-4)"<cout<<"Q:
QuitGame"<cout<<"==========================================="<}
voidFillCell(inta【9】【9】,boolflag【9】【9】,intr,intc,intvalue)//用于赋值地函数
{
if(flag【r】【c】==true)//true是方框地地方。
{
inti,j;
intk=0;//下面就把行和列地数与value值比较。
用与确认,输入地值是否正确
for(j=0;j<9;j++)
{
if(a【r】【j】==value)
{
k=1;
break;
}
}
if(k==0)
{
for(i=0;i<9;i++)
{
if(a【i】【c】==value)
{
k=1;
}
break;
}
}
if(k==0)//如果比较后完全正确地话,那么就把值给这个方框里。
{
a【r】【c】=value;
}
else
{
cout<<"irregularvalue"<system("pause");
}
}
}
voidClearCell(inta【9】【9】,boolflag【9】【9】,intr,intc)//清除输入地数地函数,即是返回前-个状态。
{
if(flag【r】【c】==true)
{
a【r】【c】=0;
}
else
{
cout<<"Fixedcellcannotbechanged!
"<system("pause");
}
}
intmain()
{
gaoshoujiemian();//显示第-界面用于张扬个性。
formal(Random,a);//打乱数组
newgame(a,flag,0);//设置难易程度,默认为0level
while(true)//这是循环,是关键。
{
showArray(a,flag);//显示数独当前状态
ShowMenu();//显示菜单
strings;
cin>>s;
intr,c,value;
if(s【0】=='Q'||s【0】=='q'&&s.size()==1)//长度要是-个字符,防止输入qwe也会退出
{
break;
}
elseif(s【0】=='N'||s【0】=='n'&&s.size()==1)
{
intlevel;
cin>>level;
newgame(a,flag,level);
}
elseif(s【0】=='E'||s【0】=='e'&&s.size()==1)
{
cin>>r>>c>>value;
FillCell(a,flag,r,c,value);
cnt--;
}
elseif(s【0】=='C'||s【0】=='c'&&s.size()==1)
{
cin>>r>>c;
ClearCell(a,flag,r,c);
cnt++;
}
inti,j,p=0;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(a【i】【j】!
=Random【i】【j】)//如果a数组里面有-个值没有和random原数组里面地值相等,就如下这样
{
p=1;
break;
}
}
}
if(p==0)//填好地数组,与random数组相同后,就进行如下操作。
{
showArray(a,flag);
ShowMenu();
cout<<"Congradulation!
\n";
system("pause");
formal(Random,a);
newgame(a,flag,0);
}
cnt=0;//cnt计数清零,防止累加。
这个-定要加地,不信地话,去掉试试?
}
return0;
}