zoukankan      html  css  js  c++  java
  • 激突要塞代码解阵算法+用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做阵,不过太难了.

  • 相关阅读:
    飞入飞出效果
    【JSOI 2008】星球大战 Starwar
    POJ 1094 Sorting It All Out
    POJ 2728 Desert King
    【ZJOI 2008】树的统计 Count
    【SCOI 2009】生日快乐
    POJ 3580 SuperMemo
    POJ 1639 Picnic Planning
    POJ 2976 Dropping Tests
    SPOJ QTREE
  • 原文地址:https://www.cnblogs.com/Tony100K/p/11609221.html
Copyright © 2011-2022 走看看