Здравствуйте дорогие друзья.
MainActivity.java
import com.example.myappshess.Desc;
import com.example.myappshess.MascBit;
public Desc dsc;
public boolean test = true;
public void onBackPressed()
...
bol = true;
bol_but = false;
test = true;
...
public void onMyButtonClick0
...
//ShowAlert(getString(R.string.back_scr));
...
class DrawView extends View
...
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
if (dsc == null)
{
dsc = new Desc();
}
MascBit.OneBit();
MascBit.maskAttak();
if (!dsc.FenToLong(StrFen))
{
ShowAlert("Ошибка fen строки");
}
...
protected void onDraw(Canvas canvas)
...
BitSwth = 0;
if (test)
{
for (int i = 0; i < 6; i++)
{
number1 = number1 | dsc.WPiece[i] | dsc.BPiece[i];
}
}
test = false;
...
//ShowAlert("Поле " + NumPol);
number2=0x8000000000000000L>>>NumPol;
//number1 ^= number2;
number1 = MascBit.AttakA1A8[NumPol]|MascBit.AttakA1H8[NumPol]|MascBit.AttakA1H1[NumPol]|MascBit.AttakH1A1[NumPol]|MascBit.AttakH8A1[NumPol]|MascBit.AttakA8A1[NumPol]|MascBit.AttakH1A8[NumPol]|MascBit.AttakA8H1[NumPol];
...
Desc.java
package com.example.myappshess;
import com.example.myappshess.MascBit;
public class Desc {
// массивы для фигур
public long[] WPiece = new long[6];
public long[] BPiece = new long[6];
// конструктор по умолчанию, теперь сразу после создания объекта будем
public Desc()
{
}
public boolean FenToLong(String str) {
String s = "";
String s1 = "KQRBNPkqrbnp";
String s2 = "12345678";
String subStrFen;
// горизонталь
int n = 0;
// вертикаль
int k = 0;
// фигура
int z = -1;
// наличие королей
int king = 0;
ClearPiece();
str = str.trim();
/*возвращает индекс в данной строке первого вхождения указанного символа или -1*/
int r = str.indexOf(' ');
if (r > 0) {
subStrFen = str.substring(0, r);
int l = subStrFen.length();
for (int i = 0; i < l; i++) {
s = subStrFen.substring(i, i + 1);
if (s.compareTo("/") == 0) {
if (n != 8) {
ClearPiece();
return false;
}
n = 0;
k++;
continue;
}
if (s2.indexOf(s) >= 0) {
n = n + 1 + s2.indexOf(s);
}
z = s1.indexOf(s);
if (z >= 0) {
switch (z) {
case 0:
{
king++;
break;
}
case 6:
{
king--;
break;
}
}
if (n+8*k > 63)
{
ClearPiece();
return false;
}
if (z<6)
{
WPiece[z] |= MascBit.MaskOneBit[n + 8*k];
} else
{
BPiece[z-6] |= MascBit. MaskOneBit[n + 8*k];
}
n++;
}
} // if
} // for
if (king != 0)
{
ClearPiece();
return false;
}
return true;
} // FenToLong
public void ClearPiece()
{
for (int i = 0; i < 6; i++)
{
WPiece[i] = 0L;
BPiece[i] = 0L;
}
}
}
MascBit.java
package com.example.myappshess;
public class MascBit {
//уст один 64 бит
public static long MSBbit = 0x8000000000000000L;
//битовая маска единичного бита
public static long[] MaskOneBit = new long[64];
//битовая маска луча из данной
//клетки поля
public static long[] AttakA1A8 = new long[64];
public static long[] AttakA8A1 = new long[64];
public static long[] AttakA1H1 = new long[64];
public static long[] AttakH1A1 = new long[64];
public static long[] AttakA1H8 = new long[64];
public static long[] AttakH8A1 = new long[64];
public static long[] AttakA8H1 = new long[64];
public static long[] AttakH1A8 = new long[64];
public MascBit()
{
}
public static void OneBit()
{
for (int i = 0; i < 64; i++)
{
MaskOneBit[i] = MSBbit >>> i;
} // for
}
public static void maskAttak()
{
int z = 0;
int k = 0;
for (int i = 0; i < 64; i++)
{
z = i/8;
for (int j = 0; j <= z; j++)
{
k = i-j*8;
AttakA1A8[i] |= MaskOneBit[k];
if (j<=(7-k%8)){
AttakA1H8[i] |= MaskOneBit[k]>>>j;
}
if (j<=(k%8)){
AttakH1A8[i] |=MaskOneBit[k]<<j;
}
}
z = 7-i/8;
for (int j = 0; j <= z; j++)
{
k = i+j*8;
AttakA8A1[i] |= MaskOneBit[k];
if (j<=(k%8)){
AttakH8A1[i] |=MaskOneBit[k]<<j;
}
if (j<=(7-k%8)){
AttakA8H1[i] |= MaskOneBit[k]>>>j;
}
}
z = 7-i%8;
for (int j = 0; j <= z; j++)
{
AttakA1H1[i] |= MaskOneBit[i+j];
}
z = i%8;
for (int j = 0; j <= z; j++)
{
AttakH1A1[i] |= MaskOneBit[i-j];
}
} // for
}
}
Молодцы, мат запретили, а шахматистам теперь как быть, подскажите?
Немного об алгоритме
Мне нравится представление шазматной позиции в виде битборда
Люблю знаете битами поиграться
Позиция будет представлена 12 числами типа Long в Desc.java
Понемногу начнем обучать Беню правилам игры в шахматы
Идея такая
Сначала дальнобойные фигуры - Ферзь, Ладья и Слон
- В начале инициализируем лучи атак в разных направлениях в MascBit.java
- Строим луч из данной клетки
- Находим ближайший включенный бит на луче
- из поля этого бита строим встречный луч
- пересечением и будет атака дальнобойно фигуры в данном направлении
Вопрос армянскому радио:
— Что общего между девушкой и гроссмейстером?
— И девушки, и гроссмейстер знают: чтобы добиться успеха, мало иметь хорошую фигуру — необходимо еще умение правильно ею двигать!
продолжение следует ...
До встречи