ตัวอย่างในบทความนี้แบ่งปันรหัสเฉพาะของการใช้งาน Java Tetris สำหรับการอ้างอิงของคุณกับคุณ เนื้อหาเฉพาะมีดังนี้
บันทึกแผนที่ของเกมโดยใช้อาร์เรย์ 2D:
// Game Map Grid, แต่ละกริดบันทึกหนึ่งตาราง, อาร์เรย์บันทึกสถานะของแผนที่สถานะส่วนตัวบล็อก [] [] = สถานะใหม่ [แถว] [คอลัมน์];
เริ่มต้นกริดทั้งหมดในแผนที่ให้ว่างก่อนเกม:
/* เริ่มต้นบล็อกทั้งหมดให้ว่าง*/สำหรับ (int i = 0; i <map.length; i ++) {สำหรับ (int j = 0; j <map [i] .length; j ++) {map [i] [j] = state.empty; -ในระหว่างเกมเราสามารถเห็นบล็อกบนอินเทอร์เฟซดังนั้นเราต้องวาดบล็อกทั้งหมดในแผนที่ แน่นอนนอกเหนือจากการวาดบล็อกแล้วจุดสิ้นสุดของเกมและจุดสิ้นสุดของเกมก็ต้องถูกวาดเมื่อจำเป็น:
/*** วาดเนื้อหาของแบบฟอร์มรวมถึงบล็อกเกมคะแนนเกมหรือสตริงสิ้นสุด*/@overridepublic Void Paint (กราฟิก G) {super.paint (g); สำหรับ (int i = 0; i <rows; i ++) {สำหรับ (int j = 0; j <คอลัมน์; j ++) {ถ้า (แผนที่ [i] [j] == state.active) {// วาดบล็อกที่ใช้งาน G.SetColor (ActiveColor); G.FillRoundRect (j * block_size, i * block_size + 25, block_size - 1, block_size - 1, block_size / 5, block_size / 5); } อื่นถ้า (แผนที่ [i] [j] == state.stoped) {// วาดบล็อกคงที่ g.setColor (stopedColor); G.FillRoundRect (j * block_size, i * block_size + 25, block_size - 1, block_size - 1, block_size / 5, block_size / 5); }}} /* คะแนนการพิมพ์* / g.setColor (scorecolor); G.SetFont (ฟอนต์ใหม่ ("Times New Roman", Font.Bold, 30)); G.DrawString ("คะแนน:" + totalscore, 5, 70); // เกมจบลงพิมพ์สตริงปลายทางถ้า (! is กำลังกำลัง) {g.setColor (color.red); G.SetFont (ตัวอักษรใหม่ ("Times New Roman", Font.Bold, 40)); G.DrawString ("Game Over!", this.getWidth () / 2 - 140, this.getheight () / 2); -กราฟิกหลายประเภทที่ประกอบด้วยสี่เหลี่ยมถูกสร้างขึ้นโดยตัวเลขสุ่ม โดยทั่วไปกราฟิกเจ็ดประเภท: แท่ง, สนาม, ปกติ 7, ย้อนกลับ 7, รูปตัว T, รูปตัว z, รูปตัว Z และรูปตัว z ผกผันเช่นการสร้างแถบ:
แผนที่ [0] [randpos] = แผนที่ [0] [randpos - 1] = แผนที่ [0] [randpos + 1] = แผนที่ [0] [randpos + 2] = state.active;
หลังจากสร้างกราฟิกแล้วจะมีการใช้งานที่อยู่ หากคุณพบอุปสรรคคุณจะไม่ตกต่อไป:
isfall = true; // ไม่ว่ามันจะตก // ตรวจสอบจากบรรทัดปัจจุบันหยุดการตกถ้าพบสิ่งกีดขวางสำหรับ (int i = 0; i <blockrows; i ++) {สำหรับ (int j = 0; j <คอลัมน์; j ++) {// ถ้าบล็อกในบรรทัดเป็นบล็อกที่ใช้งานอยู่ 1] [j] == state.stoped) {isfall = false; // หยุดพักตก }} if (! isfall) break;}หากไม่พบอุปสรรคแผนภาพบล็อกจะเลื่อนลงหนึ่งบรรทัดโดยรวม:
// กราฟตกแถวสำหรับ (int i = 0; i <blockrows; i ++) {สำหรับ (int j = 0; j <คอลัมน์; j ++) {ถ้า (แผนที่ [rowindex - i] [j] == state.active) {// บล็อกที่ใช้งานอยู่ // บล็อกที่ใช้งานเดิมกลายเป็นแผนที่บล็อกว่างเปล่า [RowIndex - I + 1] [J] = state.active; // บรรทัดถัดไปของบล็อกกลายเป็นบล็อกที่ใช้งานอยู่}}}การดำเนินการที่คล้ายกันคือเมื่อย้ายไปทางซ้ายและขวา:
/*** ไปทางซ้าย*/โมฆะส่วนตัวซ้าย () {// ทำเครื่องหมายว่ามีอุปสรรคในบูลีนซ้าย hasblock = false; /* ตรวจสอบว่ามีสิ่งกีดขวางทางด้านซ้าย*/ สำหรับ (int i = 0; i <blockrows; i ++) {ถ้า (แผนที่ [rowindex - i] [0] == state.active) {// ตรวจสอบว่าด้านซ้ายเป็นผนัง hasblock = true; หยุดพัก; // มีสิ่งกีดขวางไม่จำเป็นต้องวนรอบเพื่อตัดสินแถว} อื่น {สำหรับ (int j = 1; j <คอลัมน์; j ++) {// ตรวจสอบว่ามีบล็อกอื่น ๆ ทางด้านซ้ายถ้า (แผนที่ [rowindex - i] [j] == state.active && แผนที่ [rowindex - i] [j - 1] = หยุดพัก; // มีอุปสรรคไม่จำเป็นต้องรีไซเคิลคอลัมน์การตัดสิน}} ถ้า (Hasblock) Break; // มีสิ่งกีดขวางไม่จำเป็นต้องรีไซเคิลแถวการตัดสิน}}/* ไม่มีสิ่งกีดขวางทางด้านซ้ายย้ายรูปไปทางซ้ายโดยระยะทางของบล็อก*/ ถ้า (! hasblock) {สำหรับ (int i = 0; i <blockrows; i ++) {สำหรับ (int j = 1; j <คอลัมน์ i] [j - 1] = state.active;}}} // repaint repaint ();เมื่อเลื่อนลงไปจะช่วยลดช่วงเวลาสำหรับแต่ละสถานะปกติจะลดลง:
/*** ลงตรงลง*/โมฆะส่วนตัวลง () {// เครื่องหมายสามารถเร่งการตกทันที = true;}วิธีการเปลี่ยนทิศทางของกราฟมีการใช้วิธีการง่ายๆเพียงอย่างเดียวที่นี่เพื่อให้ได้การแปลงทิศทาง แน่นอนว่าอาจมีอัลกอริทึมที่ดีกว่าในการดำเนินการเปลี่ยนแปลงทิศทาง คุณสามารถศึกษาด้วยตัวเอง:
/*** หมุนรูปทรงสี่เหลี่ยม*/โมฆะส่วนตัวหมุน () {ลอง {ถ้า (รูปร่าง == 4) {// สี่เหลี่ยมรูปร่างเดียวกันจะถูกส่งคืนก่อนและหลังการหมุน } อื่นถ้า (shape == 0) {// strip // อาร์เรย์ชั่วคราวให้วางรูปหลังจากสถานะการหมุน [] [] tmp = สถานะใหม่ [4] [4]; int startColumn = 0; // ค้นหาตำแหน่งสี่เหลี่ยมแรกที่จุดเริ่มต้นของรูปสำหรับ (int i = 0; i <คอลัมน์; i ++) {ถ้า (แผนที่ [rowindex] [i] == state.active) {startColumn = i; หยุดพัก; }} // ค้นหาว่ามีอุปสรรคหลังจากการหมุนหรือไม่ หากมีสิ่งกีดขวางอย่าหมุนสำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {ถ้า (แผนที่ [rowindex - 3+i] [j+startColumn] == state.stoped) {return; }}}} ถ้า (แผนที่ [rowindex] [startColumn+1] == state.active) {// แถบแนวนอน, แปลงเป็นแถบแนวตั้งสำหรับ (int i = 0; i <4; i ++) {tmp [i] [0] = state.active; สำหรับ (int j = 1; j <4; j ++) {tmp [i] [j] = state.empty; }} blockrows = 4; } else {// แถบแนวตั้ง, แปลงเป็นแถบแนวนอนสำหรับ (int j = 0; j <4; j ++) {tmp [3] [j] = state.active; สำหรับ (int i = 0; i <3; i ++) {tmp [i] [j] = state.empty; }} blockrows = 1; } // แก้ไขกราฟในแผนที่ดั้งเดิมเป็นกราฟที่แปลงสำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {แผนที่ [rowindex - 3+i] [startColumn+j] = tmp [i] [j]; }}} else {// อาร์เรย์ชั่วคราววางการหมุนของสถานะรูป [] [] tmp = สถานะใหม่ [3] [3]; int startColumn = คอลัมน์; // ค้นหาตำแหน่งบล็อกแรกที่จุดเริ่มต้นของรูปสำหรับ (int j = 0; j <3; j ++) {สำหรับ (int i = 0; i <คอลัมน์; i ++) {ถ้า (แผนที่ [rowindex - j] [i] == state.active) {startColumn = i <startColumn? ฉัน: StartColumn; }}} // พิจารณาว่าจะมีอุปสรรคหลังจากการแปลงสำหรับ (int i = 0; i <3; i ++) {สำหรับ (int j = 0; j <3; j ++) {ถ้า (แผนที่ [rowindex - 2+j] }} // แปลงสำหรับ (int i = 0; i <3; i ++) {สำหรับ (int j = 0; j <3; j ++) {tmp [2 - j] [i] = แผนที่ [rowindex - 2+i] [startColumn+J]; }} // แก้ไขกราฟในแผนที่ต้นฉบับเป็นกราฟที่แปลงแล้วสำหรับ (int i = 0; i <3; i ++) {สำหรับ (int j = 0; j <3; j ++) {แผนที่ [rowindex - 2+i] [startColumn+J] = tmp [i] [j]; }} // repaint repaint (); // ลบตัวชี้บรรทัดสำหรับ (int i = 0; i <3; i ++) {สำหรับ (int j = 0; j <3; j ++) {ถ้า (แผนที่ [rowindex - i] [startColumn+j]! blockrows = 3; กลับ; }}}}}} catch (Exception E) {// ถ้าพบตัวห้อยอาร์เรย์นั่นหมายความว่ารูปร่างของกราฟไม่สามารถเปลี่ยนแปลงได้และไม่มีการประมวลผลใด ๆ }}เมื่อรูปตกและหยุดเมื่อพบอุปสรรคเราจำเป็นต้องพิจารณาว่ามีเส้นหนึ่งหรือหลายบรรทัดที่สามารถกำจัดได้ ในเวลานี้เราสามารถได้รับจำนวนสี่เหลี่ยมในแต่ละบรรทัดก่อนจากนั้นทำการตัดสิน:
int [] blockscount = new int [แถว]; // บันทึกจำนวนคอลัมน์ที่มีบล็อกต่อแถว int eliminaterows = 0; // จำนวนแถวกำจัด/* คำนวณจำนวนบล็อกต่อแถว*/สำหรับ (int i = 0; i <rows; i ++) {blockscount [i] = 0; สำหรับ (int j = 0; j <คอลัมน์; j ++) {ถ้า (แผนที่ [i] [j] == state.stoped) blockscount [i] ++; -หากมีบล็อกเต็มแถวแถวของบล็อกจะถูกกำจัด:
/* ใช้การดำเนินการกำจัดบล็อกด้วยแถวเต็ม*/สำหรับ (int i = 0; i <rows; i ++) {ถ้า (blockscount [i] == คอลัมน์) {// ล้างบรรทัดสำหรับ (int m = i; m> = 0; m--) {สำหรับ (int n = 0; n <คอลัมน์; n ++) state.empty: แผนที่ [M - 1] [n]; }} Eliminaterows ++; // บันทึกจำนวนแถวกำจัด}}}ในที่สุดเราสามารถทาสีจุดและแสดงให้เห็นได้
ทำซ้ำการดำเนินการด้านบนของการสร้างกราฟิกกราฟิกที่ตกลงมาเคลื่อนที่ไปทางซ้ายและขวาและตัดสินเส้นกำจัดและ tetris ง่าย ๆ จะเสร็จสิ้น
เอฟเฟกต์การทำงาน:
รหัสตัวอย่างที่สมบูรณ์: tetris
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น