สารบัญ:

ตั้งโปรแกรมเกม 2048 ของคุณเองด้วย Java!: 8 ขั้นตอน
ตั้งโปรแกรมเกม 2048 ของคุณเองด้วย Java!: 8 ขั้นตอน

วีดีโอ: ตั้งโปรแกรมเกม 2048 ของคุณเองด้วย Java!: 8 ขั้นตอน

วีดีโอ: ตั้งโปรแกรมเกม 2048 ของคุณเองด้วย Java!: 8 ขั้นตอน
วีดีโอ: วิธีติดตั้งหรืออัพเดท Java ง่ายๆ และอธิบายคร่าวๆเกี่ยวกับ Optifine 2024, ธันวาคม
Anonim

โดย PranP1เว็บไซต์ของฉัน (ไม่สมบูรณ์) ติดตาม เพิ่มเติมโดยผู้เขียน:

เครื่อง CNC Arduino จากชิ้นส่วนพีซีที่กู้คืน
เครื่อง CNC Arduino จากชิ้นส่วนพีซีที่กู้คืน
เครื่อง CNC Arduino จากชิ้นส่วนพีซีที่กู้คืน
เครื่อง CNC Arduino จากชิ้นส่วนพีซีที่กู้คืน
DIY ม้านั่งไม้ที่ทันสมัย
DIY ม้านั่งไม้ที่ทันสมัย
DIY ม้านั่งไม้ที่ทันสมัย
DIY ม้านั่งไม้ที่ทันสมัย
ที่เปิดประตูแบบไม่สัมผัส (vSTEM)
ที่เปิดประตูแบบไม่สัมผัส (vSTEM)
ที่เปิดประตูแบบไม่สัมผัส (vSTEM)
ที่เปิดประตูแบบไม่สัมผัส (vSTEM)

ฉันชอบเกม 2048 ดังนั้นฉันจึงตัดสินใจตั้งโปรแกรมเวอร์ชันของตัวเอง

มันคล้ายกับเกมจริงมาก แต่การเขียนโปรแกรมด้วยตัวเองทำให้ฉันมีอิสระในการเปลี่ยนแปลงสิ่งที่ฉันต้องการเมื่อใดก็ตามที่ฉันต้องการ ถ้าฉันต้องการเกม 5x5 แทนที่จะเป็น 4x4 ทั่วไป การเปลี่ยนแปลงง่ายๆ โดยใช้ตัวสร้าง 'บอร์ด' จะอนุญาตให้ฉันทำเช่นนั้น สมมติว่าฉันต้องการทำให้เกมยากขึ้นโดยเพิ่มชิ้นส่วนในตำแหน่งที่จะทำให้มันซับซ้อนที่สุดสำหรับผู้เล่นมากกว่าที่จะสุ่ม โดยใช้อัลกอริธึมง่ายๆ ฉันทำได้ แม้ว่าฉันจะไม่ครอบคลุมถึงการปรับเปลี่ยนเหล่านี้ทั้งหมดในคำแนะนำนี้ แต่ฉันวางแผนที่จะเพิ่มมากขึ้นเมื่อฉันทำ

อย่างไรก็ตาม สำหรับตอนนี้ เราจะตั้งโปรแกรมเกมทั่วไปของคุณในปี 2048

มาเริ่มกันเลย!

(หมายเหตุด้านข้าง: คำแนะนำนี้ต้องการความรู้ปานกลางเกี่ยวกับการเขียนโปรแกรม - โดยเฉพาะกับ Java)

ขั้นตอนที่ 1: วัสดุ

วัสดุ
วัสดุ

คุณไม่ต้องการอะไรมากสำหรับโปรเจ็กต์นี้ เนื่องจากเป็นเพียงคำแนะนำในการเขียนโปรแกรม

วัสดุ:

  • แล็ปท็อป
  • Eclipse (หรือ IDE ที่คุณเลือก)

ได้. แค่นั้นแหละ.

ขั้นตอนที่ 2: ทำความรู้จักโปรแกรม - Board

ฉันอัปโหลดรหัสทั้งหมดของฉันไปที่ GitHub - ลองดูที่นี่:

ฉันแบ่งเกมออกเป็น 3 คลาส: บอร์ด ไทล์ และเกม

กระดาน:

คำอธิบาย: คลาส Board เกี่ยวข้องกับ gameboard ตั้งค่าอาร์เรย์ขององค์ประกอบ 'Tile' รับคะแนนปัจจุบันและไทล์สูงสุด และใส่อาร์เรย์ในสตริง (เพื่อใช้ในภายหลังใน 'Game') ตรรกะส่วนใหญ่ก็อยู่ที่นี่เช่นกัน คลาสที่จัดเตรียมวิธีการวางไข่ของ 2 และ 4 ในตำแหน่งสุ่ม เลื่อนขึ้น ลง ซ้ายและขวา และแจ้งให้ผู้เล่นทราบเมื่อเกมจบลง

ตัวสร้าง:

/* ตัวสร้างเริ่มต้นสำหรับบอร์ด - ตั้งค่าเมทริกซ์ 4x4 */

บอร์ดสาธารณะ () {…}

/* Constructor for the Board - ตั้งค่าเมทริกซ์ด้วยขนาดกริดที่ระบุ */

บอร์ดสาธารณะ (กริด int) {…}

วิธีการ:

/* วิธี Getter ที่ส่งคืนบอร์ด */

ไทล์สาธารณะ getBoard() {…}

/* วิธี Getter ที่ส่งคืนคะแนน */

สาธารณะ int getScore() {…}

/* ค้นหาไทล์สูงสุดบนกระดานและส่งคืน */

int สาธารณะ getHighTile() {…}

/* พิมพ์บอร์ดลงบนคอนโซล - เพื่อการทดสอบ */

พิมพ์โมฆะสาธารณะ () {…}

/* ส่งคืนบอร์ดเป็นสตริง - ใช้ใน GUI */

สตริงสาธารณะ toString() {…}

/* เกิด 2 (หรือ 4) ในพื้นที่ว่างเมื่อทำการย้าย */

วางไข่เป็นโมฆะสาธารณะ () {…}

/* ตรวจสอบว่ากระดานเป็นสีดำสนิทหรือไม่ และหากเป็นเช่นนั้น จะเป็นการสะกิดให้ผู้เล่นเริ่มใหม่ */

blackOut บูลีนสาธารณะ () {…}

/* ตรวจสอบเพื่อดูว่าเกมจบลงหรือไม่ - เมื่อกระดานเป็นสีดำและไม่มีแผ่นใดที่สามารถรวมกันได้ */

gameOver บูลีนสาธารณะ () {…}

/* เรียกเมื่อกด 'w' หรือลูกศรขึ้น - เรียก 'verticalMove' สำหรับทุกไทล์บนกระดานที่มีพารามิเตอร์ 'up' */

โมฆะสาธารณะ () {…}

/* เรียกเมื่อกด 's' หรือลูกศรลง - เรียก 'verticalMove' สำหรับทุกไทล์บนกระดานที่มีพารามิเตอร์ 'down' */public void down() {…}

/* เรียกเมื่อกด 'd' หรือลูกศรขวา - เรียก 'horizontalMove' สำหรับทุกไทล์บนกระดานพร้อมพารามิเตอร์ 'right' */public void right() {…}

/* เรียกเมื่อกด 'a' หรือลูกศรซ้าย - เรียก 'horizontalMove' สำหรับทุกไทล์บนกระดานพร้อมพารามิเตอร์ 'left' */

โมฆะสาธารณะ left() {…}

/* เปรียบเทียบค่าของไพ่สองแผ่นด้วยกัน และถ้าเท่ากันหรือมีค่าเท่ากับ 0 (แผ่นกระเบื้องธรรมดา) - ค่าของพวกมันจะถูกเพิ่มเข้าไป (โดยที่แผ่นที่เรากำลังเปรียบเทียบนั้นเป็นไพ่สองใบที่แตกต่างกันและกำลังเคลื่อนไปในทิศทางที่เหมาะสม) - วนซ้ำไปมาในแถว */

โมฆะสาธารณะในแนวนอน (แถว int, int col, ทิศทางสตริง) {…}

/* เปรียบเทียบค่าของไพ่สองแผ่นด้วยกัน และถ้าเท่ากันหรือมีค่าเท่ากับ 0 (แผ่นกระเบื้องธรรมดา) - ค่าของพวกมันจะถูกเพิ่มเข้าไป (โดยที่แผ่นที่เรากำลังเปรียบเทียบนั้นเป็นไพ่สองใบที่แตกต่างกันและกำลังเคลื่อนไปในทิศทางที่เหมาะสม) - วนซ้ำผ่านคอลัมน์ */

โมฆะสาธารณะ verticalMove (แถว int, int col, ทิศทางสตริง) {…}

ใช่ มีวิธีการมากมาย แต่ไม่ต้องกังวล ส่วนใหญ่เข้าใจง่ายมาก ยิ่งไปกว่านั้น คลาส 'บอร์ด' นั้นซับซ้อนที่สุด ดังนั้นทุกอย่างหลังจากนั้นจะค่อนข้างง่าย

ขั้นตอนที่ 3: ทำความรู้จักกับโปรแกรม - ไทล์

กระเบื้อง:

คำอธิบาย: คลาสไทล์เกี่ยวข้องกับไทล์แต่ละรายการ และเป็นคลาสที่เล็กที่สุดในบรรดาคลาสทั้งหมด แต่ละไทล์มีค่าจำนวนเต็มและสี มีตัวสร้างสองตัวที่สร้างไทล์ที่มีค่า 0 (ค่าเริ่มต้น) หรือค่า # วิธีการส่วนใหญ่จะอธิบายตนเองได้ โดยวิธี 'getter' และ 'setter' รวมกันเป็นจำนวนมาก

ตัวสร้าง:

/* สร้างไทล์พื้นฐานที่มีค่า 0 */

ไทล์สาธารณะ () {…}

/* สร้างไทล์ที่มีค่าตัวเลข */

ไทล์สาธารณะ (หมายเลข int) {…}

วิธีการ:

/* รับค่าของไทล์ */

int สาธารณะ getValue() {…}

/* ตั้งค่าของไทล์ - ใช้เมื่อรวมสองไทล์เข้าด้วยกัน */

โมฆะสาธารณะ setValue (ค่า int) {…}

/* หมายถึงไทล์เป็นสตริง - ใช้ใน GUI */

สตริงสาธารณะ toString() {…}

/* กำหนดสีของไทล์ตามค่าของมัน */

โมฆะสาธารณะ setColor() {…}

/* รับสีของไทล์ */

โมฆะสาธารณะ getColor() {…}

ขั้นตอนที่ 4: ทำความรู้จักกับโปรแกรม - เกม

เกม

คำอธิบาย: คลาสเกมประกอบด้วยเมธอดหลัก เมธอด GUI ส่วนใหญ่ และการโต้ตอบคีย์ ต้องใช้ทั้งคลาสไทล์และบอร์ด และทำให้พวกเขาทำงานร่วมกันได้

ตัวสร้าง:

ไม่มี

วิธีการ:

/* ตั้งค่า GUI ด้วยขนาดที่เหมาะสมและเพิ่ม Key Listener */

โมฆะคงที่สาธารณะ setUpGUI () {…}

/* ตรวจสอบเพื่อดูว่ามีการกดปุ่ม wasd หรือลูกศรและดำเนินการตามความเหมาะสมหรือไม่ - อัปเดต JFrame ทุกการเคลื่อนไหว */

โมฆะสาธารณะ keyPressed (KeyEvent e) {…}

/* ระบายสี GUI ด้วยชุดสตริง กระดาน ไทล์ และตรวจดูให้แน่ใจว่ามีการทาสีใหม่เมื่อเกมจบลง */

สีโมฆะสาธารณะ (กราฟิก g) {…}

/* วาดแต่ละไทล์ - เรียกจากวิธีการทาสี */

โมฆะสาธารณะ drawTiles (กราฟิก g, ไทล์ไทล์, int x, int y) {…}

/* วิธีหลัก - ตั้งค่า GUI และเริ่มเกม */

โมฆะคงที่สาธารณะ main(String args) {…}

ขั้นตอนที่ 5: วิธีการที่สำคัญ - การเคลื่อนไหว

วิธีการเคลื่อนไหวเป็นสิ่งสำคัญที่สุดในการทำความเข้าใจ แต่ข่าวดีก็คือ เมื่อคุณเข้าใจการเคลื่อนไหวในแนวดิ่งแล้ว คุณสามารถนำความเข้าใจนั้นไปใช้กับการเคลื่อนไหวในแนวนอนได้ อันที่จริง วิธีการเคลื่อนที่ในแนวตั้งสามวิธีนั้นเหมือนกันทุกประการกับวิธีการเคลื่อนที่ในแนวนอนทั้งสามวิธี ยกเว้นวิธีหนึ่งเคลื่อนที่ข้ามแถวและอีกวิธีหนึ่งข้ามคอลัมน์ ด้วยเหตุผลดังกล่าว เราจึงเน้นเฉพาะวิธีการเคลื่อนที่ในแนวตั้งเท่านั้น

โมฆะส่วนตัว verticalMove (แถว int, int col, ทิศทางสตริง)

{ ไทล์เริ่มต้น = กระดาน[border][col]; กระเบื้องเปรียบเทียบ = กระดาน[แถว][col]; if (initial.getValue() == 0 || initial.getValue() == Compare.getValue()) { if (row > border || (direction.equals("down") && (row < border))) { int addScore = initial.getValue () + Compare.getValue (); ถ้า (initial.getValue() != 0) { คะแนน += addScore; } initial.setValue (addScore); Compare.setValue(0); } } else { if (direction.equals("down")) { border--; } อื่น ๆ { เส้นขอบ ++; } verticalMove(แถว, col, ทิศทาง); } }

วิธีการข้างต้น verticalMove ถูกเรียกโดยวิธี 'ขึ้น' และ 'ลง' มาดูวิธีการ 'ขึ้น' กัน

โมฆะสาธารณะ ()

{ สำหรับ (int i = 0; i < กริด; i ++) { border = 0; สำหรับ (int j = 0; j < grids; j++) { if (board[j].getValue() != 0) { if (border <= j) { verticalMove (j, i, "up"); } } } } }

วิธีนี้จะผ่านทั้งกระดานและเรียก verticalMove สำหรับทุกไทล์ที่มีพารามิเตอร์ "up" verticalMove จะเปรียบเทียบไทล์ที่ตำแหน่ง 'j' และ 'i' กับไทล์ที่ตำแหน่ง 'border' และ 'i' หากทั้งสองมีค่าเท่ากัน ให้นำมารวมกัน หากไม่เป็นเช่นนั้น ไทล์เส้นขอบจะเพิ่มขึ้น 1 (เนื่องจากพารามิเตอร์อยู่ในตำแหน่ง 'up') และ VerticalMove จะถูกเรียกอีกครั้ง

แนะนำ: