AI AI -алгоритм Goziqi также является типичным алгоритмом Game AI. Некоторые алгоритмы шахматных AI могут быть использованы в качестве ссылки. Ниже приведено код реализации Java.
Абстрактный интерфейс шахмат
импортировать java.util.list; Публичный интерфейс ichessboard {// Получить максимальную горизонтальную координату платы Public int getMaxx (); // максимальная вертикальная координата public int getMaxy (); // Получить все текущие пустые очки, и эти баллы могут воспроизводить только шахматный общедоступный список <popt> getFreePoints (); }Реализация шахматного класса
// Point Class Class {// Это производительность, установленная для Public int x; Public int y; public int getx () {return x; } public point setx (int x) {this.x = x; вернуть это; } public int gety () {return y; } public point sety (int y) {this.y = y; вернуть это; } public point (int x, int y) {this.x = x; this.y = y; } @Override public int hashcode () {return x + y; } @Override public boolean equals (Object obj) {if (this == obj) вернуть true; Точка другая = (точка) obj; if (x! = Другое.) вернуть false; if (y! = Другое.y) вернуть false; вернуть истину; }} Игрок абстрактный интерфейс
импортировать java.util.list; Публичный интерфейс iPlayer {// Следующим шагом является передача набора шахматной доски, который оппонент уже установил Public void Run (List <Popt> EnemyPoints, Point Point); общественный логический Haswin (); public void setchessboard (шахматная доска Ichessboard); Общественный список <popt> getMypoints (); } Игрок базовый абстрактный класс
импортировать java.util.arraylist; импортировать java.util.list; Общедоступный абстрактный класс Обеспечивает IPlayer {// Шахматная часть, которую я поместил защищенный список <popt> mypoints = new ArrayList <popt> (200); // шахматная доска защищенная шахматная доска для iChessboard; // максимальные горизонтальные и вертикальные координаты платы защищены int maxx; защищенный int maxy; // все пустые шахматные части защищенного списка <pot> allfreepoints; @Override public final List <point> getMypoints () {return mypoints; } @Override public void setchessboard (iChessboard Chessboard) {this.chessboard = Chessboard; AllFreePoints = Chessboard.getFreePoints (); maxx = chessboard.getmaxx (); maxy = chessboard.getmaxy (); mypoints.clear (); } частная окончательная точка temp = new Point (0, 0); // Я выиграю публичный окончательный логический Haswin () {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; } // перпендикулярно | count = 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; } // Вперед косой/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; } вернуть false; }} Реализация компьютерного искусственного интеллекта
импортировать java.util.arraylist; импортировать java.util.collections; импортировать java.util.hashmap; импортировать java.util.list; импортировать java.util.map; // Основной класс алгоритма, основная идея алгоритма разделена на три шага. // Первый шаг: циклически возьмите сцену для себя и другую сторону (чтобы сделать счет в определенном диапазоне) в соответствии с текущей ситуацией обеих сторон, и судить о изменениях в ситуации, которые может принести этот произведение, например, может ли он спешить 4, независимо от того, может ли он формировать наш или враг Double 3 и т. Д./// Второй шаг: согласно результатам предыдущего шага. Половина живи 4) и т. Д.), Включая врага и нашу сторону. // Шаг 3: Сортировка предыдущего результата в соответствии с правилами, указанными пользователем, и выберите субъективные и оборонительные формы (существуют правила для оскорбительных и защитных форм) Общедоступный класс BaseComputerai расширяет латерий {// четыре направления, горизонтальный -, вертикальный | , вперед-slant /, обратный состав / частный статический финал int hang = 0; Частный статический финал int zhong = 1; Частный статический финал int zheng_xie = 2; Частный статический финал int fan_xie = 3; // спереди, чтобы получить частный статический финальный логический форвард = true; Частный статический финальный логический логический Backward = false; // отображать результат анализа. Независимо от того, является ли текущая точка проходов с двумя концами (живым) или только проход в одном конце (Half_alive), процесс анализа заблокированных шахматных произведений автоматически блокируется, а не как шахматный элемент, который будет выбран частным статическим окончательным окончанием int alive = 1; Частный статический финал int lalf_alive = 0; // частный статический окончательный финал int dead = -1; // Рассчитайте диапазон, слишком большой диапазон будет иметь проблемы с производительностью частного класса Calcuterange {int xstart, ystart, xstop, ystop; Private Calcuterange (int xstart, int ystart, int xstop, int ystop) {this.xstart = xstart; this.ystart = ystart; this.xstop = xstop; this.ystop = ystop; }} // Ограничьте диапазон расчетов компьютера. Если вся производительность расчета шахматной платы слишком плохая, в настоящее время он формируется на основе граничного значения всех шахматных частей, которые были использованы. В настоящее время это 1 частная статическая конечная окончательная int range_step = 1; CalcuTerange CurrangeRange = новый CalcuTerange (0, 0, 0, 0); private void initrange (list <point> couters, list <poank> люди) {currentrange.xstart = humans.get (0) .getx ()-range_step; currentrange.ystart = hulan.get (0) .gety ()-range_step; currentrange.xstop = hulan.get (0) .getx ()+range_step; currentRange.ystop = hulan.get (0) .gety ()+range_step; для (точка (точка: люди) {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; }} для (точка точки: 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; }} // Если диапазон расширен и превышает шахматную доску, она равна Chessboard currentrange.xstart = currentrange.xstart <0? 0: currentrange.xstart; currentrange.ystart = currentrange.ystart <0? 0: currentrange.ystart; currentrange.ystart = currentrange.ystart <0? 0: currentrange.ystart; currentrange.xstop = currentrange.xstop> = maxx? Maxx-1: currentRange.xstop; currentrange.ystop = currentrange.ystop> = maxy? Maxy-1: currentrange.ystop; } // Проанализируйте текущую форму метода входа. Анализ разделен на три этапа всего. Третий шаг можно контролировать подклассами для сложности. Приватный пункт Doanalysis (List <Point> couters, list <poank> hules) {if (humans.size () == 1) {// Первый шаг возвращает getFirstPoint (люди); } // Инициализировать диапазон расчетов initrange (Comaters, люди); // Очистить предыдущие результаты initAnalysresults (); // Начальный анализ, сканировать все пустые точки и сформировать первую точку результата анализа BestPoint = dofirstanalysis (Comaters, люди); if (bestpoint! = null) {//system.out.println(" Это самое важное, вы можете сыграть только в этом произведении »); вернуть BestPoint; } // Проанализируйте первый результат и найдите свою лучшую точку зрения BestPoint = DocomputerEncondanalysis (ComputerFirstresults, ComputerenceNcoDresults); if (bestpoint! = null) {//system.out.println("i'm собираюсь выиграть, я сыграю эту часть »); вернуть BestPoint; } computerFirstresults.clear (); System.gc (); // Проанализируйте первый результат и найдите лучшую точку врага BestPoint = Dohumansencondanalysis (HumanFirstesults, Humansencodresults); if (bestpoint! = null) {//system.out.println("f Вы не играете в этот произведение, вы потеряете »); вернуть BestPoint; } HumanFirstresults.clear (); System.gc (); // Не было обнаружено окончательного убийства, третий анализ результатов вернул Dothirdanalysis (); } // Первый шаг шахматного произведения не требует сложных расчетов, и он завершен на основе значения x первого этапа человека шахматного куска. Private Point GetFirstPoint (List <point> Люди) {point point = humans.get (0); if (точка else {return new point (point.getx ()-1, point.gety ()); }} // private int Debugx, Debug Point ComputerPoint = null; Point HumanPoint = null; int x, y; FirstAnalysResult FirstAnalysisResult; for (int i = 0; i <size; i ++) {computerpoint = allfreepoints.get (i); // Сначала щелкните координаты x и y, потому что исходный объект будет изменен во время процесса анализа x = computerpoint.getx (); y = computerpoint.gety (); if (x <currentrange.xstart || x> currentrange.xstop || y <currentrange.ystart || y> currentrange.ystop) {продолжение; } // if (x == debugx && y == Debugy) {// system.out.println ("ssssssssssssssssssssssssssssssssss) {{} // if (x == y == debugy) {// if (x = elebugx && y == debugy) System.out.println ("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSST = tryAndCountresult (Comterers, люди, ComputerPoint, Heng); ComputerPoint.Setx (x) .sety (y); // Ответьте на исходное значение точки для следующего анализа if (FirstAnalysResult! Если (FirstAnalysisResult.count == 5) // Равно 5 означает, что вы можете играть в шахматные фигуры на этом этапе, и вы можете подключиться к 5. Если вы выиграете, вы не будете анализировать их. Вернуть ComputerPoint; // Записать первое результат анализа addtoFirstanalysisResult (FirstAnalysisResult, ComputerFirstresults); } // Повторите вышеуказанные шаги в «вертикальном направлении» FirstAnalysresult = tryAndCountresult (Comterers, люди, ComputerPoint, Zhong); ComputerPoint.SetX (x) .sety (y); if (FirstAnalysResult! = null) {// Умиреть в шахматах, не играйте, если (FirstAnalysResult.count == 5) возврат компьютерный точка; addtofirstanalysisresult (FirstAnalysisResult, ComputerFirstresults); } // ПАССКИЙ КОВЛИКОВЫЙ FirstAnalysresult = tryAndCountresult (Comaters, люди, ComputerPoint, Zheng_xie); ComputerPoint.SetX (x) .sety (y); if (firstAnalysresult! = null) {// мертвые шахматы, не играйте, если (FirstAnalysResult.count == 5) return Computerpoint; addtofirstanalysisresult (FirstAnalysisResult, ComputerFirstresults); } // backside firstAnalysresult = tryAndCountresult (Comaters, люди, ComputerPoint, Fan_xie); ComputerPoint.SetX (x) .sety (y); if (firstAnalysresult! = null) {// мертвые шахматы, не играйте, если (FirstAnalysResult.count == 5) return Computerpoint; addtofirstanalysisresult (FirstAnalysisResult, ComputerFirstresults); } // Проанализируйте состояние этой пьесы в враге в «горизонтальном» направлении, таком как враг Live 3, Semi-Living 4 и т. Д. FirstAnalysresult = TryAndCountresult (люди, Comter Somaters, Computerpoint, Heng); ComputerPoint.SetX (x) .sety (y); if (firstAnalysresult! = null) {// Die Chess, не играйте, если (FirstAnalysResult.count == 5) HumanPoint = ComputerPoint; addtofirStanalysisResult (FirstAnalysisResult, HumanFirstresults); } // "Long-Perpendicular" FirstAnalysResult = tryAndCountresult (люди, Comterers, ComputerPoint, Zhong); ComputerPoint.SetX (x) .sety (y); if (FirstAnalysResult! = null) {// Die Chess, не играйте, если (FirstAnalysResult.count == 5) HumanPoint = ComputerPoint; addtofirStanalysisResult (FirstAnalysisResult, HumanFirstresults); } // "вперед-slant" firstAnalysresult = tryAndCountresult (люди, Comterers, ComputerPoint, Zheng_xie); ComputerPoint.SetX (x) .sety (y); if (FirstAnalysResult! = null) {// Die Chess, не играйте, если (FirstAnalysResult.count == 5) HumanPoint = ComputerPoint; addtofirStanalysisResult (FirstAnalysisResult, HumanFirstresults); } // "BackSlash" FirstAnalysResult = tryAndCountresult (люди, Comterers, ComputerPoint, fan_xie); ComputerPoint.SetX (x) .sety (y); if (FirstAnalysResult! = null) {// Die Chess, не играйте, если (FirstAnalysResult.count == 5) HumanPoint = ComputerPoint; addtofirStanalysisResult (FirstAnalysisResult, HumanFirstresults); }} // Если нет победного произведения, первый анализ не должен возвращать результат первого анализа; } // Второй анализ, проанализируйте результат первой формирования, первый результат анализа будет генерировать до четырех объектов FirstAnalysisResult (четыре врага и друг друга). // Четыре объекта должны быть объединены в объект SencondanalysisResult, частную точку DocomputererSendanalysis (Map <точка, список <firstAnalysresult >> Firstresults, список <sencondanalysisresult> sencodresults) {list <fewanalysusult> list = null; Sencondanalysisresult sr = null; for (point p: firstresults.keyset ()) {sr = new sencondanalysisresult (p); list = firstresults.get (p); Для (FirstAnalysisResult Result: List) {if (result.count == 4) {if (result.alivestate == alive) {// После предыдущей фильтрации обе стороны исключили окончательное убийство. Если есть 4, сделайте этот шаг и выиграйте следующий шаг. result.point; // Если есть окончательное убийство, первый раунд вернулся. В этом раунде 4 уже хорошая часть, вернуть напрямую и больше не анализировать его} else {sr.halfalive4 ++; Computer4halfalives.Add (SR); }} else if (result.count == 3) {if (result.alivestate == живой) {sr.alive3 ++; if (sr.alive3 == 1) {computer3alives.add (sr); } else {computerDouble3alives.Add (sr); }} else {sr.halfalive3 ++; Computer3halfalives.Add (SR); }} else {// semi-live 2 был исключен на первом этапе и больше не обработана sr.alive2 ++; if (sr.alive2 == 1) {computer2alives.add (sr); } else {computerDouble2alives.Add (sr); }}}} sencodresults.add (sr); } // не было найдено Live 4; вернуть ноль; } // Этот метод в основном такой же, как и выше, но для производительности это меньше суждения, отделяет людей и компьютеров частной точки зрения dohumansencondanalysis (map <point, list <firstanalysresult >> firstresults, list <sencondanalysisresult> sencodresults) {listAnalisesResult> nullysult>; Sencondanalysisresult sr = null; for (point p: firstresults.keyset ()) {sr = new sencondanalysisresult (p); list = firstresults.get (p); для (FirstAnalysisResult Результат: List) {if (result.count == 4) {if (result.alivestate == alive) {human4alives.add (sr); } else {sr.halfalive4 ++; Human4halfalives.Add (SR); }} else if (result.count == 3) {if (result.alivestate == живой) {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); } // No Live 4 не было найдено return null; } private void sleep (int minisecond) {try {thread.sleep (minisecond); } catch (прерывание Exception e) {}} // третий анализ, ни одна из сторон не может создать Live 4, найти двойной живой 3 штуки, если нет, найдите половину живого 4, если нет, найдите Single Live 3, Double Live 2 Private Point Dothirdanalysis () {if (! Computer4halfalives.isempty () {return Computer4halfalives.get (0). } System.gc (); сон (300); Collections.sort (ComputerenceDresults); System.gc (); // Я собираюсь жить 4, и у меня нет полужигания 4 или более, поэтому я могу блокировать только точку MostBest = getBestPoint (Human4alives, ComputerenceDresults); if (больше всего! = null) вернуть самое лучшее; Collections.Sort (HumanSencoDresults); System.gc (); самый лучший = getBestPoint (); if (больше всего! = null) вернуть самое лучшее; // Установите первые, и тот, кто лучше вернет ComputermerencoDresults.get (0) .point; } // Подкласс реализует этот метод и изменяет свой приказ для достижения ориентированной на оборону или атаки защищенной точки getBestpoint () {// Я собираюсь жить 4, и у меня нет полужигания 4 или более, поэтому я могу блокировать только точку ModBest = GetBestPoint (ComputerDouble3alives, humanSencodresults); if (больше всего! = null) вернуть самое лучшее; самый лучший = getBestPoint (Computer3alives, HumanSencoDresults); if (больше всего! = null) вернуть самое лучшее; Самый лучший = getBestPoint (HumandOUble3alives, ComputerenceDresults); if (больше всего! = null) вернуть самое лучшее; Самый лучший = getBestPoint (Human3alives, ComputerenceDresults); if (больше всего! = null) вернуть самое лучшее; самый лучший = getBestPoint (ComputerDouble2alives, HumanSencoDresults); if (больше всего! = null) вернуть самое лучшее; самый лучший = getBestPoint (Computer2alives, HumanSencoDresults); if (больше всего! = null) вернуть самое лучшее; самый лучший = getBestPoint (Computer3Halfalives, HumanSencoDresults); if (больше всего! = null) вернуть самое лучшее; самый лучший = getBestPoint (Human4Halfalives, ComputerenceDresults); if (больше всего! = null) вернуть самое лучшее; самый лучший = getBestPoint (HumandOUble2alives, ComputerenceDresults); if (больше всего! = null) вернуть самое лучшее; Самый лучший = getBestPoint (Human2alives, ComputerenceDresults); if (больше всего! = null) вернуть самое лучшее; самый лучший = getBestPoint (Human3halfalives, ComputerencoDresults); вернуть самое лучшее; } // Последний шаг третьего анализа, второй результат был отсортирован, здесь вы можете выбрать лучшую шахматную часть из передней защищенной точки GetBestPoint (List <SencondanalysisResult> mybest, list <sencondanalysisresult> yoursencestresults) {if (! (Sencondanalysisresult your: yourencodresults) {if (mybest.contains (your)) {return your.point; }} вернуть mybest.get (0) .point; } else {return mybest.get (0) .point; }} return null; } // Первый результат анализа частная окончательная карта <точка, список <firstAnalysresult >> computerFirstresults = new Hashmap <point, list <firstAnasysisResult >> (); Частная финальная карта <пункт, список <firstanalysisresult >> HumanFirstresults = new Hashmap <point, list <FirstAnalysisResult >> (); // Второй общий результат защищенный окончательный список <sencondanalysisresult> ComputerenceNcoDresults = new ArrayList <SencondanalysisResult> (); Защищенный окончательный список <sencondanalysisresult> humansencodresults = new Arraylist <SencondanalysisResult> (); Защищенный окончательный список <sencondanalysisresult> (); // Второй результат состоит в том, что Компьютер защищен окончательный список <sencondanalysisresult> computer4halfalives = new Arraylist <sencondanalysisresult> (2); Защищенный окончательный список <sencondanalysisresult> ComputerDouble3alives = new ArrayList <SencondanalysisResult> (4); Защищенный окончательный список <sencondanalysisresult> computer3alives = new ArrayList <sencondanalysresult> (5); Защищенный окончательный список <sencondanalysisresult> computer3alives = new ArrayList <sencondanalysresult> (5); Защищенный конечный список <sencondanalysisresult> computerdouble2alives = new Arraylist <sencondanalysisresult> (); Защищенный окончательный список <sencondanalysisresult> computer2alives = new ArrayList <sencondanalysresult> (); Защищенный окончательный список <sencondanalysisresult> computer3halfalives = new Arraylist <sencondanalysisresult> (); // Второй результат - охраняемый финальный список человека <sencondanalysisresult> Human4alives = new ArrayList <SencondanalysisResult> (2); Защищенный окончательный список <sencondanalysisresult> Human4halfalives = new ArrayList <SencondanalysisResult> (5); Защищенный окончательный список <sencondanalysisresult> humandouble3alives = new Arraylist <SencondanalysisResult> (2); Защищенный окончательный список <sencondanalysisresult> Human3alives = new ArrayList <sencondanalysresult> (10); Защищенный окончательный список <sencondanalysisresult> humandouble2alives = new Arraylist <SencondanalysisResult> (3); Защищенный окончательный список <sencondanalysisresult> Human2alives = new ArrayList <sencondanalysresult> (); Защищенный окончательный список <sencondanalysisresult> Human3halfalives = new ArrayList <SencondanalysisResult> (); // Анализ Результаты очистки предыдущей части перед первым анализом Private void initanalysisResults () {computerFirstresults.clear (); HumanFirstresults.clear (); // второй общий результат ComputerencoDresults.clear (); humansencodresults.clear (); // второй результат Computer4halfalives.clear (); ComputerDouble3alives.clear (); Computer3alives.clear (); ComputerDouble2alives.clear (); Computer2alives.clear (); Computer3halfalives.clear (); Computer3alives.clear (); ComputerDouble2alives.clear (); Computer2alives.clear (); Computer3halfalives.clear (); // второй результат - Human4alives.clear (); Human4halfalives.clear (); humandouble3alives.clear (); Human3alives.clear (); hirandouble2alives.clear (); Human2alives.clear (); Human3halfalives.clear (); System.gc (); } // Добавить к первым результатам анализа private void addtoFirStanalysisResult (FirstAnalysisResult Результат, MAP <точка, список <firstAnalysresult >> dest) {if (dest.containskey (result.point)) {dest.get (result.point). } else {list <FirstAnalysResult> list = new ArrayList <FirstAnalysisResult> (1); list.add (результат); dest.put (result.point, list); }} // Первый анализ результатов класса частного класса FirstAnalysResult {// непрерывный счет; // точка точки; // направление int направление; // Государство int alivestate; Private FirstAnalysisResult (int Count, Point Point, Int Direction) {this (count, point, направление, живое); } private FirstAnalysResult (int count, точка точка, int direction, int alivestate) {this.count = count; this.point = point; this.direction = направление; this.alivestate = alivestate; } private FirstAnalysisResult init (точка точки, int direction, int alivestate) {this.count = 1; this.point = point; this.direction = направление; this.alivestate = alivestate; вернуть это; } private firstAnalysisResult cloneme () {return new FirstAnalysResult (Count, Point, Direction, Alivestate); }} // SecondAlysisResult реализует сопоставимые <sencondanalysisresult> {int alive4 = 0; // Жить 3 int alive3 = 0; // второе место 4, один конец уплотнения int laflaLive4 = 0; // второе место 3, один конец уплотнения int lalfalive3 = 0; // Жизнь 2 Количество int alive2 = 0; // точка точки; @Override public int hashcode () {final int prime = 31; int result = 1; result = prime * result + ((point == null)? 0: point.hashcode ()); результат возврата; } @Override public boolean equals (Object obj) {sencondanalysisResult Другое = (SencondanalysisResult) obj; if (point == null) {if (shere.point! = null) вернуть false; } else if (! point.equals (ore.point)) вернуть false; вернуть истину; } private sencondanalysisresult (точка точки) {this.point = point; } // Во время третьего анализа результаты второго анализа отсортированы. Это сортировка функции обратного вызова @override public int compareto (sencondanalysisresult erese) {return compareTowResult (это, другое); }} // Если возврат -1 является первым параметром, 1 является вторым параметром первым, а 0 -это частное в исходном порядке CompareTowResult (sencondanalysresult oneresult, sencondanalysisresult другое) {if (oneresult.alive4> hene.alive4) {return -1; } if (oneresult.alive4 <orhate.alive4) {return 1; } if (oneresult.alive4> shrience.alive4) {return -1; } if (oneresult.alive3> shrience.alive3) {return -1; } if (oneresult.alive3 <orhate.alive3) {return 1; } if (oneresult.alive2> shrience.alive2) {return -1; } if (oneresult.alive2 <orhate.alive2) {return 1; } if (oneresult.alive3> shrience.alive3) {return -1; } if (oneresult.alive3> shrience.alive3) {return 1; } return 0; } // Временный объект используется для временного хранения результатов анализа во время первого анализа. Если существует более 1 (исключая) результаты, метод Cloneme вызывается для получения результата. В противном случае этот результат будет отброшен частным финальным FirstAnalysisResult far = new FirstAnalysisResult (1, Null, Heng); // Анализ Если сабвуфера находится рядом с текущей позицией, сколько подводных лодок будет сформировано в определенном направлении. Параметры: все точки, которые были размещены на текущей стороне, то, что необходимо предположить, направление, которое необходимо оценить в частном первом анализисе TryAndCountresult (List <popt> mypoints, list <pot> Enemypoints, Point Point, int Direction) {int x = point.getx (); int y = point.gety (); FirstAnalysResult fr = null; int maxcountthishidection = maxcountonthisdiverection (точка, энемипоинты, направление, 1); if (maxcountthisdirection <5) {// бессмысленная шахматная часть возврата null; // В этом направлении меньше пяти пустых пространств, а шахматная часть, которую вы уже установили, исключается} else if (maxcountthishidection == 5) {// наполовину изгибное состояние, если это одно-конечное fr = far. Наинин (точка, наполовину, наполовину); } else {// оба конца - fr = far.init (точка, направление, живое); } // Рассчитать count -point (mypoints, enerypoints, point.setx (x) .sety (y), fr, направление, вперед); countpoint (mypoints, eneryypoints, point.setx (x) .sety (y), Fr, направление, назад); if (fr.count <= 1 || (fr.count == 2 && fr.alivestate == Half_alive)) {// Realive1, полуактивные 2 и следующие результаты, отдайте возврат null; } // Возврат результат копирования return fr.cloneme (); } // Шахматная пьеса выходит из стены Частный логический isoutsideofwall (точка точка, int direction) {if (direction == heng) {return point.getx () <0 || point.getx ()> = maxx; // максимальные значения x и y находятся вне стены, поэтому используйте равный знак} else if (direction == zhong) {return point.gety () <0 || point.gety ()> = maxy; } else {// Здесь может быть проблема возврата точка. Getx () <0 || point.gety () <0 || point.gety () <0 || point.gety () <0 || point.gety () <0 || point.getx ()> = maxx || point.gety ()> = maxy; }} частная точка точкатонекта (точка точки, int direction, boolean forward) {switch (направление) {case heng: if (forward) point.x ++; еще point.x--; перерыв; case Zhong: if (вперед) point.y ++; еще point.y--; перерыв; case zheng_xie: if (вперед) {point.x ++; point.y--; } else {point.x--; point.y ++; } перерыв; case fan_xie: if (вперед) {point.x ++; point.y ++; } else {point.x--; point.y--; } перерыв; } возвратный пункт; } // Сколько пьес можно сыграть в определенном направлении (один из восьми). Этот метод является основным методом в первом анализе Private Void Countypoint (List <point> mypoints, list <pot> Enemypoints, Point Point, FirstAnalysResult fr, int direction, boolean forward) {if (mypoints.contains (pointtonext (point, направление, вперед))) {fr.count ++; if (mypoints.contains (pointtonext (point, направление, вперед))) {fr.count ++; if (mypoints.contains (pointtonext (point, направление, вперед))) {fr.count ++; if (mypoints.contains (pointtonext (point, направление, вперед))) {fr.count ++; } else if (enemypoints.contains (point) || isoutsideofwall (point, direction)) {fr.alivestate = Half_alive; }} else if (enemypoints.contains (point) || isoutsideofwall (point, direction)) {fr.alivestate = Half_alive; }} else if (enemypoints.contains (point, direction)) {fr.alivestate = Half_alive; }} else if (enemypoints.contains (point) || isoutsideofwall (point, direction)) {fr.alivestate = Half_alive; }} else if (enemypoints.contains (point) || isoutsideofwall (point, direction)) {fr.alivestate = Half_alive; }} // Можно ли получить пять штук в определенном направлении private int maxcounthIsDirection (точка точки, список <pot> eneryPoints, int direction, int count) {int x = point.getx (), y = point.gety (); Switch (направление) {// горизонтальный случай heng: while (! enemypoints.contains (point.setx (point.getx ()-1)) && point.getx ()> = 0 && count <6) {count ++; } point.setx (x); while (! enemypoints.contains (point.setx (point.getx ()+1)) && point.getx () <maxx && count <6) {count ++; } перерыв; // перпендикулярный случай Zhong: while (! Enemypoints.contains (point.sethy (point.gety ()-1)) && point.gety ()> = 0) {count ++; } point.sety (y); while (! enemypoints.contains (point.sety (point.gety ()+1)) && point.gety () <maxy && count <6) {count ++; } перерыв; // Переходной косой/case zheng_xie: while (! Enemypoints.contains (point.setx (point.getx ()-1) .sethy (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 ++; } перерыв; // 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 ++; } перерыв; } return Count; } // Играть в шахматные фигуры, внешний интерфейс @override public void run (список <point> hules, point p) {// Удалить последний шаг человека Allfreepoints.remove (humans.get (humans.size ()-1)); // один шаг компьютера может сделать точечный результат = doanalysis (mypoints, люди); // Удалить шахматы на компьютере allfreepoints.remove (result); // Добавить в компьютерные шахматы и воспроизводить mypoints.add (result); }} Очень легко внедрить человеческих игроков
импортировать java.util.list; Public Class HumanPlayer Extends Baseplayer {@Override public void run (список <pot> eneryPoints, point p) {getMypoints (). add (p); allfreepoints.remove (p); }}Резюме: хотя он написан на Java, алгоритм был абстрактен и может быть легко изменен в реализации различных платформ.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.