【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2
【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载1_zhuyi8120的博客-CSDN博客
【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载3_zhuyi8120的博客-CSDN博客
【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载4_zhuyi8120的博客-CSDN博客
【原创】|源码全文-日历拼图游戏的解决方案(C语言-进阶应用)-详解连载5_zhuyi8120的博客-CSDN博客
今天的计算和拼图如下:
C语言实现1:初始化
初始化看上去还是比较简单的。按照上面所分析的,我们先把4个有8种变体的方块放在前面,有4种变体的方块放在中间,有2种变体的方块放到最后,并且按这样的顺序命名。
图8:8种方块的命名
代码如下:
char cA[8][4][4]={ {{'A','A','A','-'},{'-','A','A','-'},{'-','-','-','-'},{'-','-','-','-'}}, {{'B','B','B','B'},{'-','-','-','B'},{'-','-','-','-'},{'-','-','-','-'}},{{'C','C','C','C'},{'-','-','C','-'},{'-','-','-','-'},{'-','-','-','-'}},{{'D','-','-','-'},{'D','D','-','-'},{'-','D','-','-'},{'-','D','-','-'}},{{'E','E','-','-'},{'-','E','-','-'},{'-','E','E','-'},{'-','-','-','-'}}, {{'F','F','F','-'},{'F','-','F','-'},{'-','-','-','-'},{'-','-','-','-'}},{{'G','G','G','-'},{'G','-','-','-'},{'G','-','-','-'},{'-','-','-','-'}},{{'H','H','H','-'},{'H','H','H','-'},{'-','-','-','-'},{'-','-','-','-'}}};
代码段1:初始化8个方块代码
注:限于篇幅,并且让读者也有参与这个过程,代码并没有把全部代码都显示出来。需要读者在阅读之后自己补充完整。
C语言实现2:生成8种变体
我们先来分析8种变体之间数组的相互关系。
先来看顺时针旋转90度的情况(如下图):
图9:顺时针旋转90度的图示
由上图,我们可以推论出变换的式子为(i,j)→(3-j,i)。有兴趣读者也可以验证一下,这个式子是否满足其他几行的变换。
代码如下(非最优化,在所有规律都试过之后,会有更合适的方式):
//顺时针旋转90度
//非最优化代码示范
for(i=0;i<8;i++){for(j=0;j<4;j++){for(k=0;k<4;k++){b[6][i][j][k]=cA[i][3-k][j];}//k}//j}//i
代码段2:顺时针旋转90度
这时候,为了便于区分原始方块数组和变体方块数组,我们需要另外再建一个数组来存放这些变体(也可以用同一个数组,以节省内存使用,但对于本文的读者来说,建议分开操作,以便于不发生混淆)。
再来看顺时针180度旋转的情况:
图10:顺时针旋转180度的图示
代码段以上述类似。因非最优化代码,本处不再赘述。
笔者在用类似的方式做完各种之后,发现已经分不出来这8种是不是出现重复或者是否准确。于是,就把这8条式子列在了一起,然后,发现有重复的。然后,也发现了在数学上的简单规律。
有兴趣的读者可以暂停一下,自己先尝试一下,体验一下自己在复杂的情况下发现简单规律的快乐。
以下是根据找到的规律。一次性把8个变体全部创建出来的代码。
///creat 8 martinchar b[8][8][4][4];int iMax=3;for(i=0;i<8;i++){for(j=0;j<4;j++){//printf("tag[%d][%d]:",i,j);for(k=0;k<4;k++){//printf("cA[%d][%d][%d]=%c\n",i,j,k,cA[i][j][k]);b[0][i][j][k]=cA[i][j][k];b[1][i][j][k]=cA[i][j][iMax-k];b[2][i][j][k]=cA[i][iMax-j][k];b[3][i][j][k]=cA[i][iMax-j][iMax-k];b[4][i][j][k]=cA[i][k][j];b[5][i][j][k]=cA[i][k][iMax-j];b[6][i][j][k]=cA[i][iMax-k][j];b[7][i][j][k]=cA[i][iMax-k][iMax-j];}//k}//j}//i
代码段3:创建8个变体的普通代码
这还不算是最优化的代码,但暂时这样放着。因为后面还会针对不同方块实际有多少个变体来进一步优化,减少计算量(可以缩小为1/16)。
C语言实现3:规整化
按之前的第7个分析,变体不出现在左上角,会出现难以进行插入比较的困难。因此需要将靠左的空列和靠上的空行都清除掉。我们来分析一下如何确定。
图11:规整化图示
在数组里面, 移动方块是很容易的,稍微有点难度的是怎么判断要移动多少格。
我们可以采用计数的方式,具体是这样:
对于列来说,用for循环计算每一列有多少个空格,等于4个空格的,就确认是空列,移动的列数加1,如果不是等于4的,就不是空列,不需要移动。(行的情况类似,不赘述。)
但还要注意的一点,A方块翻面后,再旋转180度之后(图12),也一样有空列。
图12:虽然有空列,但不需要处理的情形
但很明显,对于这个空列来说,这并不需要移动。所以,简单的按空行/列就移动,这是不可取的。还要有技巧。
具体实现的代码如下:
做规整计算for(ib=0;ib<8;ib++){ for(i=0;i<8;i++){for(j=0;j<4;j++){xem[j]=0;for(k=0;k<4;k++){if(b[ib][i][j][k]=='-'){xem[j]++;}//if}}
/test xem//xmv=0;if(xem[0]==4){xmv++;if(xem[1]==4){xmv++;if(xem[2]==4){xmv++;}}}//if//move-1for(j=0;j<(4-xmv);j++){//printf("cA[%d]:\n",i);for(k=0;k<4;k++){ b[ib][i][j][k]=b[ib][i][j+xmv][k];}//for k}//for j//move-2:fill the emptyfor(j=4-xmv;j<4;j++){//printf("cA[%d]:\n",i);for(k=0;k<4;k++){ b[ib][i][j][k]='-';}//for k}//for j //printend 1/the 2 for(k=0;k<4;k++){yem[k]=0;for(j=0;j<4;j++){if(b[ib][i][j][k]=='-'){yem[k]++;}//if}
// printf("yem[%d]:%d\n",k,yem[k]);}/test yem//ymv=0;if(yem[0]==4){ymv++;if(yem[1]==4){ymv++;if(yem[2]==4){ymv++;}}}//if//move-1for(k=0;k<(4-ymv);k++){//printf("cA[%d]:\n",i);for(j=0;j<4;j++){ b[ib][i][j][k]=b[ib][i][j][k+ymv];}//for k}//for j//move-2:fill the emptyfor(k=4-ymv;k<4;k++){//printf("cA[%d]:\n",i);for(j=0;j<4;j++){ b[ib][i][j][k]='-';}//for k}//for jend of order}//i}//ib
printf("the second part is over!they are ordered.\n");
代码段4:规整化计算
(注:从分析到代码实现中间有点小的脱节,这是故意为之,目的是让读者自己去思考一下,然后,再看代码是如何实现的。)
【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2相关推荐
- 【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载1
[原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2_zhuyi8120的博客-CSDN博客 [原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载3_zhuyi8120的博客-C ...
- 视频教程-FPS游戏逆向与安全+UE4引擎基础详解-其他
FPS游戏逆向与安全+UE4引擎基础详解 想把自己的知识传播出去,让更多人学习到 苏瑞兵 ¥188.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取 ...
- 游戏脚本多线程与中控台完整详解
游戏脚本多线程与中控台完整详解
- C语言处理贪吃蛇游戏蛇的长度,c语言贪吃蛇详解4.食物的投放与蛇的变长
c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...
- Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程
事前准备 最近给游戏添加了苹果的内购,这一块的东西也是刚刚做完,总结一下,其实这里不管是游戏还是我们普通的App添加内购这一块的东西都是差不多的,多出来的部分就是我们Lua和OC的交互的部分,以前刚开 ...
- 巅峰战舰今日服务器全部维护,巅峰战舰12月7日更新维护公告 12.7新增玩法和舰船属性调整详解[图]...
类型:策略卡牌 大小:827.38MB 评分:10 平台: 巅峰战舰今天进行了临时维护更新,具体更新了什么内容?估计小伙伴们不太清楚,没关系,下面是小麦整理出来的12.7新增玩法和舰船属性调整详解,希 ...
- Android仿网易游戏的精美开场动画+动画基础详解
可以看到现在不少app都加入了开场动画,效果还是挺不错的,今天我就在这分享一下仿网易游戏的开场动画制作,同时我也在文章中加入了Android动画基础的详解,接下来就进入主题吧. 首先是布局文件: &l ...
- FPS游戏通用自瞄与透视算法详解!!
自瞄算法与实现: 1:首先我们要找到一个敌人的三维坐标. 2:我们还要找到自己的三维坐标. 3:我们还要找到自己的鼠标坐标X与Y(这里的鼠标坐标X与Y是角度,X为360,Y正中间为0向上减少到负90度 ...
- 【跳棋】跳棋游戏-多人游戏-微信小程序开发流程详解
看到跳棋游戏,一个2到6人可一起玩的游戏,于是联想起,自己上小学时候陪同学们玩过的弹珠游戏,是不是跟跳棋游戏很像呢,看了跳棋玩法,有兴趣就研究,这里把跳棋游戏给弄出来了,想知道地图怎么画,对此感兴趣的 ...
最新文章
- github设置添加SSH
- Spring常见面试题及答案汇总1000道(春招+秋招+社招)
- php和python哪个学起来简单一点-现在自学php和python那个合适?
- QLibrary 动态加载外部库文件
- MFC控件(7):Split Button
- linux正向连接shell_[经验] Linux 怎么连接 Xshell?
- spring内容协商管理_Spring框架中的内容协商
- 统计整数n的二进制表示中1的个数
- android 通知_Android 全局消息通知框架实现(类似EventBus)
- matlab计算曲线形心,并将y轴移动到形心上,使图形居中布置
- BFS算法解题套路框架(附习题)
- FFmpeg 和 MP4Box 几个命令
- 柳州哪里有短视频创业直播基地?柳州市互联网协会为您精选4家
- java openoffic linux_怎样使用Java读取OpenOffice文档
- 级联选择器实现省市区三级联动
- 河南科技大学计算机科学与技术分数线,河南科技大学2017年河南省各专业录取分数线...
- js中耦合与解耦问题总结
- 票房突破9亿,翻拍片《误杀》凭什么收获票房口碑双丰收?
- 运动耳机哪个好,蓝牙运动耳机排行榜
- 网络之IP地址规划小技巧分享(秘)