สารบัญ:
- ขั้นตอนที่ 1: วัสดุ
- ขั้นตอนที่ 2: ทำความรู้จักโปรแกรม - Board
- ขั้นตอนที่ 3: ทำความรู้จักกับโปรแกรม - ไทล์
- ขั้นตอนที่ 4: ทำความรู้จักกับโปรแกรม - เกม
- ขั้นตอนที่ 5: วิธีการที่สำคัญ - การเคลื่อนไหว
วีดีโอ: ตั้งโปรแกรมเกม 2048 ของคุณเองด้วย Java!: 8 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:02
โดย PranP1เว็บไซต์ของฉัน (ไม่สมบูรณ์) ติดตาม เพิ่มเติมโดยผู้เขียน:
ฉันชอบเกม 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 จะถูกเรียกอีกครั้ง
แนะนำ:
Raspberry Pi - TMD26721 Infrared Digital Proximity Detector Java Tutorial: 4 ขั้นตอน
Raspberry Pi - TMD26721 Infrared Digital Proximity Detector Java Tutorial: TMD26721 เป็นเครื่องตรวจจับความใกล้ชิดแบบดิจิตอลอินฟราเรดซึ่งมีระบบตรวจจับความใกล้ชิดที่สมบูรณ์แบบและตรรกะอินเทอร์เฟซแบบดิจิทัลในโมดูลยึดพื้นผิว 8 พินเดียว การตรวจจับความใกล้ชิดรวมถึงสัญญาณต่อสัญญาณรบกวนที่ดีขึ้นและ ความแม่นยำ. โปร
วิธีสร้าง UML สำหรับ Java ใน Microsoft Visio: 4 ขั้นตอน
วิธีสร้าง UML สำหรับ Java ใน Microsoft Visio: ในตอนแรก การสร้าง UML อาจดูน่ากลัวเล็กน้อย มีสไตล์สัญกรณ์ที่ซับซ้อนมากมาย และรู้สึกเหมือนไม่มีแหล่งข้อมูลที่ดีในการจัดรูปแบบ UML ที่สามารถอ่านได้และแม่นยำ อย่างไรก็ตาม Microsoft Visio ทำให้การสร้าง UML qu
การพัฒนา Java อย่างมีประสิทธิภาพสำหรับ Raspberry Pi: 11 ขั้นตอน (พร้อมรูปภาพ)
การพัฒนา Java อย่างมีประสิทธิภาพสำหรับ Raspberry Pi: คำแนะนำนี้อธิบายแนวทางที่มีประสิทธิภาพมากสำหรับการพัฒนาโปรแกรม Java สำหรับ Raspberry Pi ฉันได้ใช้วิธีนี้ในการพัฒนาความสามารถของ Java ตั้งแต่การรองรับอุปกรณ์ระดับต่ำไปจนถึงโปรแกรมแบบมัลติเธรดและบนเครือข่าย แอปพ
สร้างนาฬิกา Retro Nixie ของคุณเองด้วย RTC!: 7 ขั้นตอน (พร้อมรูปภาพ)
สร้างนาฬิกา Nixie Retro ของคุณเองด้วย RTC!: ในโครงการนี้ ฉันจะแสดงวิธีสร้างนาฬิกา Nixie ย้อนยุค นั่นหมายความว่าฉันจะแสดงให้คุณเห็นว่าคุณสามารถควบคุมหลอด nixie ด้วยแหล่งจ่ายไฟ DC แรงสูงได้อย่างไร จากนั้นฉันจะรวม 4 หลอด nixie เข้ากับ Arduino, Real Time Clock (RTC) และ
สร้าง Afero Hub ของคุณเองด้วย Raspberry Pi: 6 ขั้นตอน
สร้าง Afero Hub ของคุณเองด้วย Raspberry Pi: สวัสดีทุกคน เราได้โพสต์คำแนะนำสองสามข้อที่แสดงให้เห็นว่าการใช้บอร์ด Afero Modulo-1 ของเรานั้นง่ายเพียงใดเพื่อเชื่อมต่ออุปกรณ์ของคุณกับคลาวด์เพื่อให้สามารถเข้าถึงได้แบบไร้สายและควบคุมได้แบบไร้สาย และสามารถพูดคุยกับอุปกรณ์อื่น ๆ ทางออนไลน์