【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载1_zhuyi8120的博客-CSDN博客
【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2_zhuyi8120的博客-CSDN博客
【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载4_zhuyi8120的博客-CSDN博客
【原创】|源码全文-日历拼图游戏的解决方案(C语言-进阶应用)-详解连载5_zhuyi8120的博客-CSDN博客
更新完毕。
今天的拼图
今天的计算结果
连载1、连载2的链接见上。如果还没看过的,建议先看上面这2个链接。
因为打算让读者也参与解决这个问题,因此我在分析时会详细点,但对代码的说明会简略些,如果看懂了分析,看代码应该是没难度的,甚至还可以看得出代码的优劣。
以下接着说连载3的内容。
C语言实现4:记录每个方块的各种变体的长宽数据
因为不同变体的长和宽是不一样的,因此在判断能否插入时,每个方块及它们的不同变体与底盘进行比对的以下2个数据是不一样的:
1、比对起始点的范围。
这个说法好像有点拗口,看一下图片说明就容易明白了。
图12:匹配的起始点示意图
针对不同的方块,匹配的起始点位置是不一样的。比如上述的H方块,是从(0,0)到(5,4),而E方块的范围是从(0,0)到(4,4)。如果E方块的匹配范围也和H方块一样,匹配的起始点到了第6行时(5,x)时,因为E方块有3行,如果继续比对,就会出现溢出了。在比对溢出时,按照C语言的运行模式,它不会提醒数组溢出,会按内存顺序继续比对,有可能会出现莫名其妙的异常情况。
2、匹配内容的对比次数。
因为不同的方块变体,占用的空间是不一样的,比对的内容也会不一样。如:H方块比对6次就可以了;G要比对9次等等。
所以,要对方块进行标识长度和宽度。
这时候,要新建数组,来用记录这个数据。方块及他们的变体,现在共有8×8=64个,每个要记录2个数据,有两种方式,第1种是因此定义一个数组,包括这2项,用第0项表示长,用第1项表示宽。第2种方式是建2个数组,分别表示长和宽。笔者使用第2种方式,用xlng和ylng来分别表示长和宽,理由是两者是相对独立的变量,并且数量不多(才2个),后面使用时也是分别引用的,这样分开不同的数组,可以减少用0和1这种不便于快速区分的表示方式。
接着,再考虑怎么算长度和宽度。本来,这时候可以沿用上面计算空行和空列的数组,但笔者在使用时,出现一些莫名其妙的错误,后来,干脆单独分了出来进行计算。虽然看上去操作的次数和代码都增加了,但因为2个功能之间是互相之间已经独立运作,功能间不出现纠缠,在后期的修改和维护都比较清晰,因此建议分开处理。
代码如下:
///mark the x-length and y-length
for (ib=0;ib<8;ib++){
for(i=0;i<8;i++){
xlng[ib][i]=0;
for(j=0;j<4;j++){
xem[j]=0;
for(k=0;k<4;k++){
if(b[ib][i][j][k]=='-'){
xem[j]++;
}//if
}//for k
//printf("xem[%d]:%d\n",j,xem[j]);
if(xem[j]<4){
xlng[ib][i]++;
}
}//for j
//printf("xlng[%d][%d]:%d\n",ib,i,xlng[ib][i]);
ylng[ib][i]=0;
for(k=0;k<4;k++){
yem[k]=0;
for(j=0;j<4;j++){
if(b[ib][i][j][k]=='-'){
yem[k]++;
}//if
}//for k
//printf("yem[%d]:%d\n",k,yem[k]);
if(yem[k]<4){
ylng[ib][i]++;
}
}//for j
//x-long is ok.
}//for i
}///for ib
printf("the third part is over.they had remark the length.\n");
代码段5:标识每个方块变体的长和宽
关于方块的前期处理,到这里就做完了,接着就开始对底盘处理和放入方块了。
C语言实现5:初始化底盘。
底盘的初始化是比较容易的。先将7×7的数组全部设置为空格’-‘,然后,把我们需要预留的用字母Z表示固定的2个边框位置,用字母X表示我们想留下的空格,如今天12月8日,就要预留(1,5)格和(3,0)格。初始化的时候,再变更这几个格子就行了。
int iii=0,jjj=0;
for(iii=0;iii<7;iii++){
for(jjj=0;jjj<7;jjj++){
ctemp[iii][jjj]='-';
}
}
ctemp[0][6]='Z';
ctemp[1][6]='Z';
ctemp[6][3]='Z';
ctemp[6][4]='Z';
ctemp[6][5]='Z';
ctemp[6][6]='Z';
ctemp[1][5]='X';
ctemp[3][0]='X';
下面要做的事情,就是开始想办法计算方块和底盘的匹配了。这个会比较有难度。我们明天继续。