อัลกอริทึม Goziqi AI ยังเป็นอัลกอริทึม AI เกมทั่วไป อัลกอริทึม AI หมากรุกบางตัวสามารถใช้เป็นข้อมูลอ้างอิงได้ ต่อไปนี้เป็นรหัสการใช้งาน Java
หมากรุก
นำเข้า java.util.list; อินเทอร์เฟซสาธารณะ ichessboard {// รับพิกัดแนวนอนสูงสุดของคณะกรรมการสาธารณะ int getMaxx (); // สูงสุดในแนวตั้งพิกัดสาธารณะ int getMaxy (); // รับคะแนนว่างในปัจจุบันทั้งหมดและจุดเหล่านี้สามารถเล่นรายการสาธารณะรายการสาธารณะ <point> getFreepoints (); -การใช้งานระดับหมากรุก
// จุดหมากรุกคลาส {// นี่คือประสิทธิภาพที่ตั้งค่าเป็นสาธารณะ int x; สาธารณะ int y; สาธารณะ int getx () {return x; } จุดสาธารณะ setx (int x) {this.x = x; คืนสิ่งนี้; } สาธารณะ int getey () {return y; } จุดสาธารณะ sety (int y) {this.y = y; คืนสิ่งนี้; } จุดสาธารณะ (int x, int y) {this.x = x; this.y = y; } @Override public int hashCode () {return x + y; } @Override บูลีนสาธารณะเท่ากับ (Object obj) {ถ้า (this == obj) คืนค่าจริง; จุดอื่น = (จุด) obj; ถ้า (x! = อื่น ๆ x) ส่งคืนเท็จ; ถ้า (y! = อื่น ๆ y) ส่งคืนเท็จ; กลับมาจริง; - ส่วนต่อประสานบทคัดย่อของผู้เล่น
นำเข้า java.util.list; อินเทอร์เฟซสาธารณะ iPlayer {// ขั้นตอนต่อไปคือการผ่านชุดหมากรุกที่ฝ่ายตรงข้ามได้ตั้งค่าโมฆะสาธารณะแล้ว (รายการ <Point> enemypoints จุดจุด); บูลีนสาธารณะ Haswin (); โมฆะสาธารณะ setchessboard (กระดานหมากรุก ichessboard); รายการสาธารณะ <point> getMypoints (); - คลาสบทคัดย่อพื้นฐานของผู้เล่น
นำเข้า java.util.arraylist; นำเข้า java.util.list; Public Abstract Class BasePlayer ใช้ iPlayer {// ชิ้นส่วนหมากรุกที่ฉันได้วางรายการที่ได้รับการป้องกัน <points> myPoints = new ArrayList <Point> (200); // กระดานหมากรุกป้องกันบอร์ดบอร์ดบอร์ด; // พิกัดแนวนอนและแนวตั้งสูงสุดของบอร์ดได้รับการป้องกัน int maxx; ได้รับการป้องกัน int maxy; // รายการหมากรุกที่ว่างเปล่าทั้งหมด <point> allfreepoints; @Override รายการสุดท้ายสาธารณะ <Point> getMypoints () {return myPoints; } @Override โมฆะสาธารณะ setChessboard (กระดานหมากรุก ichessboard) {this.chessboard = chessboard; allfreepoints = chessboard.getFreepoints (); maxx = chessboard.getMaxx (); maxy = chessboard.getMaxy (); myPoints.clear (); } จุดสุดท้ายส่วนตัวอุณหภูมิ = จุดใหม่ (0, 0); // ฉันจะชนะบูลีนสุดท้ายของสาธารณะ haswin () {ถ้า (mypoints.size () <5) {return false; } point point = mypoints.get (mypoints.size ()-1); จำนวน int = 1; int x = point.getx (), y = point.gety (); // แนวนอน- temp.setx (x) .sety (y); ในขณะที่ (mypoints.contains (temp.setx (temp.getx ()-1)) && temp.getx ()> = 0 && นับ <5) {นับ ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); ในขณะที่ (mypoints.contains (temp.setx (temp.getx ()-1)) && temp.getx ()> = 0 && นับ <5) {นับ ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); ในขณะที่ (mypoints.contains (temp.setx (temp.getx ()+1)) && temp.getx () <maxx && นับ <5) {count ++; } if (count> = 5) {return true; } // ตั้งฉาก | นับ = 1; temp.setx (x) .sety (y); ในขณะที่ (mypoints.contains (temp.sety (temp.gety ()-1)) && temp.gety ()> = 0) {count ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); ในขณะที่ (mypoints.contains (temp.sety (temp.gety ()-1)) && temp.gety ()> = 0) {count ++; } if (count> = 5) {return true; } temp.setx (x) .sety (y); ในขณะที่ (mypoints.contains (temp.sety (temp.gety ()+1)) && temp.gety () <maxy && นับ <5) {นับ ++; } if (count> = 5) {return true; } // ไปข้างหน้าเอียง/นับ = 1; temp.setx (x) .sety (y); ในขณะที่ (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); ในขณะที่ (mypoints.contains (temp.setx (temp.getx ()+1) .sety (temp.gety ()-1)) && temp.getx () <maxx && temp.gety ()> = 0 && นับ <6) {count ++; } if (count> = 5) {return true; } // backslash/count = 1; temp.setx (x) .sety (y); ในขณะที่ (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); ในขณะที่ (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; - การใช้งานคอมพิวเตอร์ AI
นำเข้า java.util.arraylist; นำเข้า Java.util.Collections; นำเข้า java.util.hashmap; นำเข้า java.util.list; นำเข้า java.util.map; // คลาสหลักของอัลกอริทึมแนวคิดหลักของอัลกอริทึมแบ่งออกเป็นสามขั้นตอน // ขั้นตอนแรก: สมมติว่าคะแนนสำหรับตัวเองและอีกฝ่าย (เพื่อทำคะแนนในช่วงที่กำหนด) ตามสถานการณ์ปัจจุบันของทั้งสองฝ่ายและตัดสินการเปลี่ยนแปลงในสถานการณ์ที่ชิ้นนี้สามารถนำมาได้ ครึ่งชีวิต 4) ฯลฯ ) รวมถึงศัตรูและด้านข้างของเรา // ขั้นตอนที่ 3: เรียงลำดับผลลัพธ์ก่อนหน้าตามกฎที่กำหนดโดยผู้ใช้และเลือกรูปร่างย่อยและรูปทรงป้องกัน (มีกฎสำหรับรูปร่างที่น่ารังเกียจและการป้องกัน) ชั้นเรียนสาธารณะ Basecomputerai ขยาย basePlayer {// สี่ทิศทางแนวนอน - แนวตั้ง | , forward-slant /, back-slant / private static final int heng = 0; INT สุดท้ายคงที่ INT ZHONG = 1; INT สุดท้ายคงที่ INT ZHENG_XIE = 2; private static final int fan_xie = 3; // ด้านหน้าไปด้านหลังบูลีนสุดท้ายคงที่ไปข้างหน้า = true; บูลีนสุดท้ายคงที่ส่วนตัวย้อนหลัง = เท็จ; // แสดงผลการวิเคราะห์ ไม่ว่าจะเป็นจุดปัจจุบันคือการผ่านสองระดับ (มีชีวิตอยู่) หรือผ่านเพียงครั้งเดียว (half_alive) กระบวนการวิเคราะห์ชิ้นหมากรุกที่ถูกบล็อกจะถูกบล็อกโดยอัตโนมัติไม่ใช่ชิ้นหมากรุกที่จะเลือก INT คงที่ส่วนตัว INT = 1; ส่วนตัวคงสุดท้าย int half_alive = 0; // ส่วนตัวคงสุดท้าย int ตาย = -1; // คำนวณช่วงช่วงที่มีขนาดใหญ่เกินไปจะมีปัญหาด้านประสิทธิภาพคลาสส่วนตัว calcuterange {int xstart, ystart, xstop, ystop; calcuterange ส่วนตัว (int xstart, int ystart, int xstop, int ystop) {this.xstart = xstart; this.ystart = ystart; this.xstop = xstop; this.ystop = ystop; }} // จำกัด ช่วงการคำนวณคอมพิวเตอร์ หากประสิทธิภาพการคำนวณบอร์ดหมากรุกทั้งหมดแย่เกินไปปัจจุบันจะถูกสร้างขึ้นตามค่าขอบเขตของชิ้นส่วนหมากรุกทั้งหมดที่ถูกนำไปใช้ ปัจจุบันเป็น 1 int สุดท้ายคงที่ int range_step = 1; calcuterange currentRange = ใหม่ calcuterange (0, 0, 0, 0); เป็นโมฆะส่วนตัวเริ่มต้น (รายการ <point> couters, รายการ <point> มนุษย์) {currentRange.xStart = humans.get (0) .getx ()-range_step; currentRange.ystart = humans.get (0) .gety ()-range_step; currentRange.xstop = humans.get (0) .getx ()+range_step; currentRange.ystop = humans.get (0) .gety ()+range_step; สำหรับ (จุดจุด: มนุษย์) {if (point.getx ()-range_step <currentRange.xStart) {currentRange.xStart = point.getx ()-range_step; } อื่นถ้า (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; } อื่นถ้า (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; } อื่นถ้า (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; } อื่นถ้า (point.gety ()+range_step> currentRange.ystop) {currentRange.ystop = point.gety ()+range_step; }} // ถ้าช่วงขยายและเกินกระดานหมากรุกจะเท่ากับกระดานหมากรุก 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 (รายการ <point> couters, รายการ <point> มนุษย์) {ถ้า (humans.size () == 1) {// ขั้นตอนแรกกลับมา getFirstpoint (มนุษย์); } // เริ่มต้นช่วงการคำนวณเริ่มต้น (comuter, มนุษย์); // ล้างผลลัพธ์ก่อนหน้านี้เริ่มต้น (); // เริ่มการวิเคราะห์สแกนจุดว่างทั้งหมดและสร้างจุดวิเคราะห์แรกจุด Bestpoint = dofirstanalysis (comuter, มนุษย์); ถ้า (bestpoint! = null) {//system.out.println(" ชิ้นส่วนนี้สำคัญที่สุดคุณสามารถเล่นชิ้นนี้ได้เท่านั้น "); กลับ Bestpoint; } // วิเคราะห์ผลลัพธ์แรกและค้นหาจุดที่ดีที่สุดของคุณ bestpoint = docomputersencondanalysis (Computerfirstresults, คอมพิวเตอร์คอมพิวเตอร์); ถ้า (bestpoint! = null) {//system.out.println("i'm กำลังจะชนะฉันจะเล่นชิ้นนี้ "); กลับ Bestpoint; } Computerfirstresults.clear (); System.gc (); // วิเคราะห์ผลลัพธ์แรกและค้นหาจุดที่ดีที่สุดของศัตรู bestpoint = dohumansencondanalysis (humanfirstresults, humansencodresults); ถ้า (bestpoint! = null) {//system.out.println(" หากคุณไม่เล่นชิ้นนี้คุณจะแพ้ "); กลับ Bestpoint; } humanfirstresults.clear (); System.gc (); // ไม่พบจุดฆ่าสุดท้ายการวิเคราะห์ผลลัพธ์ที่สามส่งคืน dothirdanalysis (); } // ขั้นตอนแรกของชิ้นหมากรุกไม่จำเป็นต้องมีการคำนวณที่ซับซ้อนและเสร็จสมบูรณ์ตามค่า x ของขั้นตอนแรกของมนุษย์ของชิ้นหมากรุก จุดส่วนตัว getFirstpoint (รายการ <point> มนุษย์) {point point = humans.get (0); if (point.getx () == 0 || point.gety () == 0 || point.getx () == maxx && point.gety () == maxy) คืนจุดใหม่ (maxx/2, maxy/2); อื่น {ส่งคืนจุดใหม่ (point.getx ()-1, point.gety ()); }} // int debugx ส่วนตัว, debugy; // ใช้สำหรับการดีบัก // เริ่มการวิเคราะห์เริ่มสแกนจุดว่างทั้งหมดและสร้างผลการวิเคราะห์ครั้งแรกจุดส่วนตัว dofirstanalysis (รายการ <point> couters, รายการ <point> มนุษย์) {ขนาด int = allfreepoints.size (); จุดคอมพิวเตอร์จุด = null; จุด HumanPoint = NULL; int x, y; FirstanalysisResult FirstanalysisResult; สำหรับ (int i = 0; i <size; i ++) {ComputerPoint = allfreepoints.get (i); // คลิกลงพิกัด X และ Y ก่อนเนื่องจากวัตถุต้นฉบับจะมีการเปลี่ยนแปลงในระหว่างกระบวนการวิเคราะห์ x = ComputerPoint.getx (); y = pumputerpoint.gety (); if (x <currentRange.xStart || x> currentRange.xstop || y <currentRange.ystart || y> currentRange.ystop) {ดำเนินการต่อ; } // ถ้า (x == debugx && y == debugy) {// system.out.println ("sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss System.out.println ("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS TryandCountresult (comuter, มนุษย์, คอมพิวเตอร์, Heng); Computerpoint.setx (x) .Sety (y); // ตอบกลับค่าดั้งเดิมของจุดสำหรับการวิเคราะห์ครั้งต่อไปหาก (FirstAnalysisResult! = null) {// ไม่มีผลการส่งคืนมันเป็นไปไม่ได้ที่จะไปถึงหมากรุกห้าชิ้นในทิศทางนี้ ถ้า (firstanalysisResult.count == 5) // เท่ากับ 5 หมายความว่าคุณสามารถเล่นชิ้นหมากรุก ณ จุดนี้และคุณสามารถเชื่อมต่อกับ 5 ถ้าคุณชนะคุณจะไม่วิเคราะห์ คืนคอมพิวเตอร์ // บันทึกผลการวิเคราะห์ครั้งแรก addtofirstanalysisResult (FirstanalysisResult, Computerfirstresults); } // ทำซ้ำขั้นตอนข้างต้นใน "ทิศทางแนวตั้ง" firstanalysisResult = tryandCountresult (comuter, มนุษย์, คอมพิวเตอร์, Zhong); Computerpoint.setx (x) .Sety (y); if (firstanalysisResult! = null) {// ตายหมากรุกอย่าเล่นถ้า (firstanalysisResult.count == 5) ส่งคืนคอมพิวเตอร์ AddtofirstanalysisResult (FirstanalysisResult, Computerfirstresults); } // ไปข้างหน้าเอียง firstanalysisResult = tryandCountResult (comuter, มนุษย์, คอมพิวเตอร์ zheng_xie); Computerpoint.setx (x) .Sety (y); if (firstanalysisResult! = null) {// หมากรุกที่ตายแล้วอย่าเล่นถ้า (firstanalysisResult.count == 5) ส่งคืนคอมพิวเตอร์ AddtofirstanalysisResult (FirstanalysisResult, Computerfirstresults); } // backside firstanalysisResult = tryandCountResult (comuter, มนุษย์, คอมพิวเตอร์ ection, fan_xie); Computerpoint.setx (x) .Sety (y); if (firstanalysisResult! = null) {// หมากรุกที่ตายแล้วอย่าเล่นถ้า (firstanalysisResult.count == 5) ส่งคืนคอมพิวเตอร์ AddtofirstanalysisResult (FirstanalysisResult, Computerfirstresults); } // วิเคราะห์สถานะของงานชิ้นนี้ในศัตรูในทิศทาง "แนวนอน" เช่น Live 3, Semi-Living 4, ฯลฯ FirstanalysisResult = TryandCountresult (มนุษย์, comuter, คอมพิวเตอร์, Heng); Computerpoint.setx (x) .Sety (y); if (firstanalysisResult! = null) {// die หมากรุกอย่าเล่นถ้า (firstanalysisResult.count == 5) HumanPoint = ComputerPoint; AddtofirstanalysisResult (FirstanalysisResult, Humanfirstresults); } // "ระยะยาว" firstanalysisResult = tryandCountresult (มนุษย์, comuter, juctpoint, zhong); Computerpoint.setx (x) .Sety (y); if (firstanalysisResult! = null) {// die หมากรุกอย่าเล่นถ้า (firstanalysisResult.count == 5) HumanPoint = ComputerPoint; AddtofirstanalysisResult (FirstanalysisResult, Humanfirstresults); } // "forward-slant" firstanalysisResult = tryandCountresult (มนุษย์, comuter, คอมพิวเตอร์, zheng_xie); Computerpoint.setx (x) .Sety (y); if (firstanalysisResult! = null) {// die หมากรุกอย่าเล่นถ้า (firstanalysisResult.count == 5) HumanPoint = ComputerPoint; AddtofirstanalysisResult (FirstanalysisResult, Humanfirstresults); } // "backslash" firstanalysisResult = tryandCountResult (มนุษย์, comuter, ocutionpoint, fan_xie); Computerpoint.setx (x) .Sety (y); if (firstanalysisResult! = null) {// die หมากรุกอย่าเล่นถ้า (firstanalysisResult.count == 5) HumanPoint = ComputerPoint; AddtofirstanalysisResult (FirstanalysisResult, Humanfirstresults); }} // หากไม่มีชิ้นส่วนที่ชนะการวิเคราะห์ครั้งแรกไม่จำเป็นต้องส่งคืนผลลัพธ์ของการวิเคราะห์ครั้งแรก } // การวิเคราะห์ครั้งที่สองวิเคราะห์ผลลัพธ์ของการก่อตัวครั้งแรกผลการวิเคราะห์ครั้งแรกจะสร้างวัตถุ FirstanalysisResult ได้สูงสุดสี่ชิ้น (ศัตรูสี่ตัวและกันและกัน) // วัตถุทั้งสี่ควรรวมเข้ากับวัตถุ sencondanalysisresult, จุดส่วนตัว docomputersencondanalysis (แผนที่ <จุด, รายการ <firstanalysisResult>> firstresults, รายการ <sencondanalysisresult> sencodresults) SencondanalysisResult SR = NULL; สำหรับ (จุด P: firstresults.keyset ()) {sr = ใหม่ sencondanalysisResult (p); list = firstresults.get (p); สำหรับ (FirstanalysisResult ผลลัพธ์: รายการ) {ถ้า (result.count == 4) {ถ้า (result.alivestate == มีชีวิตอยู่) {// หลังจากการกรองก่อนหน้าทั้งสองฝ่ายจะทำการฆ่าขั้นสุดท้าย หากมี 4 ให้ทำตามขั้นตอนนี้และชนะขั้นตอนต่อไป result.point; // หากมีการฆ่าสุดท้ายรอบแรกกลับมาแล้ว ในรอบนี้ของ 4 เป็นชิ้นส่วนที่ดีแล้วกลับมาโดยตรงและไม่วิเคราะห์อีกต่อไปอีกต่อไป} อื่น {sr.halfalive4 ++; Computer4halfalives.add (SR); }} อื่นถ้า (result.count == 3) {ถ้า (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); } // ไม่พบสด 4; คืนค่า null; } // วิธีนี้โดยทั่วไปเหมือนกับด้านบน แต่สำหรับประสิทธิภาพมันเป็นการตัดสินน้อยกว่าแยกมนุษย์และคอมพิวเตอร์จุดส่วนตัว dohumansencondanalysis (แผนที่ <จุด <จุด, รายการ <firstanalysisresult >> firstresults, รายการ <sencondanalysisresult> sencodresults) SencondanalysisResult SR = NULL; สำหรับ (จุด P: firstresults.keyset ()) {sr = ใหม่ sencondanalysisResult (p); list = firstresults.get (p); สำหรับ (firstanalysisResult ผลลัพธ์: รายการ) {ถ้า (result.count == 4) {ถ้า (result.alivestate == มีชีวิตอยู่) {human4alives.add (sr); } else {sr.halfalive4 ++; Human4halfalives.add (SR); }} อื่นถ้า (result.count == 3) {ถ้า (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); } // ไม่พบ Live 4 Return Null; } โมฆะส่วนตัวการนอนหลับ (int minisecond) {ลอง {thread.sleep (minisecond); } catch (interruptedException e) {}} // การวิเคราะห์ที่สามทั้งสองฝ่ายไม่สามารถสร้างสด 4 ค้นหาคู่สด 3 ชิ้นถ้าไม่พบครึ่งชีวิต 4 ถ้าไม่พบการถ่ายทอดสดแบบเดี่ยว 3, สองจุดส่วนตัว 2 จุดส่วนตัว } system.gc (); นอนหลับ (300); collections.sort (ComputerSencodresults); System.gc (); // ฉันกำลังจะมีชีวิตอยู่ 4 และฉันไม่มีครึ่งชีวิต 4 หรือมากกว่าดังนั้นฉันจึงสามารถบล็อกจุดที่ดีที่สุด = getBestPoint (Human4alives, คอมพิวเตอร์คอมพิวเตอร์); ถ้า (มากที่สุด! = null) กลับที่สุด; คอลเลคชั่น SORT (HUMANSENCODRESULTS); System.gc (); มากที่สุด = getBestPoint (); ถ้า (มากที่สุด! = null) กลับที่สุด; // นำสิ่งแรกออกมาและใครก็ตามที่ดีกว่าจะส่งคืนคอมพิวเตอร์ที่เป็นผู้เข้าร่วมประชุม (0) .Point; } // subclass ใช้วิธีนี้และเปลี่ยนแปลงคำสั่งของมันเพื่อให้บรรลุจุดป้องกันหรือโจมตีจุดป้องกัน getBestPoint () {// ฉันกำลังจะมีชีวิตอยู่ 4 และฉันไม่มีครึ่งชีวิต 4 หรือมากกว่าดังนั้นฉันจึงสามารถบล็อกจุดที่ดีที่สุดเท่านั้น = getBestPoint ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Computer3alives, Humansencodresults); ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Humandouble3alives, คอมพิวเตอร์คอมพิวเตอร์); ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Human3Alives, คอมพิวเตอร์คอมพิวเตอร์); ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Computerdouble2alives, HumanSencodresults); ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Computer2alives, Humansencodresults); ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Computer3halfalives, HumanSencodresults); ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Human4Halfalives, คอมพิวเตอร์คอมพิวเตอร์); ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Humandouble2alives, คอมพิวเตอร์คอมพิวเตอร์); ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Human2Alives, ComputerSenCodResults); ถ้า (มากที่สุด! = null) กลับที่สุด; MostBest = GetBestPoint (Human33Halfalives, คอมพิวเตอร์คอมพิวเตอร์); กลับที่สุด } // ขั้นตอนสุดท้ายของการวิเคราะห์ครั้งที่สามผลลัพธ์ที่สองได้รับการจัดเรียงที่นี่คุณสามารถเลือกชิ้นหมากรุกที่ดีที่สุดจากจุดที่ได้รับการป้องกันด้านหน้า (รายการ <sencondanalysisresult> mybest, รายการ <sencondanalysisresult> yourencodresults) {ถ้า (sencondanalysisResult ของคุณ: yourencodresults) {ถ้า (mybest.contains (ของคุณ)) {return your.point; }} ส่งคืน myBest.get (0) .point; } else {return mybest.get (0) .point; }} return null; } // ผลการวิเคราะห์ครั้งแรก MAP สุดท้าย <point, รายการ <FirstanalysisResult>> ComputerFirStresults = new HashMap <Point, list <firstanalysisResult>> (); แผนที่สุดท้ายส่วนตัว <จุด, รายการ <FirstanalysisResult>> HumanFirstresults = new HashMap <จุด, รายการ <FirstanalysisResult>> (); // ผลรวมที่สองได้รับการปกป้องรายการสุดท้าย <SencondanalysisResult> ComputersEncodResults = arrayList ใหม่ <SencondanalysisResult> (); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> HUMANSENCODRESULTS = new ArrayList <SencondanalysisResult> (); รายการสุดท้ายที่ได้รับการปกป้อง <SencondanalysisResult> (); // ผลลัพธ์ที่สองคือคอมพิวเตอร์ที่ได้รับการป้องกันรายการสุดท้าย <SencondanalysisResult> Computer4Halfalives = arrayList ใหม่ <SencondanalysisResult> (2); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> ComputerDouble3Alives = arrayList ใหม่ <SencondanalysisResult> (4); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> Computer3alives = arrayList ใหม่ <SencondanalysisResult> (5); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> Computer3alives = arrayList ใหม่ <SencondanalysisResult> (5); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> ComputerDouble2Alives = arrayList ใหม่ <SencondanalysisResult> (); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> Computer2alives = arrayList ใหม่ <SencondanalysisResult> (); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> Computer3Halfalives = arrayList ใหม่ <SencondanalysisResult> (); // ผลลัพธ์ที่สองคือรายการสุดท้ายที่ได้รับการปกป้องจากมนุษย์ <SencondanalysisResult> Human4Alives = arrayList ใหม่ <SencondanalysisResult> (2); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> Human4Halfalives = arrayList ใหม่ <SencondanalysisResult> (5); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> Humandouble3Alives = arrayList ใหม่ <SencondanalysisResult> (2); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> Human3Alives = arrayList ใหม่ <SencondanalysisResult> (10); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> Humandouble2alives = arrayList ใหม่ <SencondanalysisResult> (3); รายการสุดท้ายที่ได้รับการป้องกัน <SencondanalysisResult> human2alives = arraylist ใหม่ <SencondanalysisResult> (); รายการสุดท้ายที่ได้รับการปกป้อง <SencondanalysisResult> Human33Halfalives = arrayList ใหม่ <SencondanalysisResult> (); // ผลการวิเคราะห์ของการล้างชิ้นส่วนก่อนหน้าก่อนการวิเคราะห์ครั้งแรกเป็นโมฆะส่วนตัวเริ่มต้น initanalysisResults () {comperofirstresults.clear (); humanfirstresults.clear (); // ผลการแข่งขันทั้งหมดที่สองคอมพิวเตอร์ Humansencodresults.clear (); // ผลลัพธ์ที่สองคอมพิวเตอร์ 4Halfalives.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 (); humandouble2alives.clear (); human2alives.clear (); Human33Halfalives.Clear (); System.gc (); } // เพิ่มลงในผลการวิเคราะห์ครั้งแรกโมฆะส่วนตัว addtofirstanalysisResult (firstanalysisResult ผลลัพธ์, แผนที่ <จุด, รายการ <firstanalysisResult >> dest) {ถ้า (dest.containskey (result.point)) {dest.get (result.point) } else {list <firstanalysisResult> list = new ArrayList <FirstanalysisResult> (1); list.add (ผลลัพธ์); dest.put (result.point, list); }} // การวิเคราะห์ครั้งแรกระดับคลาสส่วนตัวชั้น FirstanalysisResult {// นับต่อเนื่อง; // จุดจุด; // ทิศทาง int direction; // state int alivestate; Private FirstanalysisResult (จำนวน int, จุดจุด, ทิศทาง int) {สิ่งนี้ (นับ, จุด, ทิศทาง, มีชีวิตอยู่); } private FirstanalysisResult (จำนวน int, จุดจุด, ทิศทาง int, int alivestate) {this.count = count; this.point = จุด; this.direction = ทิศทาง; this.alivestate = alivestate; } private FirstanalysisResult init (จุดจุด, ทิศทาง int, int alivestate) {this.count = 1; this.point = จุด; this.direction = ทิศทาง; this.alivestate = alivestate; คืนสิ่งนี้; } Private FirstanalysisResult Cloneme () {ส่งคืน FirstanalysisResult ใหม่ (นับ, จุด, ทิศทาง, Alivestate); }} // SecondAnalysisResult ใช้วิธีการเปรียบเทียบ <SencondanalysisResult> {int live4 = 0; // การใช้ชีวิต 3 int live3 = 0; // SecondLiving 4, ปลายด้านหนึ่งของตราประทับ int halfalive4 = 0; // SecondLiving 3, ปลายด้านหนึ่งของตราประทับ int halfalive3 = 0; // การใช้ชีวิต 2 ปริมาณ int live 2 = 0; // จุดจุด; @Override public int hashCode () {สุดท้าย int prime = 31; int ผลลัพธ์ = 1; result = prime * result + ((point == null)? 0: point.hashCode ()); ผลการกลับมา; } @Override บูลีนสาธารณะเท่ากับ (Object obj) {SencondanalysisResult อื่น ๆ = (sencondanalysisresult) obj; if (point == null) {ถ้า (other.point! = null) return false; } อื่นถ้า (! point.equals (อื่น ๆ . จุด)) ส่งคืน false; กลับมาจริง; } ส่วนตัว sencondanalysisResult (จุดจุด) {this.point = point; } // ในระหว่างการวิเคราะห์ครั้งที่สามผลลัพธ์ของการวิเคราะห์ครั้งที่สองจะถูกจัดเรียง นี่คือฟังก์ชั่นการเรียกกลับแบบเรียงลำดับ @Override public int compereto (sencondanalysisResult อีก) {return compareTowResult (นี่อีกอัน); }} // ถ้า return -1 เป็นพารามิเตอร์แรก 1 คือพารามิเตอร์ที่สองเป็นครั้งแรกและ 0 คือ int ส่วนตัว int ในลำดับต้นฉบับ comperetowResult (sencondanalysisresult oneresult, sencondanalysisresult) {ถ้า (oneresult.alive4> อื่น ๆ } if (oneresult.alive4 <อื่น. alive4) {return 1; } if (oneresult.alive4> other.alive4) {return -1; } if (oneresult.alive3> other.alive3) {return -1; } if (oneresult.alive3 <อื่น. alive3) {return 1; } if (oneresult.alive2> other.alive2) {return -1; } if (oneresult.alive2 <อื่น. alive2) {return 1; } if (oneresult.alive3> other.alive3) {return -1; } if (oneresult.alive3> other.alive3) {return 1; } return 0; } // วัตถุชั่วคราวใช้เพื่อจัดเก็บผลการวิเคราะห์ชั่วคราวในระหว่างการวิเคราะห์ครั้งแรก หากมีผลลัพธ์มากกว่า 1 (ไม่รวม) วิธี cloneme จะถูกเรียกให้ได้ผลลัพธ์ มิฉะนั้นผลลัพธ์นี้จะถูกยกเลิกครั้งสุดท้ายครั้งสุดท้ายของ FirstanalysisResult Far = FirstanalysisResult ใหม่ (1, Null, Heng); // การวิเคราะห์หากย่อยอยู่ถัดจากตำแหน่งปัจจุบันจำนวนหมวดย่อยจะเกิดขึ้นในทิศทางที่แน่นอน พารามิเตอร์: คะแนนทั้งหมดที่วางไว้ในด้านปัจจุบันจุดที่ต้องสันนิษฐานว่าทิศทางที่ต้องได้รับการตัดสิน FirstanalysisSresult TryandCountresult (รายการ <points> mypoints, รายการ <point> enemypoints จุดจุด int y = point.gety (); FirstanalysisResult FR = NULL; int maxCountOnThisdirection = maxCountonThisDirection (จุด, enemypoints, ทิศทาง, 1); ถ้า (maxcountonthisdirection <5) {// หมากรุกชิ้นหมดสติกลับ null; // มีพื้นที่ว่างน้อยกว่าห้าช่องว่างในทิศทางนี้และชิ้นหมากรุกที่คุณตั้งไว้แล้วจะถูกแยกออก} อื่นถ้า (maxcountonthisdivection == 5) {// } else {// ปลายทั้งสองคือ fr = far.init (จุด, ทิศทาง, มีชีวิตอยู่); } // คำนวณจุดนับ (mypoints, enemypoints, point.setx (x) .sety (y), fr, ทิศทาง, ไปข้างหน้า); Countpoint (mypoints, enemypoints, point.setx (x) .sety (y), fr, ทิศทาง, ย้อนหลัง); if (fr.count <= 1 || (fr.count == 2 && fr.alivestate == half_alive)) {// realive1, semi-active2 และผลลัพธ์ต่อไปนี้ } // ส่งคืนผลลัพธ์ของการคัดลอก return fr.cloneme (); } // ชิ้นหมากรุกออกมาจากผนังบูลีนส่วนตัว Isoutsidefwall (จุดจุด, ทิศทาง int) {ถ้า (ทิศทาง == Heng) {return point.getx () <0 || point.getx ()> = maxx; // ค่าสูงสุด x และ y อยู่นอกผนังดังนั้นให้ใช้เครื่องหมายเท่ากัน} อื่นถ้า (ทิศทาง == zhong) {return point.gety () <0 || point.gety ()> = maxy; } else {// อาจมีปัญหาที่นี่ return point.getx () <0 || point.gety () <0 || point.gety () <0 || point.gety () <0 || point.gety () <0 || point.getx ()> = maxx || point.gety ()> = maxy; }} point pointsoNext ส่วนตัว (จุดจุด, ทิศทาง int, บูลีนไปข้างหน้า) {สวิตช์ (ทิศทาง) {case heng: ถ้า (ไปข้างหน้า) point.x ++; จุดอื่น ๆ x--; หยุดพัก; กรณี zhong: ถ้า (ไปข้างหน้า) point.y ++; จุดอื่น ๆ y-; หยุดพัก; กรณี zheng_xie: ถ้า (ไปข้างหน้า) {point.x ++; Point.y--; } else {point.x--; point.y ++; } หยุดพัก; case fan_xie: ถ้า (ไปข้างหน้า) {point.x ++; point.y ++; } else {point.x--; Point.y--; } หยุดพัก; } จุดส่งคืน; } // สามารถเล่นได้กี่ชิ้นในทิศทางที่แน่นอน (หนึ่งในแปด) วิธีนี้เป็นวิธีการหลักในการวิเคราะห์ครั้งแรกพนันโมฆะส่วนตัว (รายการ <point> mypoints, รายการ <point> enemypoints, จุดจุด, firstanalysisresult fr, ทิศทาง int, บูลีนไปข้างหน้า) {ถ้า (mypoints.contains if (mypoints.contains (PointNext (จุด, ทิศทาง, ไปข้างหน้า))) {fr.count ++; if (mypoints.contains (PointNext (จุด, ทิศทาง, ไปข้างหน้า))) {fr.count ++; if (mypoints.contains (PointNext (จุด, ทิศทาง, ไปข้างหน้า))) {fr.count ++; } อื่นถ้า (enemypoints.contains (จุด) || isoutsidefwall (จุด, ทิศทาง)) {fr.alivestate = half_alive; }} อื่นถ้า (enemypoints.contains (จุด) || isoutsidefwall (จุดทิศทาง)) {fr.alivestate = half_alive; }} อื่นถ้า (enemypoints.contains (จุด, ทิศทาง)) {fr.alivestate = half_alive; }} อื่นถ้า (enemypoints.contains (จุด) || isoutsidefwall (จุดทิศทาง)) {fr.alivestate = half_alive; }} อื่นถ้า (enemypoints.contains (จุด) || isoutsidefwall (จุดทิศทาง)) {fr.alivestate = half_alive; }} // คุณยังสามารถได้รับห้าชิ้นในทิศทางที่แน่นอน INT INT MAXCOUNTONTHISDIRECTION (จุดจุด, รายการ <point> enemypoints, ทิศทาง int, จำนวน int) {int x = point.getx (), y = point.gety (); สวิตช์ (ทิศทาง) {// เคสแนวนอน HENG: ในขณะที่ (! enemypoints.contains (point.setx (point.getx ()-1)) && point.getx ()> = 0 && นับ <6) {count ++; } point.setx (x); ในขณะที่ (! enemypoints.contains (point.setx (point.getx ()+1)) && point.getx () <maxx && count <6) {count ++; } หยุดพัก; // case perpendicular zhong: ในขณะที่ (! enemypoints.contains (point.sety (point.gety ()-1)) && point.gety ()> = 0) {count ++; } point.sety (y); ในขณะที่ (! enemypoints.contains (point.sety (point.gety ()+1)) && point.gety () <maxy && count <6) {count ++; } หยุดพัก; // ไปข้างหน้าเอียง/เคส zheng_xie: ในขณะที่ (! enemypoints.contains (point.setx (point.getx ()-1) .sety (point.gety ()+1)) && point.getx ()> = 0 && point.gety () <maxy) {count ++; } point.setx (x) .sety (y); ในขณะที่ (! enemypoints.contains (point.setx (point.getx ()+1) .sety (point.gety ()-1)) && point.getx () <maxx && point.gety ()> = 0 && นับ <6) {count ++; } หยุดพัก; // backslash/case fan_xie: ในขณะที่ (! enemypoints.contains (point.setx (point.getx ()-1) .sety (point.gety ()-1)) && point.getx ()> = 0 && point.gety ()> = 0) {count ++; } point.setx (x) .sety (y); ในขณะที่ (! enemypoints.contains (point.setx (point.getx ()+1) .sety (point.gety ()+1)) && point.getx () <maxx && point.gety () <maxy && count <6) {count ++; } หยุดพัก; } นับคืน; } // เล่นหมากรุกชิ้นส่วนอินเทอร์เฟซภายนอก @Override โมฆะสาธารณะเรียกใช้ (รายการ <point> มนุษย์จุด P) {// ลบขั้นตอนสุดท้ายของมนุษย์ที่เป็น allfreepoints.remove (humans.get (humans.size ()-1)); // ขั้นตอนเดียวของคอมพิวเตอร์สามารถสร้างผลลัพธ์ได้ = doanalysis (mypoints, มนุษย์); // ถอดชิ้นหมากรุกลงในคอมพิวเตอร์ allfreepoints.remove (ผลลัพธ์); // เพิ่มลงในชิ้นหมากรุกคอมพิวเตอร์และเล่น mypoints.add (ผลลัพธ์); }} มันง่ายมากที่จะนำผู้เล่นมนุษย์มาใช้
นำเข้า java.util.list; Handaryer ระดับสาธารณะขยาย BasePlayer {@Override โมฆะสาธารณะเรียกใช้ (รายการ <point> enemypoints, จุด P) {getMypoints (). เพิ่ม (p); allfreepoints.remove (p); -สรุป: แม้ว่ามันจะถูกเขียนใน Java อัลกอริทึมได้รับการแยกออกและสามารถปรับเปลี่ยนได้อย่างง่ายดายในการใช้งานของแพลตฟอร์มต่างๆ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น