เมื่อฉันเรียนรู้ JavaScript ฉันเขียนเกม Sudoku ใน JavaScript ฉันเพิ่งอ่านเนื้อหา Java ดังนั้นฉันจึงต้องการสร้างเกม Sudoku เวอร์ชั่น Java
ตอนนี้ฉันจะแบ่งปันรหัสทั้งหมดและเรียนรู้จากคุณ แน่นอนว่ามีปัญหาและข้อบกพร่องต่าง ๆ ในรหัส ฉันหวังว่าคุณจะวิพากษ์วิจารณ์และให้คำแนะนำกับฉัน
ต่อไปนี้เป็นอัลกอริทึมหลักสำหรับการสร้างแผนที่ Sudoku อัลกอริทึมไม่ดีมากและฉันก็อ้างถึงความคิดออนไลน์มาก่อน:
แพ็คเกจ hlc.shudu.src;/** คลาสช่วยเหลือ sudoku ซึ่งให้อัลกอริทึมทั้งหมดที่จำเป็นสำหรับข้อมูล*/คลาสสาธารณะ Shuduhelper {// sudoku แผนที่อาร์เรย์ส่วนตัวคงที่ int [] [] แผนที่ = ใหม่ int [9] [9]; // จำนวนตำแหน่งที่สามารถวางไว้ในแต่ละกริดเก้าเมตร int คงที่ int [] canputsum = int ใหม่ [9]; // ใช้เพื่อเก็บไว้ก่อนหน้านี้ int คงที่ [] used = new int [9]; // ไม่ว่าการสร้างแผนที่จะเสร็จสิ้นบูลีนแบบคงที่ isok = true; /** รับอาร์เรย์แผนที่ sudoku*/สาธารณะคงที่ int [] [] getMap () {// ตัดสินว่าแผนที่ได้รับการสร้างและสร้างใหม่หากยังไม่เสร็จสมบูรณ์ // จากนี้เราจะเห็นว่าอัลกอริทึมยังคงต้องได้รับการปรับให้เหมาะสม หาก backtrack ดีมันสามารถสร้างใหม่ผ่านการย้อนรอยย้อนกลับและที่นี่มันจะถูกสร้างใหม่โดยการดำเนินการอีกครั้งอัลกอริทึมการสร้าง ฉันหวังว่าเพื่อนที่สนใจสามารถนำไปใช้ต่อไปนี้ ทำ {isok = true; initmaps (); } ในขณะที่ (! isok); แผนที่กลับ; } / * * เริ่มต้นแผนที่ * / โมฆะแบบคงที่ส่วนตัวเริ่มต้น () {// เริ่มต้นอาร์เรย์แผนที่โดยไม่มีหมายเลขใด ๆ สำหรับ (int i = 0; i <9; i ++) {สำหรับ (int j = 0; j <9; j ++) {maps [i] [j] = -1; }} // เติมใน 1 ~ 9 สำหรับ (int num = 1; num <= 9; num ++) {สำหรับ (int i = 0; i <9; i ++) {ใช้ [i] = -1; canputsum [i] = -1; } // Traverse แต่ละกริดเก้าในกริดเก้าขนาดใหญ่สำหรับ (int i = 0; i <9; i ++) {ถ้า (canputsum [i] ==-1) {canputsum [i] = getCanputsum (i, num); } if (canputsum [i] == 1) {ใช้ [i] = -1; } if (canputsum [i] == 0) {canputsum [i] = -1; ใช้ [i] = -1; // ถ้าหมายเลขจำนวนไม่สามารถวางไว้ในกริดเก้าปัจจุบันจากนั้นกลับไปที่ NIN ก่อนหน้าถ้า (i> 0) {// ล้างตำแหน่งที่วาง NUM ในตารางเก้าอันก่อนหน้านี้ถ้า (ใช้ [I-1]! =-1) {// แผนที่ [int) (Math.floor (ใช้ [I-1]/3)+Math.floor ((I-1)/3)*3)] [ใช้ [I-1]%3+((I-1)%3)*3] =-1; Clearnum (i - 1, num); } // ฉันตกหลุมหนึ่งเพราะสำหรับลูปเกรย์จะเพิ่มหนึ่งลงใน i ดังนั้น 2 จึงถูกลบออกที่นี่ฉัน -= 2; ดำเนินการต่อ; } else {isok = false; กลับ; }} else {// ใส่ num ลงในธงบูลีนกริดที่เก้าปัจจุบัน = false; ในขณะที่ (! ธง) {int j = (int) (math.random () * 9); // พิกัดแนวนอนของสี่เหลี่ยมจัตุรัสขนาดเล็กปัจจุบัน II = (i / 3) * 3 + j / 3; // พิกัดแนวตั้งปัจจุบันของสแควร์ขนาดเล็ก int jj = (i % 3) * 3 + j % 3; //system.out.println("num:"+num+"/tii:"+ii+"/tjj:"+jj); // ถ้าสามารถวาง NUM ให้วางถ้า (แผนที่ [ii] [jj] == -1 && j! = ใช้ [i] && iscanput (ii, jj, num)) {แผนที่ [ii] [jj] = num; ใช้ [i] = j; canputsum [i] -= 1; ธง = จริง; }}}}}}}} / * * ล้าง num ในกริดที่เก้าที่เก้า * / โมฆะคงที่ส่วนตัว clearnum (int i, int num) {สำหรับ (int j = 0; j <9; j ++) {// การประสานงานแนวนอน // พิกัดแนวตั้งของสี่เหลี่ยมจัตุรัสขนาดเล็กปัจจุบัน int jj = (i % 3) * 3 + j % 3; // ตรวจสอบว่าสามารถวางสแควร์ขนาดเล็กในปัจจุบันได้หรือไม่ถ้า (แผนที่ [ii] [jj] == num) {แผนที่ [ii] [jj] = -1; }}} /** รับจำนวนตำแหน่งที่สามารถวางตำแหน่งเก้า-ลูกค้าในจำนวน num num* / ส่วนตัว int int getCanputsum (int i, int num) {int sum = 0; // สำรวจเก้าลูกค้าสำหรับ (int j = 0; j <9; j ++) {// พิกัดแนวนอนของสี่เหลี่ยมจัตุรัสขนาดเล็กปัจจุบัน int ii = (i / 3) * 3+j / 3; // พิกัดแนวตั้งของสี่เหลี่ยมจัตุรัสขนาดเล็กปัจจุบัน int jj = i % 3 * 3 + j % 3; // ตรวจสอบว่าสามารถวางสแควร์ขนาดเล็กในปัจจุบันได้หรือไม่ถ้า (แผนที่ [ii] [jj] == -1 && iScanput (ii, jj, num)) {++ ผลรวม; }} ส่งคืนผลรวม; } / * * ระบุว่าจุดพิกัดแนวนอนและแนวตั้งสามารถวาง num * / บูลีนสแตติกส่วนตัว (int II, int jj, int num) {// ตรวจสอบว่าจำนวนแถวเดียวกันหรือคอลัมน์เดียวกันของจุดพิกัดที่ระบุมีจำนวนเดียวกัน หากมีมันเป็นเท็จสำหรับ (int i = 0; i <9; i ++) {ถ้า (แผนที่ [ii] [i] == num) {return false; } if (maps [i] [jj] == num) {return false; }} ส่งคืนจริง; -แพ็คเกจที่สมบูรณ์สามารถดาวน์โหลดได้บน gitHub: https://github.com/houlongchao/s
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น