เกมคำศัพท์ - การติดตั้งบอร์ด?


12

ฉันกำลังทำงานในเกมประเภทเกรงกลัวสำหรับ Android โดยใช้ libgdx ผู้ใช้นำเสนอด้วยตัวอักษรขนาด 4x4 และต้องค้นหาคำด้วยการลากนิ้วของพวกเขาไปที่ตัวอักษร

ฉันต้องการให้ตัวอักษรที่ใช้หายไป ตัวอักษรที่เหลือจะล้มลง (ที่ด้านล่างของกระดานการวางแนวหน้าจอได้รับการแก้ไข) และกระดานจะถูกเติมจากด้านบน ผู้ใช้สามารถหมุนกระดานเพื่อพยายามใช้ตัวอักษรให้อยู่ในที่ที่ดีขึ้นโดยการเลือกคำที่เหมาะสม

ตัวอย่าง:

d g a o
u o r T
h v R I
d G n a

หากฉันเลือกคำว่า GRIT ตัวอักษรเหล่านั้นจะหายไปและส่วนที่เหลือจะล้มลง:

d
u g a
h o r o
d v n a

แล้วแทนที่ด้วยตัวอักษรใหม่

d w x y
u g a z
h o r o
d v n a

ฉันกำลังหาวิธีที่จะเป็นตัวแทนคณะกรรมการและกระเบื้อง

ฉันพยายามแสดงบอร์ดเป็นเมทริกซ์เพื่อติดตามการเลือกไทล์และการเคลื่อนไหวที่ถูกต้องและไทล์ที่เก็บในเมทริกซ์ก็มีการแมปง่าย ใช้งานได้ แต่ฉันต้องเขียนโค้ดที่ซับซ้อนเพื่อหมุนกระดาน

เกมอื่น ๆ จัดการกับปัญหานี้อย่างไร

แก้ไข: ดังนั้นคิดเกี่ยวกับมันฉันควรเพียงแค่ประมวลผลจุดสัมผัสของฉันตามการหมุนกระดานเพื่อให้เซลล์คงที่ แนบภาพสิ่งที่ฉันคิดสัมผัสหน้าจอประมวลผลเพื่อปรับทิศทางของกระดานไม่เปลี่ยนแปลง


1
คุณหมายถึงทิศทางนั้นซึ่งตัวอักษรใดจะล้มขึ้นอยู่กับทิศทางของอุปกรณ์? คุณอาจจะยังทำอย่างละเอียดที่คุณหมายถึงโดย"เมาขึ้นเมื่อฉันต้องการที่จะหมุนกระเบื้อง"
Petr Abdulin

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

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

ฉันคิดว่าฉันทำผิดพลาดไปทั้งหมดการประมวลผลจุดสัมผัสของผู้ใช้ตามการหมุนจะทำให้ฉันคิดว่าบอร์ดเป็นวัตถุคงที่
andy mcevoy

โปรดใส่คำตอบลงไปและยอมรับคำตอบของคุณหากคุณพบวิธีแก้ไขปัญหาแล้ว มิฉะนั้นคุณสามารถเปิดไว้ได้หากคุณยังไม่แน่ใจ 100% คำที่อธิบายโซลูชันที่คุณเสนอคือ "การแปลช่องว่าง" คือคุณกำลังแปลจุดสัมผัสระหว่างพื้นที่หน้าจอและพื้นที่บอร์ด (หมุน)
วิศวกร

คำตอบ:


1

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

โหนดขอบของคุณจะมีการตั้งค่าเพื่อนบ้านnullเพื่อให้แน่ใจว่าจะจัดการตามนั้นในวิธีการของคุณในระดับโหนดที่จำเป็นต้องอ้างถึงเพื่อนบ้าน

ฉันได้ใช้วิธีการนี้เพื่อนำGame of Life ของ Conwayมาใช้และเมื่อคุณติดตั้งแล้วมันจะลดความซับซ้อนของการเพิ่มตรรกะอย่างมากซึ่งจะเปลี่ยนสถานะของโหนดตามเพื่อนบ้าน

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

ป้อนคำอธิบายรูปภาพที่นี่


-2

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

    int MAX_GRID = 4;
    int[][] main_array = new int[MAX_GRID][MAX_GRID];
    int[][] temp_array = new int[MAX_GRID][MAX_GRID];

    /** This method for clockwise **/
    int mainRow = MAX_GRID - 1;
    for (int c = 0; c < MAX_GRID; c++) {
        for (int r = 0; r < MAX_GRID; r++) {
            temp_array [mainRow][c] = main_array [r][c];
            Log.i("TAG", "R C : [ " + mainRow + " " + c + " ]" + " => [ "
                    + r + " " + c + " ]");
            mainRow--;
        }
    }
    main_array = temp_array;

    /** This method for anti-clockwise **/
    int mainCol = 0;
    for (int c = MAX_GRID - 1; c >= 0; c--) {
        for (int r = MAX_GRID - 1; r >= 0; r--) {
            temp_array [r][mainCol] = main_array [c][r];
            Log.i("TAG", "R C : [ " + r + " " + mainCol + " ]" + " => [ "
                    + c + " " + r + " ]");
        }
        mainCol++;
    }
    main_array = temp_array;

    // Now you can set main_array value then its rotate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.