Смекни!
smekni.com

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

public static final int HERE_SHIP_2=2;//здесь есть 2 корабль

public static final int HERE_SHIP_3=3;//здесь есть 3 корабль

public static final int HERE_SHIP_4=4;//здесь есть 4 корабль

public static final int HERE_NO_CHOOSE=5;//здесь уже ничего быть не может

public static final int BOMB_HERE=6;//клетка атакована

public static final int SHIP_ON_FIRE=7;

private int ships_count=0;

public static int[][] field_gamer=new int[11][11];//поля игрока и оппонента

public static int[][] field_opp=new int[11][11];

public static boolean comm_attack=true;

public static final int IDM_GAMER_ROUND=100; //интент актив. мен.

public static final int IDM_OPP_ROUND=200;

int opp=GameStats.total_ships_opp_count;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

new Thread(new Runnable() {public void run() {autoPlacing(field_opp); autoPlacing(field_gamer);}}).start();

Intent intent=new Intent();

intent.setClass(getApplicationContext(), GamerRound.class);

Intent intent_opp=new Intent();

intent_opp.setClass(getApplicationContext(), OppRound.class);

Intent finIntent=new Intent();

finIntent.setClass(getApplicationContext(), FinishSplash.class);

startActivity(finIntent);

opp=4;

do {

startActivity(intent_opp);

startActivity(intent);

opp-=1;

}while(opp==0);}

@Override

protected void onResume() {

super.onResume();

opp=GameStats.total_ships_opp_count; }

@Override

protected void onSaveInstanceState(Bundle savedInstanseState) {

super.onSaveInstanceState(savedInstanseState);

//savedInstanseState.putInt(key, value); }

public static int attack(int selX, int selY,int field_gamer[][]) {

if(field_gamer[selX][selY]>HERE_NO_CHOOSE) return -1;//не важно

if(field_gamer[selX][selY]==0 || field_gamer[selX][selY]==HERE_NO_CHOOSE) {//если клетка пустая то записываем что её удже атаковали

field_gamer[selX][selY]=BOMB_HERE; return 0; }

if(field_gamer[selX][selY]<5) {//если не пустая то записываем что тут корабль взорван

if(field_gamer[selX][selY]==HERE_SHIP_1) {//если игрок нашёл однотрубник то и искать дальше нечего

field_gamer[selX][selY]=SHIP_ON_FIRE;

field_gamer[selX+1][selY-1]=BOMB_HERE;

field_gamer[selX+1][selY]=BOMB_HERE;

field_gamer[selX+1][selY-1]=BOMB_HERE;

field_gamer[selX][selY-1]=BOMB_HERE;

field_gamer[selX][selY+1]=BOMB_HERE;

field_gamer[selX-1][selY-1]=BOMB_HERE;

field_gamer[selX-1][selY]=BOMB_HERE;

field_gamer[selX-1][selY+1]=BOMB_HERE;

GameStats.total_ships_opp_count-=1; }//вычёркиваем корабль у противника

if(field_gamer[selX][selY]==HERE_SHIP_3) {//

field_gamer[selX][selY]=SHIP_ON_FIRE;

GameStats.ship_3_opp_heal-=1;

if(GameStats.ship_3_opp_heal==0) GameStats.total_ships_opp_count-=1;

}

if(field_gamer[selX][selY]==HERE_SHIP_4) {

field_gamer[selX][selY]=SHIP_ON_FIRE;

GameStats.ship_4_opp_heal-=1;

if(GameStats.ship_4_opp_heal==0) GameStats.total_ships_opp_count-=1;}

return 1; }//успешно

return 0; }//промах

private void autoPlacing(int field_gamer[][]) {//авто расстановка

Random generateRandom=new Random();

int gorizont=0;

int vertic=0;

int tmep_gorizont=0;

//расставляем 4х трубные

int choose=generateRandom.nextInt(2);

switch(choose) {

case 0: //ставимпогоризонтали

tmep_gorizont=gorizont=generateRandom.nextInt(6)+1;//конец не включая

vertic=generateRandom.nextInt(9)+1;//корабль нельзя начать на буферных полях 0,0 и 10,10

for(int i=0;i<HERE_SHIP_4;i++) {

field_gamer[tmep_gorizont][vertic]=HERE_SHIP_4;

field_gamer[tmep_gorizont][vertic-1]=HERE_NO_CHOOSE;

field_gamer[tmep_gorizont][vertic+1]=HERE_NO_CHOOSE;

tmep_gorizont+=1; }//переходим на следующую клетку

field_gamer[gorizont-1][vertic]=HERE_NO_CHOOSE;//конец и начало

field_gamer[gorizont+4][vertic]=HERE_NO_CHOOSE;

field_gamer[gorizont-1][vertic+1]=HERE_NO_CHOOSE;//диагональные клетки

field_gamer[gorizont-1][vertic-1]=HERE_NO_CHOOSE;//диагональные клетки

field_gamer[gorizont+4][vertic+1]=HERE_NO_CHOOSE;

field_gamer[gorizont+4][vertic-1]=HERE_NO_CHOOSE;

break;

case 1://поехали по вертикали

gorizont=generateRandom.nextInt(9)+1;//конец не включая

int tmep_vertic=vertic=generateRandom.nextInt(6)+1;

for(int i=0;i<HERE_SHIP_4;i++) {

field_gamer[gorizont][tmep_vertic]=HERE_SHIP_4;

field_gamer[gorizont-1][tmep_vertic]=HERE_NO_CHOOSE;

field_gamer[gorizont+1][tmep_vertic]=HERE_NO_CHOOSE;

tmep_vertic+=1; }

field_gamer[gorizont][vertic-1]=HERE_NO_CHOOSE;

field_gamer[gorizont][vertic+4]=HERE_NO_CHOOSE;

field_gamer[gorizont-1][vertic-1]=HERE_NO_CHOOSE;

field_gamer[gorizont+1][vertic-1]=HERE_NO_CHOOSE;

field_gamer[gorizont-1][vertic+4]=HERE_NO_CHOOSE;

field_gamer[gorizont+1][vertic+4]=HERE_NO_CHOOSE;

break; }//закончили 4х трубный

do {//начинаем 3 трубные 2 штуки

gorizont=0;

vertic=0;

tmep_gorizont=0;

int choose1=generateRandom.nextInt(2);

switch(choose1) {

case 0: //ставим по горизонтали

//два корабля ставим

booleanenter=false; //надо ли ещё раз генерить новую точку отсчёта

int ship_place=tmep_gorizont=gorizont=generateRandom.nextInt(6)+1; //конец не включая

vertic=generateRandom.nextInt(9)+1;//корабль нельзя начать на буферных полях 0,0 и 10,10

for(intk=0;k<HERE_SHIP_3;k++) { //еслиужезанятооднаклеткаif(field_gamer[ship_place][vertic]==0

&& (field_gamer[ship_place][vertic+1]>4||field_gamer[ship_place][vertic+1]==0)

&& (field_gamer[ship_place][vertic-1]>4|| field_gamer[ship_place][vertic-1]==0)

&& (field_gamer[gorizont-1][vertic]>4|| field_gamer[gorizont-1][vertic]==0)

&&(field_gamer[gorizont+HERE_SHIP_3][vertic]>4||field_gamer[gorizont+HERE_SHIP_3][vertic]==0) &&(field_gamer[gorizont-1][vertic+1]>4||field_gamer[gorizont-1][vertic+1]==0)

&&(field_gamer[gorizont-1][vertic-1]>4 || field_gamer[gorizont-1][vertic-1]==0)

&&(field_gamer[gorizont+HERE_SHIP_3][vertic+1]>4||field_gamer[gorizont+HERE_SHIP_3][vertic+1]==0)&&(field_gamer[gorizont+HERE_SHIP_3][vertic-1]>4|| field_gamer[gorizont+HERE_SHIP_3][vertic-1]==0)) {

enter=true; }

else{enter=false; break;}

ship_place=ship_place+1;}

if(enter) {//если занято то не выполнится цикл

for(int i=0;i<HERE_SHIP_3;i++) {

field_gamer[tmep_gorizont][vertic]=HERE_SHIP_3;

field_gamer[tmep_gorizont][vertic-1]=HERE_NO_CHOOSE;

field_gamer[tmep_gorizont][vertic+1]=HERE_NO_CHOOSE;

tmep_gorizont=tmep_gorizont+1; }//переходим на следующую клетку

field_gamer[gorizont-1][vertic]=HERE_NO_CHOOSE;

field_gamer[gorizont+3][vertic]=HERE_NO_CHOOSE;

field_gamer[gorizont-1][vertic+1]=HERE_NO_CHOOSE;//диагональные клетки

field_gamer[gorizont-1][vertic-1]=HERE_NO_CHOOSE;//диагональные клетки

field_gamer[gorizont+HERE_SHIP_3][vertic+1]=HERE_NO_CHOOSE;

field_gamer[gorizont+HERE_SHIP_3][vertic-1]=HERE_NO_CHOOSE;

ships_count=ships_count+1; }

break;

case 1: //повертикали

intt2_vertic=0;

booleanenter1=false; //надо ли ещё раз генерить новую точку отсчёта

ship_place=gorizont=generateRandom.nextInt(9)+1;//конец не включая

int t_vertic=t2_vertic=vertic=generateRandom.nextInt(6)+1;//корабль нельзя начать на буферных полях 0,0 и 10,10

for(intk=0;k<HERE_SHIP_3;k++) {//если уже занято одна клетка

if(field_gamer[gorizont][t_vertic]==0&&(field_gamer[gorizont+1][t_vertic]>4|| field_gamer[gorizont+1][t_vertic]==0)&&(field_gamer[gorizont-1][t_vertic]>4|| field_gamer[gorizont-1][t_vertic]==0)&&(field_gamer[gorizont+1][vertic-1]>4|| field_gamer[gorizont+1][vertic-1]==0)&&(field_gamer[gorizont][vertic+HERE_SHIP_3]>4 ||field_gamer[gorizont][vertic+HERE_SHIP_3]==0)&&(field_gamer[gorizont-1][vertic-1]>4||field_gamer[gorizont-1][vertic-1]==0)&&(field_gamer[gorizont-1][vertic+HERE_SHIP_3]>4 || field_gamer[gorizont-1][vertic+HERE_SHIP_3]==0)&& (field_gamer[gorizont+1][vertic+HERE_SHIP_3]>4|| field_gamer[gorizont+1][vertic+HERE_SHIP_3]==0)) {

enter1=true; }

else { enter1=false; break;}

t_vertic=t_vertic+1; }

if(enter1) {//еслизанятотоещёразокциклвхиле

for(int i=0;i<HERE_SHIP_3;i++) {

field_gamer[gorizont][t2_vertic]=HERE_SHIP_3;

field_gamer[gorizont-1][t2_vertic]=HERE_NO_CHOOSE;

field_gamer[gorizont+1][t2_vertic]=HERE_NO_CHOOSE;

t2_vertic+=1; }//переходим на следующую клетку

field_gamer[gorizont][vertic-1]=HERE_NO_CHOOSE;

field_gamer[gorizont][vertic+3]=HERE_NO_CHOOSE;

field_gamer[gorizont-1][vertic-1]=HERE_NO_CHOOSE;

field_gamer[gorizont+1][vertic-1]=HERE_NO_CHOOSE;

field_gamer[gorizont-1][vertic+3]=HERE_NO_CHOOSE;

field_gamer[gorizont+1][vertic+3]=HERE_NO_CHOOSE;

ships_count=ships_count+1;

break; }//КОНЕЦ РАССТАНОВКИ

} while(ships_count<3);

/*//начинаемдвухтрубники 3 штуки

ships_count=0;

int ships_2_count=0;

do {//

gorizont=0;

vertic=0;

tmep_gorizont=0;

int choose2=generateRandom.nextInt(2);//choose=1;

switch(choose2) {

case 0: //ставим по горизонтали

//два корабля ставим

booleanenter3=false; //надо ли ещё раз генерить новую точку отсчёта

int ship_place=tmep_gorizont=gorizont=generateRandom.nextInt(6)+1;//конец не включая

vertic=generateRandom.nextInt(9)+1;//корабль нельзя начать на буферных полях 0,0 и 10,10

for(intk=0;k<HERE_SHIP_2;k++) {//если уже занято одна клетка

if(field_gamer[ship_place][vertic]==0&&(field_gamer[ship_place][vertic+1]>4||field_gamer[ship_place][vertic+1]==0)&&(field_gamer[ship_place][vertic-1]>4||field_gamer[ship_place][vertic-1]==0)&&(field_gamer[gorizont-1][vertic]>4|| field_gamer[gorizont-1][vertic]==0)&&(field_gamer[gorizont+HERE_SHIP_2][vertic]>4 || field_gamer[gorizont+HERE_SHIP_2][vertic]==0)&&(field_gamer[gorizont-1][vertic+1]>4 ||field_gamer[gorizont-1][vertic+1]==0)&&(field_gamer[gorizont-1][vertic-1]>4|| field_gamer[gorizont-1][vertic-1]==0)

&&(field_gamer[gorizont+HERE_SHIP_2][vertic+1]>4||field_gamer[gorizont+HERE_SHIP_2][vertic+1]==0)&&(field_gamer[gorizont+HERE_SHIP_2][vertic-1]>4|| field_gamer[gorizont+HERE_SHIP_2][vertic-1]==0)) {

enter3=true; }

else {enter3=false;break;}

ship_place=ship_place+1; }

if(enter3) {//если занято то не выполнится цикл

for(int i=0;i<HERE_SHIP_2;i++) {

field_gamer[tmep_gorizont][vertic]=HERE_SHIP_2;

field_gamer[tmep_gorizont][vertic-1]=HERE_NO_CHOOSE; field_gamer[tmep_gorizont][vertic+1]=HERE_NO_CHOOSE;

tmep_gorizont+=1; }//переходим на следующую клетку

field_gamer[gorizont-1][vertic]=HERE_NO_CHOOSE;

field_gamer[gorizont+3][vertic]=HERE_NO_CHOOSE;

ships_2_count=ships_2_count+1;}

break;

case 1: //повертикали

booleanenter2=false;//надо ли ещё разгенерить новую точку отсчёта

ship_place=gorizont=generateRandom.nextInt(9)+1;//конец не включая

intt_vertic=vertic=generateRandom.nextInt(6)+1;//корабль нельзя начать на буферных полях 0,0 и 10,10

for(intk=0;k<HERE_SHIP_2;k++) {//если уже занято одна клетка

if(field_gamer[gorizont][t_vertic]==0&&(field_gamer[gorizont+1][t_vertic]>4|| field_gamer[gorizont+1][t_vertic]==0)&&(field_gamer[gorizont-1][t_vertic]>4|| field_gamer[gorizont-1][t_vertic]==0)&&(field_gamer[gorizont+1][vertic-1]>4|| field_gamer[gorizont+1][vertic-1]==0)&& field_gamer[gorizont][vertic+HERE_SHIP_2]>4||field_gamer[gorizont][vertic+HERE_SHIP_2]==0)&&(field_gamer[gorizont-1][vertic-1]>4||field_gamer[gorizont-1][vertic-1]==0)&&(field_gamer[gorizont-1][vertic+HERE_SHIP_2+1]>4||field_gamer[gorizont-1][vertic+HERE_SHIP_2+1]==0)&&(field_gamer[gorizont+1][vertic+HERE_SHIP_2+1]>4 || field_gamer[gorizont+1][vertic+HERE_SHIP_2+1]==0)) {

enter2=true; }

else {enter2=false;break;}

t_vertic=t_vertic+1; }

if(enter2) {//еслизанятотоещёразокциклвхиле

for(int i=0;i<HERE_SHIP_2;i++) {

field_gamer[gorizont][t_vertic]=HERE_SHIP_2;

field_gamer[gorizont-1][t_vertic]=HERE_NO_CHOOSE;

field_gamer[gorizont+1][t_vertic]=HERE_NO_CHOOSE;

t_vertic+=1; }//переходим на следующую клетку

field_gamer[gorizont-1][vertic]=HERE_NO_CHOOSE;

field_gamer[gorizont+3][vertic]=HERE_NO_CHOOSE;

ships_2_count=ships_2_count+1;}

break;}//КОНЕЦРАССТАНОВКИ

} while(ships_2_count<3);*/

//начинаем 1хтрубники

int ship_4_count=0;

do {

//boolean enter_4=false;

int gorizont_4=generateRandom.nextInt(9)+1;

int vertic_4=generateRandom.nextInt(9)+1;

if(field_gamer[gorizont_4][vertic_4]==0&&(field_gamer[gorizont_4+1][vertic_4-1]==0 ||field_gamer[gorizont_4+1][vertic_4-1]>4) && (field_gamer[gorizont_4+1][vertic_4]==0 || field_gamer[gorizont_4+1][vertic_4]>4) && (field_gamer[gorizont_4+1][vertic_4-1]==0 ||field_gamer[gorizont_4+1][vertic_4-1]>4) && (field_gamer[gorizont_4][vertic_4-1]==0 ||field_gamer[gorizont_4][vertic_4-1]>4) && (field_gamer[gorizont_4][vertic_4+1]==0 ||field_gamer[gorizont_4][vertic_4+1]>4) && (field_gamer[gorizont_4-1][vertic_4-1]==0 ||field_gamer[gorizont_4-1][vertic_4-1]>4) && (field_gamer[gorizont_4-1][vertic_4]==0 ||field_gamer[gorizont_4-1][vertic_4]>4) && (field_gamer[gorizont_4-1][vertic_4+1]==0 ||field_gamer[gorizont_4-1][vertic_4+1]>4)) {

field_gamer[gorizont_4][vertic_4]=HERE_SHIP_1; field_gamer[gorizont_4+1][vertic_4-1]=HERE_NO_CHOOSE;

field_gamer[gorizont_4+1][vertic_4]=HERE_NO_CHOOSE;

field_gamer[gorizont_4+1][vertic_4-1]=HERE_NO_CHOOSE;

field_gamer[gorizont_4][vertic_4-1]=HERE_NO_CHOOSE;

field_gamer[gorizont_4][vertic_4+1]=HERE_NO_CHOOSE;

field_gamer[gorizont_4-1][vertic_4-1]=HERE_NO_CHOOSE;

field_gamer[gorizont_4-1][vertic_4]=HERE_NO_CHOOSE;

field_gamer[gorizont_4-1][vertic_4+1]=HERE_NO_CHOOSE;

ship_4_count+=1;}

} while(ship_4_count<6);} //функция атаки корабля противником

static int[] autoAttack(int field_gamer[][]) {

int m_att_y=0,m_i=0;

int[] return_coord=new int[3];

Random attRand=new Random();

int att_x = 0;

int att_y = 0;

GameStats.bot_mem_full=false;

if(!GameStats.bot_mem_full) {//если память бота пуста

boolean att_ok=false;//успех атаки

while(!att_ok) {//это чтобы бот не ошибался и не кликал по уже атакованым клеткам и клеткам где физически не может быть корабля

att_x=attRand.nextInt(9)+1;

att_y=attRand.nextInt(9)+1;//выбор клетки для атаки

if(field_gamer[att_x][att_y]!=SHIP_ON_FIRE && field_gamer[att_x][att_y]!=BOMB_HERE)

att_ok=true; }

if(field_gamer[att_x][att_y]==0){ field_gamer[att_x][att_y]=BOMB_HERE;return_coord[0]=att_x;return_coord[1]=att_y;return_coord[2]=0; return return_coord; }//если клетка пуста то отметка об атаке

if(field_gamer[att_x][att_y]==HERE_SHIP_1) {//если бот нашёл однотрубник то и искать дальше нечего

field_gamer[att_x][att_y]=SHIP_ON_FIRE;

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;

field_gamer[att_x][att_y-1]=BOMB_HERE;