Смекни!
smekni.com

РАЗРАБОТКА ИГРЫ МОРСКОЙ БОЙ С AI (стр. 5 из 5)

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

}

}