有道云连接有代码:http://note.youdao.com/share/?id=1d20756d3476106a1587a9296a252c3b&type=note
图片要随机分配,那好了随机分配的一个问题是,你分配之后的这个图片排布要有“姐”。也就是可以完整的拼出图片。
那么就要求逆序 (矩阵的知识大家应该都懂)其原理如下:
1. 第一步:点数逆序的个数,并求其和。 把数字盘中的数字当成一个数列,其顺序为由左而右、由上而下,以图 11 右边的归位花式而言, 可看成是下面的数列 9, 8, 4, 7, 3, 12, 13, 10, 11, 5, 15, 1, 6, 14, 2 什麽是逆序呢? 当数列中较小的数字位置在较大数字的后方时,就是逆序。 以上面的数列为例, 数字 9 共有 8 个逆序,因为 1, 2, 3, 4, 5, 6, 7, 8 都在它的后方, 数字 8 共有 7 个逆序,因为 1, 2, 3, 4, 5, 6, 7 都在它的后方, 数字 4 共有 3 个逆序,因为 1, 2, 3 都在它的后方, 数字 7 共有 5 个逆序,因为 1, 2, 3, 5, 6 都在它的后方, 数字 3 共有 2 个逆序,因为 1, 2 都在它的后方, 数字 12 共有 6 个逆序,因为 1, 2, 5, 6, 10, 11 都在它的后方, 数字 13 共有 6 个逆序,因为 1, 2 5, 6, 10, 11 都在它的后方, 数字 10 共有 4 个逆序,因为 1, 2 5, 6 都在它的后方, 数字 11 共有 4 个逆序,因为 1, 2 5, 6 都在它的后方, 数字 5 共有 2 个逆序,因为 1, 2 都在它的后方, 数字 15 共有 4 个逆序,因为 1, 2, 6, 14 都在它的后方, 数字 1 共有 0 个逆序,因为它就是最小的数了, 数字 6 共有 1 个逆序,因为只有 2 在它的后方, 数字 14 也只有 1 个逆序,就是 2, 数字 2 已是数列中的最后一个数字了,当然没有逆序。 所以逆序和就是 8 + 7 + 3 + 5 + 2 + 6 + 6 + 4 + 4 + 2 + 4 + 0 + 1 + 1 = 53 3. 第三步:判定。逆序和为偶是有解,为奇则无解。
实验平台:stm32f103zet6,Uv5
1、首先是确定方案,我的方案是:把图片放在SD卡里,而不是直接转化维数组进行显示。放在SD卡方便操作。
2、将一张240x320的图片裁剪成12等分,其中最后一份用一张空白的图片代替。
比如这里的 12 图片他就是我们拿来填充在空白的地方,也就是图片的右下角位置。当然也可以用清屏的方法啦填充空白处。
框架以及游戏原理什么的就不重点介绍了,网上都有,或者是自己动动脑筋也都可以想出来。那我现在来着重介绍一下图片的随机排布问题。
1、根据上边的介绍应该可以得出结论了,就是逆序为偶数有解,为奇数则无解。
那么我们怎么使这12张图片随机排布呢? 我选择的方法是采集ADC的电压(该IO口为悬空状态)把这个随机的数值传递到网上大神已经做好了的产生随机数的函数里边。(不必要每件事请都自己做,站在巨人的肩膀上会看的更远)。那么具体怎么实现呢?
主要的文件时这两个
给我一个种子我可以产生无数的随机数.......
我们用到的函数就两个
int IRandom(int min, int max); void RandomInit(int seed);
一个是初始化函数 RandomInit 里面的seed就是随机数的种子我们这里是将ADC采集回来的数据直接放到这里来。
第二个是IRandom函数其中有连个参数一个是产生的随机数的最小值一个是最大值,这个函数有一个返回值,该返回值就是在min~max之间;
好了随机数有了,但是还不能直接使用那么我使用的方法是:第一张图片的位置和产生的随机数的位置的图片进行互换,从1一直换到12那么图片的顺序就是随机的了。之后再进行判断是否有姐。
效果如下:
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |