首页前端开发HTMLHTML5之中国象棋,附带源码!

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

时间2024-01-25 09:32:58发布访客分类HTML浏览434
导读:收集整理的这篇文章主要介绍了html5教程-HTML5之中国象棋,附带源码!,觉得挺不错的,现在分享给大家,也给大家做个参考。小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 原理: 象棋由帅(...
收集整理的这篇文章主要介绍了html5教程-HTML5之中国象棋,附带源码!,觉得挺不错的,现在分享给大家,也给大家做个参考。小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 原理:

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

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

 

 

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

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

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

 

 

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

 

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

 

 

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

 

 

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

 

 

     会走象棋的人都知道,需要对这些棋子熟练运用,调配自如,不同的棋子应该走到最该走的那些点中,才能对最后的战局起到攻无不克,战无不胜的境地。公司则一样,需要用人的长处,把相关人员安排在他最擅长的地方,公司的前景才能灿烂无比,坚比中午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; imap.length; i++){

        for (var n=0; nmap[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; imanArr.length; i++){

        var man = manArr[i];

        var val=man.bl(map);

        

        for (var n=0; nval.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; imap.length; i++){

        for (var n=0; nmap[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;

原理:

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

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

 

 

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

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

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

 

 

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

 

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

 

 

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

 

 

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

 

 

     会走象棋的人都知道,需要对这些棋子熟练运用,调配自如,不同的棋子应该走到最该走的那些点中,才能对最后的战局起到攻无不克,战无不胜的境地。公司则一样,需要用人的长处,把相关人员安排在他最擅长的地方,公司的前景才能灿烂无比,坚比中午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; imap.length; i++){

        for (var n=0; nmap[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; imanArr.length; i++){

        var man = manArr[i];

        var val=man.bl(map);

        

        for (var n=0; nval.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; imap.length; i++){

        for (var n=0; nmap[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;

觉得可用,就经常来吧! 欢迎评论哦! html5教程,巧夺天工,精雕玉琢。小宝典献丑了!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

divDOMHTMLletMappost-format-galleryslicethis

若转载请注明出处: HTML5之中国象棋,附带源码!
本文地址: https://pptw.com/jishu/586371.html
HTML5+NodeJs实现WebSocket即时通讯 区域医疗移动医疗影像基于HTML5的PACS--HTML5图像处理(5)图像旋转

游客 回复需填写必要信息