Здравствуйте дорогие друзья.
Итак пора нашему Бени и правилам игры научится.
Наснем с дальнобойных фигур
MainActivity.java
import android.content.DialogInterface;
public static Context sInstance;
public static Desc desc;
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 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);
}
...
number2=0x8000000000000000L>>>NumPol;
MoveGenerator.TestPos(desc);
if (dsc.returnPiece(NumPol)<6)
{
number1=MoveGenerator.MovePiece(desc,number2,0);
} else
{
number1=MoveGenerator.MovePiece(desc,number2,1);
}
//вызываем onDraw
invalidate();
...
public static String TimeCount(long ms)
...
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 ;
}
}
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 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
public class Desc {
// массивы для фигур
public long[] WPiece = new long[6];
public long[] BPiece = new long[6];
public long WP,BP;
// конструктор
public Desc(long[] w,long[] b)
{
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];
}
}
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 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;
}
Когда в Англии появился первый гроссмейстер, то начался настоящий шахматный бум. Это побудило театральных режиссеров вводить в спектакли сцены, в которых действующие лица играют в шахматы. Но шахматный уровень актеров оказался довольно низок. Были отмечены случаи, когда зрители первых рядов партера подсказывали ходы, насмехались над актерами и даже ругались неприличными словами
До встречи