www.pudn.com > WuZiQi_src.rar > Func.java, change:2006-02-16,size:9374b
package game; /** *Title: 五子棋
* *Description: 五子棋游戏
* *Copyright: Copyright (c) 2005
* *Company: David Company
* * @author David * @version 1.0 */ public class Func { private int[][] s=new int[15][]; //s=2 表示没有任何棋子,s=0表示黑方,s=1白方 //下面数据是调试算法x,y int resultX=-1; int resultY=-1; //下面是一些图象常量数据 int linespace=28; int xn=15; int yn=15; //保存MAX相同权值 int equalMax[][]=new int[225][]; //equalMax[][0]=x; equalMax[][1]=y int m_equalMax=-1; public Func() { for (int i=0;i<=14;i++){ s[i] = new int[15]; for (int j=0;j<=14;j++){ s[i][j]=2; } } } public int getResultX(){ return resultX; } public int getResultY(){ return resultY; } public void setXY(int x,int y,int turn){ s[x][y]=turn; } public void run(){ getXY(); } /* nowS is the function to view S[][] */ public void showS(){ for (int i=0;i<=14;i++){ for (int j = 0; j <= 14; j++) { System.out.print(s[i][j] + " "); } System.out.println(""); } } /* 下面是算法部分 */ //isFive is the funcation to check 五个子 private long calw(int x,int y,int turn){ int a[][]=new int[4][]; int i; int num; long w=0; //w为权 //初始化a[i][j]=0; // i表示方向 j=0表示数目 j=1表示死活状态,0两头死,=1一头死,=2活 for (i=0;i<=3;i++){ a[i] = new int[2]; for (int j=0;j<=1;j++){ a[i][j]=0; } } //记录左右棋子个数 num=0;i=1; //左 while (true) { if ((y-i)<0) break; if (s[x][y-i]!=turn) { if (s[x][y-i]==2) a[0][1]++; break; } else{ i++; num++; } } //右 i=1; while (true){ if ((y+i)>14) break; if (s[x][y+i]!=turn) { if (s[x][y+i]==2) a[0][1]++; break; } else{ i++; num++; } } a[0][0]=num; //记录左上右下棋子个数 num=0;i=1; //左上 while (true) { if ((x-i)<0 || (y-i)<0) break; if (s[x-i][y-i]!=turn) { if (s[x-i][y-i]==2) a[1][1]++; break; } else{ i++; num++; } } //右下 i=1; while (true){ if ((x+i)>14 || (y+i)>14) break; if (s[x+i][y+i]!=turn) { if (s[x+i][y+i]==2) a[1][1]++; break; } else{ i++; num++; } } a[1][0]=num; //记录上下棋子个数 num=0; i=1; //上 while (true) { if ((x-i)<0) break; if (s[x-i][y]!=turn) { if (s[x-i][y]==2) a[2][1]++; break; } else{ i++; num++; } } //下 i=1; while (true){ if ((x+i)>14) break; if (s[x+i][y]!=turn) { if (s[x+i][y]==2) a[2][1]++; break; } else{ i++; num++; } } a[2][0]=num; //记录右上左下棋子个数 num=0;i=1; //右上 while (true) { if ((x-i)<0 || (y+i)>14) break; if (s[x-i][y+i]!=turn) { if (s[x-i][y+i]==2) a[3][1]++; break; } else{ i++; num++; } } //左下 i=1; while (true){ if ((x+i)>14 || (y-i)<0) break; if (s[x+i][y-i]!=turn) { if (s[x+i][y-i]==2) a[3][1]++; break; } else{ i++; num++; } } a[3][0]=num; for (i=0;i<=3;i++) { if (a[i][0] == 4) { //虽然两头死,但是可以成5 w=w+100000; } if (a[i][1] == 2) { if (a[i][0]>=4) w=w+100000; //能成活5 if (a[i][0]==3) {//能成活4 if (w==0) w=10000; else if (w<10000) w=w*10+10000; else w=100000*10+w; } if (a[i][0]==2) {//能成活3 if (w==0) w=200; else if (w<200) w=w*10+200; else w=200*10+w; } if (a[i][0]==1) {//能成活2 if (w==0) w=5; else if (w<5) w=w*10+5; else w=5*10+w; } } if (a[i][1]==1){ if (a[i][0]>=4) { //能成死5 w = w + 100000; } if (a[i][0]==3) { //能成死4 if (w==0) w=500; else if (w<500) w=w*10+500; else w=500*10+w; } if (a[i][0]==2) { //能成死3 if (w==0) w=50; else if (w<50) w=w*10+50; else w=50*10+w; } if (a[i][0]==1) { //能成死2 if (w==0) w=3; else if (w<3) w=w*10+3; else w=3*10+w; } } } return w; } //this funcation to getXY from Computer private void getXY(){ long max=0; long temp=0; int i,j; for (i=0;i<=14;i++){ for (j = 0; j <= 14; j++) { if (s[i][j]==2){ temp=calw(i,j,1); // if (temp!=0) System.out.println(" ==Com==w[" + i + "," + j + "]=" + temp); if (temp>2200) temp=temp*3; if (maxxn || y > yn ) return false; if (s[x][y]==1 || s[x][y]==0) return false; return true; } public boolean isOK(){ int x; for (int i=0;i<=10;i++){ for (int j=0;j<=14;j++){ if (s[i][j]!=2){ x=s[i][j]; if ( j >= 4){ //搜索左下方 if (x==s[i][j] && x==s[i+1][j-1] && x==s[i+2][j-2] && x==s[i+3][j-3]&& x==s[i+4][j-4]){ return true; } } //下方 if (x==s[i][j] && x==s[i+1][j] && x==s[i+2][j] && x==s[i+3][j]&& x==s[i+4][j]){ return true; } //右下方 if ( j <= 10){ //搜索左下方 if (x==s[i][j] && x==s[i+1][j+1] && x==s[i+2][j+2] && x==s[i+3][j+3]&& x==s[i+4][j+4]){ return true; } } //右方 if ( j <= 10){ //搜索右方 if (x==s[i][j] && x==s[i][j+1] && x==s[i][j+2] && x==s[i][j+3] && x==s[i][j+4]){ return true; } } } } } return false; } }