field_gamer[att_x][att_y+1]=BOMB_HERE;
field_gamer[att_x-1][att_y-1]=BOMB_HERE;
field_gamer[att_x-1][att_y]=BOMB_HERE;
field_gamer[att_x-1][att_y+1]=BOMB_HERE;
GameStats.total_ships_gamer_count-=1;//вычёркиваем корабль у игрока
return_coord[0]=att_x;
return_coord[1]=att_y;
return_coord[2]=1;
return return_coord; } //попадание!
if(field_gamer[att_x][att_y]==HERE_SHIP_3) {
field_gamer[att_x][att_y]=SHIP_ON_FIRE; GameStats.ship_3_gamer_heal-=1;
if(GameStats.ship_3_gamer_heal==0)
GameStats.total_ships_gamer_count-=1;//запоминаем координаты
GameStats.ship_3_gamer_coord[0]=att_x;
GameStats.ship_3_gamer_coord[1]=att_y;
GameStats.bot_last_found=HERE_SHIP_3;
GameStats.bot_mem_full=true;
return_coord[0]=att_x;
return_coord[1]=att_y;
return_coord[2]=1;
return return_coord;}
if(field_gamer[att_x][att_y]==HERE_SHIP_4) {
field_gamer[att_x][att_y]=SHIP_ON_FIRE; GameStats.ship_4_gamer_heal-=1;
if(GameStats.ship_4_gamer_heal==0) GameStats.total_ships_gamer_count-=1;
GameStats.ship_4_gamer_coord[0]=att_x;
GameStats.ship_4_gamer_coord[1]=att_y;
GameStats.bot_last_found=HERE_SHIP_4;
GameStats.bot_mem_full=true;
return_coord[0]=att_x;
return_coord[1]=att_y;
return_coord[2]=1;
return return_coord;}
} //конец пустой атаки
////////////////////////////////////////////////////////
//начало продолжения атаки по памяти
if(GameStats.bot_mem_full ){
boolean comm_att_ok=false;
int now_att_direction=5; //текущее направление атаки
if(field_gamer[att_x][att_y]==HERE_SHIP_3) {
field_gamer[att_x][att_y]=SHIP_ON_FIRE; GameStats.ship_3_gamer_heal-=1;
do {
intchoose_att_direction=attRand.nextInt(1);//выбираем одно из 4х направлений атаки
if(now_att_direction!=5) choose_att_direction=now_att_direction;//сохраняем в текущее нпавление если оно есть
switch(choose_att_direction) {
case 0://влево
for(inti=1;i<HERE_SHIP_3;i++) {//если на пути есть препятсвие то выход из цикла
if(field_gamer[att_x][att_y-i]==BOMB_HERE||field_gamer[att_x][att_y-i]==SHIP_ON_FIRE) break;
else { comm_att_ok=true;//если же направление атаки логично
if(field_gamer[att_x][att_y-i]==HERE_SHIP_3) {
field_gamer[att_x][att_y-i]=BOMB_HERE; m_att_y=att_y-1;//сдвигаемся на клетку и продолжаем атаку в том же направлении
now_att_direction=choose_att_direction;}
else{field_gamer[att_x][att_y-i]=BOMB_HERE;GameStats.bot_mem_full=true; GameStats.bot_mem[0]=att_x;GameStats.bot_mem[1]=att_y-i;return_coord[0]=att_x;return_coord[1]=att_y-i;return_coord[2]=0;GameStats.bot_last_found=HERE_SHIP_3;return return_coord;}
}
}break;
case 1://вправо
for(inti=1;i<HERE_SHIP_3;i++) {//если на пути есть препятсвие то выход из цикла
if(field_gamer[att_x][att_y+i]==BOMB_HERE||field_gamer[att_x][att_y-i]==SHIP_ON_FIRE) break;
else { comm_att_ok=true;
if(field_gamer[att_x][att_y+i]==HERE_SHIP_3) {
field_gamer[att_x][att_y+i]=SHIP_ON_FIRE; m_att_y=att_y=+i;
now_att_direction=choose_att_direction;}
else{
field_gamer[att_x][att_y+i]=BOMB_HERE;GameStats.bot_mem_full=true; GameStats.bot_mem[0]=att_x;GameStats.bot_mem[1]=att_y+1;GameStats.bot_last_found=HERE_SHIP_3;}
}
}break;
case 2://вверх
for(inti=1;i<HERE_SHIP_3;i++) {//если на пути есть препятсвие то выход из цикла
if(field_gamer[att_x-i][att_y]==BOMB_HERE || field_gamer[att_x][att_y-i]==SHIP_ON_FIRE)
break;
else { comm_att_ok=true;
field_gamer[att_x-i][att_y]=BOMB_HERE; att_x=-i;
now_att_direction=choose_att_direction;}
}break;
case 3://вниз
for(inti=1;i<HERE_SHIP_3;i++) {//если на пути есть препятсвие то выход из цикла
if(field_gamer[att_x-i][att_y]==BOMB_HERE||field_gamer[att_x][att_y-i]==SHIP_ON_FIRE )
break;
else { comm_att_ok=true;
field_gamer[att_x+i][att_y]=BOMB_HERE; att_x=+i;
now_att_direction=choose_att_direction; }
}break;
}
}while(!comm_att_ok);//совершаем атаку в выбранном направлении
}
}
if(field_gamer[att_x][att_y]==0||field_gamer[att_x][att_y]>HERE_SHIP_4) field_gamer[att_x][att_y]=BOMB_HERE;
else field_gamer[att_x][att_y]=SHIP_ON_FIRE;
return_coord[0]=att_x;
return_coord[1]=att_y;
return_coord[2]=0;
return return_coord;}
}
BattleView.java
package ru.ship.game;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
class ViewBattle extends View {
privatefinal OppRound oppRound;
privatestaticfinalintRESULT_OK = -1;
privateintheight;
privateintwidth;
privateintselX; // X index of selection
privateintselY; // Y index of selection
privatefinal Rect selRect = new Rect();
privatefinal Rect attackedRect = new Rect();
privatefinal Rect ship4Rect = new Rect();
privatefinal Rect ship3Rect = new Rect();
privatefinal Rect ship2Rect = new Rect();
privatefinal Rect ship1Rect = new Rect();
privateintattack_coord[]=newint[3];
publicintattack_result=5;
public ViewBattle(Context context) {
super(context);
setFocusable(true);
this.oppRound = (OppRound) context;
setId(43);//устанавливаемномервьюва
}
publicvoid onDraw(Canvas canvas) {
Paint background=newPaint();
background.setColor(getResources().getColor(R.color.backBattle));//рисуемизакрашиваемзадник
canvas.drawRect(0, 0, getWidth(), getHeight(), background);//рисуемсетку
Paint grid = newPaint();
grid.setColor(getResources().getColor(R.color.grid_color));
for (int i = 0; i < 10; i++) {
canvas.drawLine(0, i * height, getWidth(), i * height,grid);//горизонатльные
canvas.drawLine(i * width, 0, i * width, getHeight(),grid); }//вертикальные
//выделяемвыбраннуюклетку
Paint selected=newPaint();
selected.setColor(getResources().getColor(R.color.grid_color));
canvas.drawRect(selRect, selected);
Paint attacked=newPaint();
attacked.setColor(getResources().getColor(R.color.attacked));//краскадляатакованногокорабля
Paint empty=newPaint();
empty.setColor(getResources().getColor(R.color.no_choose));//краскадляклеткиатакованнойнопустой
Paint ship_4=newPaint();
ship_4.setColor(getResources().getColor(R.color.ship_4));
Paint ship_3=newPaint();
ship_3.setColor(getResources().getColor(R.color.ship_3));
Paint ship_2=newPaint();
ship_2.setColor(getResources().getColor(R.color.ship_2));
Paint ship_1=newPaint();
ship_1.setColor(getResources().getColor(R.color.ship_1));
for(int i=0;i<11;i++) {
for(int j=0;j<11;j++){
if(Battle.field_gamer[i][j]==Battle.BOMB_HERE) {//еслинашлинаместеатаки 4 корабль
attackedRect.set(i*width, j*height,i*width+50,j*height+50);
canvas.drawRect(attackedRect, empty);}
if(Battle.field_gamer[i][j]==Battle.SHIP_ON_FIRE) {//еслинашлинаместеатакикорабль
attackedRect.set(i*width, j*height,i*width+50,j*height+50);
canvas.drawRect(attackedRect, attacked);}
if(Battle.field_gamer[i][j]==Battle.HERE_SHIP_4) {//еслинашлинаместеатаки 4 корабль
ship4Rect.set(i*width, j*height,i*width+50,j*height+50);
canvas.drawRect(ship4Rect, ship_4);}
if(Battle.field_gamer[i][j]==Battle.HERE_SHIP_3) {//еслинашлинаместеатаки 4 корабль
ship3Rect.set(i*width, j*height,i*width+50,j*height+50);
canvas.drawRect(ship3Rect, ship_3);}
if(Battle.field_gamer[i][j]==Battle.HERE_SHIP_2) {//еслинашлинаместеатаки 4 корабль
ship2Rect.set(i*width, j*height,i*width+50,j*height+50);
canvas.drawRect(ship2Rect, ship_2); }
if(Battle.field_gamer[i][j]==Battle.HERE_SHIP_1) {//еслинашлинаместеатаки 4 корабль
ship1Rect.set(i*width, j*height,i*width+50,j*height+50);
canvas.drawRect(ship1Rect, ship_1); }}}}
publicboolean onTouchEvent(MotionEvent event) {
if (event.getAction() != MotionEvent.ACTION_DOWN)
returnsuper.onTouchEvent(event);
attack_coord=Battle.autoAttack(Battle.field_gamer);
select(attack_coord[0], attack_coord[1]);
if(attack_coord[2]==0) {//если промахнулся то завершаем активити
Toast.makeText( getContext(), "Промах", Toast.LENGTH_SHORT).show();
oppRound.setResult(RESULT_OK);
oppRound.finish();}
else {
Toast.makeText( getContext(), "Прямоепопадание!", Toast.LENGTH_SHORT).show(); }
invalidate();
returntrue; }
@Override
protectedvoid onSizeChanged(int w,int h,int oldw,int oldh) {
width = w /10;
height = h /10;
getRect(selX, selY, selRect);
getRect(selX,selY,ship1Rect);
getRect(selX,selY,ship3Rect);
getRect(selX,selY,attackedRect);
getRect(selX,selY,ship2Rect);
getRect(selX,selY,ship4Rect);
super.onSizeChanged(w, h, oldw, oldh);}
privatevoid getRect(int x, int y, Rect rect) {
rect.set((int) (x * width), (int) (y * height), (int) (x
* width + width), (int) (y * height + height)); }
privatevoid select(int x, int y) {
invalidate(selRect);
selX = Math.min(Math.max(x, 0), 9);
selY = Math.min(Math.max(y, 0), 9);
if(Battle.field_gamer[selX][selY]>0 && Battle.field_gamer[selX][selY]<5) { getRect(selX, selY, attackedRect); invalidate(attackedRect);}
getRect(selX, selY, selRect);
invalidate(selRect);
}
}