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

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

    [原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2_zhuyi8120的博客-CSDN博客 [原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载3_zhuyi8120的博客-C ...

  2. 视频教程-FPS游戏逆向与安全+UE4引擎基础详解-其他

    FPS游戏逆向与安全+UE4引擎基础详解 想把自己的知识传播出去,让更多人学习到 苏瑞兵 ¥188.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取 ...

  3. 游戏脚本多线程与中控台完整详解

    游戏脚本多线程与中控台完整详解

  4. C语言处理贪吃蛇游戏蛇的长度,c语言贪吃蛇详解4.食物的投放与蛇的变长

    c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...

  5. Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程

    事前准备 最近给游戏添加了苹果的内购,这一块的东西也是刚刚做完,总结一下,其实这里不管是游戏还是我们普通的App添加内购这一块的东西都是差不多的,多出来的部分就是我们Lua和OC的交互的部分,以前刚开 ...

  6. 巅峰战舰今日服务器全部维护,巅峰战舰12月7日更新维护公告 12.7新增玩法和舰船属性调整详解[图]...

    类型:策略卡牌 大小:827.38MB 评分:10 平台: 巅峰战舰今天进行了临时维护更新,具体更新了什么内容?估计小伙伴们不太清楚,没关系,下面是小麦整理出来的12.7新增玩法和舰船属性调整详解,希 ...

  7. Android仿网易游戏的精美开场动画+动画基础详解

    可以看到现在不少app都加入了开场动画,效果还是挺不错的,今天我就在这分享一下仿网易游戏的开场动画制作,同时我也在文章中加入了Android动画基础的详解,接下来就进入主题吧. 首先是布局文件: &l ...

  8. FPS游戏通用自瞄与透视算法详解!!

    自瞄算法与实现: 1:首先我们要找到一个敌人的三维坐标. 2:我们还要找到自己的三维坐标. 3:我们还要找到自己的鼠标坐标X与Y(这里的鼠标坐标X与Y是角度,X为360,Y正中间为0向上减少到负90度 ...

  9. 【跳棋】跳棋游戏-多人游戏-微信小程序开发流程详解

    看到跳棋游戏,一个2到6人可一起玩的游戏,于是联想起,自己上小学时候陪同学们玩过的弹珠游戏,是不是跟跳棋游戏很像呢,看了跳棋玩法,有兴趣就研究,这里把跳棋游戏给弄出来了,想知道地图怎么画,对此感兴趣的 ...

最新文章

  1. github设置添加SSH
  2. Spring常见面试题及答案汇总1000道(春招+秋招+社招)
  3. php和python哪个学起来简单一点-现在自学php和python那个合适?
  4. QLibrary 动态加载外部库文件
  5. MFC控件(7):Split Button
  6. linux正向连接shell_[经验] Linux 怎么连接 Xshell?
  7. spring内容协商管理_Spring框架中的内容协商
  8. 统计整数n的二进制表示中1的个数
  9. android 通知_Android 全局消息通知框架实现(类似EventBus)
  10. matlab计算曲线形心,并将y轴移动到形心上,使图形居中布置
  11. BFS算法解题套路框架(附习题)
  12. FFmpeg 和 MP4Box 几个命令
  13. 柳州哪里有短视频创业直播基地?柳州市互联网协会为您精选4家
  14. java openoffic linux_怎样使用Java读取OpenOffice文档
  15. 级联选择器实现省市区三级联动
  16. 河南科技大学计算机科学与技术分数线,河南科技大学2017年河南省各专业录取分数线...
  17. js中耦合与解耦问题总结
  18. 票房突破9亿,翻拍片《误杀》凭什么收获票房口碑双丰收?
  19. 运动耳机哪个好,蓝牙运动耳机排行榜
  20. 网络之IP地址规划小技巧分享(秘)

热门文章

  1. Excel操作:使用函数进行统计
  2. KMP算法-next函数介绍
  3. 终于有华为高工整理网工基础知识完整版,看完就入门
  4. [随笔] 不能卸,我舍不得。IE8,Beta2的。
  5. 网络系统管理赛项之Debian栏目文章导航
  6. OV2SLAM 安装运行
  7. 计算机网络电子邮件的格式,计算机网络基础之申请电子邮箱
  8. Ubuntu16.04+1080ti显卡驱动安装流程+循环登录问题【集锦】
  9. 小程序毕业设计 基于微信电影院购票小程序毕业设计开题报告功能参考
  10. MineMap地图web端定位问题处理