最新公告
  • 欢迎您光临,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 战棋类移动范围算法

    申明:思维方法有借鉴CSDN上的文章,代码为自己编写,用到了数据库,每个小步骤设置了syso,如果步骤出错可以参考,觉得多余也可以自行删去,转载请标明原作者_飙车大将军)

    可能遇到的情况:

    ①起始点、可移动地形且无人占据的点:可移动,可扩展

    ②可移动地形但己方单位占据的点:不可移动,可扩展

    ③不可移动地形,可移动地形但非己方占据的点:不可移动,不可扩展

    思路:

    已知:move为单位总行动量

      地形属性为(x,y,land,move_use,state)

      x,y表示该地点坐标

      land表示地形名称

      move_use表示到达该点所需行动量

      state表示地形占据状态,0为无人占据,1为己方占据,>1为非己方占据

    设表(x,y,dmove,stay_ok,expanded)

      dmove表示剩余行动量

      stay_ok=0表示该点不可停留,=1表示该点可停留

      expanded=0表示该点需判定,=1表示该点已判定

    
    //具体算法:使用已建立数据库
    
    sss table_move="_id integer primary key,x integer,y integer,dmove integer,stay_ok integer,expanded integer"
    
    sss table_movex="x,y,dmove,stay_ok,expanded"
    
    sql(sss.data,"move","ip",b)
    f(b==true)
    {
      sql(sss.data,"move","del",b)
    }
    sql(sss.data,"move","add",sss.table_move,b)
    //1 将起始点(x,y,move,1,0)加入表,开始大循环
    ss("'"+x+"','"+y+"','"+move+"','1','0'",value)
    
    sql(sss.data,"move","add",sss.table_movex,value,b)
    
    syso("ok_1")
    //2 大循环:从表中搜索expanded=0的点(x0,y0,dmove0,stay_ok0,0)
    //通过"1,0;0,-1;-1,0;0,1"获取四个点,进入小循环
    sql(sss.data,"move","sele",sss.table_movex,"expanded='0'",data)
    sqlsele(data,"next",e)
    syso("ok_2")
    w(e==true)
    {
      sqlsele(data,0,x0)
    
      sqlsele(data,1,y0)
    
      sqlsele(data,2,dmove0)
    
      s order="1,0;0,-1;-1,0;0,1"
      sl(order,";",order_0)
      for(order_1;order_0)
      {
        //3 小循环:得到点(x1,y1)
        sl(order_1,",",order_2)
        sgsz(order_2,0,dx)
        sgsz(order_2,1,dy)
        s+(x0,dx,x1)
        s+(y0,dy,y1)
        //①从地图数据中获取move_use,state
        ss("x='"+x1+"' and y='"+y1+"'",sqlx)
        sql(sss.data,"map","sele",sss.table_mapx,sqlx,data)
        sqlsele(data,"next",e)
        syso("ok_3_1")
        f(e==true)
        {
          sqlsele(data,3,move_use)
          sqlsele(data,4,state)
          f(move_use==0||state>1)
          {
            //如果move_use=0,或者state>1则输出(x1,y1,0,0,1)
            s dmove1=0
            s stay_ok1=0
            s expanded1=1
          }
          else
          {
            //②计算dmove1=dmove0-move_use:
            //如果dmove1<0,输出(x1,y1,dmove1,0,1)
            //如果dmove1=0,输出(x1,y1,dmove1,1,1)
            //如果dmove1>0,输出(x1,y1,dmove1,1,0)
            s-(dmove0,move_use,dmove1)
            f(dmove1<0)
            {
              s stay_ok1=0
              s expanded1=1
            }
            else f(dmove1==0)
            {
              s stay_ok1=1
              s expanded1=1
            }
            else
            {
              s stay_ok1=1
              s expanded1=0
            }
          }
          syso("ok_3_2")
          f(state==1)
          {
            //③如果state=1,则修改stay_ok1=0
            s stay_ok1=0
          }
        }
        else f(e==false)
        {
           //地形数据不存在,即超出地图范围
          s x1=0
          s y1=0
          s dmove1=0
          s stay_ok1=0
          s expanded1=1
        }
    
    syso("ok_3_3")
        //④将得到的数据返回表中查询
        //若有重复数据,则比较dmove1和stay_ok1,保留大值,仅当dmove1改变时,将expanded重置为0
        sql(sss.data,"move","sele",sss.table_movex,sqlx,data)
        sqlsele(data,"next",e)
        f(e==true)
        {
          sqlsele(data,2,dmove2)
    
          sqlsele(data,3,stay_ok2)
    
          f(dmove1>dmove2)
          {
            ss("dmove='"+dmove1+"'",sqlx1)
            sql(sss.data,"move","up",sqlx1,sqlx,b)
            sql(sss.data,"move","up","expanded='0'",sqlx,b)
          }
          f(stay_ok1>stay_ok2)
          {
            ss("stay_ok='"+stay_ok1+"'",sqlx1)
            sql(sss.data,"move","up",sqlx1,sqlx,b)
          }
        }
        else f(e==false)
        {
          ss("'"+x1+"','"+y1+"','"+dmove1+"','"+stay_ok1+"','"+expanded1+"'",value)
          sql(sss.data,"move","add",sss.table_movex,value,b)
        }
        syso("ok_3_4")
      //4 重复小循环步骤,当四点均经过判定,结束小循环
      }
      syso("ok_4")
      //5 当小循环结束,修改输出(x0,y0,dmove0,stay_ok0,1)
      ss("x='"+x0+"' and y='"+y0+"'",sqlx)
      sql(sss.data,"move","up","expanded='1'",sqlx,b)
      syso("ok_5")
      //6 重复大循环步骤,当expanded=0搜索为空时,停止大循环
      sql(sss.data,"move","sele",sss.table_movex,"expanded='0'",data)
      sqlsele(data,"next",e)
      syso("ok_6")
    }
    //7 当大循环结束,输出stay_ok=1的点为可移动范围
    
    
    //似乎会照成短暂卡顿
    
    
    1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!
    2.如有侵权请邮件联系客服!l联系邮箱:837609420@qq.com
    3. 本站不保证所提供下载的资源的准确性、安全性和完整性
    4.资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
    5. 如用于商业或者非法用途,与本站无关,一切后果请用户自负!
    6. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    7. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    8. 如遇到加密压缩包,默认解压密码为"www。loveu8.cn",如遇到无法解压的请联系客服!
    9. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
    幻梦资源网 » 战棋类移动范围算法

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    幻梦资源网
    一个高级程序员模板开发平台