javascriptで五目並べを実現する(二)

6420 ワード

前は全部のゲームの流れを実現しました.五目並べAIの実現は主に以下の通りです.
1.表を調べて、いくつかの棋譜を保存して、コンピュータが碁を打つ時自動的に一致します.
2.分値法:ボード上の各空席を検索して、この空席にある駒を置くと仮定して、状況によって異なる分値を与えて、一番高いところで碁を打ちます.
3.ゲームツリー:すべての状況をリストし、極小値で検索して最適なパスを選ぶ
4.コンピュータは毎回ゲームに負けた後、記録を保存して、もう繰り返しません.
ここでは分値法だけを言います.私の考えは駒の状態を分けることです.1、1、2、2、眠2、3、3、3、3、3、4、4、4、4、5に寝ます.
ここでは、いくつかの場合、効果は同じです.例えば、5になります.4になります.3になります.4になります.
/**   AI
 *  :              ,            
 *   :
 * 〖  〗                      
 * 〖  〗             ,       。
 * 〖  〗          。
 * 〖  〗           。
 * 〖  〗      。
 * 〖 〗              5              。
 * 〖  〗            。
 * 〖   〗 :    (                     )。  “  ”。
 * 〖   〗           。  “  ”。
 * 〖  〗            。
 * 〖  〗      。
 * 〖 〗              5              。
 * 〖  〗            。
 * 〖   〗 :    (                     )。  “  ”。
 * 〖   〗           。  “  ”。
 * 〖    〗           。  “   ”。
 * 〖  〗            。
 * 〖  〗      。
 * 〖  〗         ,       ,    “    ”。
 * 〖  〗            。  “  ”。
 * 〖  〗            。  “  ”。
 * 〖  〗                 。
 *    
 *  5:100000 
 *  4:10000 
 *  3+ 4:5000 
 *  3+ 2:2000 
 *  2+ 1:1 
 *       5  0 
 * @return {[type]} [description]
 */
function getPosition() {
	var a = new Array(2);
	var score = 0;
	for (var x = 0; x < 15; x++) {
		for (var y = 0; y < 15; y++) {
			if (chessData[x][y] == 0) {
				if (judge(x, y) > score) {
					score = judge(x, y);
					a[0] = x;
					a[1] = y;
				}
			}
		}
	}
	return a;
}

function AIplay() {
	var str = getPosition();
	// console.log("  AI        :" + str[0] + "," + str[1]);
	doCheck(str[0], str[1]);
}

function judge(x, y) {
	var a = parseInt(leftRight(x, y, 1)) + parseInt(topBottom(x, y, 1)) + parseInt(rightBottom(x, y, 1)) + parseInt(rightTop(x, y, 1))+100; //           
	var b = parseInt(leftRight(x, y, 2)) + parseInt(topBottom(x, y, 2)) + parseInt(rightBottom(x, y, 2)) + parseInt(rightTop(x, y, 2)); //           
	var result = a + b;
	// console.log("     " + x + "," + y + "        " + result);
	return result; //            
}

function leftRight(x, y, num) {
	var death = 0; //0        ,    5,1       ,   5,2     ,    
	var live = 0;
	var count = 0;
	var arr = new Array(15);
	for (var i = 0; i< 15; i++) {
		arr[i] = new Array(15);
		for (var j = 0; j < 15; j++) {
			arr[i][j] = chessData[i][j];
		}
	}
	arr[x][y] = num;
	for (var i = x; i >= 0; i--) {
		if (arr[i][y] == num) {
			count++;
		} else if (arr[i][y] == 0) {
			live += 1; //    
			i = -1;
		} else {
			death += 1; //            
			i = -1;
		}
	}
	for (var i = x; i <= 14; i++) {
		if (arr[i][y] == num) {
			count++;
		} else if (arr[i][y] == 0) {
			live += 1; //    
			i = 100;
		} else {
			death += 1;
			i = 100;
		}
	}
	count -= 1;
	// console.log(x + "," + y + "         " + model(count, death));
	return model(count, death);
}

function topBottom(x, y, num) {
	var death = 0; //0        ,    5,1       ,   5,2     ,    
	var live = 0;
	var count = 0;
	var arr = new Array(15);
	for (var i = 0; i< 15; i++) {
		arr[i] = new Array(15);
		for (var j = 0; j < 15; j++) {
			arr[i][j] = chessData[i][j];
		}
	}
	arr[x][y] = num;
	for (var i = y; i >= 0; i--) {
		if (arr[x][i] == num) {
			count++;
		} else if (arr[x][i] == 0) {
			live += 1; //    
			i = -1;
		} else {
			death += 1;
			i = -1;
		}
	}
	for (var i = y; i <= 14; i++) {
		if (arr[x][i] == num) {
			count++;
		} else if (arr[x][i] == 0) {
			live += 1; //    
			i = 100;
		} else {
			death += 1;
			i = 100;
		}
	}
	count -= 1;
	// console.log(x + "," + y + "          " + model(count, death));
	return model(count, death);
}

function rightBottom(x, y, num) {
	var death = 0; //0        ,    5,1       ,   5,2     ,    
	var live = 0;
	var count = 0;
	var arr = new Array(15);
	for (var i = 0; i< 15; i++) {
		arr[i] = new Array(15);
		for (var j = 0; j < 15; j++) {
			arr[i][j] = chessData[i][j];
		}
	}
	arr[x][y] = num;
	for (var i = x, j = y; i >= 0 && j >= 0;) {
		if (arr[i][j] == num) {
			count++;
		} else if (arr[i][j] == 0) {
			live += 1; //    
			i = -1;
		} else {
			death += 1;
			i = -1;
		}
		i--;
		j--;
	}
	for (var i = x, j = y; i <= 14 && j <= 14;) {
		if (arr[i][j] == num) {
			count++;
		} else if (arr[i][j] == 0) {
			live += 1; //    
			i = 100;
		} else {
			death += 1;
			i = 100;
		}
		i++;
		j++;
	}
	count -= 1;
	// console.log(x + "," + y + "          " + model(count, death));
	return model(count, death);
}

function rightTop(x, y, num) {
	var death = 0; //0        ,    5,1       ,   5,2     ,    
	var live = 0;
	var count = 0;
	var arr = new Array(15);
	for (var i = 0; i< 15; i++) {
		arr[i] = new Array(15);
		for (var j = 0; j < 15; j++) {
			arr[i][j] = chessData[i][j];
		}
	}
	arr[x][y] = num;
	for (var i = x, j = y; i >= 0 && j <= 14;) {
		if (arr[i][j] == num) {
			count++;
		} else if (arr[i][j] == 0) {
			live += 1; //    
			i = -1;
		} else {
			death += 1;
			i = -1;
		}
		i--;
		j++;
	}
	for (var i = x, j = y; i <= 14 && j >= 0;) {
		if (arr[i][j] == num) {
			count++;
		} else if (arr[i][j] == 0) {
			live += 1; //    
			i = 100;
		} else {
			death += 1;
			i = 100;
		}
		i++;
		j--;
	}
	count -= 1;
	// console.log(x + "," + y + "          " + model(count, death));
	return model(count, death);
}
/**         (          ,   ,            )
 *    :  =  ==   =  +  =   
 * 
 * 
 * 
 */
function model(count, death) {
	// console.log("count" + count + "death" + death);
	var LEVEL_ONE = 0;//  
	var LEVEL_TWO = 1;// 2, 1
	var LEVEL_THREE = 1500;// 3, 2
	var LEVEL_FOER = 4000;// 4, 3
	var LEVEL_FIVE = 10000;// 4
	var LEVEL_SIX = 100000;// 5
	if (count == 1 && death == 1) {
		return LEVEL_TWO; // 1
	} else if (count == 2) {
		if (death == 0) {
			return LEVEL_THREE; // 2
		} else if (death == 1) {
			return LEVEL_TWO; // 2
		} else {
			return LEVEL_ONE; //  
		}
	} else if (count == 3) {
		if (death == 0) {
			return LEVEL_FOER; // 3
		} else if (death == 1) {
			return LEVEL_THREE; // 3
		} else {
			return LEVEL_ONE; //  
		}
	} else if (count == 4) {
		if (death == 0) {
			return LEVEL_FIVE; // 4
		} else if (death == 1) {
			return LEVEL_FOER; // 4
		} else {
			return LEVEL_ONE; //  
		}
	} else if (count == 5) {
		return LEVEL_SIX; // 5
	}
	return LEVEL_ONE;
}