123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /**
- * AI
- * @author Airing
- */
- var wins = []; // 赢法统计数组
- var count = 0; // 赢法统计数组的计数器
- // 初始化赢法统计数组
- for (var i = 0; i < 15; i++) {
- wins[i] = [];
- for (var j = 0; j < 15; j++) {
- wins[i][j] = []
- }
- }
- var myWin = [];
- var airingWin = [];
- // 阳线纵向90°的赢法
- for (let i = 0; i < 15; i++) {
- for (let j = 0; j < 11; j++) {
- for (let k = 0; k < 5; k++) {
- wins[i][j + k][count] = true;
- }
- count++;
- }
- }
- // 阳线横向0°的赢法
- for (let i = 0; i < 15; i++) {
- for (let j = 0; j < 11; j++) {
- for (let k = 0; k < 5; k++) {
- wins[j + k][i][count] = true;
- }
- count++;
- }
- }
- // 阴线斜向135°的赢法
- for (let i = 0; i < 11; i++) {
- for (let j = 0; j < 11; j++) {
- for (let k = 0; k < 5; k++) {
- wins[i + k][j + k][count] = true;
- }
- count++;
- }
- }
- // 阴线斜向45°的赢法
- for (let i = 0; i < 11; i++) {
- for (let j = 14; j > 3; j--) {
- for (let k = 0; k < 5; k++) {
- wins[i + k][j - k][count] = true;
- }
- count++;
- }
- }
- /**
- * AI
- */
- function airingGo(over, me) {
- if (over) {
- return;
- }
- var u = 0; // 电脑预落子的x位置
- var v = 0; // 电脑预落子的y位置
- var myScore = []; // 玩家的分数
- var airingScore = []; // 电脑的分数
- var max = 0; // 最优位置的分数
- // 初始化分数的二维数组
- for (var i = 0; i < 15; i++) {
- myScore[i] = [];
- airingScore[i] = [];
- for (var j = 0; j < 15; j++) {
- myScore[i][j] = 0;
- airingScore[i][j] = 0;
- }
- }
- // 通过赢法统计数组为两个二维数组分别计分
- for (let i = 0; i < 15; i++) {
- for (let j = 0; j < 15; j++) {
- if (chessBoard[i][j] == 0) {
- for (var k = 0; k < count; k++) {
- if (wins[i][j][k]) {
- if (myWin[k] == 1) {
- myScore[i][j] += 200;
- } else if (myWin[k] == 2) {
- myScore[i][j] += 400;
- } else if (myWin[k] == 3) {
- myScore[i][j] += 2000;
- } else if (myWin[k] == 4) {
- myScore[i][j] += 10000;
- }
- if (airingWin[k] == 1) {
- airingScore[i][j] += 220;
- } else if (airingWin[k] == 2) {
- airingScore[i][j] += 420;
- } else if (airingWin[k] == 3) {
- airingScore[i][j] += 2100;
- } else if (airingWin[k] == 4) {
- airingScore[i][j] += 20000;
- }
- }
- }
- // 如果玩家(i,j)处比目前最优的分数大,则落子在(i,j)处
- if (myScore[i][j] > max) {
- max = myScore[i][j];
- u = i;
- v = j;
- } else if (myScore[i][j] == max) {
- // 如果玩家(i,j)处和目前最优分数一样大,则比较电脑在该位置和预落子的位置的分数
- if (airingScore[i][j] > airingScore[u][v]) {
- u = i;
- v = j;
- }
- }
- // 如果电脑(i,j)处比目前最优的分数大,则落子在(i,j)处
- if (airingScore[i][j] > max) {
- max = airingScore[i][j];
- u = i;
- v = j;
- } else if (airingScore[i][j] == max) {
- // 如果电脑(i,j)处和目前最优分数一样大,则比较玩家在该位置和预落子的位置的分数
- if (myScore[i][j] > myScore[u][v]) {
- u = i;
- v = j;
- }
- }
- }
- }
- }
- oneStep(u, v, false);
- chessBoard[u][v] = 2;
- for (let k = 0; k < count; k++) {
- if (wins[u][v][k]) {
- airingWin[k]++;
- myWin[k] = 6;
- if (airingWin[k] == 5) {
- over = true;
- }
- }
- }
- if (!over) {
- me = !me;
- }
- }
|