Run Code
|
API
|
Code Wall
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
Fgh
import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ class Rextester { static int sci=0,scy=0,scz=0; public static void main (String[] args) throws java.lang.Exception { long start = System.currentTimeMillis(); for (int ii=0;ii<10;ii++) for (int jj=0;jj<10;jj++) { //Ff ff=new Ff(ii,jj); } Ff ff=new Ff(5,5); //System.out.println("Ничья="+sci+";X="+scy+";O="+scz); long stop = System.currentTimeMillis(); System.out.println("Время= "+(int)((-start+stop)/1000)+" с"); }//main }//Rextester class Ff{ int sto_best=-1,str_best=-1; int sto1=-1,str1=-1,sto_set_free=-1,str_set_free=-1,sto2=-1,str2=-1,sto3=-1,str3=-1,sto_set1=-1,str_set1=-1,sto_set=-1,str_set=-1,sto=0,str=0,str_a_2=-1,sto_a_2=-1,r=-5,lineMax=0, sr_l11=-1, so_l11=-1,sr_l12=-1, so_l12=-1, sr_l21=-1,so_l21=-1,sr_l22=-1,so_l22=-1, winner=0,sc=0,sci=0,scy=0,scz=0, xod=0,u21=0,u22=0,u11=0,u12=0,ty=-1,scF6=0,s=0,maxDepth=2; boolean fg=false,aten1=false,aten2=false,draw=false,nhf=false,minimax=false; int Q[][]=new int[10][10]; //кол-во клеток идущих в ряд образованных ходом игрока Х int F_2[][]=new int[10][10]; //кол-во клеток идущих в ряд образованных ходом игрока О int F_3[][]=new int[10][10]; //кол-во клеток идущих в ряд образованных и Х и О (для Х) int F_4[][]=new int[10][10]; //кол-во клеток идущих в ряд образованных и Х и О (для О) int F_5[][]=new int[10][10]; int F_6[][]=new int[10][10]; int F_max[][]=new int[10][10]; int NL[][]=new int[10][10]; int Z[][]=new int[10][10]; int L[][]=new int[10][10]; int P[][]=new int[10][10]; int X[][]=new int[10][10]; int Y[][]=new int[10][10]; int POT[][]=new int[10][10]; int HF1[][]=new int[10][10]; int HF2[][]=new int[10][10]; //кол-во клеток разбросанных вокруг поля в 4ёх направлениях int F_A1[][]=new int[10][10]; int F_A2[][]=new int[10][10]; //возможные ходы ArrayList <Integer>AM = new ArrayList(); ArrayList <Integer>AM1 = new ArrayList(); ArrayList <Integer>AM2 = new ArrayList(); //сделанные ходы ArrayList <Integer>SET = new ArrayList(); //ArrayList <Integer>SET_0 = new ArrayList(); ArrayList <Integer>_8maxF6 = new ArrayList(); Iterator<Integer> iter; //= AM.iterator(); Iterator<Integer> iterator;// = AM.iterator(); int Q1[][]=new int[10][10]; int zz=0,ddf=0; ArrayList <Integer> arr_HF2 = new ArrayList(); public void set_Q(int str_, int sto_, int b_){ Q[str_][sto_]=b_; } public Ff(int u11, int u12){ this.u11=u11;this.u12=u12; set_desk(); for (int i=0;i<10;i++) for (int j=0;j<10;j++) { Q1[i][j]=0; } u21=6;u22=4; //randO(); set_Q(u11,u12,1); set_Q(u21,u22,2); SET.clear(); SET.add(getq(u11,u12)); SET.add(getq(u21,u22)); AM.clear(); ty=0; //Q[0][0]=2;Q[0][1]=2;Q[0][2]=2;Q[0][3]=2; //Q[1][0]=2;Q[2][0]=2;Q[3][0]=2;Q[4][0]=2; FACT(); //System.out.println(ddf); /* System.out.println("q1------"); for (int i=0;i<10;i++) for (int j=0;j<10;j++) { System.out.print("|"+Q1[i][j]); if(j==9)System.out.println(); } */ print_desk(1); }//Ff() - конструктор //region minimax /* //------------------------MIN---------------------------- public int Min(int q_,int a_, int deph_){ System.out.println(" MIN"); //System.out.println(AM2); //AM2.remove(Integer.valueOf(q_)); //System.out.println(AM2); Iterator<Integer> iterator = AM.iterator(); int next=-1; //terminal()!=0》ничья,Х или О. xod=1; nomF(1); if(terminal()!=0 || deph_>=maxDepth*2){ if(terminal()!=0)System.out.println("term " +terminal()); if(deph_>=maxDepth*2)System.out.println("maxDepth"); winner=0; xod1(); System.out.println(";X》》:"+getq(str_set,sto_set)+"("+F_6[str_set][sto_set]+")"); return (F_6[str_set][sto_set]); } int score = Integer.MAX_VALUE; while (iterator.hasNext()) { next=iterator.next(); if(Integer.valueOf(q_)==next)continue; System.out.print("nextMin="+next); get_coord(next); int str_a2=str_set; int sto_a2=sto_set; doMove(str_a2,sto_a2,2); s=Max(next,1,deph_+1); undoMove(str_a2,sto_a2); if(s<score){ str_set1=str_a2;sto_set1=sto_a2; score=s; } } System.out.println("score="+score+"q="+getq(str_set1,sto_set1)+"("+F_6[str_set1][sto_set1]+")"); return score; } //------------------------MAX---------------------------- public int Max(int q_,int a_, int deph_){ System.out.print(" MAX"); //q_ - состояние поля в результате хода игрока Min(нолик) //a_=1 - крестик(тек. токен) //AM2.addAll(AM); Iterator<Integer> iter = AM.iterator(); int next1=-1; //проверка терминального состояния в рез. хода Min xod=2; nomF(2); if(terminal()!=0 || deph_>=maxDepth*2){ if(terminal()!=0){ System.out.println(); System.out.print("term"+terminal()); } //if(deph_>=maxDepth*2)System.out.println("maxDepth"); winner=0; xod2(); System.out.println(";O》》:"+getq(str_set,sto_set)+"("+F_6[str_set][sto_set]+")"); return F_6[str_set][sto_set]; } int score = Integer.MIN_VALUE; while (iter.hasNext()) { next1=iter.next(); if(Integer.valueOf(q_)==next1)continue; System.out.print("nextMax="+next1); get_coord(next1); int str_a1=str_set; int sto_a1=sto_set; doMove(str_a1,sto_a1,1); s=Min(next1,2,deph_+1); undoMove(str_a1,sto_a1); if(s>score){ score=s; } } System.out.println("score="+score+"q="+getq(str_set1,sto_set1)+"("+F_6[str_set1][sto_set1]+")"); return score;//max } */ //endregion //------------------------X---------------------------- public int X(int q_,int a_, int deph_){ ddf++; if(ty<5)System.out.println("-- X --"); //System.out.println(AM2); //AM2.remove(Integer.valueOf(q_)); //System.out.println(AM2); //terminal()!=0》ничья,Х или О. xod1(); if(terminal()!=0 || deph_>=maxDepth*2){ //if(terminal()!=0)System.out.println("term " +terminal()); //if(deph_>=maxDepth*2)System.out.println("maxDepth"); winner=0; if(ty<5)System.out.println(";X》》:"+getq(str_set,sto_set)+"("+(-F_6[str_set][sto_set]) +")"); return (-F_6[str_set][sto_set]); } Iterator<Integer> iterator = AM.iterator(); int next=-1; int score = Integer.MAX_VALUE; while (iterator.hasNext()) { next=iterator.next(); if(Integer.valueOf(q_)==next)continue; if(ty<5)System.out.print("nextMin="+next); get_coord(next); int str_a2=str_set; int sto_a2=sto_set; doMove(str_a2,sto_a2,1); s=O(next,2,deph_+1); undoMove(str_a2,sto_a2); if(s<score){ str_a_2=str3;sto_a_2=sto3; str_set1=str_a2;sto_set1=sto_a2; score=s; } } if(ty<5)System.out.println("MIN》》score="+score+"q="+getq(str_set1,sto_set1)+"q1="+getq(str_a_2,sto_a_2));//+"("+F_6[str_set1][sto_set1]+")"); return score; } //------------------------O---------------------------- public int O(int q_,int a_, int deph_){ ddf++; int next1=-1; if(ty<5)System.out.print("-- O --"); //q_ - состояние поля в результате хода игрока Min(нолик) //a_=1 - крестик(тек. токен) //AM2.addAll(AM); //проверка терминального состояния...есть ли выигрышный ход... xod2(); if(terminal()!=0 || deph_>=maxDepth*2){ if(terminal()!=0){ System.out.println(); //System.out.print("term"+terminal()); } //if(deph_>=maxDepth*2)System.out.println("maxDepth"); winner=0; bestMove3(str_set,sto_set); if(ty<5)System.out.println(";O》》:"+getq(str_set,sto_set)+"("+F_6[str_set][sto_set]+")"); return F_6[str_set][sto_set]; } System.out.println(); Iterator<Integer> iter = AM.iterator(); //printF6(); while (iter.hasNext()) { next1=iter.next(); get_coord_free(next1); if(ty<5)System.out.print("q="+getq(str_set_free,sto_set_free)+"M_F6="+F_6[str_set_free][sto_set_free]); System.out.println(); } iter = AM.iterator(); int score = Integer.MIN_VALUE; while (iter.hasNext()) { next1=iter.next(); if(Integer.valueOf(q_)==next1)continue; if(ty<5)System.out.print("nextMax="+next1); get_coord(next1); int str_a1=str_set; int sto_a1=sto_set; doMove(str_a1,sto_a1,2); s=X(next1,1,deph_+1); undoMove(str_a1,sto_a1); if(s>score){ str_best=str_a1;sto_best=sto_a1; score=s; } } if(ty<5)System.out.println("MAX》》score="+score+"q="+getq(str_best,sto_best));//+"("+F_6[str_best][sto_best]+")"); return score;//max } //------------------------doMove---------------------------- public void doMove(int str_1,int sto_1,int a_1){ //a_1=》1-крестик》2-нолик set_Q(str_1,sto_1,a_1); //AM.remove(Integer.valueOf(getq(str_1,sto_1))); SET.add(getq(str_1,sto_1)); } //------------------------undoMove---------------------------- public void undoMove(int str_1_,int sto_1_){ //a_1=》1-крестик》2-нолик》0-пустое поле set_Q(str_1_,sto_1_,0); //AM.add(getq(str_1_,sto_1_)); SET.remove(Integer.valueOf(getq(str_1_,sto_1_))); } //------------------------get_coord---------------------------- public void get_coord(int q1){ str_set=(q1-q1%10)/10; sto_set=(q1%10); } //------------------------get_coord_free----------------------- public void get_coord_free(int q1){ str_set_free=(q1-q1%10)/10; sto_set_free=(q1%10); } //------------------------bestMove---------------------------- public void bestMove(int q11){ str_best=(q11-q11%10)/10; sto_best=(q11%10); } //------------------------bestMove---------------------------- public void bestMove(int q11,int q12){ str_best=q11; sto_best=q12; } //------------------------bestMove3---------------------------- public void bestMove3(int q11,int q12){ str3=q11; sto3=q12; } //------------------------bestMove2---------------------------- public void bestMove2(int q11,int q12){ str2=q11; sto2=q12; } //------------------------bestMove1---------------------------- public void bestMove1(int q11,int q12){ str1=q11; sto1=q12; } //------------------------FACT------------------------------- public int FACT(){ long start = System.currentTimeMillis(); int ddff=0; int q1=-1; AM_moves(); AM1.clear(); AM2.clear(); _8maxF6.clear(); arr_HF2.clear(); maxDepth=1; for (int i=0;i<10;i++) for (int j=0;j<10;j++) { F_2[i][j]=0; F_3[i][j]=0; F_4[i][j]=0; F_5[i][j]=0; F_6[i][j]=0; F_A1[i][j]=0; F_A2[i][j]=0; HF1[i][j]=0; HF2[i][j]=0; } //проверка ничья/выигрыш... if(terminal()!=0) return 0;//завершение игры nhf=false; ty++; System.out.println(); if(ty<5)System.out.println("xod1"); System.out.println(); Collections.sort(AM); System.out.println(AM); xod1(); doMove(str_set,sto_set,1); //Q1[str_set][sto_set]=zz; //AM.remove(Integer.valueOf(getq(str_set,sto_set))); System.out.println(); if(ty<5)System.out.print("X》》:"+getq(str_set,sto_set)); if(terminal()!=0) return 0;//завершение игры if(ty<5)print_desk(1); AM_moves(); //AM1(); xod2(); System.out.println(); if(ty<5)System.out.println("xod2"); for (int i=0;i<_8maxF6.size();i++) if(!AM.contains(_8maxF6.get(i)))AM.add(_8maxF6.get(i)); arr_HF2(); //print_param(2); //System.out.println(AM); //System.out.println(arr_HF2); //оставляем только ходы из которых можно сделать 5 в ряд Iterator<Integer> ih = AM.iterator(); while (ih.hasNext()) { int ihh=ih.next(); if(arr_HF2.contains(ihh)){}else ih.remove(); } System.out.println(AM); System.out.println(); minimax=true; O(getq(str_set,sto_set),2,0); minimax=false; doMove(str_best,sto_best,2); //Q1[str_set1][sto_set1]=2; System.out.println(); if(ty<5)System.out.print("O》》:"+getq(str_best,sto_best)); sc++; //AM.forEach(i -> System.out.print(i)); System.out.println(); System.out.print("sc="+sc); if(ty<5)print_desk(1); long stop = System.currentTimeMillis(); if(ty<5)System.out.println("Время= "+(int)((-start+stop)/1000)+" с"); System.out.println("итер="+ddf); return FACT(); } //------------------------F45--------------------------------------- public void F45(int kez){ int d=0,c1=0,hf_=0; int hg=0; for (int i=0;i<10;i++) for (int j=0;j<10;j++) { d=i*10+j; if(!SET.contains(d)){ //реализована стратегия крестики ходят по себе, а нолики "догоняют" //для крестиков if(HF1[i][j]==1) {c1=10;hf_++;} if(F_2[i][j]<=5 & L[i][j]<3) F_4[i][j]=F_2[i][j]+F_A1[i][j]+c1; if(F_2[i][j]==5 & L[i][j]==3) F_4[i][j]=50;//(3+2) if(F_2[i][j]==5 & L[i][j]==4) F_4[i][j]=70;//(4+1) if(F_2[i][j]==6) F_4[i][j]=300; if(F_2[i][j]>=7) F_4[i][j]=400; //if(F_4[i][j]<3) F_4[i][j]=0; //для ноликов //добавка к potence для создания вилок? if (xod==2){ if (NL[i][j]==2 & F_A2[i][j]>=5)hg=20; if (NL[i][j]==3 & F_A2[i][j]>=5)hg=20; if (NL[i][j]==4 & F_A2[i][j]>=5)hg=20; } hg=0; c1=0; if(HF2[i][j]==1) {c1=10;hf_++;} if(F_3[i][j]<5) F_5[i][j]=F_3[i][j]+F_A2[i][j]+c1; if(F_3[i][j]==5 & L[i][j]==3) F_5[i][j]=50;//(3+2) if(F_3[i][j]==5 & L[i][j]==4) F_5[i][j]=70;//(4+1) if(F_3[i][j]==6) F_5[i][j]=300; if(F_3[i][j]>=7) F_5[i][j]=400; //if(F_5[i][j]<3) F_5[i][j]=0; } } if(hf_==0)nhf=true; } //-------------------------------------F6--------------------------------- public int F6(int x_){ int max=-1000,min=1000,d=0; str_set=-1; sto_set=-1; for (int i=0;i<10;i++) for (int j=0;j<10;j++) { d=i*10+j; if(!SET.contains(d)){ F_6[i][j]=F_4[i][j]+F_5[i][j]; if(F_6[i][j]>max) { max=F_6[i][j]; str_set=i; sto_set=j; str_best=i; sto_best=j; } //за О +(максимум) | за Х -(минимум) /* if(F_6[i][j]>max & x_ ==1) { max=F_6[i][j]; str_set=i; sto_set=j; } if(F_6[i][j]<min & x_ ==2) { min=F_6[i][j]; str_set=i; sto_set=j; } */ }//end if!Set } //if(x_==1)return min; //if(x_==2)return max; return max; }//endF6 //------------------------AM1---------------------------------- public void AM1(){ //System.out.println("AM1"); //ArrayList <Integer>_t = new ArrayList(); for(int i=0;i<10;i++) for(int j=0;j<10;j++) if(Q[i][j]==0) AM1.add(getq(i,j)); //System.out.println(arr_HF2); } //------------------------arr_HF2---------------------------------- public void arr_HF2(){ //System.out.println("arr_HF2"); //ArrayList <Integer>_t = new ArrayList(); for(int i=0;i<10;i++) for(int j=0;j<10;j++) if(HF2[i][j]==1) arr_HF2.add(getq(i,j)); //System.out.println(arr_HF2); } //------------------------_8maxF6---------------------------------- public void _8maxF6(){ ArrayList <Integer>_t = new ArrayList(); for(int i=0;i<10;i++) for(int j=0;j<10;j++) _8maxF6.add(F_6[i][j]); _t.addAll(_8maxF6); Collections.sort(_8maxF6); Collections.reverse(_8maxF6); int kk =_8maxF6.size(); if ( kk > 8 ) _8maxF6.subList(8, kk).clear(); for(int i=0;i<_8maxF6.size();i++) if(_t.contains(_8maxF6.get(i)))_8maxF6.set(i,(Integer.valueOf(_t.indexOf(_8maxF6.get(i))))); Collections.sort(_8maxF6); // System.out.println(_8maxF6); } //------------------------XOD1---------------------------------- public void xod1(){ xod=1; nomF(1);//F_A1,F2 //if(sc>ty)print_param(1); nomF(2);//F_A2,F3 F45(0);//F4,F5 F6(1); /* if(sc>ty)printF_2F_3(1); if(sc>ty)printF_2F_3(2); if(sc>ty)printF_4F_5(1); if(sc>ty)printF_4F_5(2); if(sc>ty)printF6();*/ //if(sc>ty)print_desk(1); } //------------------------XOD2----------------------------------- public void xod2(){ xod=2; nomF(1); nomF(2); if(sc>ty)print_param(2); F45(0);//F4,F5 F6(2); /* if(sc>ty)printF_2F_3(1); if(sc>ty)printF_2F_3(2); if(sc>ty)printF_4F_5(2); if(sc>ty)printF6();*/ //if(sc>ty)print_desk(2); } //------------------------terminal---------------------------- public int terminal(){ scF6=0; for (int i=0;i<10;i++) for (int j=0;j<10;j++) { if(Q[i][j]==0)scF6++;//определение ничьи } //nhf- нет возможности поставить 5 в ряд //scF6=0 - нет свободных клеток if(nhf || scF6==0){ //Rextester.sci++;//кол. проходов if(!minimax)System.out.print("Ничья!"); return 3; } if(winner==1){ //Rextester.scy++;//кол. проходов if(!minimax)System.out.print("Выиграл Х"); return 1; } if(winner==2){ //Rextester.scz++;//кол. проходов if(!minimax)System.out.print("Выиграл О"); return 2; } return 0; } public void print_param(int a){ /* if(sc>ty){ System.out.println("Z"+a); for (int ii=0; ii<10; ii++) for (int jj=0; jj<10; jj++) { System.out.print("|"+Z[ii][jj]); if (jj==9) System.out.print("\n"); } System.out.println("P"+a); for (int ii=0; ii<10; ii++) for (int jj=0; jj<10; jj++) { System.out.print("|"+P[ii][jj]); if (jj==9) System.out.print("\n"); } */ /* System.out.println("L"+a); for (int ii=0; ii<10; ii++) for (int jj=0; jj<10; jj++) { System.out.print("|"+L[ii][jj]); if (jj==9) System.out.print("\n"); } */ /* System.out.println("XY"+a); for (int ii=0; ii<10; ii++) for (int jj=0; jj<10; jj++) { if (X[ii][jj]!=0) System.out.print("|"+X[ii][jj]+Y[ii][jj]);else System.out.print("|0"); if (jj==9) System.out.print("\n"); } //System.out.print("HAF_W="+HAF_W); //System.out.println(" max="+maxF);//+"("+cur+")"+"; min="+minF); //существует эффект перезаписи z */ /* if((a==1 & xod==1) || (a==2 & xod==2)){ System.out.println("NL-----"+a); for (int yt=0; yt<10; yt++) for (int uu=0; uu<10; uu++) { System.out.print("|"+NL[yt][uu]); if (uu==9) System.out.print("\n"); } } if((a==1 & xod==1) ){ System.out.println("F_A1-----"+a); for (int yt=0; yt<10; yt++) for (int uu=0; uu<10; uu++) { System.out.print("|"+F_A1[yt][uu]); if (uu==9) System.out.print("\n"); } } if((a==2 & xod==2) ){ System.out.println("F_A2-----"+a); for (int yt=0; yt<10; yt++) for (int uu=0; uu<10; uu++) { System.out.print("|"+F_A2[yt][uu]); if (uu==9) System.out.print("\n"); } } System.out.println("HF"+a); for (int ii=0; ii<10; ii++) for (int jj=0; jj<10; jj++) { if(a==1)System.out.print("|"+HF1[ii][jj]); else System.out.print("|"+HF2[ii][jj]); if (jj==9) System.out.print("\n"); } */ } public void randO(){ int rand; boolean f=false; while(f!=true){ rand=(int)(Math.random()*3); if(rand==0)u21=u11-1; if(rand==1)u21=u11; if(rand==2)u21=u11+1; if((u21-1)>=0 & (u21+1)<10){ while(true){ rand=0+(int)(Math.random()*3); if(rand==0)u22=u12-1; if(rand==1)u22=u12; if(rand==2)u22=u12+1; if((u22-1)>=0 & (u22+1)<10) if((u21*10+u22)!=getq(u11,u12)){f=true; break;} }//2 }//if }//1 } public void printF_4F_5(int f45){ if(f45==1){ System.out.println("F_4-----"); for (int i=0; i<10; i++) for (int j=0; j<10; j++) { if(i==u11 & j==u12)System.out.print("|£");else if(i==u21 & j==u22)System.out.print("|€");else System.out.print("|"+F_4[i][j]); if (j==9) System.out.print("\n"); } } if(f45==2){ System.out.println("F_5-----"); for (int i=0; i<10; i++) for (int j=0; j<10; j++) { if(i==u11 & j==u12)System.out.print("|£");else if(i==u21 & j==u22)System.out.print("|€");else System.out.print("|"+F_5[i][j]); if (j==9) System.out.print("\n"); } } } public void printF_2F_3(int f23){ if(f23==1){ System.out.println("F_2-----"); for (int i=0; i<10; i++) for (int j=0; j<10; j++) { if(i==u11 & j==u12)System.out.print("|£");else if(i==u21 & j==u22)System.out.print("|€");else System.out.print("|"+F_2[i][j]); if (j==9) System.out.print("\n"); } } if(f23==2){ System.out.println("F_3-----"); for (int i=0; i<10; i++) for (int j=0; j<10; j++) { if(i==u11 & j==u12)System.out.print("|£");else if(i==u21 & j==u22)System.out.print("|€");else System.out.print("|"+F_3[i][j]); if (j==9) System.out.print("\n"); } } } public void printF6(){ System.out.println("F6-----"); for (int i=0; i<10; i++) for (int j=0; j<10; j++) { if(i==u11 & j==u12)System.out.print("|£");else if(i==u21 & j==u22)System.out.print("|€");else System.out.print("|"+F_6[i][j]); if (j==9) System.out.print("\n"); } } //------------------------getq---------------------------------- public int getq(int q1, int q2){ int y; y=(q1*10+q2); return y; } //------------------------AM_moves---------------------------- public void AM_moves(){ int q=0; for (int i=0;i<10;i++) for (int j=0;j<10;j++) { if (Q[i][j]==1 || Q[i][j]==2) { if((i-1)>=0) if ((!AM.contains(getq(i-1,j))) & (!SET.contains(getq(i-1,j))))AM.add(getq(i-1,j)); if((i+1)<10) if (!AM.contains(getq(i+1,j)) & (!SET.contains(getq(i+1,j)) ))AM.add(getq(i+1,j)); if((j-1)>=0) if (!AM.contains(getq(i,j-1)) & (!SET.contains(getq(i,j-1) )))AM.add(getq(i,j-1)); if((j+1)<10) if (!AM.contains(getq(i,j+1)) & (!SET.contains(getq(i,j+1) )))AM.add(getq(i,j+1)); if((i-1)>=0 & (j-1)>=0) if (!AM.contains(getq(i-1,j-1)))AM.add(getq(i-1,j-1)); if((i-1)>=0 & (j+1)<10) if (!AM.contains(getq(i-1,j+1)) & !SET.contains(getq(i-1,j+1) ))AM.add(getq(i-1,j+1)); if((i+1)<10 & (j+1)<10) if (!AM.contains(getq(i+1,j+1)) & !SET.contains(getq(i+1,j+1) ))AM.add(getq(i+1,j+1)); if((i+1)<10 & (j-1)>=0) if (!AM.contains(getq(i+1,j-1))& !SET.contains(getq(i,j+1) ))AM.add(getq(i+1,j-1)); } } Collections.sort(AM); AM.removeAll(SET); /* System.out.println("Возможные ходы:"); for (Integer i:AM) System.out.print(";"+i); System.out.println(); System.out.println("SET:"); for (Integer i:SET) System.out.print(";"+i); System.out.println(""); */ } public void set_desk(){ for (int i=0;i<10;i++) for (int j=0;j<10;j++) { //r=0+(int)(Math.random()*8); //if(r>=3)r=0; r=0; Q[i][j]=r; } }//setdesk public void print_desk(int m){ System.out.println(); System.out.println("-----Q-----"+m); for (int i=0;i<10;i++) for (int j=0;j<10;j++) { /* if(i==str_set & j==sto_set & m==1)System.out.print("|£");else if(i==str_set & j==sto_set & m==2)System.out.print("|€");else */ if(i==0 & j==0){System.out.print(" "); for (int k=0;k<10;k++){ System.out.print(k+" "); } System.out.println(); } if(j%10==0)System.out.print(i+" "); if(i==u11 & j==u12)System.out.print("|£"); else if(i==u21 & j==u22)System.out.print("|€");else System.out.print("|"+Q[i][j]); if (j==9) System.out.print("\n"); } System.out.print("\n"); }//printdesk //------------------------nomF-------------------------------------- public void nomF(int a){ int pl1=0,pl2=0, xx, yy,x1,y1,x2,y2,x3,y3,x4,y4, potence=0; fg=false; int nlm=10,sr=111,so=111,sr_l=111,so_l=111, line=0,l=0; // l - величина линии на итерации int maxF=-1000, minF=1000,cur=0, nl=0; boolean HAF=false,HAF_W=false, aten,key; for (int i=0;i<10;i++) for (int j=0;j<10;j++) { F_A1[i][j]=0; F_A2[i][j]=0; F_max[i][j]=0; NL[i][j]=0; Z[i][j]=0; L[i][j]=0; P[i][j]=0; X[i][j]=0; Y[i][j]=0; POT[i][j]=0; } //Q[0][5]=0; Q[1][5]=0; Q[2][5]=1; Q[3][5]=2; Q[4][5]=0; Q[5][5]=0; Q[6][5]=0; Q[7][5]=2; Q[8][5]=0; //Q[4][5]=1; Q[4][7]=1; if(a==1) {pl1=1;pl2=2;} if(a==2) {pl1=2;pl2=1;} if(a>2 | a<1) {System.out.println("Неверное значение");} // Q - матрица игрового поля // p - расчётное поле матрицы с его текущими координатами (str, sto). // W - выигрышная комбинация (=4+р.поле) // F - значение величины поля // pot - расчётный потенциал поля //for main nomF for (str=0; str<10; str++) for (sto=0; sto<10; sto++) { if (Q[str][sto]!=0) { if (a==1)F_2[str][sto]=0; if (a==2)F_3[str][sto]=0; continue; } int F=0, F1=0,F2=0, F3=0, F4=0;//(токен) int t1=0, t2=0, t3=0, t4=0,W=4, z1=0,z2=0,z3=0,z4=0,k=0,haf=0,z=-1; int pot=0,pot1=0,pot2=0,pot3=0,pot4=0; //для проверки поместится ли пять в ряд boolean pW1=false,pW2=false, pW3=false,pW4=false; HAF=false; nl=0;line=1;potence=0;z=0; //для проверки 5 в ряд. Ниже опять=0 Q[str][sto]=a; haf=0;l=0;aten=false; key=false; x1=-1;y1=-1; for (int i=0; i<9; i++){ //проверяем что поле находится в пределах игрового поля if( (str-W+i)>=0 & (str-W+i)<10){ //проверяем вертикаль xx=(str-W+i); //t1 кол. клеток в ряд //haf кол. клеток для проверки 5 в ряд if (Q[xx][sto]==pl1) {t1++;haf++;} // aten отсечка клеток идущих подряд //клетки попадающиеся вдоль проверяемой линии //key для сохранения координат начала линии // x1, y1 координаты начала линии //l длина линии на текущей итерации //line наибольшая в серии итераций(4 за одну проверяемую клетку) длина линии if (Q[xx][sto]==pl1 & !aten){l++;if(!key){x1=xx;y1=sto;key=true;}if (l==5)line=l;} //z1 кол. незанятых клеток if (Q[xx][sto]==0) z1++; //pW1 поместится или нет 5 в ряд //pot1 кол. значимых полей (свободных и токенов) //F кол. токенов на отрезке //line кол. токенов в линии собранной вокруг центрального (проверяемого) токена (а) if ((t1+z1)>=5 & t1>=1) {pW1=true;F1=t1;} if (Q[xx][sto]==pl2) {t1=0; z1=0; } //aten - отсечка по которой происходит фиксация длинны линии //z номер линии (1-вертикаль,2-горизонт...) if (Q[xx][sto]==0 || Q[xx][sto]==pl2){haf=0;if ((xx)>str ) {aten=true;if (l>line) {line=l;z=1;}}if ((xx)!=str & !aten){l=0; x1=-1;y1=-1;key=false;}} if (l>=5) z=1; //HAF_W есть пять в ряд или нет if (haf>=5) {HAF=true;HAF_W=true;} if((xx+1)==10 & line<2)line=1; } } haf=0;l=0;aten=false; key=false; x2=-1;y2=-1; for (int i=0; i<9; i++){ //проверяем что поле находится в пределах игрового поля if( (sto-W+i)>=0 & (sto-W+i)<10){ yy=(sto-W+i); //проверяем горизонталь if (Q[str][sto-W+i]==pl1) {t2++;haf++;} if (Q[str][sto-W+i]==pl1 & !aten){l++;if(!key){x2=str;y2=yy;key=true;}if (l==5)line=l;} if (Q[str][sto-W+i]==0) {z2++;} if ( (t2+z2)>=5 & t2>=1){pW2=true;F2=t2;} if (Q[str][sto-W+i]==pl2) {t2=0; z2=0; } if (Q[str][sto-W+i]==0 || Q[str][sto-W+i]==pl2) {haf=0; if ((sto-W+i)>sto) {aten=true;if (l>line) {line=l;z=2;}}if ((sto-W+i)!=sto & !aten){l=0; x2=-1;y2=-1;key=false;} } if (l>=5) z=2; if (haf>=5) {HAF=true;HAF_W=true;} if((sto-W+i+1)==10 & line<2)line=1; } } //if(str==1 & sto==2)System.out.println("l="+l+"; line="+line); haf=0;l=0;aten=false; key=false; x3=-1;y3=-1; for (int i=0; i<9; i++){ //проверяем что поле находится в пределах игрового поля if( (sto-W+i)>=0 & (sto-W+i)<10 & (str-W+i)>=0 & (str-W+i)<10){ xx=(str-W+i);yy=(sto-W+i); //проверяем диагональ прямую if (Q[str-W+i][sto-W+i]==pl1) {t3++;haf++;} if (Q[str-W+i][sto-W+i]==pl1 & !aten){l++;if(!key){x3=xx;y3=yy;key=true;}if (l==5)line=l;} if (Q[str-W+i][sto-W+i]==0) {z3++;} if ( (t3+z3)>=5 & t3>=1){pW3=true;F3=t3;} if (Q[str-W+i][sto-W+i]==pl2) {t3=0; z3=0;} if (Q[str-W+i][sto-W+i]==0 || Q[str-W+i][sto-W+i]==pl2) { haf=0; if ((str-W+i)>str & (sto-W+i)>sto) {aten=true;if (l>line) {line=l;z=3;}}if ((str-W+i)!=str & (sto-W+i)!=sto & !aten){l=0; x3=-1;y3=-1;key=false;}} if (l>=5) z=3; if (haf>=5) {HAF=true;HAF_W=true;} if((str-W+i+1)==10 & (sto-W+i+1)==10 & line<2)line=1; } } haf=0;l=0;aten=false; key=false; x4=-1;y4=-1; for (int i=0; i<9; i++){ //проверяем что поле находится в пределах игрового поля if( (sto-W+i)>=0 & (sto-W+i)<10 & (str+W-i)>=0 & (str+W-i)<10){ xx=(str+W-i);yy=(sto-W+i); //проверяем диагональ / if (Q[str+W-i][sto-W+i]==pl1) {t4++;haf++;} if (Q[str+W-i][sto-W+i]==pl1 & !aten){l++;if(!key){x4=xx;y4=yy;key=true;}if (l==5)line=l;} if (Q[str+W-i][sto-W+i]==0) {z4++;} if ( (t4+z4)>=5 & t4>=1){ pW4=true;F4=t4;} if (Q[str+W-i][sto-W+i]==pl2) {t4=0; z4=0; } if (Q[str+W-i][sto-W+i]==0 || Q[str+W-i][sto-W+i]==pl2) {haf=0; if ((str+W-i)<str & (sto-W+i)>sto) {aten=true;if (l>line) {line=l;z=4;}} if ((str+W-i)!=str & (sto-W+i)!=sto & !aten){l=0; x4=-1;y4=-1;key=false;}} if (l>=5) z=4; if (haf>=5) {HAF=true;HAF_W=true;} //для правого нижнего поля line if((str+W-i-1)==-1 & (sto-W+i+1)==10 & line<2)line=1; } } //if(str==3 & sto==6)System.out.println("l="+l+"; line="+line); //обратно возвращается нейтральное значение Q[str][sto]=0; //Учет ведется через //line наибольшая в серии итераций(4 за одну проверяемую клетку) длина линии //F кол. токенов на отрезке(отрезков всего 4) if(F1>1){nl++;k++;}if(F2>1){nl++;k++;} if(F3>1){nl++;k++;}if(F4>1){nl++;k++;} //исключается учёт повторных пересечений F=F1+F2+F3+F4-(k-1); //значащие линии (F>1) при расчёте F NL[str][sto]=nl; if(pW1 || pW2 || pW3 || pW4){ if(a==1 & xod==1) HF1[str][sto]=1; if(a==2 & xod==2) HF2[str][sto]=1; } if(a==1 & xod==1) F_A1[str][sto]=F; if(a==2 & xod==2) F_A2[str][sto]=F; Z[str][sto]=z; L[str][sto]=line; //region longestLine //определение самой длинной линии в текущей точке в одном из 4ёх возможных направлений switch (z){ //вертикаль case 1: //xi,yi - коорд. первой клетки линии //line - длинна самой длинной линии на итерации X[str][sto]=x1;Y[str][sto]=y1; if((x1-1)>=0 & (x1+line)<10){ if(Q[x1-1][y1]==0 & Q[x1-1][y1]==0) potence=2+line; if(Q[x1-1][y1]==pl2 & Q[x1-1][y1]==pl2) potence=line; if((Q[x1-1][y1]==pl2 & Q[x1-1][y1]==0) || (Q[x1-1][y1]==0 & Q[x1-1][y1]==pl2)) potence=1+line; } if((x1-1)==-1){ if(Q[x1+line][y1]==pl2) potence=line; if(Q[x1+line][y1]==0) potence=1+line; } if((x1+line)==10){ if(Q[x1-1][y1]==pl2) potence=line; if(Q[x1-1][y1]==0) potence=1+line; } if((!pW1) & (!pW2) & (!pW3) &(!pW4))potence=potence-3;//исключаем выбор не помещяющихся в пять в ряд if(line==5)potence=potence+30; break; //горизонталь case 2: X[str][sto]=x2;Y[str][sto]=y2; if((y2-1)>=0 & (y2+line)<10){ if(Q[x2][y2-1]==0 & Q[x2][y2+line]==0) potence=2+line; if(Q[x2][y2-1]==pl2 & Q[x2][y2+line]==pl2) potence=line; if((Q[x2][y2-1]==pl2 & Q[x2][y2+line]==0) || (Q[x2][y2-1]==0 & Q[x2][y2+line]==pl2)) potence=1+line; } if((y2-1)==-1){ if(Q[x2][y2+line]==pl2) potence=line; if(Q[x2][y2+line]==0) potence=1+line; } if((y2+line)==10){ if(Q[x2][y2-1]==pl2) potence=line; if(Q[x2][y2-1]==0) potence=1+line; } if((!pW1) & (!pW2) & (!pW3) &(!pW4))potence=potence-3; if(line==5)potence=potence+30; break; // прямая диагональ case 3: X[str][sto]=x3;Y[str][sto]=y3; if((x3-1)>=0 & (y3-1)>=0 & (x3+line)<10 & (y3+line)<10){ if(Q[x3-1][y3-1]==0 & Q[x3+line][y3+line]==0) potence=2+line; if(Q[x3-1][y3-1]==pl2 & Q[x3+line][y3+line]==pl2) potence=line; if((Q[x3-1][y3-1]==pl2 & Q[x3+line][y3+line]==0) || (Q[x3-1][y3-1]==0 & Q[x3+line][y3+line]==pl2)) potence=1+line; } if(((x3-1)==-1 || (y3-1)==-1) & ((x3+line)<10 & (y3+line)<10)){ if(Q[x3+line][y3+line]==pl2) potence=line; if(Q[x3+line][y3+line]==0) potence=1+line; } if(((x3+line)==10 || (y3+line)==10) & ((x3-1)>=0 & (y3-1)>=0)){ if(Q[x3-1][y3-1]==pl2) potence=line; if(Q[x3-1][y3-1]==0) potence=1+line; } if((!pW1) & (!pW2) & (!pW3) &(!pW4))potence=potence-3; if(line==5)potence=potence+30; break; //обратная диагональ case 4: X[str][sto]=x4;Y[str][sto]=y4; if((x4+1)<10 & (y4-1)>=0 & (x4-line)>=0 & (y4+line)<10){ if(Q[x4+1][y4-1]==0 & Q[x4-line][y4+line]==0) potence=2+line; if(Q[x4+1][y4-1]==pl2 & Q[x4-line][y4+line]==pl2) potence=line; if((Q[x4+1][y4-1]==pl2 & Q[x4-line][y4+line]==0) || (Q[x4+1][y4-1]==0 & Q[x4-line][y4+line]==pl2)) potence=1+line; } if(((x4+1)==10 || (y4-1)==-1) & ((x4-line)>=0 & (y4+line)<10)){ if(Q[x4-line][y4+line]==pl2) potence=line; if(Q[x4-line][y4+line]==0) potence=1+line; } if(((x4-line)==-1 || (y4+line)==10) & ((x4+1)<10 & (y4-1)>=0)){ if(Q[x4+1][y4-1]==pl2) potence=line; if(Q[x4+1][y4-1]==0) potence=1+line; } if((!pW1) & (!pW2) & (!pW3) &(!pW4))potence=potence-3; if(line==5)potence=potence+30; break; } //endregion P[str][sto]=potence; //F_2- потенциал для токен(Х). F_3- токен(О). if(line>1) { if (a==1)F_2[str][sto]=potence; if (a==2)F_3[str][sto]=potence; } else { if (a==1)F_2[str][sto]=line; if (a==2)F_3[str][sto]=line; } //определение максимума F со всего поля //if(F>maxF)maxF=F; //if(F<minF)minF=F; /* if(lineMax<line){ lineMax=line; sr_l=str; so_l=sto; } */ //установка координат победного хода if(HAF_W==true){ str_set=str;sto_set=sto; } }// formainF //есть ли победитель //if(!minimax){ if(HAF_W & a==1 & xod==1){winner=1;} if(HAF_W & a==2 & xod==2){winner=2;} }//nomF }//Ff
run
|
edit
|
history
|
help
0
Java Lambda Expression Sample
rd dap da
Problem: on_off
get top k frequent elements ( Priority Queue implementation ) Language: Editor: Layout:
Java Switch
formuły
Link document
Extracting Value from a String that contains key value pairs
MinMaxArray
palin