最新公告
  • 欢迎您光临大资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!怎么把网页设置成桌面图标
  • HTML5实现人工智能中国象棋网页小游戏

    HTML5实现人工智能中国象棋网页小游戏 最后编辑:2026-06-05
    增值服务: 自动发货 使用说明 安装指导 环境配置二次开发BUG修复

    HTML5中国象棋网页小游戏源码分享,HTML5+js实现中国象棋网页小游戏。人工智能网页象棋小游戏。游戏背景为木板,页面默认显示较小,可通过换肤变大棋盘。象棋游戏包括新手、中级、大师水平,可以悔棋,同时显示AI搜索结果,提示最佳走法。进入游戏后请选择你要对战的水平

    HTML5中国象棋网页小游戏源码分享,HTML5+js实现中国象棋网页小游戏。人工智能网页象棋小游戏。游戏背景为木板,页面默认显示较小,可通过换肤变大棋盘。象棋游戏包括新手、中级、大师水平,可以悔棋,同时显示AI搜索结果,提示最佳走法。

    1、html页面代码

    1. <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
    2. <html xmlns=“http://www.w3.org/1999/xhtml”>
    3. <head>
    4. <meta http-equiv=“Content-Type” content=“text/html; charset=gb2312” />
    5. <title>HTML5实现中国象棋网页小游戏 – bokequ.com</title>
    6. <link href=“css/zzsc.css” type=“text/css” rel=“stylesheet” />
    7. </head>
    8. <body>
    9. <div class=“box” id=“box”>
    10. <div class=“chess_left”>
    11. <canvas id=“chess”>对不起,您的浏览器不支持HTML5,请升级浏览器至IE9、firefox或者谷歌浏览器!</canvas>
    12. <audio src=“audio/click.wav” id=“clickAudio” preload=“auto”></audio>
    13. <!–<audio src=”audio/check.wav” id=”checkAudio” preload=”auto”></audio>–>
    14. <audio src=“audio/select.wav” id=“selectAudio” preload=“auto”></audio>
    15. <div>
    16. <div class=“bn_box” id=“bnBox”>
    17. <input type=“button” name=“offensivePlay” id=“tyroPlay” value=“新手水平” />
    18. <input type=“button” name=“offensivePlay” id=“superPlay” value=“中级水平” />
    19. <input type=“button” name=“button” id=“” value=“大师水平” disabled />
    20. <!–
    21. <input type=”button” name=”offensivePlay” id=”offensivePlay” value=”先手开始” />
    22. <input type=”button” name=”defensivePlay” id=”defensivePlay” value=”后手开始” />
    23. –>
    24. <input type=“button” name=“regret” id=“regretBn” value=“悔棋” />
    25. <input type=“button” name=“billBn” id=“billBn” value=“棋谱” class=“bn_box” />
    26. <input type=“button” name=“stypeBn” id=“stypeBn” value=“换肤” />
    27. </div>
    28. </div>
    29. </div>
    30. <div class=“chess_right” id=“chessRight”>
    31. <select name=“billList” id=“billList”>
    32. </select>
    33. <ol id=“billBox” class=“bill_box”>
    34. </ol>
    35. </div>
    36. <div id=“moveInfo” class=“move_info”> </div>
    37. </div>
    38. <script src=“js/common.js”></script>
    39. <script src=“js/play.js”></script>
    40. <script src=“js/AI.js”></script>
    41. <script src=“js/bill.js”></script>
    42. <script src=“js/gambit.js”></script>
    43. <div style=textalign:center;clear:both>
    44. <p>适用浏览器:360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗. 不支持IE8及以下浏览器</p>
    45. </div>
    46. </body>
    47. </html>

    2、部分js代码

    1. /*! qq一叶孤舟 */
    2. var AI = AI||{};
    3. AI.historyTable = {}; //历史表
    4. //人工智能初始化
    5. AI.init = function(pace){
    6. var bill = AI.historyBill || com.gambit; //开局库
    7. if (bill.length){
    8. var len=pace.length;
    9. var arr=[];
    10. //先搜索棋谱
    11. for (var i=0;i< bill.length;i++){
    12. if (bill[i].slice(0,len)==pace) {
    13. arr.push(bill[i]);
    14. }
    15. }
    16. if (arr.length){
    17. var inx=Math.floor( Math.random() * arr.length );
    18. AI.historyBill = arr ;
    19. return arr[inx].slice(len,len+4).split(“”);
    20. }else{
    21. AI.historyBill = [] ;
    22. }
    23. }
    24. //如果棋谱里面没有,人工智能开始运作
    25. var initTime = new Date().getTime();
    26. AI.treeDepth=play.depth;
    27. //AI.treeDepth=4;
    28. AI.number=0;
    29. AI.setHistoryTable.lenght = 0
    30.  
    31. var val=AI.getAlphaBeta(-99999 ,99999, AI.treeDepth, com.arr2Clone(play.map),play.my);
    32. //var val = AI.iterativeSearch(com.arr2Clone(play.map),play.my)
    33. if (!val||val.value==-8888) {
    34. AI.treeDepth=2;
    35. val=AI.getAlphaBeta(-99999 ,99999, AI.treeDepth, com.arr2Clone(play.map),play.my);
    36. }
    37. //var val = AI.iterativeSearch(com.arr2Clone(play.map),play.my);
    38. if (val&&val.value!=-8888) {
    39. var man = play.mans[val.key];
    40. var nowTime= new Date().getTime();
    41. com.get(“moveInfo”).innerHTML=‘<h3>AI搜索结果:</h3>最佳着法:’+
    42. com.createMove(com.arr2Clone(play.map),man.x,man.y,val.x,val.y)+
    43. ‘<br />搜索深度:’+AI.treeDepth+‘<br />搜索分支:’+
    44. AI.number+‘个 <br />最佳着法评估:’+
    45. val.value+‘分’+
    46. ‘ <br />搜索用时:’+
    47. (nowTimeinitTime)+‘毫秒’
    48. return [man.x,man.y,val.x,val.y]
    49. }else {
    50. return false;
    51. }
    52. }
    53. //迭代加深搜索着法
    54. AI.iterativeSearch = function (map, my){
    55. var timeOut=100;
    56. var initDepth = 1;
    57. var maxDepth = 8;
    58. AI.treeDepth=0;
    59. var initTime = new Date().getTime();
    60. var val = {};
    61. for (var i=initDepth; i<=maxDepth; i++){
    62. var nowTime= new Date().getTime();
    63. AI.treeDepth=i;
    64. AI.aotuDepth=i;
    65. var val = AI.getAlphaBeta(-99999, 99999, AI.treeDepth , map ,my)
    66. if (nowTimeinitTime > timeOut){
    67. return val;
    68. }
    69. }
    70. return false;
    71. }
    72.  
    73. //取得棋盘上所有棋子
    74. AI.getMapAllMan = function (map, my){
    75. var mans=[];
    76. for (var i=0; i<map.length; i++){
    77. for (var n=0; n<map[i].length; n++){
    78. var key = map[i][n];
    79. if (key && play.mans[key].my == my){
    80. play.mans[key].x = n;
    81. play.mans[key].y = i;
    82. mans.push(play.mans[key])
    83. }
    84. }
    85. }
    86. return mans;
    87. }
    88.  
    89. /*
    90. //取得棋谱所有己方棋子的着法
    91. AI.getMoves = function (map, my, txtMap){
    92. var highMores = []; //优先级高的着法
    93. var manArr = AI.getMapAllMan (map, my);
    94. var moves = [];
    95. var history=AI.historyTable[txtMap];
    96. for (var i=0; i<manArr.length; i++){
    97. var man = manArr[i];
    98. var val=man.bl(map);
    99. for (var n=0; n<val.length; n++){
    100. if (history){
    101. highMores.push([man.x,man.y,val[n][0],val[n][1],man.key])
    102. }else{
    103. moves.push([man.x,man.y,val[n][0],val[n][1],man.key])
    104. }
    105. }
    106. }
    107. return highMores.concat(moves);
    108. }
    109. */
    110. //取得棋谱所有己方棋子的着法
    111. AI.getMoves = function (map, my){
    112. var manArr = AI.getMapAllMan (map, my);
    113. var moves = [];
    114. var foul=play.isFoul;
    115. for (var i=0; i<manArr.length; i++){
    116. var man = manArr[i];
    117. var val=man.bl(map);
    118. for (var n=0; n<val.length; n++){
    119. var x=man.x;
    120. var y=man.y;
    121. var newX=val[n][0];
    122. var newY=val[n][1];
    123. //如果不是长将着法
    124. if (foul[0]!=x || foul[1]!=y || foul[2]!=newX || foul[3]!=newY ){
    125. moves.push([x,y,newX,newY,man.key])
    126. }
    127. }
    128. }
    129. return moves;
    130. }
    131. //A:当前棋手value/B:对手value/depth:层级
    132. AI.getAlphaBeta = function (A, B, depth, map ,my) {
    133. //var txtMap= map.join();
    134. //var history=AI.historyTable[txtMap];
    135. // if (history && history.depth >= AI.treeDepth-depth+1){
    136. // return history.value*my;
    137. //}
    138. if (depth == 0) {
    139. return {“value”:AI.evaluate(map , my)}; //局面评价函数;
    140.   }
    141.   var moves = AI.getMoves(map , my ); //生成全部走法;
    142.   //这里排序以后会增加效率
    143.  
    144. for (var i=0; i < moves.length; i++) {
    145.    //走这个走法;
    146. var move= moves[i];
    147. var key = move[4];
    148. var oldX= move[0];
    149. var oldY= move[1];
    150. var newX= move[2];
    151. var newY= move[3];
    152. var clearKey = map[ newY ][ newX ]||“”;
    153.  
    154. map[ newY ][ newX ] = key;
    155. delete map[ oldY ][ oldX ];
    156. play.mans[key].x = newX;
    157. play.mans[key].y = newY;
    158.   if (clearKey==“j0”||clearKey==“J0”) {//被吃老将,撤消这个走法;
    159. play.mans[key] .x = oldX;
    160. play.mans[key] .y = oldY;
    161. map[ oldY ][ oldX ] = key;
    162. delete map[ newY ][ newX ];
    163. if (clearKey){
    164. map[ newY ][ newX ] = clearKey;
    165. // play.mans[ clearKey ].isShow = false;
    166. }
    167.  
    168. return {“key”:key,“x”:newX,“y”:newY,“value”:8888};
    169. //return rootKey;
    170.   }else {
    171.    var val = AI.getAlphaBeta(-B, A, depth 1, map , my).value;
    172. //val = val || val.value;
    173.    //撤消这个走法; 
    174. play.mans[key] .x = oldX;
    175. play.mans[key] .y = oldY;
    176. map[ oldY ][ oldX ] = key;
    177. delete map[ newY ][ newX ];
    178. if (clearKey){
    179. map[ newY ][ newX ] = clearKey;
    180. //play.mans[ clearKey ].isShow = true;
    181. }
    182.    if (val >= B) {
    183. //将这个走法记录到历史表中;
    184. //AI.setHistoryTable(txtMap,AI.treeDepth-depth+1,B,my);
    185. return {“key”:key,“x”:newX,“y”:newY,“value”:B};
    186. }
    187. if (val > A) {
    188.      A = val; //设置最佳走法;
    189. if (AI.treeDepth == depth) var rootKey={“key”:key,“x”:newX,“y”:newY,“value”:A};
    190. }
    191. }
    192.   }
    193. //将这个走法记录到历史表中;
    194. //AI.setHistoryTable(txtMap,AI.treeDepth-depth+1,A,my);
    195. if (AI.treeDepth == depth) {//已经递归回根了
    196. if (!rootKey){
    197. //AI没有最佳走法,说明AI被将死了,返回false
    198. return false;
    199. }else{
    200. //这个就是最佳走法;
    201. return rootKey;
    202. }
    203. }
    204.  return {“key”:key,“x”:newX,“y”:newY,“value”:A};
    205. }
    206.  
    207. //奖着法记录到历史表
    208. AI.setHistoryTable = function (txtMap,depth,value,my){
    209. AI.setHistoryTable.lenght ++;
    210. AI.historyTable[txtMap] = {depth:depth,value:value}
    211. }
    212.  
    213. //评估棋局 取得棋盘双方棋子价值差
    214. AI.evaluate = function (map,my){
    215. var val=0;
    216. for (var i=0; i<map.length; i++){
    217. for (var n=0; n<map[i].length; n++){
    218. var key = map[i][n];
    219. if (key){
    220. val += play.mans[key].value[i][n] * play.mans[key].my;
    221. }
    222. }
    223. }
    224. //val+=Math.floor( Math.random() * 10); //让AI走棋增加随机元素
    225. //com.show()
    226. //z(val*my)
    227. AI.number++;
    228. return val*my;
    229. }
    230.  
    231. //评估棋局 取得棋盘双方棋子价值差
    232. AI.evaluate1 = function (map,my){
    233. var val=0;
    234. for (var i in play.mans){
    235. var man=play.mans[i];
    236. if (man.isShow){
    237. val += man.value[man.y][man.x] * man.my;
    238. }
    239. }
    240. //val+=Math.floor( Math.random() * 10); //让AI走棋增加随机元素
    241. //com.show()
    242. //z(val*my)
    243. AI.number++;
    244. return val*my;
    245. }

    猜你在找

    常见问题FAQ

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

    发表评论

    售后服务:

    • 售后服务范围 1、商业模板使用范围内问题免费咨询
      2、源码安装、模板安装(一般 ¥50-300)服务答疑仅限SVIP用户
      3、单价超过200元的模板免费一次安装,需提供服务器信息。
      付费增值服务 1、提供dedecms模板、WordPress主题、discuz模板优化等服务请详询在线客服
      2、承接 WordPress、DedeCMS、Discuz 等系统建站、仿站、开发、定制等服务
      3、服务器环境配置(一般 ¥50-300)
      4、网站的问题处理(需额外付费,500元/次/质保三个月)
      售后服务时间 周一至周日(法定节假日除外) 9:00-23:00
      免责声明 本站所提供的模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: 3482249445@qq.com),我们会及时删除,给您带来的不便,我们深表歉意!

    Hi, 如果你对这款模板有疑问,可以跟我联系哦!

    联系作者
    • 7031会员总数(位)
    • 163602资源总数(个)
    • 2712本周发布(个)
    • 2102今日发布(个)
    • 3687稳定运行(天)

    开通VIP 知识课堂
    升级SVIP尊享更多特权立即升级
    My title page contents
    召唤伊斯特瓦尔