欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

HTML5之中国象棋,附带源码!

程序员文章站 2022-05-28 19:29:28
原理:   象棋由帅(将)、仕(士)、相(象)、车(车)、马(马)、炮(炮)、兵(卒)组成。      公司也由许许多多的公司职员组成,现在我就简要分析一下公...
原理:

  象棋由帅(将)、仕(士)、相(象)、车(车)、马(马)、炮(炮)、兵(卒)组成。

     公司也由许许多多的公司职员组成,现在我就简要分析一下公司人员组成的象棋原理。

 

 

     帅(将)无疑是决胜于千里之外,运筹帷幄之中的关键人物。在一个公司这样的位置应该是总经理或

者是董事长。他们虽然不直接参与项目的构建,但项目雏形的策划,拉关系(通路子)之类的金点子应该

都是计上心头,不然,公司不得不接受被社会所淘汰的命运。

 

 

     仕(士)、相(象)就是保卫帅(将)的斗士。对公司来说,应该属于那些创建公司初期的“开国元老”。他们也竭尽所能,发挥自己的长处,为公司不辞辛劳。他们虽地位、权力不及帅(将),

 

但少了他们的光杆司令必定自取灭亡,作用也不可低估。

 

 

     车(车)、马(马)、炮(炮)在象棋中属于攻守兼备的棋子,灵活自如,“来如影,去如风”。在公司中诸如:科长、组长、班长之类的人属于这类棋子。虽头脑、思想、能力不及总经理、董事长;但比那些新来公司的应届毕业生、跳槽员工,相对来说,更实用,更能体现自己的价值。俗话说:“他们属于社会中的中层*”。各个部门的凝聚力、团队配合精神来说,对公司事关重要。

 

 

     兵(卒)在象棋中属于地位最低的棋子,基本属于可有可无的棋子。在公司中,这类人比较类似刚进入社会的应届毕业生,什么经验都没有,只有那些在校园里学到很教条的理论知识。需要高人的指点,有时候,则被嫉妒者任人摆布,命运多坎坷。

 

 

     会走象棋的人都知道,需要对这些棋子熟练运用,调配自如,不同的棋子应该走到最该走的那些点中,才能对最后的战局起到攻无不克,战无不胜的境地。公司则一样,需要用人的长处,把相关人员安排在他最擅长的地方,公司的前景才能灿烂无比,坚比中午12点的太阳。

 

 

     小卒虽然地位地位,能力不足。但千兵能挡一将,假如公司的某些做法太不得人心的话,纵然公司名身再高,不也会被拉下马来?世界排名前十的荷兰银行被一小小的私募起诉直至最后的拆分,这就是很好的一例。

 

 

     我们现在刚出社会没几年的人就似象棋中的小卒,命运几何?能力3分,处事3分,运气4分。希望大家都能在美好的2014交好运......    

 

部分代码

 

 

复制代码

//人工智能初始化

ai.init = function(pace){

    var bill = ai.historybill || com.gambit; //开局库

    if (bill.length){

        var len=pace.length;

        var arr=[];

        //先搜索棋谱

        for (var i=0;i< bill.length;i++){

            if (bill[i].slice(0,len)==pace) {

            arr.push(bill[i]);

            }

        }

        if (arr.length){

            var inx=math.floor( math.random() * arr.length );

            ai.historybill = arr ;

            return arr[inx].slice(len,len+4).split("");

        }else{

            ai.historybill = [] ;

        }

        

    }

     //如果棋谱里面没有,人工智能开始运作

    var inittime = new date().gettime();

    ai.treedepth=play.depth;

    //ai.treedepth=4;

    

    ai.number=0;

    ai.sethistorytable.lenght = 0

 

    var val=ai.getalphabeta(-99999 ,99999, ai.treedepth, com.arr2clone(play.map),play.my);

    //var val = ai.iterativesearch(com.arr2clone(play.map),play.my)

    if (!val||val.value==-8888) {

        ai.treedepth=2;

        val=ai.getalphabeta(-99999 ,99999, ai.treedepth, com.arr2clone(play.map),play.my);

    }

    //var val = ai.iterativesearch(com.arr2clone(play.map),play.my);

    if (val&&val.value!=-8888) {

        var man = play.mans[val.key];

        var nowtime= new date().gettime();

        com.get("moveinfo").innerhtml='<h3>ai搜索结果:</h3>最佳着法:'+

                                        com.createmove(com.arr2clone(play.map),man.x,man.y,val.x,val.y)+

                                        '<br />搜索深度:'+ai.treedepth+'<br />搜索分支:'+

                                        ai.number+'个 <br />最佳着法评估:'+

                                        val.value+'分'+

                                        ' <br />搜索用时:'+

                                        (nowtime-inittime)+'毫秒'

        return [man.x,man.y,val.x,val.y]

    }else {

        return false;    

    }

}

 

 

复制代码

//迭代加深搜索着法

ai.iterativesearch = function (map, my){

    var timeout=100;

    var initdepth = 1;

    var maxdepth = 8;

    ai.treedepth=0;

    var inittime = new date().gettime();

    var val = {};

    for (var i=initdepth; i<=maxdepth; i++){

        var nowtime= new date().gettime();

        ai.treedepth=i;

        ai.aotudepth=i;

        var val = ai.getalphabeta(-99999, 99999, ai.treedepth , map ,my)

        if (nowtime-inittime > timeout){

            return val;

        }

    }

    return false;

}

 

//取得棋盘上所有棋子

ai.getmapallman = function (map, my){

    var mans=[];

    for (var i=0; i<map.length; i++){

        for (var n=0; n<map[i].length; n++){

            var key = map[i][n];

            if (key && play.mans[key].my == my){

                play.mans[key].x = n;

                play.mans[key].y = i;

                mans.push(play.mans[key])

            }

        }

    }

    return mans;

}

复制代码

复制代码

//取得棋谱所有己方棋子的着法

ai.getmoves = function (map, my){

    var manarr = ai.getmapallman (map, my);

    var moves = [];

    var foul=play.isfoul;

    for (var i=0; i<manarr.length; i++){

        var man = manarr[i];

        var val=man.bl(map);

        

        for (var n=0; n<val.length; n++){

            var x=man.x;

            var y=man.y;

            var newx=val[n][0];

            var newy=val[n][1];

             //如果不是长将着法

            if (foul[0]!=x || foul[1]!=y || foul[2]!=newx || foul[3]!=newy ){

                moves.push([x,y,newx,newy,man.key])

            }

        }

    }

    return moves;

}

//a:当前棋手value/b:对手value/depth:层级

ai.getalphabeta = function (a, b, depth, map ,my) { 

    //var txtmap= map.join();

    //var history=ai.historytable[txtmap];

    //    if (history && history.depth >= ai.treedepth-depth+1){

    //        return     history.value*my;

    //}

    if (depth == 0) {

        return {"value":ai.evaluate(map , my)}; //局面评价函数; 

     }

     var moves = ai.getmoves(map , my ); //生成全部走法; 

     //这里排序以后会增加效率

 

    for (var i=0; i < moves.length; i++) {

        

        

      //走这个走法;

        var move= moves[i];

        var key = move[4];

        var oldx= move[0];

        var oldy= move[1];

        var newx= move[2];

        var newy= move[3];

        var clearkey = map[ newy ][ newx ]||"";

 

        map[ newy ][ newx ] = key;

        delete map[ oldy ][ oldx ];

        play.mans[key].x = newx;

        play.mans[key].y = newy;

        

      if (clearkey=="j0"||clearkey=="j0") {//被吃老将,撤消这个走法; 

            play.mans[key]    .x = oldx;

            play.mans[key]    .y = oldy;

            map[ oldy ][ oldx ] = key;

            delete map[ newy ][ newx ];

            if (clearkey){

                 map[ newy ][ newx ] = clearkey;

                // play.mans[ clearkey ].isshow = false;

            }

 

            return {"key":key,"x":newx,"y":newy,"value":8888};

            //return rootkey; 

      }else { 

          var val = -ai.getalphabeta(-b, -a, depth - 1, map , -my).value; 

            //val = val || val.value;

    

          //撤消这个走法;  

            play.mans[key]    .x = oldx;

            play.mans[key]    .y = oldy;

            map[ oldy ][ oldx ] = key;

            delete map[ newy ][ newx ];

            if (clearkey){

                 map[ newy ][ newx ] = clearkey;

                 //play.mans[ clearkey ].isshow = true;

            }

          if (val >= b) { 

                //将这个走法记录到历史表中; 

                //ai.sethistorytable(txtmap,ai.treedepth-depth+1,b,my);

                return {"key":key,"x":newx,"y":newy,"value":b}; 

            } 

            if (val > a) { 

            a = val; //设置最佳走法; 

                if (ai.treedepth == depth) var rootkey={"key":key,"x":newx,"y":newy,"value":a};

            } 

        } 

     } 

    //将这个走法记录到历史表中; 

    //ai.sethistorytable(txtmap,ai.treedepth-depth+1,a,my);

    if (ai.treedepth == depth) {//已经递归回根了

        if (!rootkey){

            //ai没有最佳走法,说明ai被将死了,返回false

            return false;

        }else{

            //这个就是最佳走法;

            return rootkey;

        }

    }

 return {"key":key,"x":newx,"y":newy,"value":a}; 

}

 

//奖着法记录到历史表

ai.sethistorytable = function (txtmap,depth,value,my){

    ai.sethistorytable.lenght ++;

    ai.historytable[txtmap] = {depth:depth,value:value} 

}

 

//评估棋局 取得棋盘双方棋子价值差

ai.evaluate = function (map,my){

    var val=0;

    for (var i=0; i<map.length; i++){

        for (var n=0; n<map[i].length; n++){

            var key = map[i][n];

            if (key){

                val += play.mans[key].value[i][n] * play.mans[key].my;

            }

        }

    }

    //val+=math.floor( math.random() * 10);  //让ai走棋增加随机元素

    //com.show()

    //z(val*my)

    ai.number++;

    return val*my;

}

 

//评估棋局 取得棋盘双方棋子价值差

ai.evaluate1 = function (map,my){

    var val=0;

    for (var i in play.mans){

        var man=play.mans[i];

        if (man.isshow){

            val += man.value[man.y][man.x] * man.my;

        }

    }

    //val+=math.floor( math.random() * 10);  //让ai走棋增加随机元素

    //com.show()

    //z(val*my)

    ai.number++;

    return val*my;