Найти в Дзене

Пишем шахматную программу Первый шаг к написанию шахматной программы (Окончание)

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

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

Жена спрашивает мужа-программиста:
- Дорогой, ты помнишь, когда у нас будет годовщина свадьбы?
- Конечно помню! Ровно через три дня, после окончания лицензии на антивирус.

Итак завершающий этап визуализации.

Теперь мы можем скормить Бене FEN строку , а он нам покажет на экране шахматную диаграмму этой строки

package com.example.myappshess;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.example.myappshess.R;
import android.view.MotionEvent;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrFen = getString(R.string.perft0);
myText = (TextView) findViewById(R.id.text);
myText.setText(StrFen);
}

public Boolean bol = true;
public String StrFen, subStrFen;
public TextView myText;
public Bitmap[] arrayOfBitmap = new Bitmap[12];
public Bitmap bitmap1, bitmap2,bitmap3,bitmap4;
public Paint paint;
public int touchX, touchY;
public Canvas canvasBmp3;

public void onBackPressed() {
if (bol) {
ShowAlert("exit");
this.finish();
} else {
ShowAlert(StrFen);
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;
setContentView(R.layout.activity_main);
myText = (TextView) findViewById(R.id.text);
myText.setText(StrFen);
}

public void ShowAlert(String str) {
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
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));
ShowAlert("нажмите кнопку -назад- чтобы вернуться");
}

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

myText = (TextView) findViewById(R.id.text);
myText.setText(StrFen);
}

public void initPiece() {
/*
createBitmap(Bitmap source, int x, int y, int width, int height) - Returns an immutable bitmap from the specified subset of the source bitmap.
*/
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) {
int h = 60; // размер клетки поля
// координаты поля a8
int dx = 26;
int dy = 22;
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;
}

class DrawView extends View {

public DrawView(Context context) {
super(context);

paint = new Paint(Paint.ANTI_ALIAS_FLAG);
// доска
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();
}

@Override
protected void onDraw(Canvas canvas) {
canvas.drawARGB(80, 102, 204, 255);
// доска
canvas.drawBitmap(bitmap3, 0, 0, paint);
parsingStrFen(StrFen, canvas);
}

public boolean onTouchEvent(MotionEvent event) {
int h = 60; // размер клетки поля
// координаты поля a8
int dx = 26;
int dy = 22;
// номер поля
// 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 (touchX < dx | touchX > dx + 8 * h) {
return true;
}
if (touchY < dy | touchY > dy + 8 * h) {
return true;
}
NumPol = XPol + 8 * YPol;
ShowAlert("Поле " + NumPol);

canvasBmp3.drawBitmap(bitmap1, 0, 0, null); canvasBmp3.drawBitmap(bitmap4, dx + h * XPol, dy + h * YPol, null);
//вызываем onDraw
invalidate();
}
return true;
}
}
}
.............

Свет в конце тунеля - это всего лишь огни приближающегося поезда...

PS: Добавлены несколько стандартных позиций и отслеживание касания на доске

Рисуем на канве другого

изображения

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="top">
<EditText
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/perft0"
android:layout_weight="100.0" />
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/but0"
android:onClick="onMyButtonClick0"
/>
</LinearLayout>
<TextView
android:layout_gravity="left"
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pos"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="top">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/but1"
android:onClick="onMyButtonClick"
/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/but2"
android:onClick="onMyButtonClick"
/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/but3"
android:onClick="onMyButtonClick"
/>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/but4"
android:onClick="onMyButtonClick"
/>
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/but5"
android:onClick="onMyButtonClick"
/>
</LinearLayout>
<TextView
android:layout_gravity="left"
android:id="@android:id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/back"/>
</LinearLayout>

strings.xml

<resources>
<string name="app_name">benya_geniuse</string>
<string name="title_activity_main">MAIN_ACTIVITY</string>
<string name="perft0">rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1</string>
<string name="perft1">r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -</string>
<string name="perft2">8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - -</string>
<string name="perft3">r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1</string>
<string name="perft4">rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8</string>
<string name="perft5">r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10</string>
<string name="but0">показать</string>
<string name="but1">поз2</string>
<string name="but2">поз3</string>
<string name="but3">поз4</string>
<string name="but4">поз5</string>
<string name="but5">поз6</string>
<string name="pos">Задайте позицию FEN строкой
</string>
<string name="back">чтобы закрыть приложение нажмите кнопку - назад
</string>
</resources>

Фигуры (облако)

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

До встречи