Здравствуйте дорогие друзья
Хеширование Zobrist (также называемое ключами Zobrist ) - это конструкция хеш-функции, используемая в компьютерных программах для реализации таблиц транспонирования , особого вида хеш-таблицы, которая индексируется позицией доски и используется, чтобы не анализировать одну и ту же позицию более одного раза.
При написании шахматной программы необходимо уметь сравнивать две позиции, чтобы увидеть, совпадают ли они. Для этого и нужно генерировать Zobrist ключи.
Zobrist.java
package com.example.myappshess;
import java.util.Random;
public class Zobrist {
public static long[][][] initzobrist()
{
long[][][] ZobristKey=new long[12][2][64];
Random rd = new Random();
//тип фигуры
for (int i=0;i<12;i++)
{
//цвет фигуры
for (int j=0;j<2;j++)
{
//расположение фигуры
for (int z=0;z<64;z++)
{
ZobristKey[i][j][z]=rd.nextLong()^(rd.nextLong()<<15)^(rd.nextLong()<<30)^(rd.nextLong()<<45)^(rd.nextLong()<<60);
}
}
}
return ZobristKey;
}
public static long returnZobristKey(long[][][] ln)
{
long number1=0L;
//тип фигуры
for (int i=0;i<12;i++)
{
//цвет фигуры
for (int j=0;j<2;j++)
{
//расположение фигуры
for (int z=0;z<64;z++)
{
number1^=ln[i][j][z];
}
}
}
return number1;
}
public static synchronized long returnZobristKeyDesc(Desc d,long[][][] ln,long key)
{
int ii,jj;
//тип фигуры
for (int i=0;i<12;i++)
{
//цвет фигуры
for (int j=0;j<2;j++)
{
//расположение фигуры
for (int z=0;z<64;z++)
{
ii=d.returnPiece(z);
if (ii==-1){continue;}
jj=d.Color;
key^=ln[ii][jj][z];
}
}
}
return key;
}
public static synchronized long returnZobristKeyMove(Desc d,long[][][] ln,long key,long from, long to,int fig,int col)
{
key^=ln[fig][col][Long.numberOfLeadingZeros(from)];
key^=ln[fig][col][Long.numberOfLeadingZeros(to)];
return key;
}
}
MainActivity.java
import java.io.FileOutputStream;
...
private static final String fileNameOut = "fen0.txt";
public long[][][] ZobristKey=new long[12][2][64];
public long MoveZobKey;
public long DescZobKey;
public long InitZobKey;
...
public DrawView(Context context) {
super(context);
sInstance = context;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
desc = new Desc(StrFen);
Start=System.currentTimeMillis ();
MascBit.OneBit();
MascBit.maskAttak();
ZobristKey=Zobrist.initzobrist();
InitZobKey=Zobrist.returnZobristKey(ZobristKey);
DescZobKey=Zobrist.returnZobristKeyDesc(desc,ZobristKey,InitZobKey);
number1=DescZobKey;
showAlert(sInstance, "DescZobKey", ""+number1,null);
Stop=System.currentTimeMillis ();
time_count = TimeCount(Stop-Start);
...
canvas.drawText("show Desc", 566, 292, paint);
canvas.drawText("Save", 566, 352, paint);
canvas.drawText("сброс", 566, 422, paint);
...
case 152:
case 122:
case 132:
case 142:
{
startGlobalTime1 = System.nanoTime();
depthmov=0L;
desc = MoveGenerator.newPos("8/8/2KQ4/8/8/8/8/7k w");
DescZobKey=Zobrist.returnZobristKeyDesc(desc,ZobristKey,InitZobKey);
//number1=DescZobKey;
number1=0L;
InviolableKing(desc,0,perft);
if (resultGlobalTime2>GlobalTime)
{
showAlert(sInstance,"Внимание!", "Превышено время работы кода",null);
} else
{
resultGlobalTime1 = (double)(System.nanoTime() - startGlobalTime1) / 1000000000;
time_count = resultGlobalTime1 + "сек";
showAlert(sInstance,"Число ходов", ""+depthmov,null);
}
//showAlert(sInstance, "DescZobKey", ""+DescZobKey,null);
invalidate();
return true;
...
case 160:
case 150:
case 140:
case 130:{
writeFile(FenToVision.DescToFen(desc)+"\n",true);
invalidate();
return true;
...
MoveGenerator.moveFromTo(desc,desc,From,To);
if (desc.mov)
{
setPoints(From,To);
MoveZobKey=Zobrist.returnZobristKeyMove(desc,ZobristKey,DescZobKey,From,To,desc.returnPiece(Long.numberOfLeadingZeros(To)),desc.Color);
DescZobKey=MoveZobKey;
//showAlert(sInstance, "MoveZobKey", ""+MoveZobKey,null);
}
...
private void writeFile(String text,boolean b) {
try {
/*
* Создается объект файла, при этом путь к файлу находиться методом класcа Environment
* Обращение идёт, как и было сказано выше к внешнему накопителю
*/
File myFile = new File(Environment.getExternalStorageDirectory().toString() + "/" + fileNameOut);
myFile.createNewFile(); // Создается файл, если он не был создан
FileOutputStream outputStream = new FileOutputStream(myFile,b); // После чего создаем поток для записи
outputStream.write(text.getBytes()); // и производим непосредственно запись
outputStream.close(); ShowAlert("Выполнено");
} catch (Exception e)
{
ShowAlert("Ошибка1");
e.printStackTrace();
}
}
//неприкосновенный король
public void InviolableKing(Desc d,int col,int depth)
{
if (resultGlobalTime2>GlobalTime)
{
return;
}
if((depth==0)|(d.WPiece[1]==0)|(d.BPiece[0]==0))
{
return;
}
resultGlobalTime2 = (double)(System.nanoTime() - startGlobalTime1) / 1000000000;
// поз короля или ферзя
long pos=0L;
//атаки короля или ферзя
long attak=0L;
//кол-во атак
int nattak=0;
//ход фигуры
long oneMove=0L;
//массивы лля фмгур
long[] WP = new long[2];
long[] BP = new long[2];
long tempZobKey;
int x = Long.numberOfLeadingZeros(d.BPiece[0]);
int y = Long.numberOfLeadingZeros(d.WPiece[1]);
if (((x==3)&(y==5))|((x==26)&(y==40)))
{
greatAlert();
showAlertDesc(dsc);
return ;
}
switch (col)
{
case 0:
{
attak=MoveGenerator.AttakPiece(d,d.WPiece[1],0);
pos=Long.lowestOneBit(d.WPiece[1]);
break;
}
case 1:
{
attak=MoveGenerator.AttakPiece(d,d.BPiece[0],1);
pos=Long.lowestOneBit(d.BPiece[0]);
break;
}
}//switch
nattak=Long.bitCount(attak);
for (int i=0;i<nattak;i++)
{
oneMove=Long.lowestOneBit(attak);
for (int j = 0; j < 2; j++)
{
WP[j] = d.WPiece[j];
BP[j] = d.BPiece[j];
}
tempZobKey=DescZobKey;
MoveGenerator.moveFromTo(d,dsc,pos,oneMove);
attak^=oneMove;
if (!dsc.mov)
{
for (int j = 0; j < 2; j++)
{
d.WPiece[j]=WP[j];
d.BPiece[j]=BP[j];
}
continue ;
}
MoveZobKey=Zobrist.returnZobristKeyMove(dsc,ZobristKey,DescZobKey,pos,oneMove,dsc.returnPiece(Long.numberOfLeadingZeros(oneMove)),dsc.Color);
DescZobKey=MoveZobKey;
InviolableKing(dsc,col^1,depth-1);
if (depth==1)
{
depthmov++;
//greatAlert();
//showAlertDesc(dsc);
}
for (int j = 0; j < 2; j++)
{
d.WPiece[j]=WP[j];
d.BPiece[j]=BP[j];
}
DescZobKey=tempZobKey;
}//for
}
AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
До встречи.