• javascript 实现五子棋人机PK-v2


    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <style type="text/css">
    7. #box1 table{
    8. border: 0px;
    9. border-collapse: collapse;
    10. cursor: pointer;
    11. }
    12. #box1 th {
    13. border: 0px;
    14. border-collapse: collapse;
    15. cursor: pointer;
    16. }
    17. #box1 td{
    18. border: 1px solid #000;
    19. border-collapse: collapse;
    20. cursor: pointer;
    21. }
    22. #box2 table{
    23. border-collapse: collapse;
    24. border: 0px;
    25. }
    26. #box2 th {
    27. border-collapse: collapse;
    28. border: 0px;
    29. }
    30. #box2 td{
    31. border-collapse: collapse;
    32. border: 1px solid transparent;
    33. border-radius:20px;
    34. }
    35. .color_human{
    36. background-color: white;
    37. }
    38. .color_machine{
    39. background-color: black;
    40. }
    41. .color_machine_win{
    42. background-color: red;
    43. }
    44. .color_human_win{
    45. background-color: green;
    46. }
    47. #box1{
    48. position: absolute;
    49. left: 100px;
    50. top: 100px;
    51. border: 0px;
    52. background-color: gray;
    53. }
    54. #box2{
    55. position: absolute;
    56. left: 110px;
    57. top: 110px;
    58. border: 0px;
    59. }
    60. style>
    61. head>
    62. <body>
    63. <div id="box1">div>
    64. <div id="box2">div>
    65. body>
    66. <script type="text/javascript">
    67. var map_code_td = new Map();
    68. var map_code_color = new Map();
    69. var map_code_score = new Map();
    70. var win = false;
    71. var color_human = "color_human";
    72. var color_machine = "color_machine"
    73. var codes_win = [];
    74. var color_blank = "xxx";
    75. var row_count = 20;
    76. var col_count = 20;
    77. // 辅助帮助显示横竖纹的底色棋盘,没有任何事件和业务逻辑
    78. function initBox1( ) {
    79. var table = document.createElement("table");
    80. table.rules = 'all' ;
    81. for (var rowNum = 1; rowNum <= row_count; rowNum++) {
    82. var tr = document.createElement("tr");
    83. for (var colNum = 1; colNum <= col_count; colNum++) {
    84. var td = document.createElement("td");
    85. td.width = 20;
    86. td.height = 20;
    87. tr.appendChild(td);
    88. }
    89. table.appendChild(tr);
    90. }
    91. document.getElementById( "box1" ).appendChild(table);
    92. }
    93. function initBox2( ) {
    94. var table = document.createElement("table");
    95. table.rules = 'all' ;
    96. for (var rowNum = 1; rowNum <= row_count; rowNum++) {
    97. var tr = document.createElement("tr");
    98. for (var colNum = 1; colNum <= col_count; colNum++) {
    99. var td = document.createElement("td");
    100. td.width = 20;
    101. td.height = 20;
    102. tr.appendChild(td);
    103. var code = rowNum + "_" + colNum;
    104. map_code_td.set( code,td );
    105. map_code_color.set( code,color_blank );
    106. }
    107. table.appendChild(tr);
    108. }
    109. document.getElementById( "box2" ).appendChild(table);
    110. table.addEventListener( "click", clickChess );
    111. }
    112. initBox1( );
    113. initBox2( );
    114. // 获取到点击的 td,如果该人类落子,则将td的颜色改为 人类棋子颜色,否则该机器落子,将颜色改为机器棋子颜色
    115. var shouldHumanPoint = true;
    116. function clickChess(){
    117. if( win ){
    118. return;
    119. }
    120. if( !shouldHumanPoint ){
    121. alert("稍等,机器落子后您再落子!");
    122. return;
    123. }
    124. var td = event.srcElement;
    125. var rowNum = td.parentElement.rowIndex + 1;
    126. var colNum = td.cellIndex + 1;
    127. if( isAlreadyFillPoint( rowNum,colNum ) ){
    128. alert( "该位置已落子" );
    129. return;
    130. }
    131. // 执行人类落子操作
    132. td.className = color_human;
    133. var code = rowNum + "_" + colNum;
    134. map_code_color.set( code,color_human );
    135. shouldHumanPoint = false;
    136. // 人类落子后检测是否胜利
    137. winCheck();
    138. if( win ){
    139. highlightFiveWinCodes( true );
    140. alert("人类胜利");
    141. return;
    142. }
    143. window.setTimeout(function(){
    144. // 机器开始落子
    145. machinePoint();
    146. // 机器落子后检测是否胜利
    147. winCheck();
    148. if( win ){
    149. highlightFiveWinCodes( false );
    150. alert("机器胜利");
    151. }
    152. },1000);
    153. }
    154. // 高亮5个连成线的棋子
    155. function highlightFiveWinCodes( humanWin ){
    156. for(var i=0;i<5;i++){
    157. var td = map_code_td.get( codes_win[i] );
    158. if( humanWin ){
    159. td.className = "color_human_win";
    160. }else{
    161. td.className = "color_machine_win";
    162. }
    163. }
    164. }
    165. // 机器落子操作
    166. function machinePoint(){
    167. // 首先检查人类是否存在机器不拦则人类必胜的情况,比如存在人类的 "空白白白空空"两端的 空的数量满足一端>=1 ,一端>1,则机器必须落在 "白白白"的两端
    168. // 空白白白空空、空空白白白空
    169. // 人类必胜检测
    170. // 人类必胜的六连子,检测到有,则机器落在六连子的最后一个子上
    171. var sixCodes = humanMustWinCheck();
    172. if( sixCodes ){
    173. console.log("检测到存在人类的必胜六连子,试图拦截:");
    174. console.log(sixCodes);
    175. var code = sixCodes[5];
    176. var td = map_code_td.get( code );
    177. td.className = color_machine;
    178. map_code_color.set( code,color_machine );
    179. shouldHumanPoint = true;
    180. return;
    181. }
    182. // 机器开始落子,需要找到一个得分最高的格子开始落子
    183. // 从下面 row_count * col_count 格子中找到得分最高的一个格子
    184. var maxScore = 0;
    185. var rowNum_maxScore = 0;
    186. var colNum_maxScore = 0;
    187. for( var rowNum = 1;rowNum <= row_count;rowNum++ ){
    188. for( var colNum = 1;colNum <= col_count;colNum++ ){
    189. if( isAlreadyFillPoint( rowNum,colNum ) ){
    190. // 该位置已经落子了,不考虑
    191. continue;
    192. }
    193. var score = calculateScore( rowNum, colNum );
    194. if( score > maxScore ){
    195. maxScore = score;
    196. rowNum_maxScore = rowNum;
    197. colNum_maxScore = colNum;
    198. }
    199. }
    200. }
    201. console.log( "机器应该落在" + rowNum_maxScore + "行" + colNum_maxScore + "列,得分:" + maxScore );
    202. var code = rowNum_maxScore + "_" + colNum_maxScore;
    203. var td = map_code_td.get( code );
    204. td.className = color_machine;
    205. map_code_color.set( code,color_machine );
    206. shouldHumanPoint = true;
    207. }
    208. // 检测指定位置是否已经落子了
    209. function isAlreadyFillPoint( rowNum,colNum ){
    210. var code = rowNum + "_" + colNum;
    211. var color = map_code_color.get( code );
    212. if( color == color_human || color == color_machine ){
    213. return true;
    214. }
    215. return false;
    216. }
    217. // 得分表,该程序的精髓,其实本程序未使用任何算法,只是使用了这个得分表,写这个得分表的人比较厉害,程序厉不厉害也是取决于得分表设计的精不精妙
    218. function calculateScoreForForHumanMachineColorCount( count_humanColor,count_machineColor){
    219. if( count_humanColor > 0 && count_machineColor > 0 ){
    220. return 0;
    221. }else if( count_humanColor == 0 && count_machineColor == 0 ){
    222. return 7;
    223. }else if( count_humanColor == 0 && count_machineColor == 1 ){
    224. return 35;
    225. }else if( count_humanColor == 0 && count_machineColor == 2 ){
    226. return 800;
    227. }else if( count_humanColor == 0 && count_machineColor == 3 ){
    228. return 15000;
    229. }else if( count_humanColor == 0 && count_machineColor == 4 ){
    230. return 800000;
    231. }else if( count_humanColor == 1 && count_machineColor == 0 ){
    232. return 15;
    233. }else if( count_humanColor == 2 && count_machineColor == 0 ){
    234. return 400;
    235. }else if( count_humanColor == 3 && count_machineColor == 0 ){
    236. return 1800;
    237. }else if( count_humanColor == 4 && count_machineColor == 0 ){
    238. return 100000;
    239. }else{
    240. return 0;
    241. }
    242. }
    243. // 为该五连子计算得分
    244. function calculateScoreForFiveCodes( fiveCodes ){
    245. // 统计人类棋子和机器棋子的个数
    246. var count_humanColor = 0;
    247. var count_machineColor = 0;
    248. for( var i=0;i<5;i++ ){
    249. var code = fiveCodes[i];
    250. var color = map_code_color.get( code );
    251. if( !color ){
    252. // 可能由于传递的 fiveCodes 不是有效的五连子导致的,比如 "16_1"、"-1_2"等,因为前面未进行最大最小合法角标的限制
    253. return 0;
    254. }
    255. if( color == color_human ){
    256. count_humanColor++;
    257. }else if( color == color_machine ){
    258. count_machineColor++;
    259. }
    260. }
    261. return calculateScoreForForHumanMachineColorCount( count_humanColor, count_machineColor );
    262. }
    263. function calculateScore(rowNum, colNum){
    264. var totalScore = 0;
    265. // 该格子所在行( 左-->右:行不变,列++ )
    266. // 统计该格子作为第1、2、3、4、5个子时候的五连子的得分之和
    267. for( var i=0; i<5; i++){
    268. var fiveCodes = [];
    269. fiveCodes.push( rowNum + "_" + ( colNum + 0 - i ) );
    270. fiveCodes.push( rowNum + "_" + ( colNum + 1 - i ) );
    271. fiveCodes.push( rowNum + "_" + ( colNum + 2 - i ) );
    272. fiveCodes.push( rowNum + "_" + ( colNum + 3 - i ) );
    273. fiveCodes.push( rowNum + "_" + ( colNum + 4 - i ) );
    274. totalScore += calculateScoreForFiveCodes( fiveCodes );
    275. }
    276. // 该格子所在列( 上->下:行++,列不变 )
    277. // 统计该格子作为第1、2、3、4、5个子时候的五连子的得分之和
    278. for( var i=0; i<5; i++){
    279. var fiveCodes = [];
    280. fiveCodes.push( ( rowNum + 0 - i ) + "_" + colNum );
    281. fiveCodes.push( ( rowNum + 1 - i ) + "_" + colNum );
    282. fiveCodes.push( ( rowNum + 2 - i ) + "_" + colNum );
    283. fiveCodes.push( ( rowNum + 3 - i ) + "_" + colNum );
    284. fiveCodes.push( ( rowNum + 4 - i ) + "_" + colNum );
    285. totalScore += calculateScoreForFiveCodes( fiveCodes );
    286. }
    287. // 该格子所在正斜线( 左下-->右上:行--,列++ )
    288. // 统计该格子作为第1、2、3、4、5个子时候的五连子的得分之和
    289. for( var i=0; i<5; i++){
    290. var fiveCodes = [];
    291. fiveCodes.push( ( rowNum + i - 0 ) + "_" + ( colNum + 0 - i ) );
    292. fiveCodes.push( ( rowNum + i - 1 ) + "_" + ( colNum + 1 - i ) );
    293. fiveCodes.push( ( rowNum + i - 2 ) + "_" + ( colNum + 2 - i ) );
    294. fiveCodes.push( ( rowNum + i - 3 ) + "_" + ( colNum + 3 - i ) );
    295. fiveCodes.push( ( rowNum + i - 4 ) + "_" + ( colNum + 4 - i ) );
    296. totalScore += calculateScoreForFiveCodes( fiveCodes );
    297. }
    298. // 该格子所在反斜线( 左上-->右下:行++,列++ )
    299. // 统计该格子作为第1、2、3、4、5个子时候的五连子的得分之和
    300. for( var i=0; i<5; i++){
    301. var fiveCodes = [];
    302. fiveCodes.push( ( rowNum + 0 - i ) + "_" + ( colNum + 0 - i ) );
    303. fiveCodes.push( ( rowNum + 1 - i ) + "_" + ( colNum + 1 - i ) );
    304. fiveCodes.push( ( rowNum + 2 - i ) + "_" + ( colNum + 2 - i ) );
    305. fiveCodes.push( ( rowNum + 3 - i ) + "_" + ( colNum + 3 - i ) );
    306. fiveCodes.push( ( rowNum + 4 - i ) + "_" + ( colNum + 4 - i ) );
    307. totalScore += calculateScoreForFiveCodes( fiveCodes );
    308. }
    309. return totalScore;
    310. }
    311. function winCheck(){
    312. if( win ){
    313. return;
    314. }
    315. // 检查全部的五连子,是否存在五个全是人类棋子或者五个全是机器棋子
    316. // 检查全部列上的五连子
    317. winCheck_col()
    318. if( win ){
    319. return;
    320. }
    321. // 检查全部行上的五连子
    322. winCheck_row();
    323. if( win ){
    324. return;
    325. }
    326. // 检查全部正斜线上的五连子
    327. winCheck_forwardSlash();
    328. if( win ){
    329. return;
    330. }
    331. // 检查全部反斜线上的五连子
    332. winCheck_backSlash();
    333. if( win ){
    334. return;
    335. }
    336. }
    337. function winCheck_forwardSlash(){
    338. // 列--,行++
    339. for( rowNum=1;rowNum<=row_count;rowNum++ ){
    340. for( colNum=1;colNum<=col_count;colNum++ ){
    341. var codes = [];
    342. codes.push( rowNum + "_" + colNum );
    343. codes.push( ( rowNum + 1 ) + "_" + ( colNum - 1 ) );
    344. codes.push( ( rowNum + 2 ) + "_" + ( colNum - 2 ) );
    345. codes.push( ( rowNum + 3 ) + "_" + ( colNum - 3 ) );
    346. codes.push( ( rowNum + 4 ) + "_" + ( colNum - 4 ) );
    347. if( isAllTargetColor( codes,color_human ) || isAllTargetColor( codes,color_machine ) ){
    348. win = true;
    349. }
    350. if( win ){
    351. for(var i=0;i<5;i++){
    352. codes_win.push( codes[i] );
    353. }
    354. return;
    355. }
    356. }
    357. }
    358. }
    359. function winCheck_backSlash(){
    360. // 列++,行++
    361. for( rowNum=1;rowNum<=row_count;rowNum++ ){
    362. for( colNum=1;colNum<=col_count;colNum++ ){
    363. var fiveCodes = [];
    364. fiveCodes.push( rowNum + "_" + colNum );
    365. fiveCodes.push( ( rowNum + 1 ) + "_" + ( colNum + 1 ) );
    366. fiveCodes.push( ( rowNum + 2 ) + "_" + ( colNum + 2 ) );
    367. fiveCodes.push( ( rowNum + 3 ) + "_" + ( colNum + 3 ) );
    368. fiveCodes.push( ( rowNum + 4 ) + "_" + ( colNum + 4 ) );
    369. if( isAllTargetColor( fiveCodes,color_human ) || isAllTargetColor( fiveCodes,color_machine ) ){
    370. // 都是人类棋子 或者 机器棋子,表示已经分出胜负了
    371. win = true;
    372. }
    373. if( win ){
    374. for( var i=0;i<5;i++ ){
    375. codes_win.push( fiveCodes[i] );
    376. }
    377. return;
    378. }
    379. }
    380. }
    381. }
    382. function winCheck_col(){
    383. // 检查全部列是否存在五连子
    384. // 列不变,行++
    385. for( var colNum=1;colNum<=col_count;colNum++ ){
    386. for( var rowNum=1;rowNum<=row_count;rowNum++ ){
    387. var fiveCodes = [];
    388. fiveCodes.push( rowNum + "_" + colNum );
    389. fiveCodes.push( ( rowNum + 1 ) + "_" + colNum );
    390. fiveCodes.push( ( rowNum + 2 ) + "_" + colNum );
    391. fiveCodes.push( ( rowNum + 3 ) + "_" + colNum );
    392. fiveCodes.push( ( rowNum + 4 ) + "_" + colNum );
    393. if( isAllTargetColor( fiveCodes,color_human ) || isAllTargetColor( fiveCodes,color_machine ) ){
    394. // 已经分出胜负了
    395. win = true;
    396. }
    397. if( win ){
    398. for( var i=0;i<5;i++ ){
    399. codes_win.push( fiveCodes[i] );
    400. }
    401. return;
    402. }
    403. }
    404. }
    405. }
    406. function winCheck_row(){
    407. // 行不变,列++
    408. for( var rowNum=1;rowNum<=row_count;rowNum++ ){
    409. for( var colNum=1;colNum<=col_count;colNum++ ){
    410. var codes = [];
    411. codes.push( rowNum + "_" + colNum );
    412. codes.push( rowNum + "_" + ( colNum + 1 ) );
    413. codes.push( rowNum + "_" + ( colNum + 2 ) );
    414. codes.push( rowNum + "_" + ( colNum + 3 ) );
    415. codes.push( rowNum + "_" + ( colNum + 4 ) );
    416. if( isAllTargetColor( codes,color_human ) || isAllTargetColor( codes,color_machine ) ){
    417. // 已经分出胜负了
    418. win = true;
    419. }
    420. if( win ){
    421. for( var i=0;i<5;i++ ){
    422. codes_win.push( codes[i] );
    423. }
    424. return;
    425. }
    426. }
    427. }
    428. }
    429. // 检查五连子是否都是指定的颜色
    430. function isAllTargetColor( fiveCodes,targetColor ){
    431. for( var i = 0;i<5;i++ ){
    432. var code = fiveCodes[i];
    433. var color = map_code_color.get( code );
    434. if( !color || color != targetColor ){
    435. return false;
    436. }
    437. }
    438. return true;
    439. }
    440. // 人类必胜检测
    441. // 检查人类是否存在机器不拦则人类必胜的情况,比如存在人类的 "空白白白空空"两端的 空的数量满足一端>=1 ,一端>1,则机器必须落在 "白白白"的两端
    442. function humanMustWinCheck(){
    443. // 全部行的 人类必胜检测
    444. var sixCodes = humanMustWinCheck_allRow();
    445. if( sixCodes ){
    446. return sixCodes;
    447. }
    448. // 全部列的 人类必胜检测
    449. sixCodes = humanMustWinCheck_allCol();
    450. if( sixCodes ){
    451. return sixCodes;
    452. }
    453. // 全部正斜线的 人类必胜检测
    454. sixCodes = humanMustWinCheck_allForwardSlash();
    455. if( sixCodes ){
    456. return sixCodes;
    457. }
    458. // 全部反斜线的 人类必胜检测
    459. sixCodes = humanMustWinCheck_allBackSlash();
    460. if( sixCodes ){
    461. return sixCodes;
    462. }
    463. }
    464. // 全部行的 人类必胜检测
    465. function humanMustWinCheck_allRow(){
    466. for( var rowNum=1;rowNum<=row_count;rowNum++ ){
    467. // 对当前行进行 人类必胜检测
    468. var sixCodes = humanMustWinCheck_row( rowNum );
    469. if( sixCodes ){
    470. return sixCodes;
    471. }
    472. }
    473. return null;
    474. }
    475. // 对当前行进行人类必胜检测
    476. function humanMustWinCheck_row( rowNum ){
    477. // 遍历当前行的全部六连子,检测是否存在 "空白白白空空"、"空空白白白空"
    478. for( var colNum=1;colNum<=col_count;colNum++ ){
    479. var codes = [];
    480. codes.push( rowNum + "_" + colNum );
    481. codes.push( rowNum + "_" + ( colNum + 1 ) );
    482. codes.push( rowNum + "_" + ( colNum + 2 ) );
    483. codes.push( rowNum + "_" + ( colNum + 3 ) );
    484. codes.push( rowNum + "_" + ( colNum + 4 ) );
    485. codes.push( rowNum + "_" + ( colNum + 5 ) );
    486. if( isHumanMushWinSixCodes( codes ) ){
    487. return codes;
    488. }
    489. }
    490. return null;
    491. }
    492. // 检查是否是人类必胜六连子
    493. function isHumanMushWinSixCodes( sixCodes ){
    494. var color1 = map_code_color.get( sixCodes[0] );
    495. var color2 = map_code_color.get( sixCodes[1] );
    496. var color3 = map_code_color.get( sixCodes[2] );
    497. var color4 = map_code_color.get( sixCodes[3] );
    498. var color5 = map_code_color.get( sixCodes[4] );
    499. var color6 = map_code_color.get( sixCodes[5] );
    500. if( !( color1 && color2 && color3 && color4 && color5 && color6 ) ){
    501. return false;
    502. }
    503. if( ( color1 == color_blank &&
    504. color2 == color_blank &&
    505. color3 == color_human &&
    506. color4 == color_human &&
    507. color5 == color_human &&
    508. color6 == color_blank ) ||
    509. ( color1 == color_blank &&
    510. color2 == color_human &&
    511. color3 == color_human &&
    512. color4 == color_human &&
    513. color5 == color_blank &&
    514. color6 == color_blank ) ){
    515. return true;
    516. }else{
    517. return false;
    518. }
    519. }
    520. // 当前列的人类必胜六连子检测
    521. function humanMustWinCheck_allCol(colNum){
    522. for( var rowNum=1;rowNum<=row_count;rowNum++ ){
    523. var codes = [];
    524. codes.push( rowNum + "_" + colNum );
    525. codes.push( ( rowNum + 1 ) + "_" + colNum );
    526. codes.push( ( rowNum + 2 ) + "_" + colNum );
    527. codes.push( ( rowNum + 3 ) + "_" + colNum );
    528. codes.push( ( rowNum + 4 ) + "_" + colNum );
    529. codes.push( ( rowNum + 5 ) + "_" + colNum );
    530. if( isHumanMushWinSixCodes( codes ) ){
    531. return codes;
    532. }
    533. }
    534. return null;
    535. }
    536. // 全部正斜线的 人类必胜检测
    537. function humanMustWinCheck_allForwardSlash(){
    538. for(var rowNum=1;rowNum<=row_count;rowNum++){
    539. // 当前正斜线的 人类必胜检测
    540. var sixCodes = humanMustWinCheck_forwardSlash(rowNum,1);
    541. if( sixCodes ){
    542. return sixCodes;
    543. }
    544. }
    545. for(var colNum=1;colNum<=col_count;colNum++){
    546. // 当前正斜线的 人类必胜检测
    547. var sixCodes = humanMustWinCheck_forwardSlash(row_count,colNum);
    548. if( sixCodes ){
    549. return sixCodes;
    550. }
    551. }
    552. return null;
    553. }
    554. // 当前正斜线的 人类必胜检测
    555. function humanMustWinCheck_forwardSlash( fromRowNum,fromColNum ){
    556. var large = row_count;
    557. if( col_count > large ){
    558. large = col_count;
    559. }
    560. for(var i=0;i
    561. var codes = [];
    562. codes.push( ( fromRowNum - i ) + "_" + ( fromColNum + i ) );
    563. codes.push( ( fromRowNum - i - 1 ) + "_" + ( fromColNum + i + 1 ) );
    564. codes.push( ( fromRowNum - i - 2 ) + "_" + ( fromColNum + i + 2 ) );
    565. codes.push( ( fromRowNum - i - 3 ) + "_" + ( fromColNum + i + 3 ) );
    566. codes.push( ( fromRowNum - i - 4 ) + "_" + ( fromColNum + i + 4 ) );
    567. codes.push( ( fromRowNum - i - 5 ) + "_" + ( fromColNum + i + 5 ) );
    568. if( isHumanMushWinSixCodes( codes ) ){
    569. return codes;
    570. }
    571. }
    572. return null;
    573. }
    574. // 全部反斜线的 人类必胜检测
    575. function humanMustWinCheck_allBackSlash(){
    576. for(var colNum=1;colNum<=col_count;colNum++){
    577. // 当前反斜线的 人类必胜检测
    578. var sixCodes = humanMustWinCheck_backSlash( 1,colNum );
    579. if( sixCodes ){
    580. return sixCodes;
    581. }
    582. }
    583. for(var rowNum=1;rowNum<=row_count;rowNum++){
    584. // 当前反斜线的 人类必胜检测
    585. var sixCodes = humanMustWinCheck_backSlash( rowNum,1 );
    586. if( sixCodes ){
    587. return sixCodes;
    588. }
    589. }
    590. return null;
    591. }
    592. // 行、列、正斜线、反斜线上的几个子的行号、列号增长的趋势规则(即++、--)可以添加到一个数组中,每次从数组中取
    593. // 当前反斜线的 人类必胜检测
    594. function humanMustWinCheck_backSlash(fromRowNum,fromColNum){
    595. var large = row_count;
    596. if( col_count > large ){
    597. large = col_count;
    598. }
    599. for( var i=0;i
    600. var codes = [];
    601. codes.push( ( fromRowNum + i ) + "_" + ( fromColNum + i ) );
    602. codes.push( ( fromRowNum + i + 1 ) + "_" + ( fromColNum + i + 1 ) );
    603. codes.push( ( fromRowNum + i + 2 ) + "_" + ( fromColNum + i + 2 ) );
    604. codes.push( ( fromRowNum + i + 3 ) + "_" + ( fromColNum + i + 3 ) );
    605. codes.push( ( fromRowNum + i + 4 ) + "_" + ( fromColNum + i + 4 ) );
    606. codes.push( ( fromRowNum + i + 5 ) + "_" + ( fromColNum + i + 5 ) );
    607. if( isHumanMushWinSixCodes( codes ) ){
    608. return codes;
    609. }
    610. }
    611. return null;
    612. }
    613. script>
    614. html>

  • 相关阅读:
    Java#6(类和对象及封装)
    【LeetCode-中等题】347. 前 K 个高频元素
    K8S中的某个容器突然出现内存和CPU占用过高的情况解决办法
    一文读懂UTF-8的编码规则
    vue @cliick.stop @click.prevent @click.self
    真实感渲染:课程介绍
    将编译过的C++库迅速部署在Visual Studio新项目中
    【Docker】深入理解Docker:一种革新性的容器技术
    【JAVA程序设计】(C00090) 基于SSM+Vue的宠物医院预约挂号平台
    大家都在“跪求”的Spring响应式微服务PDF蓝光版,简直羡慕了!
  • 原文地址:https://blog.csdn.net/heshiyuan1406146854/article/details/134079015