Algoritma Goziqi AI juga merupakan algoritma AI game yang khas. Beberapa algoritma AI catur dapat digunakan sebagai referensi. Berikut ini adalah kode implementasi Java.
Antarmuka abstrak catur
impor java.util.list; antarmuka publik ichessboard {// dapatkan koordinat horizontal maksimum dari dewan int getmaxx (); // maksimum koordinat vertikal int getmaxy (); // Dapatkan semua poin kosong saat ini, dan poin -poin ini hanya dapat memainkan daftar publik catur <point> getFreepoints (); }Implementasi kelas catur
// titik kelas catur {// Ini adalah kinerja, diatur ke publik int x; int y publik; publik int getx () {return x; } public point setx (int x) {this.x = x; kembalikan ini; } public int gety () {return y; } public point sety (int y) {this.y = y; kembalikan ini; } public point (int x, int y) {this.x = x; this.y = y; } @Override public int hashCode () {return x + y; } @Override public boolean sama (objek obj) {if (this == obj) mengembalikan true; Point lain = (point) obj; if (x! = Other.x) mengembalikan false; if (y! = Other.y) mengembalikan false; Kembali Benar; }} Antarmuka abstrak pemain
impor java.util.list; Public Interface iPlayer {// Langkah selanjutnya adalah lulus set papan catur bahwa lawan telah mengatur run public void (daftar <point> musuh, titik titik); haswin boolean publik (); Public Void SetChessboard (Ichessboard Chessboard); Daftar Publik <Point> getMypoints (); } Kelas Abstrak Dasar Pemain
impor java.util.arraylist; impor java.util.list; Baseplayer kelas abstrak publik mengimplementasikan iPlayer {// bagian catur yang telah saya tempatkan daftar yang dilindungi <coint> mypoints = new ArrayList <Point> (200); // papan catur yang dilindungi papan ichessboard; // Koordinat horizontal dan vertikal maksimum papan dilindungi int maxx; Int Maxy yang dilindungi; // semua potongan catur kosong daftar yang dilindungi <coint> allfreepoints; @Override Public Final List <Point> getMypoints () {return myPoints; } @Override public void setChessboard (ichessboard chessboard) {this.chessboard = CHESSBOARD; allFreepoints = cysboard.getFreepoints (); maxx = chessboard.getmaxx (); maxy = chessboard.getmaxy (); mypoints.clear (); } private final point temp = poin baru (0, 0); // apakah saya memenangkan haswin boolean akhir publik () {if (mypoints.size () <5) {return false; } Point point = mypoints.get (mypoints.size ()-1); Int count = 1; int x = point.getX (), y = point.gety (); // horizontal- temp.setx (x) .sety (y); while (mypoints.contains (temp.setx (temp.getx ()-1)) && temp.getx ()> = 0 && count <5) {count ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); while (mypoints.contains (temp.setx (temp.getx ()-1)) && temp.getx ()> = 0 && count <5) {count ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); while (mypoints.contains (temp.setx (temp.getx ()+1)) && temp.getx () <maxx && count <5) {count ++; } if (count> = 5) {return true; } // tegak lurus | hitung = 1; temp.setx (x) .sety (y); while (mypoints.contains (temp.sety (temp.gety ()-1)) && temp.gety ()> = 0) {count ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); while (mypoints.contains (temp.sety (temp.gety ()-1)) && temp.gety ()> = 0) {count ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); while (mypoints.contains (temp.sety (temp.gety ()+1)) && temp.gety () <maxy && count <5) {count ++; } if (count> = 5) {return true; } // Maju Miring/Count = 1; temp.setx (x) .sety (y); while (mypoints.contains (temp.setx (temp.getx ()-1) .sety (temp.gety ()+1)) && temp.getx ()> = 0 && temp.gety () <maxy) {count ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); while (mypoints.contains (temp.setx (temp.getx ()+1) .sety (temp.gety ()-1)) && temp.getx () <maxx && temp.gety ()> = 0 && count <6) {count ++; } if (count> = 5) {return true; } // backslash/count = 1; temp.setx (x) .sety (y); while (mypoints.contains (temp.setx (temp.getx ()-1) .sety (temp.gety ()-1)) && temp.getx ()> = 0 && temp.gety ()> = 0) {count ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); while (mypoints.contains (temp.setx (temp.getx ()+1) .sety (temp.gety ()+1)) && temp.getx () <maxx && temp.gety () <maxy && count <5) {count ++; } if (count> = 5) {return true; } return false; }} Implementasi AI Komputer
impor java.util.arraylist; impor java.util.collections; impor java.util.hashmap; impor java.util.list; impor java.util.map; // Kelas inti dari algoritma, gagasan utama algoritma dibagi menjadi tiga langkah. // Langkah pertama: Secara siklis mengasumsikan skor untuk diri sendiri dan pihak lain (untuk membuat skor dalam kisaran tertentu) sesuai dengan situasi saat ini dari kedua belah pihak, dan menilai perubahan dalam situasi yang dapat dibawa oleh bagian ini, seperti apakah dapat terburu -buru, apakah itu dapat membentuk 1 atau satu live (masing -masing. itu setengah hidup 4), dll.), Termasuk musuh dan sisi kita. // Langkah 3: Urutkan hasil sebelumnya sesuai dengan aturan yang diberikan oleh pengguna dan pilih bentuk sub -subjek dan defensif (ada aturan untuk bentuk ofensif dan defensif) kelas publik Basecomputerai memperluas baseplayer {// empat arah, horizontal -, vertikal | , forward-slant /, back-slant / private static final int heng = 0; private static final int zhong = 1; private static final int zheng_xie = 2; private static int int fan_xie = 3; // depan ke belakang private static final boolean forward = true; private static final boolean mundur = false; // Tampilkan hasil analisis. Apakah titik saat ini adalah lulus dua ujung (hidup) atau hanya lulus satu ujung (Half_alive), proses analisis potongan catur yang diblokir secara otomatis diblokir, bukan sebagai bagian catur untuk dipilih int private static final Alive = 1; private static final int half_alive = 0; // private static final int dead = -1; // Hitung jangkauan, rentang yang terlalu besar akan memiliki masalah kinerja kalkuteRange kelas pribadi {int xstart, ystart, xstop, ystop; Private CalcuteRange (int xstart, int ystart, int xstop, int ystop) {this.xstart = xstart; this.istart = ystart; this.xstop = xstop; this.ystop = ystop; }} // Batasi rentang perhitungan komputer. Jika seluruh kinerja perhitungan papan catur terlalu buruk, saat ini dibentuk berdasarkan nilai batas semua potongan catur yang telah digunakan. Saat ini 1 private static int int range_step = 1; Calcutearing CurrentRange = New CalcuteRange (0, 0, 0, 0); private void initrange (Daftar <Point> couters, daftar <point> manusia) {currentRange.xStart = humans.get (0) .getx ()-range_step; CurrentRange.istart = Humans.get (0) .gety ()-range_step; currentRange.xstop = Humans.get (0) .getX ()+range_step; currentRange.ystop = humans.get (0) .gety ()+range_step; untuk (titik titik: manusia) {if (point.getx ()-range_step <currentRange.xStart) {currentRange.xstart = point.getx ()-range_step; } else if (point.getX ()+range_step> currentRange.xstop) {currentRange.xstop = point.getX ()+range_step; } if (point.gety ()-range_step <currentRange.ystart) {currentRange.ystart = point.gety ()-range_step; } else if (point.gety ()+range_step> currentRange.ystop) {currentRange.ystop = point.gety ()+range_step; }} untuk (titik titik: couters) {if (point.getx ()-range_step <currentRange.xStart) {currentRange.xstart = point.getx ()-range_step; } else if (point.getX ()+range_step> currentRange.xstop) {currentRange.xstop = point.getX ()+range_step; } if (point.gety ()-range_step <currentRange.ystart) {currentRange.ystart = point.gety ()-range_step; } else if (point.gety ()+range_step> currentRange.ystop) {currentRange.ystop = point.gety ()+range_step; }} // Jika kisaran diperluas dan melebihi papan catur, itu sama dengan papan catur saat ini. currentRange.istart = currentRange.istart <0? 0: currentRange.istart; currentRange.istart = currentRange.istart <0? 0: currentRange.istart; currentRange.xstop = currentRange.xStop> = maxx? maxx-1: currentRange.xstop; currentRange.ystop = currentRange.ystop> = maxy? maxy-1: currentrange.ystop; } // menganalisis bentuk metode entri saat ini. Analisis dibagi menjadi tiga langkah secara total. Langkah ketiga dapat dikendalikan oleh subkelas untuk kesulitan. poin pribadi doanalysis (daftar <point> couters, daftar <point> manusia) {if (manusia. } // inisialisasi rentang perhitungan initrange (comuters, manusia); // Bersihkan hasil sebelumnya initanalysisResults (); // Mulai analisis, pindai semua titik kosong, dan bentuk titik analisis pertama Bestpoint = dofirstanalysis (Comuters, Humans); if (bestpoint! = null) {//system.out.println(" ini adalah yang paling penting, Anda hanya dapat memainkan bagian ini "); Return BestPoint; } // Analisis hasil pertama dan temukan poin terbaik Anda BestPoint = DOCOMPUTERSENCONDANANYSIS (COMPUTERFIRSTRESULTS, COMPUTERCODRESULTS); if (bestpoint! = null) {//system.out.println("i'm akan menang, saya akan memainkan bagian ini "); Return BestPoint; } computerFirStresults.clear (); System.gc (); // analisis hasil pertama dan temukan poin terbaik dari musuh terbaik = dohumansencondanalisis (humanfirstresults, humansencodresults); if (bestpoint! = null) {//system.out.println("if Anda tidak memainkan bagian ini, Anda akan kalah "); Return BestPoint; } humanfirstresults.clear (); System.gc (); // Tidak ada titik pembunuhan akhir yang ditemukan, analisis hasil ketiga mengembalikan dothirdanalysis (); } // Langkah pertama dari bagian catur tidak memerlukan perhitungan yang rumit, dan diselesaikan berdasarkan nilai X dari langkah pertama manusia dari potongan catur. Private Point GetFirstPoint (Daftar <Point> manusia) {point point = Humans.get (0); if (point.getx () == 0 || point.gety () == 0 || point.getx () == maxx && point.gety () == maxy) mengembalikan titik baru (maxx/2, maxy/2); else {return new point (point.getX ()-1, point.gety ()); }} // Private Int Debugx, Debugy; // Gunakan untuk Debug // Mulai Analisis, Pindai Semua Poin Kosong, dan Bentuk Hasil Analisis Pertama Poin Pribadi Dofirstanalysis (Daftar <Point> Couters, Daftar <Point> Humans) {int size = allFreepoints.size (); Point computerpoint = null; Point humanpoint = null; int x, y; FirstanalysisResult firstanalysisResult; untuk (int i = 0; i <size; i ++) {computerpoint = allfreepoints.get (i); // Klik koordinat X dan Y terlebih dahulu, karena objek asli akan diubah selama proses analisis x = computerpoint.getx (); y = computerpoint.gety (); if (x <currentrange.xstart || x> currentRange.xstop || y <currentRange.ystart || y> currentrange.ystop) {lanjutan; } // if (x == debugx && y == debugy) {// system.out.println ("sssssssssssssssssssssssssssssssssssss) {lanjutan;} // if (x == debug & y == ==) {{} // if (x == debug & & y == ==) {{} // if (x == debug & & y == ==) {{} // if (x == y == System.out.println("ssssssssssssssssssssssssssssssssssssssssssss){ // } //Try to set a chess piece at this position and analyze the states that we can only form in the "horizontal" direction, such as live 4, live 3, semi-living 4, live 2, etc. firstAnalysisResult = tryandcountresult (comuters, manusia, computerpoint, heng); computerpoint.setx (x) .sety (y); // Balas nilai asli dari titik untuk analisis berikutnya jika (firstanalysisResult! = null) {// tidak ada hasil pengembalian, tidak mungkin untuk mencapai lima bagian catur ke arah ini. If (firstanalysisResult.count == 5) // sama dengan 5 berarti Anda dapat memainkan catur pada titik ini dan Anda dapat terhubung ke 5. Jika Anda menang, Anda tidak akan menganalisisnya. Mengembalikan ComputerPoint; // Catat hasil analisis pertama addtofirstanalysisResult (firstanalysisResult, computerFirStresults); } // Ulangi langkah -langkah di atas dalam "arah vertikal" firstanalysisResult = tryandcountresult (comuters, manusia, computerpoint, zhong); computerpoint.setx (x) .sety (y); if (firstanalysisResult! = null) {// mati catur, jangan mainkan if (firstanalysisResult.count == 5) return computerpoint; addtofirstanalysisResult (firstanalysisResult, computerFirstresults); } // Maju Miring FirstanalysisResult = TryAndCountresult (Comuters, Humans, ComputerPoint, Zheng_xie); computerpoint.setx (x) .sety (y); if (firstanalysisResult! = null) {// catur mati, jangan mainkan jika (firstanalysisResult.count == 5) return computerpoint; addtofirstanalysisResult (firstanalysisResult, computerFirstresults); } // Backside firstanalysisResult = tryandcountresult (comuters, manusia, computerpoint, fan_xie); computerpoint.setx (x) .sety (y); if (firstanalysisResult! = null) {// catur mati, jangan mainkan jika (firstanalysisResult.count == 5) return computerpoint; addtofirstanalysisResult (firstanalysisResult, computerFirstresults); } // Menganalisis keadaan karya ini dalam musuh dalam arah "horizontal", seperti musuh Live 3, semi-hidup, dll. FirstanalysisResult = tryandcountresult (manusia, comuters, computerpoint, heng); computerpoint.setx (x) .sety (y); if (firstanalysisResult! = null) {// die catur, jangan mainkan jika (firstanalysisResult.count == 5) humanpoint = computerpoint; addtofirstanalysisResult (firstanalysisresult, humanfirstresults); } // "Long-Perpendicular" firstanalysisResult = tryandcountresult (manusia, comuters, computerpoint, zhong); computerpoint.setx (x) .sety (y); if (firstanalysisResult! = null) {// die catur, jangan mainkan if (firstanalysisResult.count == 5) humanpoint = computerpoint; addtofirstanalysisResult (firstanalysisresult, humanfirstresults); } // "Forward-Slant" firstanalysisResult = tryandcountresult (manusia, comuters, computerpoint, zheng_xie); computerpoint.setx (x) .sety (y); if (firstanalysisResult! = null) {// die catur, jangan mainkan if (firstanalysisResult.count == 5) humanpoint = computerpoint; addtofirstanalysisResult (firstanalysisresult, humanfirstresults); } // "backslash" firstanalysisResult = tryandcountresult (manusia, comuters, computerpoint, fan_xie); computerpoint.setx (x) .sety (y); if (firstanalysisResult! = null) {// die catur, jangan mainkan if (firstanalysisResult.count == 5) humanpoint = computerpoint; addtofirstanalysisResult (firstanalysisresult, humanfirstresults); }} // Jika tidak ada bagian yang menang, analisis pertama tidak perlu mengembalikan hasil analisis pertama; } // Analisis kedua, menganalisis hasil formasi pertama, hasil analisis pertama akan menghasilkan hingga empat objek result firstanalysisR (empat musuh dan satu sama lain). // Keempat objek harus digabungkan ke dalam objek SencondanalysisyResult, poin pribadi doComputerCondanalysis (peta <point, list <firstanalysisResult>> firstresults, daftar <sencondanalysisyresult> sencodresults) {list <firstanalyysissultresult> list = null; null; SencondanalysisResult sr = null; untuk (titik p: firstresults.keyset ()) {sr = new sencondanalysisResult (p); daftar = firstresults.get (p); untuk (firstanalysisResult hasil: daftar) {if (result.count == 4) {if (result.alivestate == hidup) {// Setelah penyaringan sebelumnya, kedua belah pihak mengesampingkan pembunuhan tertinggi. Jika ada 4, ambil langkah ini, dan menangkan langkah selanjutnya. hasil.point; // Jika ada pembunuhan akhir, babak pertama telah kembali. Dalam putaran 4 ini sudah merupakan bagian yang bagus, kembali secara langsung dan tidak lagi menganalisisnya} else {sr.halfalive4 ++; computer4halfalives.add (sr); }} lain jika (result.count == 3) {if (result.alivestate == hidup) {sr.Alive3 ++; if (sr.Alive3 == 1) {computer3alives.add (sr); } else {computerDouble3alives.add (sr); }} else {sr.halfalive3 ++; computer3halfalives.add (sr); }} else {// Semi-live 2 telah dikecualikan pada tahap pertama dan tidak lagi diproses SR.Alive2 ++; if (sr.Alive2 == 1) {computer2alives.add (sr); } else {computerDouble2alives.add (sr); }}}} sencodresults.add (sr); } // Tidak ada live 4 yang ditemukan; kembali nol; } // Metode ini pada dasarnya sama seperti di atas, tetapi untuk kinerja, ini lebih sedikit penilaian, memisahkan manusia dan komputer poin pribadi dohumansencondanalisis (peta <point, list <firstanalysisResult >> firstresults, daftar <sencondanalysisResult> sencodresults) {list <firstanalysysult> list = nol; SencondanalysisResult sr = null; untuk (titik p: firstresults.keyset ()) {sr = new sencondanalysisResult (p); daftar = firstresults.get (p); untuk (firstanalysisResult hasil: daftar) {if (result.count == 4) {if (result.alivestate == hidup) {human4alives.add (sr); } else {sr.halfalive4 ++; Human4Halfalives.add (SR); }} lain jika (result.count == 3) {if (result.alivestate == hidup) {sr.Alive3 ++; if (sr.Alive3 == 1) {human3alives.add (sr); } else {humandouble3alives.add (sr); }} else {sr.halfalive3 ++; human3halfalives.add (sr); }} else {sr.Alive2 ++; if (sr.alive2 == 1) {human2alives.add (sr); } else {humandouble2alives.add (sr); }}} sencodresults.add (sr); } // Tidak ada live 4 ditemukan kembali nol; } private void sleep (int miniSecond) {coba {thread.sleep (miniSecond); } Catch (InterruptedException e) {}} // Analisis ketiga, tidak ada pihak yang dapat membuat live 4, temukan ganda live 3 buah, jika tidak, temukan setengah hidup 4, jika tidak, temukan live 3, ganda hidup 2 poin pribadi dothirdanalysis () {if (! computer4halfalives.isempty ()) {return Computer4Halfs. } System.gc (); tidur (300); Collections.sort (computersencodresults); System.gc (); // Saya akan hidup 4, dan saya tidak memiliki 4-hidup atau lebih, jadi saya hanya bisa memblokir poin MostBest = getBestPoint (Human4Alives, ComputersEncodResults); if (mostbest! = null) kembalikan mostbest; Collections.sort (humansencodresults); System.gc (); MostBest = getBestPoint (); if (mostbest! = null) kembalikan mostbest; // Keluarkan yang pertama, dan siapa pun yang lebih baik akan mengembalikan ComputersencodResults.get (0) .Point; } // Subclass mengimplementasikan metode ini dan mengubah urutannya untuk mencapai titik lindung yang berorientasi pada pertahanan atau menyerang getBestPoint () {// Saya akan hidup 4, dan saya tidak memiliki setengah hidup 4 atau lebih, jadi saya hanya dapat memblokir titik paling banyak = getBestPoint (computerDouble3Alives, humansencodresults); if (mostbest! = null) kembalikan mostbest; MostBest = GetBestPoint (Computer3Alives, HumansencodResults); if (mostbest! = null) kembalikan mostbest; MostBest = getBestPoint (humandouble3alives, computersencodresults); if (mostbest! = null) kembalikan mostbest; MostBest = GetBestPoint (Human3Alives, ComputersEncodResults); if (mostbest! = null) kembalikan mostbest; MostBest = GetBestPoint (ComputerDouble2Alives, HumansencodResults); if (mostbest! = null) kembalikan mostbest; MostBest = getBestPoint (Computer2Alives, HumansencodResults); if (mostbest! = null) kembalikan mostbest; MostBest = getBestPoint (Computer3Halfalives, Humansencodresults); if (mostbest! = null) kembalikan mostbest; MostBest = getBestPoint (Human4Halfalives, ComputersEncodResults); if (mostbest! = null) kembalikan mostbest; MostBest = GetBestPoint (Humandouble2Alives, ComputersEncodResults); if (mostbest! = null) kembalikan mostbest; MostBest = getBestPoint (Human2Alives, ComputersEncodResults); if (mostbest! = null) kembalikan mostbest; MostBest = getBestPoint (Human3Halfalives, ComputersEncodResults); kembalikan Mostbest; } // Langkah terakhir dari analisis ketiga, hasil kedua telah diurutkan, di sini Anda dapat memilih bagian catur terbaik dari titik dilindungi depan getBestPoint (daftar <sencondanalysisResult> mybest, daftar <sencondanAnysisyResult> yourencodresults) {if (! Mybest.isisalysissult> my (my) {if (! MyBest.isisyalysisR> {my) {my) {if (! MyBest.isiseM () {my) {my) {my) {my) {my) {myBest.) (SencondanalysisResult Anda: yoursencodresults) {if (mybest.contains (your)) {return your.point; }} return mybest.get (0) .Point; } else {return mybest.get (0) .point; }} return null; } // Hasil analisis pertama peta akhir pribadi <point, daftar <firstanalysisResult>> computerFirStresults = hashmap baru <point, daftar <firstanalysisResult>> (); peta akhir pribadi <point, daftar <firstanalysisResult>> humanfirstresults = hashmap baru <point, daftar <firstanalysisResult >> (); // Total Hasil Kedua Melindungi Daftar Akhir <SencondanalysisResult> ComputerCodResults = Daftar Array baru <SencondanAnysisResult> (); Daftar Akhir yang Dilindungi <SencondanalysisResult> HumansencodResults = Daftar Array baru <SencondanAnalysisResult> (); Daftar Akhir yang Dilindungi <SencondanalysisResult> (); // Hasil kedua adalah, daftar final yang dilindungi komputer <SencondanalysisResult> computer4halfalives = Daftar Array baru <sencondanalysisyResult> (2); Daftar Akhir yang Dilindungi <SencondanalysisResult> computerDouble3alives = Daftar Array baru <SencondanAnysisResult> (4); Daftar Akhir yang Dilindungi <SencondanalysisResult> Computer3Alives = Daftar Array baru <SencondanAnysisResult> (5); Daftar Akhir yang Dilindungi <SencondanalysisResult> Computer3Alives = Daftar Array baru <SencondanAnysisResult> (5); Daftar Akhir yang Dilindungi <SencondanalysisResult> computerDouble2Alives = Daftar Array baru <SencondanAnysisResult> (); Daftar Akhir yang Dilindungi <SencondanalysisResult> Computer2alives = Daftar Array baru <SencondanAnysisResult> () (); Daftar Akhir yang Dilindungi <SencondanAnysisResult> computer3halfalives = Daftar Array baru <sencondanalysisResult> () (); // Hasil kedua adalah, Daftar Akhir yang Dilindungi Manusia <sencondanalysisResult> Human4Alives = Daftar Array baru <sencondanalysisyResult> (2); Daftar Akhir yang Dilindungi <SencondanalysisResult> Human4Halfalives = Daftar Array Baru <SencondanAnysisResult> (5); Daftar Akhir yang Dilindungi <SencondanalysisResult> Humandouble3Alives = Daftar Array Baru <SencondanAnysisResult> (2); Daftar Akhir yang Dilindungi <SencondanalysisResult> Human3Alives = ArrayList baru <sencondanalysisResult> (10); Daftar Akhir yang Dilindungi <SencondanalysisResult> Humandouble2Alives = Daftar Array Baru <SencondanAnysisResult> (3); Daftar Akhir yang Dilindungi <SencondanalysisResult> Human2Alives = Daftar Array baru <SencondanalysisResult> () (); Daftar Akhir yang Dilindungi <SencondanalysisResult> Human3Halfalives = Daftar Array Baru <SencondanalysisResult> () (); // Hasil analisis membersihkan bagian sebelumnya sebelum analisis pertama void initanalysisResults () {computerFirStresults.clear (); humanfirstresults.clear (); // Total hasil kedua ComputersencodResults.Clear (); humansencodresults.clear (); // hasil kedua computer4halfalives.clear (); computerDouble3alives.clear (); computer3alives.clear (); computerDouble2alives.clear (); computer2alives.clear (); computer3halfalives.clear (); computer3alives.clear (); computerDouble2alives.clear (); computer2alives.clear (); computer3halfalives.clear (); // Hasil kedua adalah human4alives.clear (); human4halfalives.clear (); humandouble3alives.clear (); human3alives.clear (); humandouble2alives.clear (); human2alives.clear (); human3halfalives.clear (); System.gc (); } // Tambahkan ke analisis pertama hasil void pribadi addtofirstanalysisResult (hasil firstanalysisResult, peta <point, daftar <firstanalysisResult >> dest) {if (dest.containskey (result.point)) {dest.get (result.point) .add (hasil); } else {list <firstanalysisResult> list = new ArrayList <firstanalysisResult> (1); list.add (hasil); dest.put (result.point, list); }} // Hasil Analisis Pertama Kelas Pribadi FirstAnalysisResult {// Count Continuous; // titik titik titik; // arah int arah; // state int alivestate; firstanalysisResult private (int count, titik titik, arah int) {this (count, point, areation, acive); } private firstanalysisResult (int count, titik titik, arah int, int alivestate) {this.count = count; this.point = point; this.direction = arah; this.alivestate = alivestate; } private firstanalysisResult init (titik titik, arah int, int alivestate) {this.count = 1; this.point = point; this.direction = arah; this.alivestate = alivestate; kembalikan ini; } private firstanalysisResult cloneme () {return new firstanalysisResult (count, point, areation, alivestate); }} // SecondanalysisResult mengimplementasikan yang sebanding <sencondanalysisResult> {int Alive4 = 0; // hidup 3 int hidup3 = 0; // SecondLiving 4, salah satu ujung seal int parenting4 = 0; // SecondLiving 3, salah satu ujung SEAL INT Halfalive3 = 0; // hidup 2 kuantitas int hidup2 = 0; // titik titik; @Override public int hashCode () {final int prime = 31; Hasil int = 1; hasil = hasil prime * + ((point == null)? 0: point.hashcode ()); hasil pengembalian; } @Override Public Boolean Equals (Object Obj) {SencondanalysisResult Other = (SencondanalysisResult) Obj; if (point == null) {if (Other.point! = null) return false; } else if (! point.equals (Other.Point)) Return false; Kembali Benar; } private sencondanalysisResult (titik titik) {this.point = point; } // Selama analisis ketiga, hasil analisis kedua diurutkan. Ini adalah fungsi callback sortir @Override public int compareTo (sencondanalysisResult lainnya) {return compareToWResult (ini, lain); }} // Jika pengembalian -1 adalah parameter pertama, 1 adalah parameter kedua adalah yang pertama, dan 0 adalah int private int dalam orde asli compareToWResult (sencondanalysisResult oneresult, sencondanalysisyresult lainnya) {if (oneresult.Alive4> lain. } if (oneresult.Alive4 <Other.Alive4) {return 1; } if (oneresult.Alive4> Other.Alive4) {return -1; } if (oneresult.Alive3> Other.Alive3) {return -1; } if (oneresult.Alive3 <Other.Alive3) {return 1; } if (oneresult.Alive2> Other.Alive2) {return -1; } if (oneresult.Alive2 <Other.Alive2) {return 1; } if (oneresult.Alive3> Other.Alive3) {return -1; } if (oneresult.Alive3> Other.Alive3) {return 1; } return 0; } // Objek sementara digunakan untuk sementara menyimpan hasil analisis selama analisis pertama. Jika ada lebih dari 1 (tidak termasuk) hasil, metode klonem dipanggil untuk mendapatkan hasilnya. Kalau tidak, hasil ini akan dibuang firstanalisis final swasta Far far = firstanalysisResult baru (1, null, heng); // Analisis Jika kapal selam berada di sebelah posisi saat ini, berapa banyak kapal selam akan dibentuk dalam arah tertentu. Parameter: Semua titik yang telah ditempatkan di sisi saat ini, titik yang perlu diasumsikan, arah yang perlu dinilai firstanalalisis pribadi yang telah diadili. int y = point.gety (); FirstanalysisResult fr = null; int maxcountonthisdirection = maxcountonthisdirection (titik, titik musuh, arah, 1); if (maxcountonthisdirection <5) {// Piece catur yang tidak masuk akal kembali null; // Ada kurang dari lima ruang kosong ke arah ini, dan potongan catur yang telah Anda setel dikecualikan} jika (maxcountonthisdirection == 5) {// status setengah mati, jika itu adalah satu-akhir dari. } else {// kedua ujungnya adalah fr = far.init (titik, arah, hidup); } // Hitung CountPoint (MyPoints, EnemyPoints, point.setx (x) .sety (y), FR, arah, maju); Countpoint (MyPoints, EnemyPoints, point.setx (x) .sety (y), FR, arah, ke belakang); if (fr.count <= 1 || (fr.count == 2 && fr.alivestate == Half_Alive)) {// Realive1, Semi-Active2 dan Hasil berikut, Abandon Return NULL; } // mengembalikan hasil penyalinan return fr.cloneme (); } // Bagian catur keluar dari dinding private boolean isoutsideofwall (titik titik, arah int) {if (arah == heng) {return point.getx () <0 || point.getx ()> = maxx; // nilai x dan y maksimum berada di luar dinding, jadi gunakan tanda yang sama} lain jika (arah == zhong) {return point.gety () <0 || point.gety ()> = maxy; } else {// Mungkin ada masalah di sini return point.getx () <0 || point.gety () <0 || point.gety () <0 || point.gety () <0 || point.gety () <0 || point.getx ()> = maxx || point.gety ()> = maxy; }} private point pointTonext (titik titik, arah int, boolean maju) {switch (arah) {case heng: if (forward) point.x ++; lain point.x--; merusak; case zhong: if (forward) point.y ++; lain point.y--; merusak; case zheng_xie: if (maju) {point.x ++; point.y--; } else {point.x--; point.y ++; } merusak; case fan_xie: if (forward) {point.x ++; point.y ++; } else {point.x--; point.y--; } merusak; } poin kembali; } // Berapa banyak bagian yang dapat dimainkan dalam arah tertentu (satu dari delapan). Metode ini adalah metode inti dalam analisis pertama void countpoint pribadi (daftar <point> mypoints, daftar <point> musuh, titik titik, firstanalysisResult fR, int arah, forward boolean) {if (mypoints.contains (pointTonext (titik, arah, maju))) {fr.count ++; if (mypoints.contains (pointTonext (titik, arah, maju))) {fr.count ++; if (mypoints.contains (pointTonext (titik, arah, maju))) {fr.count ++; if (mypoints.contains (pointTonext (titik, arah, maju))) {fr.count ++; } lain if (musemadypoints.contains (point) || isoutsideofwall (titik, arah)) {fr.alivestate = setengah_alive; }} lain if (musuhPoints.contains (point) || isOutsideOfwall (titik, arah)) {fr.alivestate = setengah_alive; }} lain if (musuhPoints.contains (titik, arah)) {fr.alivestate = Half_alive; }} lain if (musuhPoints.contains (point) || isOutsideOfwall (titik, arah)) {fr.alivestate = setengah_alive; }} lain if (musuhPoints.contains (point) || isOutsideOfwall (titik, arah)) {fr.alivestate = setengah_alive; }} // Bisakah Anda tetap mendapatkan lima bagian dalam arah tertentu int private int maxcountonthisdirection (titik titik, daftar <point> titik musuh, arah int, jumlah int) {int x = point.getx (), y = point.gety (); switch (arah) {// horisontal case heng: while (! musuh. } point.setx (x); while (! Enemypoints.contains (point.setx (point.getx ()+1)) && point.getx () <maxx && count <6) {count ++; } merusak; // case tegak lurus zhong: while (! Musuh. } point.sety (y); while (! Enemypoints.contains (point.sety (point.gety ()+1)) && point.gety () <maxy && count <6) {count ++; } merusak; // Maju Oblique/Case Zheng_xie: while (! Enemypoints.contains (point.setx (point.getx ()-1) .sety (point.gety ()+1)) && point.getX ()> = 0 && point.gety () <maxy) {count ++; } point.setx (x) .sety (y); while (! Enemypoints.contains (point.setx (point.getx ()+1) .sety (point.gety ()-1)) && point.getx () <maxx && point.gety ()> = 0 && count <6) {count ++; } merusak; // backslash/case fan_xie: while (! Enemypoints.contains (point.setx (point.getx ()-1) .sety (point.gety ()-1)) && point.getX ()> = 0 && point.gety ()> = 0) {count ++; } point.setx (x) .sety (y); while (! Enemypoints.contains (point.setx (point.getx ()+1) .sety (point.gety ()+1)) && point.getx () <maxx && point.gety () <maxy && count <6) {count ++; } merusak; } jumlah pengembalian; } // Mainkan Catur Potongan, Antarmuka Eksternal @Override Public Void Run (Daftar <Point> Humans, Point P) {// Hapus langkah terakhir manusia allfreepoints.remove (manusia. // Satu langkah komputer dapat membuat hasil poin = doanalysis (MyPoints, manusia); // Lepaskan potongan catur di komputer allfreepoints.remove (hasil); // Tambahkan ke potongan catur komputer dan mainkan mypoints.add (hasil); }} Sangat mudah untuk mengimplementasikan pemain manusia
impor java.util.list; HumanPlayer kelas publik memperluas baseplayer {@Override public void run (daftar <point> musuh, poin p) {getMypoints (). add (p); allfreepoints.remove (p); }}Ringkasan: Meskipun ditulis dalam Java, algoritma telah diabstraksikan dan dapat dengan mudah dimodifikasi menjadi implementasi berbagai platform.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.