计算机C编程第一个课程设计高手数独游戏最终完结完美解释版Word格式.docx
《计算机C编程第一个课程设计高手数独游戏最终完结完美解释版Word格式.docx》由会员分享,可在线阅读,更多相关《计算机C编程第一个课程设计高手数独游戏最终完结完美解释版Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
printf("
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n"
);
\n\n\n\n\n\n\n\n\n\n高手数独\n\n\n\n\n\n\n\n\n\n\n高手公司重磅推出\n请按任意键继续"
\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));
//利用时间设置随机种子,随机数初始化
l=rand()%9;
if(l==1||l==2)
n=rand()%9;
if(n==0||n==3||n==6)
for(i=0;
i<
9;
i++)
intu;
u=h【i】【m】;
h【i】【m】=h【i】【m+l】;
h【i】【m+l】=u;
}//两列交换
k=rand()%9;
if(k==1||k==2)
for(j=0;
j<
j++)
intp;
p=h【n】【j】;
h【n】【j】=h【n+k】【j】;
h【n+k】【j】=p;
}//两行交换
for(j=0;
j++)
f【i】【j】=h【i】【j】;
//把交换好地数组给要用于显示地数组h给f。
voidcopyArray(intfrom【9】【9】,intto【9】【9】)//还原数组
//利用时间设置随机种子,随机数初始化!
u=from【i】【m】;
from【i】【m】=from【i】【m+l】;
from【i】【m+l】=u;
p=from【n】【j】;
from【n】【j】=from【n+k】【j】;
from【n+k】【j】=p;
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)
r=15;
elseif(level==2)
r=20;
elseif(level==3)
r=25;
elseif(level==4)
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"
endl;
system("
pause"
//暂停
voidshowArray(inta【9】【9】,boolflag【9】【9】)//显示数独当前状态
charcol【9】={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
system("
//清屏
cout<
012345678"
╔═════╤═════╤═════╗"
inti,j;
col【i】<
║"
;
=0&
&
flag【i】【j】==false)
cout<
setw(3)<
a【i】【j】;
cnt++;
//cnt是用来标记方框数
□"
//setw是空格
flag【i】【j】==true)//原来是方框地地方,现在输入了值了,那就如下这样。
setw(2)<
_"
if((j+1)%3==0&
j!
=8)//什么时候显示│
│"
if((i+1)%3==0&
i!
=8)
cout<
╟─────┼─────┼─────╢"
╚═════╧═════╧═════╝"
voidShowMenu()//显示菜单
============="
cnt<
spacesleft=============="
===========SuDoKuGame(数独)============"
==========================================="
Erowcolvalue:
Editcell"
Crowcol:
Clearcell"
NLevel:
RestartwithLevel(0-4)"
Q:
QuitGame"
voidFillCell(inta【9】【9】,boolflag【9】【9】,intr,intc,intvalue)//用于赋值地函数
if(flag【r】【c】==true)//true是方框地地方。
{
inti,j;
intk=0;
//下面就把行和列地数与value值比较。
用与确认,输入地值是否正确
if(a【r】【j】==value)
k=1;
break;
if(k==0)
for(i=0;
if(a【i】【c】==value)
{
k=1;
}
if(k==0)//如果比较后完全正确地话,那么就把值给这个方框里。
a【r】【c】=value;
else
irregularvalue"
voidClearCell(inta【9】【9】,boolflag【9】【9】,intr,intc)//清除输入地数地函数,即是返回前-个状态。
if(flag【r】【c】==true)
a【r】【c】=0;
else
Fixedcellcannotbechanged!
system("
}
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也会退出
elseif(s【0】=='
N'
n'
s.size()==1)
intlevel;
cin>
level;
newgame(a,flag,level);
E'
e'
r>
c>
value;
FillCell(a,flag,r,c,value);
cnt--;
C'
c'
c;
ClearCell(a,flag,r,c);
cnt++;
inti,j,p=0;
for(i=0;
for(j=0;
if(a【i】【j】!
=Random【i】【j】)//如果a数组里面有-个值没有和random原数组里面地值相等,就如下这样
p=1;
break;
}
if(p==0)//填好地数组,与random数组相同后,就进行如下操作。
showArray(a,flag);
ShowMenu();
Congradulation!
\n"
formal(Random,a);
newgame(a,flag,0);
cnt=0;
//cnt计数清零,防止累加。
这个-定要加地,不信地话,去掉试试?
return0;