【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载3

【原创】|日历拼图游戏的解决方案(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';

下面要做的事情,就是开始想办法计算方块和底盘的匹配了。这个会比较有难度。我们明天继续。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值