📄 silnik.java
字号:
package JavaWarcaby;
import java.util.*;
class Silnik
{
final static int NIESKONCZONOSC = Integer.MAX_VALUE;
final static int PION = 100; //pion warty 100
//final static int POZYCJA=1;
final static int DAMKA=200; //damka warta 200
final static int KRAWEDZ=10; //damka na krawedzi
final static int LOSOWOSC=10; //losowa waga
public static int funkcjaOceniajaca(int[][] plansza)
{
int punkty=0;
for (int i=0; i<8; i++)
for (int j=0; j<8; j++)
{
if (plansza[i][j] == Gra.BIALE)
{
punkty-=PION;
//punkty-=POZYCJA*j*j;
}
else if (plansza[i][j] ==Gra.B_DAMKA){
punkty-=DAMKA;
if (i==0 || i==7)
punkty += KRAWEDZ;
if (j==0 || j==7)
punkty += KRAWEDZ;
}
else if (plansza[i][j] == Gra.C_DAMKA){
punkty+=DAMKA;
if (i==0 || i==7)
punkty -= KRAWEDZ;
if (j==0 || j==7)
punkty -= KRAWEDZ;
}
else if (plansza[i][j] == Gra.CZARNE)
{
punkty+=PION;
//punkty+=POZYCJA*(7-j)*(7-j);
}
}//end for
//punkty += (int)(Math.random() * LOSOWOSC);
return punkty;
}//end funkcjaOceniajaca
static int przeciwnik(int czyjRuch){
return czyjRuch==Gra.CZARNE ? Gra.BIALE : Gra.CZARNE;
}
static int czyj_ruch(int czyjRuch) {
return Ruchy.kolor(czyjRuch)==Gra.CZARNE ? -NIESKONCZONOSC : NIESKONCZONOSC;
}
public static int MiniMax(int[][] plansza, int glebokosc, int maxGlebokosc, int[] ruch, int czyjRuch, int[] counter, int alg)
{
return MiniMax(plansza,glebokosc,maxGlebokosc,ruch,czyjRuch,counter,NIESKONCZONOSC,-NIESKONCZONOSC,alg);
}
static int MiniMax(int[][] plansza, int glebokosc, int maxGlebokosc,int[] ruch, int czyjRuch, int[] counter, int biale_best, int czarne_best,int alg)
{
int punkty=0;
int[][] nowa_plansza=new int[8][8];
int best_wynik;
int[] best_ruch=new int[4];
Vector listaRuchow = new Vector(); //vector 4x1 tablic
if (glebokosc==maxGlebokosc)
{
best_wynik = funkcjaOceniajaca(plansza);
counter[0]++;
}
else {
listaRuchow = Ruchy.generujRuchy(plansza,czyjRuch);
best_wynik=czyj_ruch(czyjRuch);
switch (listaRuchow.size())
{
case 0:
counter[0]++;
return best_wynik;
case 1:
if (glebokosc == 0)
{
best_ruch = (int[])listaRuchow.elementAt(0);
for (int k=0; k<4; k++)
ruch[k]=best_ruch[k];
return 0;
}
else
{
maxGlebokosc += 1;
}
}
for (int i=0;i<listaRuchow.size();i++){
nowa_plansza = kopiujPlansze(plansza);
Ruchy.rusz(nowa_plansza, (int[])listaRuchow.elementAt(i)); //zwraca nowa_plansza
int temp[] = new int[4];
punkty= MiniMax(nowa_plansza, glebokosc+1, maxGlebokosc, temp, przeciwnik(czyjRuch), counter, biale_best, czarne_best,alg);
if (czyjRuch==Gra.CZARNE && punkty > best_wynik) {
best_ruch = (int[])listaRuchow.elementAt(i);
best_wynik = punkty;
if (best_wynik > czarne_best)
{
if (alg==2)
czarne_best = best_wynik;
else
{
if (best_wynik >= biale_best)
break; /* alpha_beta cutoff */
else
czarne_best = best_wynik; //punkty
}
}
}
else if (czyjRuch==Gra.BIALE && punkty < best_wynik) {
best_ruch = (int[])listaRuchow.elementAt(i);
best_wynik = punkty;
if (best_wynik < biale_best)
{
if (alg==2)
biale_best = best_wynik;
else
{
if (best_wynik <= czarne_best)
break; /* alpha_beta cutoff */
else
biale_best = best_wynik; //punkty
}
}
}
} //end for
}//end else
for (int k=0; k<4; k++)
ruch[k]=best_ruch[k];
return best_wynik;
} //end minimax
static int[][] kopiujPlansze(int[][] plansza){
int[][] kopia = new int[8][8];
for (int i=0; i<8; i++)
System.arraycopy(plansza[i],0,kopia[i],0,8);
return kopia;
}//end kopiujPlansze
}//end class engine
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -