木头风火轮 发表于 2014-7-13 23:05

用数学软件建模来通过游戏关卡的一个小想法,

本帖最后由 木头风火轮 于 2014-7-14 19:20 编辑

前不久玩《机械迷城2-小小星球大碰撞》玩到倒数第二关的这个拼图这里一时半会没拼出来, 就想到是不是可以用matlab矩阵实验室来求解答案

把每一个小块编号:a,b....k

然后进行数字化处理, 后面用这些数字矩阵在软件里来做拼图游戏,应该会简单很多,,下面是程序部分, clear all;
%假设初始状态,十个小块都在大面板的左上角放置
a='4040e0000000';
b='40e040000000';
c='80c060000000';
d='c08080000000';
e='c07000000000';
f='f04000000000';
g='20e000000000';
h='808080808000';
i='40e020000000';
j='c04040000000';
k='800000000000';
%十个小块在大面板中的十六进制编码
tab={a b c d e f g h i j k};
tab2=cell(1,11);
%定义一个一行十列的数组用以储存转换后的二进制编码
tabL=zeros(1,11);
for t=1:11
    tx=tab(t);
    %依次读取十六进制编码
    tt=hex2dec(tx);
    tab2{1,t}=dec2bin(tt);
    %依次转换成二进制编码储存在tab2{}中
end
for k=1:11
    n=tab2{1,k};
        nn=num2str(n);
        lin=length(nn);
        %读取二进制编码并转换成字符串格式,以便能测量长度
        %因为在从十进制转成二进制的过程中, 二进制数开头的0会被省略掉,所以需要重新测量长度
    for m=lin:-1:1
        if nn(m)==1
            
            tabL(1,k)=47-m;
          %这里应该是能表示出每个小块能向右移动的最大距离,

        end
        continue
    end
end

如上面最后一条注释所说, tabL(1,k)=47-m; 应该能储存每个小块的矩阵编码含1部分能向右移动的最大距离,但是在这个方式里面好像有点问题,另一个方式里面能表示出最大距离,和这个差不多, 那个程序问题比较多,,就不发另一个的了,
做到这一步之后, 最后就只差一个类似线性规划的多元一次方程了,
大概是
A U B U C U D U . . U J U K==ones(1,48),
是一个矩阵做并,或者也可能是做异或, 由于一开始就把所有条件都设为一维矩阵,所以最后并下来的结果和ones(1,48)相等,就能找出每个小块在大面板中从左上角开始移动的距离,从而得出正确的拼图答案
难就难在只有一个方程, 我matlab了解得不深, 不知道matlab该怎么去实现最后这一步,,接下几天在其他事情上会比较忙, 所以不再独自一个人研究, 发出来大家共同探讨,集思广益,

【后面有一个小小的建议,建议在YY频道里开设课程试听环节,159214作为数学中国旗下的指定的学员交流和授课频道, 没有了免费试听环节之后, YY里每天都没什么人, 没人气,除了交了费了来听课之外, 都很少有爱好者来围观了, ,对数学中国和YY电台都是不怎么好的事情】

木头风火轮 发表于 2014-7-15 16:38

这里用16进制数写进去, 是由于我对十六进制数比较熟悉, 而且主要是48位的二进制,用十六进制只要12为就能输入进去,再通过一个小程序即可再转回二进制数,便于后面程序调用

GO雨林木风 发表于 2014-7-15 16:39

{:3_59:}高大上啊,,有点看不懂。试听现在是每一个课程的第一节是试听课程。(⊙v⊙)嗯,

木头风火轮 发表于 2014-7-15 16:45

GO雨林木风 发表于 2014-7-15 16:39 static/image/common/back.gif
高大上啊,,有点看不懂。试听现在是每一个课程的第一节是试听课程。(⊙v⊙)嗯,

这个哪里高端大气了, 就是拼图而已, ,,希望试听是第一节课+每节课的前十几分钟就好了

kedi87135 发表于 2014-8-4 18:27

学习了,谢谢~~~~~
页: [1]
查看完整版本: 用数学软件建模来通过游戏关卡的一个小想法,