Найти тему

Пишем шахматную программу (Задача о неприкосновенном короле)

8/8/2KQ4/8/8/8/8/7k w
8/8/2KQ4/8/8/8/8/7k w

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

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

Задачу о ходе коня мы решили

исходники тут

Интересна еще одна из шахматно математических задач

Задача о неприкосновенном короле

У белых — король на с3 (с6, f6 или f3) и ферзь, у чёрных — король. Всегда ли белые могут, не двигая своего короля, дать мат? Решение удалось получить при помощи ЭВМ (А. Л. Брудно и И. Я. Ландау, 1969). Мат даётся не позднее 23-го хода при любом положении ферзя и чёрного короля.

При других положениях белого короля и свободном чёрном короле мат поставить нельзя.

Подготовим нашего Беню к решению этой задачи.

В данном случае Беня еще не использует генератор ходов.

Но передвижения фигур, кроме пешек соответствуют шахматным правилам

Т.е. для решени задачи о неприкосновенном короле Беня готов.

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

MainActivity.java

package com.example.myappshess;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.example.myappshess.MainActivity;
import com.example.myappshess.MascBit;
import com.example.myappshess.R;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
//import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.Long;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
StrFen = getString(R.string.perft0);
myText = (TextView) findViewById(R.id.text);
myText.setText(StrFen);
}
public String strDate = "14.04.21";
public Boolean bol = true;
public static String StrFen, subStrFen;
public TextView myText,myTextView;
public Bitmap[] arrayOfBitmap = new Bitmap[12];
public Bitmap bitmap1, bitmap2,bitmap3,bitmap4;
public Paint paint;
public int touchX, touchY;
public Canvas canvasBmp3;
public long number1=0;
public long number2=0x8000000000000000L;
public Bitmap imgnumber,imgnumber0,imgnumber1;
public Bitmap button_up, button_down,button_click;
public Boolean bol_but = false;
public Desc dsc;
public boolean test = true;
public long Start,Stop;
public String time_count;
public static Context sInstance;
public static Desc desc;
private static final String fileName = "fen.txt";
private static StringBuilder stringBuilder;
public static String subStrBuild="";
public String fontPath1;
public Typeface typeface1;
public int NumPos=0;
// размер клетки поля
public int h = 60;
// координаты поля a8
public int dx = 26;
public int dy = 22;
public static long From,To;
public static int SwitchFromTo = 0;
public float[] points = new float[4];
public void onBackPressed() {
if (bol) {
ShowAlert("exit");
if (stringBuilder!=null)
{
stringBuilder = null;
}
this.finish();
} else {
if (bitmap1 != null) {
bitmap1.recycle();
bitmap1 = null;
}
if (bitmap2 != null) {
bitmap2.recycle();
bitmap2 = null;
}
if (bitmap3 != null) {
bitmap3.recycle();
bitmap3 = null;
}
if (bitmap4 != null) {
bitmap4.recycle();
bitmap4 = null;
}
for (int i = 0; i < 12; i++) {
if (arrayOfBitmap[i] != null) {
arrayOfBitmap[i].recycle();
arrayOfBitmap[i] = null;
}
}
}
bol = true;
bol_but = false;
test = true;
number1=0;
number2=0x8000000000000000L;
SwitchFromTo=0;
points[0]=0f;
points[1]=0f;
points[2]=0f;
points[3]=0f; setContentView(R.layout.activity_main);
myText = (TextView) findViewById(R.id.text);
myText.setText(StrFen);
}
public static void showAlert(Context context,String title, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(title);
builder.setMessage(message);
builder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
}
public static Context getInstance() {
return sInstance;
}
public void ShowAlert(String str) {
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
}
public void onMyButtonClick0(View view) {
bol = false;
StrFen = myText.getText().toString();
if (StrFen.compareTo("") == 0) {
StrFen = getString(R.string.perft0);
myText = (TextView) findViewById(R.id.text);
myText.setText(StrFen);
return;
}
setContentView(new DrawView(this));
}
public void onMyButtonClick(View view) {
switch (view.getId())
{
case R.id.button1:
StrFen = getString(R.string.perft1);
break;
case R.id.button2:
StrFen = getString(R.string.perft2);
break;
case R.id.button3:
StrFen = getString(R.string.perft3);
break;
case R.id.button4:
StrFen = getString(R.string.perft4);
break;
case R.id.button5:
StrFen = getString(R.string.perft5);
break;
case R.id.buttonRead:
myTextView = (TextView) findViewById(R.id.textView);
myTextView.setTypeface(Typeface.DEFAULT);
myTextView.setText(StrFen);
readFile();
break;
case R.id.buttonNext:
NumPos++;
if (stringBuilder==null){break;}
int r = stringBuilder.indexOf(",");
if (r > 0)
{
subStrBuild = stringBuilder.substring(0, r);
StrFen = subStrBuild+"\n"+"задача √"+NumPos;
myTextView = (TextView) findViewById(R.id.textView);
myTextView.setTypeface(Typeface.DEFAULT);
myTextView.setText(subStrBuild);
stringBuilder = stringBuilder.delete(0,subStrBuild.length()+1);
}
break;
case R.id.buttonFen:
myTextView = (TextView) findViewById(R.id.textView);
if (subStrBuild.length()>15)
{
String s = subStrBuild.substring(0, subStrBuild.length()-15);
s=FenToVision.fenToVis(s);
if (s.compareTo("error") != 0)
{
setFont();
}
myTextView.setText(s);
}
else
{
showAlert(this, "ВАЖНО", "Сначала загрузите fen.txt");
}
break;
}
myText = (TextView) findViewById(R.id.text);
myText.setText(StrFen);
}
public void initPiece() {
for (int i = 0; i < 6; i++) {
// белые
arrayOfBitmap[i] = Bitmap.createBitmap(bitmap2, i * 60, 0, 60, 60);
// черные
arrayOfBitmap[i + 6] = Bitmap.createBitmap(bitmap2, i * 60, 60, 60, 60);
}
}
public boolean parsingStrFen(String str, Canvas canvas) {
String s = "";
String s1 = "KQRBNPkqrbnp";
String s2 = "12345678";
// горизонталь
int n = 0;
// вертикаль
int k = 0;
// фигура
int z = -1;
// наличие королей
int king = 0;
// str = str.trim();
/*возвращает индекс в данной строке первого вхождения указанного символа или -1*/
int r = str.indexOf(' ');
// http://proglang.su/java/strings
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) {
ShowAlert("ERROR");
}
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;
}
}
canvas.drawBitmap(arrayOfBitmap[z], dx + h * n, dy + h * k, paint);
n++;
}
}
}
if (king != 0) {
ShowAlert("ERROR");
}
return true;
}
public void printDesc(Canvas canvas)
{
// горизонталь
int n = 0;
// вертикаль
int k = 0;
// фигура
int z = -1;
long PC,pos;
int len;
int NumPol;
for (int j = 0; j < 2; j++)
{
PC = desc.returnPC(j);
len = Long.bitCount(PC);
for (int i = 0; i < len; i++)
{
pos = Long.lowestOneBit(PC);
PC ^= pos;
NumPol = Long.numberOfLeadingZeros(pos);
n = NumPol % 8;
k = NumPol / 8;
z = desc.returnPiece(NumPol);
canvas.drawBitmap(arrayOfBitmap[z], dx + h * n, dy + h * k, paint);
} //for
}//for
}
public void LongtoBin(long lg, Canvas canvas)
{
long k = 1;
for (int j = 7; j >= 0; j--)
{
for (int i = 7; i >= 0; i--)
{
if ((lg & k) == 0)
{
canvas.drawBitmap(imgnumber0, dx + h * i, dy + h * j, paint);
} else
{
canvas.drawBitmap(imgnumber1, dx + h * i, dy + h * j, paint);
}
k<<=1;
}
}
}
class DrawView extends View {
public DrawView(Context context) {
super(context);
sInstance = context;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
if (dsc == null)
{
dsc = new Desc();
Start=System.currentTimeMillis ();
MascBit.OneBit();
MascBit.maskAttak();
Stop=System.currentTimeMillis ();
time_count = TimeCount(Stop-Start);
// showAlert(context, "время", time_count);
} else
{
time_count = "";
}
if (!dsc.FenToLong(StrFen))
{
desc = MoveGenerator.newPos("");
showAlert(context, "ERROR", "Ошибка fen строки");
} else
{
desc = MoveGenerator.newPos(StrFen);
}
// доска
bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.reduced_board);
// фигуры
bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.peice);
//рамка
bitmap4 = Bitmap.createBitmap(bitmap2, 360, 0, 60, 60);
bitmap3 = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(), bitmap1.getConfig());
canvasBmp3 = new Canvas(bitmap3);
canvasBmp3.drawBitmap(bitmap1, 0, 0, null);
initPiece();
paint.setColor(Color.BLACK);
paint.setTextSize(35.0f);
imgnumber = BitmapFactory.decodeResource(getResources(), R.drawable.number);
imgnumber1 = Bitmap.createBitmap(imgnumber, 0, 0, 60, 60);
imgnumber0 = Bitmap.createBitmap(imgnumber, 60, 0, 60, 60);
button_click = BitmapFactory.decodeResource(getResources(), R.drawable.on_off);
button_up = Bitmap.createBitmap(button_click, 0, 20, 160, 60);
button_down = Bitmap.createBitmap(button_click, 0, 80, 160, 60);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawARGB(80, 102, 204, 255);
// доска
canvas.drawBitmap(bitmap3, 0, 0, paint);
//parsingStrFen(StrFen, canvas);
printDesc(canvas);
printAttak();
PrintLine(0);
if (bol_but)
{
LongtoBin(number1,canvas);
} canvas.drawBitmap(button_up, 566, 442, paint);
onDrawText(canvas);
paint.setColor(Color.BLACK);
}
//=============
protected void onDrawText(Canvas canvas)
{
canvas.drawText("long = " + number1, 0, 600, paint);
number2 = Long.lowestOneBit(number1);
canvas.drawText("Поз-я младшего бита (LSB) = " + number2, 0, 650, paint);
number2 = Long.highestOneBit(number1);
canvas.drawText("Поз-я старшего бита (MSB) = " + number2, 0, 700, paint);
canvas.drawText("Кол-во уст. бит = " + Long.bitCount(number1), 0, 750, paint);
canvas.drawText("Кол-во 0 до старшего бита (MSB)= " + Long.numberOfLeadingZeros(number1), 0, 800, paint);
canvas.drawText("Кол-во 0 до младшего бита (LSB)= " + Long.numberOfTrailingZeros(number1), 0, 850, paint);
canvas.drawText("Знак числа = " + Long.signum(number1), 0, 900, paint);
canvas.drawText("long: хранит целое число ", 0, 1000, paint);
canvas.drawText("от -9223372036854775808", 0, 1050, paint);
canvas.drawText("до 9223372036854775807", 0, 1100, paint);
canvas.drawText(time_count, 0, 1150, paint);
canvas.drawText(strDate, 0, 1200, paint);
/*paint.setColor(Color.YELLOW);
canvas.drawRect(530, 20, 700, 430, paint);*/
paint.setColor(Color.BLUE);
canvas.drawText("<<1", 566, 52, paint);
canvas.drawText(">>>1", 566, 112, paint);
canvas.drawText("", 566, 172, paint);
canvas.drawText("", 566, 232, paint);
canvas.drawText("", 566, 292, paint);
canvas.drawText("", 566, 352, paint);
canvas.drawText("сброс", 566, 422, paint);
}
public boolean onTouchEvent(MotionEvent event) {
// номер поля
// a8 - 0 h1 - 63
int NumPol = 0;
// координаты левого угла поля
int XPol, YPol;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
touchX = (int) event.getX();
touchY = (int) event.getY();
// ShowAlert("x="+touchX+" y="+touchY);
XPol = (touchX - dx) / h;
YPol = (touchY - dy) / h;
if (XPol>7) {XPol=XPol*10;}
NumPol = XPol + 8 * YPol;
switch (NumPol)
{
case 90:{
number1<<=1;
invalidate();
return true;
}
case 98:{
number1>>>=1;
invalidate();
return true;
}
case 136:
case 126:
case 116:
case 106:
{
invalidate();
return true;
}
case 144:
case 114:
case 124:
case 134:
{
invalidate();
return true;
}
case 152:
case 122:
case 132:
case 142:
{
invalidate();
return true;
}
case 160:
case 150:
case 140:
case 130:{
invalidate();
return true;
}
case 138:{
number1 = 0;
test = true;
invalidate();
return true;
}
case 156:
case 166:
case 146:{
Bitmap bmp = button_up;
button_up = button_down;
button_down = bmp;
bol_but = !bol_but;
invalidate();
return true;
}
}
if (touchX < dx | touchX > dx + 8 * h) {
return true;
}
if (touchY < dy | touchY > dy + 8 * h) {
return true;
}
number2=0x8000000000000000L>>>NumPol;
points[0]=0f;
points[1]=0f;
points[2]=0f;
points[3]=0f;
try {
if (SwitchFromTo==0)
{
From = number2;
To = From;
SwitchFromTo^=1;
if (test)
{
//MoveGenerator.TestPos(desc);
test = false;
}
if (desc.returnPiece(NumPol)<6)
{
number1=MoveGenerator.AttakPiece(desc,number2,0);
}
else
{
number1=MoveGenerator.AttakPiece(desc,number2,1);
if (desc.returnPiece(NumPol)==6)
{
number1=desc.returnMoveBKing();
}
}
} //(SwitchFromTo==0)
else
{
To = number2;
SwitchFromTo^=1;
if ((To&number1)!=0)
{
MoveGenerator.moveFromTo(desc,desc,From,To);
if (desc.mov)
{
setPoints(From,To);
}
}
number1=0;
}
}//try
catch (Exception e)
{
java.io.StringWriter sw = new java.io.StringWriter();
e.printStackTrace(new java.io.PrintWriter(sw));
String trace = sw.getBuffer().toString();
showAlert(sInstance,"ERROR", trace);
}
if (number1==0){SwitchFromTo=0;}
//вызываем onDraw
invalidate();
}
return true;
}
}
public static 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;
}
private void readFile() {
int k = 0;
NumPos=1;
subStrBuild = "";
/*
создается объект файла
*/
File myFile = new File(Environment.getExternalStorageDirectory().toString() + "/" + fileName);
try {
FileInputStream inputStream = new FileInputStream(myFile);
/*
* Буфферезируем данные из выходного потока файла
*/
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
/*
* Класс для создания строк из последовательностей символов
*/
stringBuilder = new StringBuilder();
String line;
try {
/*
* Производим построчное считывание данных из файла в конструктор строки,
* Псоле того, как данные закончились, производим вывод текста в TextView
*/
while ((line = bufferedReader.readLine()) != null){
stringBuilder.append(line);
k++;
}
ShowAlert("кол-во загруженных строк равно " + k);
int r = stringBuilder.indexOf(",");
if (r > 0)
{
subStrBuild = stringBuilder.substring(0, r);
myTextView = (TextView) findViewById(R.id.textView); myTextView.setText(subStrBuild);
stringBuilder = stringBuilder.delete(0,subStrBuild.length()+1);
}
}
catch (IOException e)
{
ShowAlert("Ошибка1");
e.printStackTrace();
}
} catch
(FileNotFoundException e)
{
ShowAlert("Ошибка2");
e.printStackTrace();
}
}
public void setFont()
{
fontPath1 = "fonts/gc2004d.ttf";
typeface1 = Typeface.createFromAsset(getAssets(), fontPath1);
myTextView.setTypeface(typeface1);
}
public void PrintLine(int a)
{
paint.setStrokeWidth(10);
switch (a)
{
case 0:
{
paint.setColor(Color.RED);
canvasBmp3.drawLines(points,paint);
break;
}
case 1:
{
paint.setColor(Color.RED);
break;
}
case 2:
{
paint.setColor(Color.GREEN);
break;
}
}
paint.setStrokeWidth(0);
paint.setColor(Color.BLACK);
}
public void setPoints(long F,long T)
{
points[0]=dx + Long.numberOfLeadingZeros(F) % 8 * h+h/2;
points[1]=dy + Long.numberOfLeadingZeros(F) / 8 * h+h/2;
points[2]=dx + Long.numberOfLeadingZeros(T) % 8 * h+h/2;
points[3]=dy + Long.numberOfLeadingZeros(T) / 8 * h+h/2;
}
public void printAttak()
{
canvasBmp3.drawBitmap(bitmap1, 0, 0, null);
for (int i = 0; i < 64; i++)
{
if ((number1&(0x8000000000000000L>>>i))!=0)
{
canvasBmp3.drawBitmap(bitmap4, dx + (i % 8)*h, dy + (i / 8)*h, null);
}
}
}
}

MoveGenerator.java

package com.example.myappshess;
public class MoveGenerator {
public static Desc dsc;
public MoveGenerator()
{
}
public static long ForvardReverceLine(Desc d,long forvard[],long reverce[],long pos,int color,boolean high)
{
long line1,line2,point;
int bitpos1,bitpos2;
//позиция текущей фигуры
bitpos1 = 63 - Long.numberOfTrailingZeros(pos);
//луч от фигуры до края доски
line1 = forvard[bitpos1]^pos;
point = line1 & (d.returnPC(0) | d.returnPC(1));
//если есть фигуры на луче
if (Long.bitCount(point)>0)
{
if (high)
{
bitpos2 = 63 - Long.numberOfTrailingZeros(point);
}
else
{
bitpos2 = Long.numberOfLeadingZeros(point);
}
line2 = reverce[bitpos2];
line1 &= line2;
}
return line1;
}
public static long AttakPiece(Desc d,long pos,int color)
{
long number1=0;
int NumPol = Long.numberOfLeadingZeros(pos);
switch (d.returnPiece(NumPol))
{
case 6:
{
number1 = MascBit.KingAttak[NumPol];
break ;
}
case 0:{
number1 = MascBit.KingAttak[NumPol];
break ;
}
case 7:
{
number1=ForvardReverceLine(d,MascBit.AttakH1A8,MascBit.AttakA8H1,pos,1,true)|ForvardReverceLine(d,MascBit.AttakA1A8,MascBit.AttakA8A1,pos,1,true)|ForvardReverceLine(d,MascBit.AttakA1H8,MascBit.AttakH8A1,pos,1,true)|ForvardReverceLine(d,MascBit.AttakA1H1,MascBit.AttakH1A1,pos,1,false)|ForvardReverceLine(d,MascBit.AttakA8H1,MascBit.AttakH1A8,pos,1,false)|ForvardReverceLine(d,MascBit.AttakA8A1,MascBit.AttakA1A8,pos,1,false)|ForvardReverceLine(d,MascBit.AttakH8A1,MascBit.AttakA1H8,pos,1,false)|ForvardReverceLine(d,MascBit.AttakH1A1,MascBit.AttakA1H1,pos,1,true);
break ;
}
case 1:{
number1=ForvardReverceLine(d,MascBit.AttakH1A8,MascBit.AttakA8H1,pos,0,true)|ForvardReverceLine(d,MascBit.AttakA1A8,MascBit.AttakA8A1,pos,0,true)|ForvardReverceLine(d,MascBit.AttakA1H8,MascBit.AttakH8A1,pos,0,true)|ForvardReverceLine(d,MascBit.AttakA1H1,MascBit.AttakH1A1,pos,0,false)|ForvardReverceLine(d,MascBit.AttakA8H1,MascBit.AttakH1A8,pos,0,false)|ForvardReverceLine(d,MascBit.AttakA8A1,MascBit.AttakA1A8,pos,0,false)|ForvardReverceLine(d,MascBit.AttakH8A1,MascBit.AttakA1H8,pos,0,false)|ForvardReverceLine(d,MascBit.AttakH1A1,MascBit.AttakA1H1,pos,0,true);
break ;
}
case 8:
{
number1=ForvardReverceLine(d,MascBit.AttakA1A8,MascBit.AttakA8A1,pos,1,true)|ForvardReverceLine(d,MascBit.AttakA1H1,MascBit.AttakH1A1,pos,1,false)|ForvardReverceLine(d,MascBit.AttakA8A1,MascBit.AttakA1A8,pos,1,false)|ForvardReverceLine(d,MascBit.AttakH1A1,MascBit.AttakA1H1,pos,1,true);
break ;
}
case 2:{
number1=ForvardReverceLine(d,MascBit.AttakA1A8,MascBit.AttakA8A1,pos,0,true)|ForvardReverceLine(d,MascBit.AttakA1H1,MascBit.AttakH1A1,pos,0,false)|ForvardReverceLine(d,MascBit.AttakA8A1,MascBit.AttakA1A8,pos,0,false)|ForvardReverceLine(d,MascBit.AttakH1A1,MascBit.AttakA1H1,pos,0,true);
break ;
}
case 9:
{
number1=ForvardReverceLine(d,MascBit.AttakH1A8,MascBit.AttakA8H1,pos,1,true)|ForvardReverceLine(d,MascBit.AttakA1H8,MascBit.AttakH8A1,pos,1,true)|ForvardReverceLine(d,MascBit.AttakA8H1,MascBit.AttakH1A8,pos,1,false)|ForvardReverceLine(d,MascBit.AttakH8A1,MascBit.AttakA1H8,pos,1,false);
break ;
}
case 3:{
number1=ForvardReverceLine(d,MascBit.AttakH1A8,MascBit.AttakA8H1,pos,0,true)|ForvardReverceLine(d,MascBit.AttakA1H8,MascBit.AttakH8A1,pos,0,true)|ForvardReverceLine(d,MascBit.AttakA8H1,MascBit.AttakH1A8,pos,0,false)|ForvardReverceLine(d,MascBit.AttakH8A1,MascBit.AttakA1H8,pos,0,false);
break ;
}
case 10:
{
number1 = MascBit.KnightAttak[NumPol];
break ;
}
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 ;
}
}
return number1;
}
public static Desc newPos(String str)
{
dsc = new Desc(str);
return dsc;
}
public static Desc newPos(long[] w,long[] b,int col)
{
dsc = new Desc(w,b,col);
return dsc;
}
public static Desc moveFromTo(Desc dfrom,Desc dto,long from, long to)
{
int colfrom=-1;
int colto=-1;
long posKing=0L;
for (int i=1;i<6;i++)
{
dto.WPiece[i]=dfrom.WPiece[i];
dto.BPiece[i]=dfrom.BPiece[i];
}
//фигура на from
int f = dfrom.returnPiece(Long.numberOfLeadingZeros(from));
colfrom=dfrom.Color;
//фигура на to
int t = dto.returnPiece(Long.numberOfLeadingZeros(to));
colto=dto.Color;
dto.mov=false;
dfrom.mov=false;
if ((f==-1)|(from==to)|(colfrom==colto)){return dfrom;}
dto.removePiece(from);
dto.removePiece(to);
dto.addPiece(f,to);
switch (colto)
{
case 1:
{
posKing=dto.WPiece[0];
break ;
}
case 0:
{
posKing=dto.BPiece[0];
break ;
}
}
if ((posKing&dto.returnAllattak(colto))!=0)
{
dto.removePiece(from);
dto.removePiece(to);
dto.addPiece(f,from);
if (t>=0)
{
dto.addPiece(t,to);
}
return dfrom;
}
dto.mov=true;
return dto;
}
public static void ShowMsg(String title, String msg)
{
MainActivity.showAlert(MainActivity.getInstance(),title, msg);
}
}//class

Desc.java

package com.example.myappshess;
public class Desc {
// массивы для фигур
public long[] WPiece = new long[6];
public long[] BPiece = new long[6];
public int Color;
public long WP,BP;
public long AllWPattak;
public long AllBPattak;
public boolean mov = false;
//test
public long MoveBlackKing = 0L;
// конструктор
public Desc(long[] w,long[] b,int col)
{
WP = 0L;
BP = 0L;
for (int i = 0; i < 6; i++)
{
WPiece[i] = w[i];
WP |= WPiece[i];
BPiece[i] = b[i];
BP |= BPiece[i];
}
Color = col;
}
public Desc()
{
WP = 0L;
BP = 0L;
for (int i = 0; i < 6; i++)
{
WPiece[i] = 0L;
BPiece[i] = 0L;
}
}
public Desc(String str)
{
FenToLong(str);
}
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;
}
//MainActivity.showAlert(MainActivity.getInstance(),"Заголовок", "сообщение");
return true;
} // FenToLong
public void ClearPiece()
{
for (int i = 0; i < 6; i++)
{
WPiece[i] = 0L;
BPiece[i] = 0L;
}
}
public int returnPiece(int Pol)
{
for (int i = 0; i < 6; i++)
{
if ((MascBit.MaskOneBit[Pol]&WPiece[i])!=0)
{
Color = 0;
return i;}
if ((MascBit.MaskOneBit[Pol]&BPiece[i])!=0)
{
Color = 1;
return i+6;}
} //for
Color ^= 1;
return -1;
}
public long returnPC(int col)
{
switch (col)
{
case 0:{
WP = 0L;
for (int i=0;i<6;i++)
{
WP |= WPiece[i];
}
return WP;
}
case 1:{
BP = 0L;
for (int i=0;i<6;i++)
{
BP |= BPiece[i];
}
return BP;
}
}//switch
return -1L;
}
public void removePiece(long pos)
{
for (int i = 0; i < 6; i++)
{
WPiece[i] ^= (WPiece[i]&pos);
BPiece[i] ^= (BPiece[i]&pos);
}
}
public void addPiece(int pc,long pos)
{
if (pc<6)
{
WPiece[pc]^=pos;
}
else
{
BPiece[pc-6]^=pos;
}
}
public long returnAllattak(int col)
{
long PC,pos;
int k;
switch (col)
{
case 0:{
AllWPattak = 0L;
PC = this.returnPC(0);
k = Long.bitCount(PC);
for (int i = 0; i < k; i++)
{
pos = Long.lowestOneBit(PC);
PC ^= pos;
AllWPattak |= MoveGenerator.AttakPiece(this,pos,0);
}
return AllWPattak;
}
case 1:{
AllBPattak = 0L;
PC = this.returnPC(1);
k = Long.bitCount(PC);
for (int i = 0; i < k; i++)
{
pos = Long.lowestOneBit(PC);
PC ^= pos;
AllBPattak |= MoveGenerator.AttakPiece(this,pos,1);
}
return AllBPattak;
}
}//switch
return 0L;
}
public long returnMoveBKing()
{
long temp = returnAllattak(0);
MoveBlackKing=MoveGenerator.AttakPiece(this,BPiece[0],1);
MoveBlackKing^=(MoveBlackKing&temp);
return MoveBlackKing;
}
}//class

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 static long[] KingAttak = 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 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];
}
maskKingAttak(i);
} // for
maskKnightAttak();
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 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];
}
}
}

До встречи