📄 cboardsituation.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 + -