AiringGo.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /**
  2. * AI
  3. * @author Airing
  4. */
  5. var wins = []; // 赢法统计数组
  6. var count = 0; // 赢法统计数组的计数器
  7. // 初始化赢法统计数组
  8. for (var i = 0; i < 15; i++) {
  9. wins[i] = [];
  10. for (var j = 0; j < 15; j++) {
  11. wins[i][j] = []
  12. }
  13. }
  14. var myWin = [];
  15. var airingWin = [];
  16. // 阳线纵向90°的赢法
  17. for (let i = 0; i < 15; i++) {
  18. for (let j = 0; j < 11; j++) {
  19. for (let k = 0; k < 5; k++) {
  20. wins[i][j + k][count] = true;
  21. }
  22. count++;
  23. }
  24. }
  25. // 阳线横向0°的赢法
  26. for (let i = 0; i < 15; i++) {
  27. for (let j = 0; j < 11; j++) {
  28. for (let k = 0; k < 5; k++) {
  29. wins[j + k][i][count] = true;
  30. }
  31. count++;
  32. }
  33. }
  34. // 阴线斜向135°的赢法
  35. for (let i = 0; i < 11; i++) {
  36. for (let j = 0; j < 11; j++) {
  37. for (let k = 0; k < 5; k++) {
  38. wins[i + k][j + k][count] = true;
  39. }
  40. count++;
  41. }
  42. }
  43. // 阴线斜向45°的赢法
  44. for (let i = 0; i < 11; i++) {
  45. for (let j = 14; j > 3; j--) {
  46. for (let k = 0; k < 5; k++) {
  47. wins[i + k][j - k][count] = true;
  48. }
  49. count++;
  50. }
  51. }
  52. /**
  53. * AI
  54. */
  55. function airingGo(over, me) {
  56. if (over) {
  57. return;
  58. }
  59. var u = 0; // 电脑预落子的x位置
  60. var v = 0; // 电脑预落子的y位置
  61. var myScore = []; // 玩家的分数
  62. var airingScore = []; // 电脑的分数
  63. var max = 0; // 最优位置的分数
  64. // 初始化分数的二维数组
  65. for (var i = 0; i < 15; i++) {
  66. myScore[i] = [];
  67. airingScore[i] = [];
  68. for (var j = 0; j < 15; j++) {
  69. myScore[i][j] = 0;
  70. airingScore[i][j] = 0;
  71. }
  72. }
  73. // 通过赢法统计数组为两个二维数组分别计分
  74. for (let i = 0; i < 15; i++) {
  75. for (let j = 0; j < 15; j++) {
  76. if (chessBoard[i][j] == 0) {
  77. for (var k = 0; k < count; k++) {
  78. if (wins[i][j][k]) {
  79. if (myWin[k] == 1) {
  80. myScore[i][j] += 200;
  81. } else if (myWin[k] == 2) {
  82. myScore[i][j] += 400;
  83. } else if (myWin[k] == 3) {
  84. myScore[i][j] += 2000;
  85. } else if (myWin[k] == 4) {
  86. myScore[i][j] += 10000;
  87. }
  88. if (airingWin[k] == 1) {
  89. airingScore[i][j] += 220;
  90. } else if (airingWin[k] == 2) {
  91. airingScore[i][j] += 420;
  92. } else if (airingWin[k] == 3) {
  93. airingScore[i][j] += 2100;
  94. } else if (airingWin[k] == 4) {
  95. airingScore[i][j] += 20000;
  96. }
  97. }
  98. }
  99. // 如果玩家(i,j)处比目前最优的分数大,则落子在(i,j)处
  100. if (myScore[i][j] > max) {
  101. max = myScore[i][j];
  102. u = i;
  103. v = j;
  104. } else if (myScore[i][j] == max) {
  105. // 如果玩家(i,j)处和目前最优分数一样大,则比较电脑在该位置和预落子的位置的分数
  106. if (airingScore[i][j] > airingScore[u][v]) {
  107. u = i;
  108. v = j;
  109. }
  110. }
  111. // 如果电脑(i,j)处比目前最优的分数大,则落子在(i,j)处
  112. if (airingScore[i][j] > max) {
  113. max = airingScore[i][j];
  114. u = i;
  115. v = j;
  116. } else if (airingScore[i][j] == max) {
  117. // 如果电脑(i,j)处和目前最优分数一样大,则比较玩家在该位置和预落子的位置的分数
  118. if (myScore[i][j] > myScore[u][v]) {
  119. u = i;
  120. v = j;
  121. }
  122. }
  123. }
  124. }
  125. }
  126. oneStep(u, v, false);
  127. chessBoard[u][v] = 2;
  128. for (let k = 0; k < count; k++) {
  129. if (wins[u][v][k]) {
  130. airingWin[k]++;
  131. myWin[k] = 6;
  132. if (airingWin[k] == 5) {
  133. over = true;
  134. }
  135. }
  136. }
  137. if (!over) {
  138. me = !me;
  139. }
  140. }