Найти тему

Пишем шахматную программу (перемещения фигур)

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

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

Гарри Каспаров однажды сказал, что «шахматы — это муки разума». Видимо поэтому кто-то решил объединить шахматы с физическими испытаниями, создав шахбокс. Голландский художник Ипе Рубингстал родоначальником шахбокса, после того как увидел идею сочетать шахматы и бокс в одной книге-комиксе. В шахбоксе чередуются раунды шахмат и бокса и ее девизом является «Сражения происходят на ринге, а войны ведутся на доске». Шахбокс приобретает все большую популярность и находится под управлением Всемирной организации шахбокса.

Сегодня научим Беню двигать фигуры на доске.

И немного причешем код

Очистим от мусора

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.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 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 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; 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);
//рисуем на канве 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);
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);
}
}
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("01.04.2021", 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("<<1", 566, 172, paint);
canvas.drawText("up", 566, 232, paint);
canvas.drawText("left", 566, 292, paint);
canvas.drawText("reverse", 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 106:{
number1<<=1;
invalidate();
return true;
}
case 114:{
number1 = Long.rotateLeft(number1,8);
invalidate();
return true;
}
case 122:{
number1 = Long.rotateLeft(number1,1);
invalidate();
return true;
}
case 130:{
number1 = Long.reverseBytes(number1);
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;
try {
if (SwitchFromTo==0)
{
From = number2;
To = From;
SwitchFromTo^=1;
if (test)
{
MoveGenerator.TestPos(desc);
test = false;
}
if (dsc.returnPiece(NumPol)<6)
{
number1=MoveGenerator.MovePiece(desc,number2,0);
}
else
{
number1=MoveGenerator.MovePiece(desc,number2,1);
}
} //(SwitchFromTo==0)
else
{
To = number2;
SwitchFromTo^=1;
if ((To&number1)!=0)
{
MoveGenerator.moveFromTo(From,To);
}
number1=0;
}
}//try
catch (Exception e)
{
showAlert(sInstance,"ERROR", "Непредвиденная ошибка");
}
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);
}
}

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;
}
switch (color)
{
case 0:
{
line1 ^= (line1&d.returnPC(0));
break ;
}
case 1:
{
line1 ^= (line1&d.returnPC(1));
break ;
}
}
// dsc = null;
return line1;
}
public static long MovePiece(Desc d,long pos,int color)
{
long number1=0;
int NumPol = Long.numberOfLeadingZeros(pos);
switch (d.returnPiece(NumPol))
{
case 6:
{
number1 = MascBit.KingAttak[NumPol];
number1 ^= (number1&d.returnPC(1));
break ;
}
case 0:{
number1 = MascBit.KingAttak[NumPol];
number1 ^= (number1&d.returnPC(0));
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];
number1 ^= (number1&d.returnPC(1));
break ;
}
case 4:{
number1 = MascBit.KnightAttak[NumPol];
number1 ^= (number1&d.returnPC(0));
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(MainActivity.StrFen);
return dsc;
}
public static Desc newPos(long[] w,long[] b,int col)
{
dsc = new Desc(w,b,col);
return dsc;
}
public static void moveFromTo(long from, long to)
{
//фигура на from
int f = MainActivity.desc.returnPiece(Long.numberOfLeadingZeros(from));
if ((f==-1)|(from==to)){return;}
MainActivity.desc.removePiece(from);
MainActivity.desc.removePiece(to);
MainActivity.desc.addPiece(f,to);
}
public static void TestPos(Desc d)
{
long Start,Stop,PC,pos;
String time_count;
int k,move;
move=0;
Start=System.currentTimeMillis ();
PC = d.returnPC(0);
k = Long.bitCount(PC);
for (int i = 0; i < k; i++)
{
pos = Long.lowestOneBit(PC);
PC ^= pos;
move +=Long.bitCount(MovePiece(d,pos,0));
}
PC = d.returnPC(1);
k = Long.bitCount(PC);
for (int i = 0; i < k; i++)
{
pos = Long.lowestOneBit(PC);
PC ^= pos;
move +=Long.bitCount(MovePiece(d,pos,1));
}
Stop=System.currentTimeMillis ();
time_count = MainActivity.TimeCount(Stop-Start);
time_count += (" move=" + move);
//ShowNsg("Время выполнения кода:", time_count);
}
public static void ShowNsg(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 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) {return i;}
if ((MascBit.MaskOneBit[Pol]&BPiece[i])!=0) {return i+6;}
} //for
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;
}
}
}//class

Промежуточный итог.

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

Замечание.

Атака отличается от хода фигуры тем что атака это величина не изменная, а на ход фигуры накладывается масса ограничений

Например связанная ладья может не иметь ни одного хода, но атакует она из данной клетки те же поля, что и ладья без связки

  • На данном этапе у нашего Бени атаки и перемещения совпадают .

До встречи