Найти тему

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

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

Здравствуйте дорогие друзья.

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];
...
-2

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
}
}

Молодцы, мат запретили, а шахматистам теперь как быть, подскажите?

Немного об алгоритме

Мне нравится представление шазматной позиции в виде битборда

Люблю знаете битами поиграться

-3

Позиция будет представлена 12 числами типа Long в Desc.java

Понемногу начнем обучать Беню правилам игры в шахматы

Идея такая

Сначала дальнобойные фигуры - Ферзь, Ладья и Слон

  • В начале инициализируем лучи атак в разных направлениях в MascBit.java
  • Строим луч из данной клетки
  • Находим ближайший включенный бит на луче
  • из поля этого бита строим встречный луч
  • пересечением и будет атака дальнобойно фигуры в данном направлении
-4
-5

Вопрос армянскому радио:
— Что общего между девушкой и гроссмейстером?
— И девушки, и гроссмейстер знают: чтобы добиться успеха, мало иметь хорошую фигуру — необходимо еще умение правильно ею двигать!

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

До встречи