แหล่งที่มาของบทความ: csdn ผู้แต่ง: Chen Wanfei
เกี่ยวกับผู้เขียน
Chen Wanfei เพศชาย สำเร็จการศึกษาระดับปริญญาตรีสาขาคณิตศาสตร์และซอฟต์แวร์จาก Central South University เขาเป็นโปรแกรมเมอร์อาวุโสและนักวิเคราะห์ระบบที่ Beijing Great Wall Software เขามีประสบการณ์มากมายในการพัฒนา j2se และ j2ee ปัจจุบันทำงานเกี่ยวกับการวิจัย j2me สามารถติดต่อได้ที่ [email protected]
สรุป
บทความนี้จะให้แผนการออกแบบสำหรับเกม Tetris ที่ใช้ MIDP1.0 และให้ซอร์สโค้ดการใช้งานแบบเต็ม คุณสมบัติที่ใหญ่ที่สุดของเกมคือความสามารถในการปรับเปลี่ยนหน้าจอ ไม่ว่าโทรศัพท์มือถือและ PDA จะมีขนาดหน้าจอเท่าใด เกมก็สามารถให้เอฟเฟกต์การแสดงผลที่ดีที่สุดได้เสมอ เกมดังกล่าวได้รับการทดสอบบนโปรแกรมจำลองสี่ตัวของชุดเครื่องมือไร้สาย J2me 2.1
ข้อจำกัดความรับผิดชอบ: รหัสเกมนี้เดิมทีมาจากโครงการโอเพ่นซอร์สของญี่ปุ่น (ดูข้อมูลอ้างอิง 1) และได้รับการแก้ไขอย่างมีนัยสำคัญโดยผู้เขียน
นี่คือภาพหน้าจอบางส่วนของเกม:
ออกแบบ
1. ขั้นตอนการดำเนินงาน
ขั้นตอนการทำงานของเกมนี้ง่ายมาก หลังจากที่ผู้ใช้เริ่ม MIDlet เขาเข้าสู่หน้าจอหลักของเกมและหน้าจอจะเริ่มแสดงหน้าจอต้อนรับ หลังจากที่ผู้ใช้กดปุ่ม [Start] เขาสามารถเริ่มเล่นเกมได้ เมื่อผู้ใช้ต้องการหยุดชั่วคราว เขากดปุ่ม [Start] อีกครั้ง และเกมจะหยุดชั่วคราวหากผู้ใช้กดปุ่ม [Start] อีกครั้ง หยุดชั่วคราว เกมยังคงดำเนินต่อไป ทุกครั้งที่กดปุ่ม [Exit] เกม MIDlet จะถูกยกเลิก
ผังหน้าจอเกมมีดังนี้:
2. อัลกอริทึม
การออกแบบเกม MIDP จะใช้เธรดหรือตัวจับเวลาเพื่อสร้างกิจกรรมการวาดใหม่ และใช้เธรดและการป้อนข้อมูลของผู้ใช้เพื่อเปลี่ยนสถานะของเกม เกมนี้ไม่มีข้อยกเว้น หลังจากเริ่ม MIDlet เธรดการวาดใหม่จะถูกสร้างขึ้นทันที ซึ่งจะดึงหน้าจอทุกๆ 50 มิลลิวินาที แน่นอนว่ามีมาตรการเพิ่มประสิทธิภาพบางอย่างเมื่อวาดใหม่ ไม่จำเป็นต้องวาดพิกเซลทั้งหมดบนหน้าจอใหม่ แต่มีตัวเลือกต่างๆ เช่น วัตถุที่ตกลงมาซึ่งได้รับการแก้ไขบนผืนผ้าใบของเกม (มีทั้งหมด 7 ประเภทของวัตถุที่ตกลงมา ประกอบด้วยอิฐขนาดเล็ก 4 ชิ้น วัตถุแต่ละชิ้นที่ตกลงมามีสีคงที่และสามารถหมุนขึ้น ลง ซ้าย และขวา ได้ จึงไม่จำเป็นต้องวาดใหม่ Canvas ของเกมคือ CommandListener ที่สามารถรับคำสั่งแป้นพิมพ์ของผู้ใช้และควบคุมการดำเนินการทางซ้าย ขวา ลง และการหมุนของวัตถุที่ตกลงมา การควบคุมโฟลว์ของเกมทั้งหมดจะสะท้อนให้เห็นในเมธอด Paint() ของออบเจ็กต์ Canvas ของเกม Paint() ดึงหน้าจอเกมปัจจุบันตามสถานะเกมปัจจุบัน หน้าจอต้อนรับและหน้าจอ Game Over นั้นค่อนข้างง่ายในการวาด การวาดหน้าจอหยุดเกมนั้นค่อนข้างง่าย เพียงตั้งค่าสถานะเพื่อให้เมื่อดำเนินการ Paint() ก็ไม่จำเป็นต้องดำเนินการวาดใหม่จริง ๆ สำหรับการวาดหน้าจอในขณะที่เกมกำลังดำเนินอยู่ วัตถุที่ตกลงมาจะต้องถูกวาดที่ตำแหน่งปัจจุบันของวัตถุที่ตกลงมา ก่อนที่จะวาดวัตถุที่ตกลงมา ให้พิจารณาว่าวัตถุที่ตกลงมายังสามารถตกลงมาได้หรือไม่ ให้ปล่อยให้ตกไปหนึ่งช่องแล้วจึงวาดมันขึ้นมา หากวัตถุที่ตกลงมาไม่สามารถตกลงมาได้อีกต่อไป ให้พิจารณาว่าเกมอยู่ในสถานะจบเกมหรือไม่ อยู่ในเกม หากเกมอยู่ในสถานะโอเวอร์ ให้ตั้งค่าสถานะเกมเป็นสถานะจบเกม เพื่อที่ผืนผ้าใบจะวาดหน้าจอเกมโอเวอร์ในครั้งถัดไปที่วาดใหม่ หากเกมไม่อยู่ในสถานะจบเกม , ในสถานะโอเวอร์ วัตถุที่ตกลงมาได้รับการแก้ไข และในเวลาเดียวกัน แถวทั้งหมดที่อยู่ใต้แถวปัจจุบันของวัตถุที่ตกลงมาจะถูกตรวจสอบบนผืนผ้าใบของเกมเพื่อดูว่าจำเป็นต้องลบแถวหรือไม่ หากจำเป็นต้องลบแถว ข้อมูลของ แถวที่ถูกลบบนแผนที่เกมจะถูกล้าง จากนั้นแถวที่ถูกลบจะถูกวาดด้วยสีพื้นหลัง จากนั้นให้เริ่มต้นวัตถุใหม่ที่ตกลงมาและวาดวัตถุที่ตกลงมาใหม่นี้ แผนภูมิการไหลของวิธีการทาสีมีดังนี้:
3.โครงสร้างข้อมูล
เกมนี้เกี่ยวข้องกับโครงสร้างข้อมูลต่อไปนี้
พื้นที่เล่นเกม
พื้นที่เล่นเกมเป็นส่วนหนึ่งของหน้าจอโทรศัพท์มือถือหรือ PDA พื้นที่เป็นสี่เหลี่ยมจัตุรัสและความยาวด้านต้องหารด้วย 16 เท่าๆ กัน (เนื่องจากพื้นที่เกมรัสเซียเป็นสี่เหลี่ยมจัตุรัสที่มีความยาว 16 ก้อนเล็กและ 16 ก้อนเล็ก กว้าง). พื้นที่นี้ควรอยู่ตรงกลางหน้าจอ ทั้งแนวนอนและแนวตั้ง พื้นที่เล่นเกมแบ่งออกเป็น 2 ส่วนในแนวนอน ส่วนหนึ่งกว้าง 12 ก้อนอิฐเล็ก ๆ เพื่อแสดงคอนเทนเนอร์เกม และอีกส่วนกว้าง 4 อิฐเล็ก ๆ กว้างเพื่อแสดงวัตถุและคะแนนถัดไปที่ตกลงมา
อิฐขนาดเล็ก
อิฐขนาดเล็กเป็นส่วนหนึ่งของคอนเทนเนอร์ดรอปและเกม ปรากฏเป็นสี่เหลี่ยมจัตุรัส โดยมีความยาวด้านเท่ากับ 1/16 ของความยาวด้านของพื้นที่เล่นเกม เมื่อวาดอิฐขนาดเล็กแต่ละก้อน จะเหลือ 1 พิกเซลทั้งสี่ด้านแล้ววาดด้วยสีขาวหรือสีเทาเพื่อให้มีช่องว่างระหว่างอิฐ อิฐขนาดเล็กแต่ละก้อนจะมี ID เช่นกัน ตั้งแต่ 1 ถึง 8 เราสามารถใช้อาร์เรย์สี (เรียกว่า BRICK_COLORS ในโปรแกรม) เพื่อจัดเก็บ 8 สีเหล่านี้ หาก ID ของอิฐก้อนเล็กคือ 3 สีของอิฐก้อนเล็กจะเป็น BRICK_COLORS[3-1]
วัตถุล้ม
หยดนั้นเป็นสี่เหลี่ยมจัตุรัสที่ทำจากอิฐขนาดเล็ก 16 ก้อน วัตถุที่ตกลงมามีทั้งหมด 7 แบบ เช่น รูปทรง "สนาม", รูปทรง "L" เป็นต้น มีรูปแบบการหมุน 4 รูปแบบสำหรับวัตถุที่ตกลงมาแต่ละชิ้น วัตถุที่ตกลงมาแต่ละชิ้นมีรหัสตั้งแต่ 1 ถึง 7 เพราะวัตถุที่ตกลงมาจะมีสีคงที่ นอกจากนี้เรายังสามารถใช้ค่าตัวห้อยของสีนั้นในอาร์เรย์ BRICK_COLORS บวก 1 เป็นรหัสของวัตถุที่ตกลงมา
ตัวอย่างเช่น วัตถุที่ตกลงมารูปร่าง "L" มี ID เท่ากับ 3 และความแปรผันของมันคือ:
ดังนั้นโครงสร้างข้อมูลใดที่ใช้ในการจัดเก็บวัตถุที่ตกลงมา ลองใช้วัตถุที่ตกลงมาเป็นรูปตัว "L" เป็นตัวอย่างเพื่อแสดง:
เนื่องจากแต่ละวัตถุที่ตกลงมามีสี่สถานะ เราจึงสามารถพิจารณาใช้อาร์เรย์ที่มีความยาว 4 เพื่อจัดเก็บสี่สถานะของวัตถุที่ตกลงมา แต่ละองค์ประกอบในอาร์เรย์แสดงถึงสถานะของวัตถุที่ตกลงมา ดังนั้นสิ่งที่ควรใช้เพื่อแสดงสถานะของวัตถุที่ตกลงมา ดังที่เห็นจากรูปด้านบน เหมาะสมที่สุดที่จะใช้อาร์เรย์สองมิติ 4X4 เพื่อจัดเก็บสถานะของวัตถุที่ตกลงมา เมื่ออิฐสีปรากฏ ค่าจะเป็น 1 และในกรณีที่มีเพียงสีพื้นหลังและไม่จำเป็นต้องวาด ค่าจะเป็น 0 ดังนั้น สี่สถานะของวัตถุที่ตกลงมาเป็นรูปตัว "L" ทั้งหมดจึงสามารถแสดงด้วยอาร์เรย์ 3 มิติได้:
ป้องกัน int blockpattern3[][][] = {
{{0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}},
{{0, 0, 0, 0}, {0, 1, 1, 1}, {0, 1, 0, 0}, {0, 0, 0, 0}},
{{0, 0, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 0}},
{{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 0}}
-
แผนที่เกม
แผนที่เกมใช้เพื่อจัดเก็บไทล์คงที่บนคอนเทนเนอร์เกม คอนเทนเนอร์เกมประกอบด้วยอิฐขนาดเล็ก 12 ยูนิตกว้างและสูง 16 ยูนิต รวมถึงกำแพงด้านซ้ายและขวา 2 ด้านและด้านล่างของคอนเทนเนอร์ด้านล่าง ดังนั้นอาร์เรย์สองมิติ 16X12 (เรียกว่า mapdata ในโปรแกรม) จึงถูกนำมาใช้เพื่อจัดเก็บอิฐคงที่ หาก mapdata[i][j]=k(k!=0) นั่นหมายความว่ามีอิฐขนาดเล็กคงที่บนแถว i และคอลัมน์ j ของคอนเทนเนอร์เกม และค่าสีของอิฐขนาดเล็กคือ BRICK_COLORS[k -1] ถ้า k=0 แสดงว่าไม่มีตัวต่อในแถว i และคอลัมน์ j
ดังนั้น สำหรับเวลารันเกมต่อไปนี้ ค่าของข้อมูลแผนที่คือ {{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0 , 0,0,0,0,0,0,8}{8,0,0,0,0,0 ,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0 ,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}
{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,0,8} {}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,0, 8}
{8,0,0,0,0,0,0,0,0,1,1,8}{8,0,0,0,0,0,0,0,0,1,1,8} {8,0,0,0,0,0,7,7,5,1,1,8}{8,0,5,0,0,7,2,5,5,1,1,8}
{8,8,8,8,8,8,8,8,8,8,8,8}}
ซอร์สโค้ดและโค้ดปฏิบัติการ
มีทั้งหมด 3 ไฟล์: src.rar, ketrisgame.jad, ketrisgame.jar หมายเหตุ: src.rar มีซอร์สโค้ดทั้งหมด นอกจากนี้ยังมีไฟล์ทรัพยากรที่จำเป็นสำหรับโปรแกรมที่ทำงานใน ketrisgame.jar หลังจากติดตั้ง wtk2.1 แล้ว ให้วาง ketrisgame.jad และ ketrisgame.jar ไว้ในไดเร็กทอรีเดียวกัน (โปรดทราบว่าพาธไดเร็กทอรีต้องไม่มีอักขระจีนและการเว้นวรรค) ให้ดับเบิลคลิกที่ ketrisgame.jad คุณสามารถรันเกมในโปรแกรมจำลองได้
อ้างอิง
http://www.javadrive.jp/j2me/game/3/index.html
<โดยย่อ j2me>
<ความรู้เบื้องต้นเกี่ยวกับการเขียนโปรแกรม Java บนโทรศัพท์มือถือ/PDA>