• 激突要塞代码解阵算法+用C++/Python处理代码


    激突要塞的代码长度为6的倍数,其中每6个字符代表着一个单位,这六个字符中,第一位代表着单位的种类,后五位则包含着单位角度.X值.Y值的信息.

    那么这个第一位究竟代表什么呢?一图以示之.

    img

    那么在代码中就用字典来进行表示了,如果你使用python

    name={'v':'骨玉','3':'剑玉','8':'枪玉','a':'剃玉','M':'骑玉','L':'采玉',
          '1':'弓玉','7':'弩玉','2':'铳玉','x':'弹玉','b':'跳玉','z':'忍玉',
          'c':'裂玉','d':'散玉','B':'花玉','D':'押玉','e':'狙玉','O':'射玉',
          '5':'爆玉','9':'炮玉','f':'浮玉','g':'导玉','w':'击玉','N':'核玉',
          'k':'飞玉','l':'战玉','K':'旋玉','H':'坠玉','n':'变玉','J':'暗玉',
    	  '6':'魔玉','P':'星玉','S':'查玉','R':'贯玉','m':'机玉','Q':'捆玉',
    	  '4':'盾玉','j':'壁玉','o':'界玉','C':'返玉','E':'迎玉','G':'的玉',
    	  'I':'箱玉','A':'障玉','F':'赘玉','y':'圣玉','h':'缮玉','i':'愈玉',
    	  'p':'木要塞壁','q':'石要塞壁','r':'纸要塞壁','s':'钢要塞壁','t':'红加速','u':'蓝加速',
    	  'T':'近突击','U':'远突击','W':'蓝旋转','V':'紫旋转','X':'狙击壁','Y':'电梯'
    	  
         }
    
    price={'v':10,'3':30,'8':30,'a':30,'M':150,'L':20,
          '1':30,'7':30,'2':70,'x':60,'b':70,'z':70,
          'c':70,'d':50,'B':70,'D':60,'e':70,'O':100,
          '5':50,'9':70,'f':70,'g':80,'w':70,'N':200,
          'k':150,'l':150,'K':150,'H':150,'n':100,'J':150,
    	  '6':200,'P':200,'S':200,'R':150,'m':200,'Q':200,
    	  '4':60,'j':150,'o':90,'C':60,'E':60,'G':50,
    	  'I':70,'A':60,'F':150,'y':200,'h':100,'i':100,
    	  'p':15,'q':40,'r':5,'s':100,'t':100,'u':250,
    	  'T':40,'U':50,'W':80,'V':80,'X':200,'Y':60
    	  
          }
    

    如果你使用C++

    map<string,string>m;
    map<string,string>inm;
    
    void init()
    {
        m["v"]="骨玉";
        m["3"]="剑玉";
        m["8"]="枪玉";
        m["a"]="剃玉";
        m["M"]="骑玉";
        m["L"]="采玉";
        m["1"]="弓玉";
        m["7"]="弩玉";
        m["2"]="铳玉";
        m["x"]="弹玉";
        m["b"]="跳玉";
        m["z"]="忍玉";
        m["c"]="裂玉";
        m["d"]="散玉";
        m["B"]="花玉";
        m["D"]="押玉";
        m["e"]="狙玉";
        m["O"]="射玉";
        m["5"]="爆玉";
        m["9"]="炮玉";
        m["f"]="浮玉";
        m["g"]="导玉";
        m["w"]="击玉";
        m["N"]="核玉";
        m["k"]="飞玉";
        m["l"]="战玉";
        m["K"]="旋玉";
        m["H"]="坠玉";
        m["n"]="变玉";
        m["J"]="暗玉";
        m["6"]="魔玉";
        m["P"]="星玉";
        m["S"]="查玉";
        m["R"]="贯玉";
        m["m"]="机玉";
        m["Q"]="捆玉";
        m["4"]="盾玉";
        m["j"]="壁玉";
        m["o"]="界玉";
        m["C"]="返玉";
        m["E"]="迎玉";
        m["G"]="的玉";
        m["I"]="箱玉";
        m["A"]="障玉";
        m["F"]="赘玉";
        m["y"]="圣玉";
        m["h"]="缮玉";
        m["i"]="愈玉";
        m["p"]="木要塞壁";
        m["q"]="石要塞壁";
        m["r"]="纸要塞壁";
        m["s"]="钢要塞壁";
        m["t"]="红加速";
        m["u"]="蓝加速";
        m["T"]="近突击";
        m["U"]="远突击";
        m["W"]="蓝旋转";
        m["V"]="紫旋转";
        m["X"]="狙击壁";
        m["Y"]="电梯";
        map<string,string>::iterator it=m.begin();
        while(it!=m.end())
        {
            string key=it->first;
            string ans=it->second;
            inm[ans]=key;
            it++;
        }
    }
    
    

    好,那么第一位就处理完了,接下来是后五位,我们知道X Y 角度分别是一个三位数.那么把角度+X值+Y值拼接起来就可以了,比如角度270,X值10,Y值280,那么拼接起来就是270010280,在激突要塞的代码中,有52个字母(大小写)和0-9十个阿拉伯数字,那么用62进制表示一下就好了.

    demo,和田正一这个密码学鬼才,居然用了一种伪61进制的方法进行表示,爷真的佛了.

    在这个进制体系中:

    • 0-9就表示0到9
    • a到z分别表示10到35
    • A到Z分别表示36到61

    比如000P6R,就是(0*61^4+0*61^3+P*61^2+6*61+R-Disp),得出来的得数,取最右边三位就是Y值,次右边三位就是X值,剩下的就是角度.

    注意这个(DISP)

    [DISP=egin{cases} 52058 & 单位为要塞时 \ 16020 & 单位为兵玉或者要塞壁时 \ end{cases} ]

    我们来看一段激突改阵器(C++)实现的代码

    while(s.length()!=0)
        {
            string type=s.substr(0,1);
            string info=s.substr(1,5);
            string name;
            int angle;
            int x;
            int y;
            if(isYaosai==1)
            {
                isYaosai=0;
                if(type=="0")name="普通要塞";
                if(type=="1")name="黑魔王";
                angle=0;
                int sum=0;
                each(i,0,4)
                {
                    int num=0;
                    char ch=info[i];
                    //de(ch);
                    if(ch>='0'&&ch<='9')num=ch-'0';
                    if(ch>='a'&&ch<='z')num=ch-'a'+10;
                    if(ch>='A'&&ch<='Z')num=ch-'A'+36;
                    each(j,1,4-i)num*=61;
                    sum+=num;
    
                }
                sum-=52058;
                x=sum/1000;
                y=sum%1000;
                fprintf(fp,"单位名称,角度,X,Y
    ");
                fprintf(fp,"%s,%d,%d,%d
    ",name.c_str(),angle,x,y);
            }
            //是兵玉的场合
            else{
                name=m[type];
                int sum=0;
                each(i,0,4)
                {
                    int num=0;
                    char ch=info[i];
                    //de(ch);
                    if(ch>='0'&&ch<='9')num=ch-'0';
                    if(ch>='a'&&ch<='z')num=ch-'a'+10;
                    if(ch>='A'&&ch<='Z')num=ch-'A'+36;
                    each(j,1,4-i)num*=61;
                    sum+=num;
                }
                sum-=16020;
                angle=sum/1000000;
                x=(sum%1000000)/1000;
                y=sum%1000;
                fprintf(fp,"%s,%d,%d,%d
    ",name.c_str(),angle,x,y);
            }
            s=s.substr(6);
        }
    
    

    用途

    了解了这些东西,你就可以去整一下有意思的事情比如改阵器(可以改出悬空和倾斜要塞壁的装逼效果),随机阵型生成器甚至AI做阵,不过太难了.

  • 相关阅读:
    Excel组件使用配置文档下载
    mysql 的书籍推荐~
    基于HTTP 协议认证介绍与实现
    DebianKvm快速安装上手教程
    spring事务,TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    项目中用到的设计模式(持续更新)
    项目中用到的架构模式(持续更新)
    添加验证
    ASP.NET Core中使用appsettings.json
    使用 ASP.NET Core 和 MongoDB 创建 Web API
  • 原文地址:https://www.cnblogs.com/Tony100K/p/11609221.html
Copyright © 2020-2023  润新知