Найти в Дзене

Пишем шахматную программу (маски атак)

предыдущая публикация

Гроссмейстер от нечего делать начинает играть в шахматы с соседом по купе... и проигрывает партию. Поражённый гроссмейстер восклицает:

- И подумать только: вы могли бы поставить мне мат ещё на три хода раньше, если бы пошли ладьёй!

- Как? Ладью тоже можно передвигать? - спрашивает попутчик.

MascBit.java

public static long[] KingAttak = new long[64];
public static long[] QweenAttak = new long[64];
public static long[] RookAttak = new long[64];
public static long[] BishopAttak = new long[64];
public static long[] KnightAttak = new long[64];
public static long[] WPawnAttak = new long[64];
public static long[] BPawnAttak = new long[64];

public static void maskAttak()

...

maskKingAttak(i);
} // for
maskKnightAttak();
maskQweenAttak();
maskRookAttak();
maskBishopAttak();
maskPswnAttak();
}//конец функции

public static void maskKingAttak(int i)
{
long bit = MaskOneBit[i];
KingAttak[i] |= bit <<8 | bit <<7 &AttakA1H8[i] | bit <<9 &AttakH1A8[i] | bit >>>8 | bit >>>7 &AttakH8A1[i] | bit >>>9 &AttakA8H1[i] | bit <<1 &AttakH1A1[i] | bit >>>1 &AttakA1H1[i];
}
public static void maskKnightAttak()
{
long bit;
int z;
for (int i = 0; i < 64; i++)
{
if (i/8>0)
{
bit = MaskOneBit[i]<<8;
z=i-8;
KnightAttak[i] |= bit <<2 &AttakH1A1[z] | bit >>>2 &AttakA1H1[z] | bit <<9 &AttakH1A8[z] | bit <<7 &AttakA1H8[z];
}//if
if (7-i/8>0)
{
bit = MaskOneBit[i]>>>8;
z=i+8;
KnightAttak[i] |= bit <<2 &AttakH1A1[z] | bit >>>2 &AttakA1H1[z] | bit >>>9 &AttakA8H1[z] | bit >>>7 &AttakH8A1[z];
}//if
}//for
}
public static void maskQweenAttak()
{
for (int i = 0; i < 64; i++)
{
QweenAttak[i]=AttakA1A8[i]|AttakA1H8[i]|AttakA1H1[i]|AttakH1A1[i]|AttakH8A1[i]|AttakA8A1[i]|AttakH1A8[i]|AttakA8H1[i];
QweenAttak[i]^=MaskOneBit[i];
}
}
public static void maskRookAttak()
{
for (int i = 0; i < 64; i++)
{
RookAttak[i]=AttakA1A8[i]|AttakA1H1[i]|AttakH1A1[i]|AttakA8A1[i];
RookAttak[i]^=MaskOneBit[i];
}
}
public static void maskBishopAttak()
{
for (int i = 0; i < 64; i++)
{
BishopAttak[i]=AttakA1H8[i]|AttakH8A1[i]|AttakH1A8[i]|AttakA8H1[i];
BishopAttak[i]^=MaskOneBit[i];
}
}
public static void maskPswnAttak()
{
for (int i = 0; i < 64; i++)
{
if ((i/8==0) | (7-i/8==0))
{
WPawnAttak[i]=0;
BPawnAttak[i]=0;
continue ;
}
WPawnAttak[i]=MaskOneBit[i]<<9 &AttakH1A8[i] | MaskOneBit[i] <<7 &AttakA1H8[i];
BPawnAttak[i]=MaskOneBit[i]>>>9 &AttakA8H1[i] | MaskOneBit[i] >>>7 &AttakH8A1[i];
}
}

Desc.java

public int returnPiece(int Pol)
{
for (int i = 0; i < 6; i++)
{
if ((MascBit.MaskOneBit[Pol]&WPiece[i])!=0) {return i;}
if ((MascBit.MaskOneBit[Pol]&BPiece[i])!=0) {return i+6;}
} //for
return -1;
}

MainActivity.java

public boolean onTouchEvent

...

/*number1 ^= number2; */
switch (dsc.returnPiece(NumPol))
{
case 6:
case 0:{
number1 = MascBit.KingAttak[NumPol];
break ;
}
case 7:
case 1:{
number1 = MascBit.QweenAttak[NumPol];
break ;
}
case 8:
case 2:{
number1 = MascBit.RookAttak[NumPol];
break ;
}
case 9:
case 3:{
number1 = MascBit.BishopAttak[NumPol];
break ;
}
case 10:
case 4:{
number1 = MascBit.KnightAttak[NumPol];
break ;
}
case 5:{
number1 = MascBit.WPawnAttak[NumPol];
break ;
}
case 11:{
number1 = MascBit.BPawnAttak[NumPol];
break ;
}
default :
{
number1 = 0;
break ;
}
}
//вызываем onDraw

У нас даже дети знают, что конь ходит буквой Г. Западным шахматистам этого не дано.

продолжение следует ...

PS

Нам необходимо как то оценивать время выполнения участков кода программы

добавим такую функцию

...
public long Start,Stop;
public String time_count;
...

public DrawView

...
if (dsc == null)
{
dsc = new Desc();
Start=System.currentTimeMillis ();
MascBit.OneBit();
MascBit.maskAttak();
Stop=System.currentTimeMillis ();
time_count = TimeCount(Stop-Start);
hash_dsc = dsc.hashCode();
} else
{
time_count = "";
}
...

public String TimeCount(long ms)
{
int h,m,s;
String str;
//часы
h =(int) ms / (60*60*1000);
//остаток
ms = ms % (60*60*1000);
//минуты
m =(int) ms / (60*1000);
//остаток
ms = ms % (60*1000);
//секунды
s = (int)ms / 1000;
//миллисекунды
ms = ms % 1000;
str = "h="+ Integer.toString(h)+"ч m="+Integer.toString(m)+"м s="+Integer.toString(s)+"с ms="+Long.toString(ms)+"мс";
return str;
}

protected void onDraw

...
canvas.drawText(time_count, 0, 1150, paint);
...

До встречи