?? func.java
字號:
package game;
/**
* <p>Title: 五子棋</p>
*
* <p>Description: 五子棋游戲</p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: David Company</p>
*
* @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 (max<temp) {
max=temp;
equalMax[0]=new int[3];
m_equalMax=-1;
equalMax[0][0]=i;
equalMax[0][1]=j;
}
if (max==temp && max!=0){
m_equalMax++;
equalMax[m_equalMax]=new int[3];
equalMax[m_equalMax][0]=i;
equalMax[m_equalMax][1]=j;
}
temp=calw(i,j,0); //player;
//if (temp!=0) System.out.println(" ==Pla==w[" + i + "," + j + "]=" + temp);
if (temp<200) temp--; else temp*=2;
if (max<temp) {
max=temp;
equalMax[0]=new int[3];
m_equalMax=-1;
equalMax[0][0]=i;
equalMax[0][1]=j;
}
if (max==temp && max!=0){
m_equalMax++;
equalMax[m_equalMax]=new int[3];
equalMax[m_equalMax][0]=i;
equalMax[m_equalMax][1]=j;
}
}
}
}
//隨機產生
int t;
if (max==0) {resultX=-1;resultY=-1;}
else{
t=(int)(Math.random()* (m_equalMax+1));
resultX=equalMax[t][0];
resultY=equalMax[t][1];
}
}
/* 算法部分結束 */
//isDrawNow is the funcation to check wheather draw
public boolean isDrawNow(int x,int y){
System.out.println( " X=" + x + ",Y=" + y);
if (x > xn || 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;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -