⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cboardsituation.as

📁 Flash之五子棋之源代码
💻 AS
字号:
/****************************************************************\
Class:CBoardSituation
Create:孙彬彬
Description:当前棋盘状态,用fiveArea数组存储当前棋面信息,用stepList
链表存储第一颗子到最后一颗子的序列;返回最佳下子位置并对
在该位置下子所形成的棋盘状态进行评分;
\****************************************************************/
import StepLink;
import flash.geom.*;
class CBoardSituation {
	//每一步的列表 
	private var stepList:StepLink;
	private var fiveArea:Array = new Array(15);
	//机器所下的那一步
	private var machineStep:Step;
	//该种盘面状态所得到的分数 
	private var value:Number;
	//静态变量,成五、活四、双三等
	static var winningMove = 9999999;
	static var openFour = 8888888;
	static var twoThrees = 7777777;
	static var lineN:Array = new Array(0, 20, 17, 15.4, 14, 10);
	//初始化
	public function CBoardSituation() {
		this.stepList = new StepLink();
		this.machineStep = new Step();
		this.value = 0;
		for (var i = 0; i<15; i++) {
			this.fiveArea[i] = new Array(15);
			for (var j = 0; j<15; j++) {
				this.fiveArea[i][j] = 0;
			}
		}
	}
	//初始化
	public function init() {
		for (var tempLink = this.stepList.preStep; tempLink; tempLink=this.stepList.preStep) {
			this.stepList.preStep = tempLink.preStep;
			tempLink.nextStep = this.stepList;
			tempLink = null;
		}
		this.value = 0;
		for (var i = 0; i<15; i++) {
			for (var j = 0; j<15; j++) {
				this.fiveArea[i][j] = 0;
			}
		}
	}
	//悔棋
	public function back():Number {
		//删除最后一个节点
		if (this.stepList.preStep) {
			this.fiveArea[this.stepList.preStep.thisStep.m][this.stepList.preStep.thisStep.n] = 0;
			var tempLink = this.stepList.preStep;
			this.stepList.preStep = tempLink.preStep;
			tempLink.nextStep = this.stepList;
			var t = tempLink.thisStep.id;
			tempLink = null;
			return t;
		} else {
			return 0;
		}
	}
	//当前位置是否有子
	public function sideIn(m:Number, n:Number):Number {
		if (m>=0 && m<=14 && n>=0 && n<=14) {
			return this.fiveArea[m][n];
		} else {
			return -1;
		}
	}
	//设置新的下子位置
	public function setStep(m:Number, n:Number, side:Number):Boolean {
		if (m>=0 && m<=14 && n>=0 && n<=14 && this.fiveArea[m][n] == 0) {
			this.fiveArea[m][n] = 1;
			this.addNode(m, n, side);
			if (this.gradeAsRule(m, n, 1) == CBoardSituation.winningMove) {
				GoBang.winer = 1;
			}
			return true;
		} else {
			return false;
		}
	}
	//添加链表节点
	private function addNode(m:Number, n:Number, side:Number) {
		this.stepList.setStep(m, n, side);
		this.stepList.nextStep = new StepLink();
		this.stepList.nextStep.preStep = this.stepList;
		this.stepList = this.stepList.nextStep;
	}
	public function computeGo():Point {
		var myPoint:Point = this.evaluateValue();
		this.fiveArea[myPoint.x][myPoint.y] = -1;
		this.addNode(myPoint.x, myPoint.y, -1);
		if (this.gradeAsRule(myPoint.x, myPoint.y, -1) == CBoardSituation.winningMove) {
			GoBang.winer = -1;
		}
		return myPoint;
	}
	//计算当前棋局的分数
	public function evaluateValue():Point {
		//存储在每个位置下子应得的分数
		var fiveValue:Array = new Array(15);
		for (var i = 0; i<15; i++) {
			fiveValue[i] = new Array(15);
			for (var j = 0; j<15; j++) {
				fiveValue[i][j] = 0;
			}
		}
		fiveValue[7][7] = 1;
		var maxV = -1, maxN = 0;
		var maxI:Array = new Array(), maxJ:Array = new Array();
		var cV, hV;
		var returnP:Point;
		//计算每个位置的得分
		for (i=0; i<15; i++) {
			for (j=0; j<15; j++) {
				//该位置已有子则继续下个位置计算or该位置周围全空,没有下子的必要,则继续下个位置计算
				if (this.fiveArea[i][j] != 0) {
					fiveValue[i][j] = -1;
					continue;
				}
				//对该下子位置评分       
				cV = this.gradeAsRule(i, j, -1);
				hV = this.gradeAsRule(i, j, 1);
				if (cV>=CBoardSituation.winningMove) {
					fiveValue[i][j] = 5*cV;
				} else if (cV>=CBoardSituation.twoThrees) {
					fiveValue[i][j] = (cV>=hV) ? cV : hV;
				} else {
					fiveValue[i][j] = fiveValue[i][j]+cV+hV;
				}
			}
		}
		for (i=0; i<15; i++) {
			for (j=0; j<15; j++) {
				if (fiveValue[i][j]>maxV) {
					maxV = fiveValue[i][j];
					maxN = 0;
				}
				if (fiveValue[i][j] == maxV) {
					maxI[maxN] = i;
					maxJ[maxN] = j;
					maxN++;
				}
			}
		}
		if (maxV == 0) {
			GoBang.winer = 2;
		}
		var rndN = Math.floor(maxN*Math.random());
		returnP = new Point(maxI[rndN], maxJ[rndN]);
		return returnP;
	}
	//该位置周围是否全空
	private function aroundBlank(i:Number, j:Number):Boolean {
		if (j>0 && this.fiveArea[i][j-1] != 0) {
			return true;
		}
		if (j+1<15 && this.fiveArea[i][j+1] != 0) {
			return true;
		}
		if (i>0) {
			if (this.fiveArea[i-1][j] != 0) {
				return true;
			}
			if (j>0 && this.fiveArea[i-1][j-1] != 0) {
				return true;
			}
			if (j+1<15 && this.fiveArea[i-1][j+1] != 0) {
				return true;
			}
		}
		if (i+1<15) {
			if (this.fiveArea[i+1][j] != 0) {
				return true;
			}
			if (j>0 && this.fiveArea[i+1][j-1] != 0) {
				return true;
			}
			if (j+1<15 && this.fiveArea[i+1][j+1] != 0) {
				return true;
			}
		}
		return false;
	}
	//按规则评分
	private function gradeAsRule(i:Number, j:Number, mySide:Number):Number {
		//情况一,成4成3时进行下面计算.............................................................
		var test4 = 0, test3 = 0;
		//L:当前检索的方向上有多少符合条件的
		var L, m, m1, m2, side1, side2;
		//检索横向
		L = 1;
		m = 1;
		while (j+m<15 && this.fiveArea[i][j+m] == mySide) {
			L++;
			m++;
		}
		m1 = m;
		m = 1;
		while (j-m>=0 && this.fiveArea[i][j-m] == mySide) {
			L++;
			m++;
		}
		m2 = m;
		if (L>4) {
			return CBoardSituation.winningMove;
		}
		side1 = (j+m1<15 && this.fiveArea[i][j+m1] == 0);
		side2 = (j-m2>=0 && this.fiveArea[i][j-m2] == 0);
		if (L == 4 && (side1 || side2)) {
			test3++;
		}
		if (side1 && side2) {
			if (L == 4) {
				test4 = 1;
			}
			if (L == 3) {
				test3++;
			}
		}
		//检索纵向                                    
		L = 1;
		m = 1;
		while (i+m<15 && this.fiveArea[i+m][j] == mySide) {
			L++;
			m++;
		}
		m1 = m;
		m = 1;
		while (i-m>=0 && this.fiveArea[i-m][j] == mySide) {
			L++;
			m++;
		}
		m2 = m;
		if (L>4) {
			return CBoardSituation.winningMove;
		}
		side1 = (i+m1<15 && this.fiveArea[i+m1][j] == 0);
		side2 = (i-m2>=0 && this.fiveArea[i-m2][j] == 0);
		if (L == 4 && (side1 || side2)) {
			test3++;
		}
		if (side1 && side2) {
			if (L == 4) {
				test4 = 1;
			}
			if (L == 3) {
				test3++;
			}
		}
		//检索反斜向                                    
		L = 1;
		m = 1;
		while (i+m<15 && j+m<15 && this.fiveArea[i+m][j+m] == mySide) {
			L++;
			m++;
		}
		m1 = m;
		m = 1;
		while (i-m>=0 && j-m>=0 && this.fiveArea[i-m][j-m] == mySide) {
			L++;
			m++;
		}
		m2 = m;
		if (L>4) {
			return CBoardSituation.winningMove;
		}
		side1 = (i+m1<15 && j+m1<15 && this.fiveArea[i+m1][j+m1] == 0);
		side2 = (i-m2>=0 && j-m2>=0 && this.fiveArea[i-m2][j-m2] == 0);
		if (L == 4 && (side1 || side2)) {
			test3++;
		}
		if (side1 && side2) {
			if (L == 4) {
				test4 = 1;
			}
			if (L == 3) {
				test3++;
			}
		}
		//检索正斜向                                    
		L = 1;
		m = 1;
		while (i+m<15 && j-m>=0 && this.fiveArea[i+m][j-m] == mySide) {
			L++;
			m++;
		}
		m1 = m;
		m = 1;
		while (i-m>=0 && j+m<15 && this.fiveArea[i-m][j+m] == mySide) {
			L++;
			m++;
		}
		m2 = m;
		if (L>4) {
			return CBoardSituation.winningMove;
		}
		side1 = (i+m1<15 && j-m1>=0 && this.fiveArea[i+m1][j-m1] == 0);
		side2 = (i-m2>=0 && j+m2<15 && this.fiveArea[i-m2][j+m2] == 0);
		if (L == 4 && (side1 || side2)) {
			test3++;
		}
		if (side1 && side2) {
			if (L == 4) {
				test4 = 1;
			}
			if (L == 3) {
				test3++;
			}
		}
		if (test4) {
			return CBoardSituation.openFour;
		}
		if (test3>=2) {
			return CBoardSituation.twoThrees;
		}
		//情况二,不成4成3等时进行下面计算............................................................           
		var minM = i-4;
		if (minM<0) {
			minM = 0;
		}
		var minN = j-4;
		if (minN<0) {
			minN = 0;
		}
		var maxM = i+5;
		if (maxM>15) {
			maxM = 15;
		}
		var maxN = j+5;
		if (maxN>15) {
			maxN = 15;
		}
		var maxA = -1;
		var nPos:Array = new Array(5);
		var dirA:Array = new Array(5);
		var A1, A2, A3, A4;
		var a:Array = new Array(15);
		for (var ti = 0; ti<15; ti++) {
			a[ti] = new Array(15);
			for (var tj = 0; tj<15; tj++) {
				a[ti][tj] = -1;
			}
		}
		//检索横向
		nPos[1] = 1;
		A1 = 0;
		m = 1;
		while (j+m<maxN && this.fiveArea[i][j+m] != -mySide) {
			nPos[1]++;
			A1 += CBoardSituation.lineN[m]*this.fiveArea[i][j+m];
			m++;
		}
		if (j+m>=15 || this.fiveArea[i][j+m] == -mySide) {
			A1 -= (this.fiveArea[i][j+m-1] == mySide) ? (CBoardSituation.lineN[5]*mySide) : 0;
		}
		m = 1;
		while (j-m>=minN && this.fiveArea[i][j-m] != -mySide) {
			nPos[1]++;
			A1 += CBoardSituation.lineN[m]*this.fiveArea[i][j-m];
			m++;
		}
		if (j-m<0 || this.fiveArea[i][j-m] == -mySide) {
			A1 -= (this.fiveArea[i][j-m+1] == mySide) ? (CBoardSituation.lineN[5]*mySide) : 0;
		}
		if (nPos[1]>4) {
			//drawPos = false;
		}
		//检索纵向                 
		nPos[2] = 1;
		A2 = 0;
		m = 1;
		while (i+m<maxM && this.fiveArea[i+m][j] != -mySide) {
			nPos[2]++;
			A2 += CBoardSituation.lineN[m]*this.fiveArea[i+m][j];
			m++;
		}
		if (i+m>=15 || this.fiveArea[i+m][j] == -mySide) {
			A2 -= (this.fiveArea[i+m-1][j] == mySide) ? (CBoardSituation.lineN[5]*mySide) : 0;
		}
		m = 1;
		while (i-m>=minM && this.fiveArea[i-m][j] != -mySide) {
			nPos[2]++;
			A2 += CBoardSituation.lineN[m]*this.fiveArea[i-m][j];
			m++;
		}
		if (i-m<0 || this.fiveArea[i-m][j] == -mySide) {
			A2 -= (this.fiveArea[i-m+1][j] == mySide) ? (CBoardSituation.lineN[5]*mySide) : 0;
		}
		if (nPos[2]>4) {
			//drawPos = false;
		}
		//检索反斜向                 
		nPos[3] = 1;
		A3 = 0;
		m = 1;
		while (i+m<maxM && j+m<maxN && this.fiveArea[i+m][j+m] != -mySide) {
			nPos[3]++;
			A3 += CBoardSituation.lineN[m]*this.fiveArea[i+m][j+m];
			m++;
		}
		if (i+m>=15 || j+m>=15 || this.fiveArea[i+m][j+m] == -mySide) {
			A3 -= (this.fiveArea[i+m-1][j+m-1] == mySide) ? (CBoardSituation.lineN[5]*mySide) : 0;
		}
		m = 1;
		while (i-m>=minM && j-m>=minN && this.fiveArea[i-m][j-m] != -mySide) {
			nPos[3]++;
			A3 += CBoardSituation.lineN[m]*this.fiveArea[i-m][j-m];
			m++;
		}
		if (i-m<0 || j-m<0 || this.fiveArea[i-m][j-m] == -mySide) {
			A3 -= (this.fiveArea[i-m+1][j-m+1] == mySide) ? (CBoardSituation.lineN[5]*mySide) : 0;
		}
		if (nPos[3]>4) {
			//drawPos = false;
		}
		//检索正斜向                 
		nPos[4] = 1;
		A4 = 0;
		m = 1;
		while (i+m<maxM && j-m>=minN && this.fiveArea[i+m][j-m] != -mySide) {
			nPos[4]++;
			A4 += CBoardSituation.lineN[m]*this.fiveArea[i+m][j-m];
			m++;
		}
		if (i+m>=15 || j-m<0 || this.fiveArea[i+m][j-m] == -mySide) {
			A4 -= (this.fiveArea[i+m-1][j-m+1] == mySide) ? (CBoardSituation.lineN[5]*mySide) : 0;
		}
		m = 1;
		while (i-m>=minM && j+m<maxN && this.fiveArea[i-m][j+m] != -mySide) {
			nPos[4]++;
			A4 += CBoardSituation.lineN[m]*this.fiveArea[i-m][j+m];
			m++;
		}
		if (i-m<0 || j+m>=15 || this.fiveArea[i-m][j+m] == -mySide) {
			A4 -= (this.fiveArea[i-m+1][j+m-1] == mySide) ? (CBoardSituation.lineN[5]*mySide) : 0;
		}
		if (nPos[4]>4) {
			//drawPos = false;
		}
		dirA[1] = (nPos[1]>4) ? A1*A1 : 0;
		dirA[2] = (nPos[2]>4) ? A2*A2 : 0;
		dirA[3] = (nPos[3]>4) ? A3*A3 : 0;
		dirA[4] = (nPos[4]>4) ? A4*A4 : 0;
		A1 = 0;
		A2 = 0;
		for (var k = 1; k<5; k++) {
			if (dirA[k]>=A1) {
				A2 = A1;
				A1 = dirA[k];
			}
		}
		a[i][j] = A1+A2;
		if (a[i][j]>maxA) {
			maxA = a[i][j];
		}
		return maxA;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -