C # สร้างเกมงูง่าย ๆ


12

ฉันกำลังคิดเกี่ยวกับการสร้างเกมงูด้วย C # ดังนั้นฉันจึงวิ่งความคิดในหัวของฉันและปัญหาบางอย่างเกิดขึ้น

ฉันจะติดตามและส่งออกไปยังตำแหน่งที่ถูกต้องของบล็อกที่วิ่งตามหัวงูได้อย่างไร?

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

นอกจากนี้ฉันจะสร้างการกระทำที่จะทำงานบนพื้นหลังได้อย่างไรซึ่งจะทำให้งูข้างหน้าไม่ว่าผู้ใช้จะทำอะไร

รหัสของฉันควรมีโครงสร้างอะไร (โครงสร้างการออกแบบรหัส)

นี่ควรเป็นแอปพลิเคชันคอนโซลเนื่องจากเป็นเพียงกรอบงานเดียวที่ฉันคุ้นเคย

ฉันไม่ได้มองหารหัสที่เสร็จสมบูรณ์แล้วเพราะฉันต้องการที่จะเข้าใจว่ามันควรจะทำงานอย่างไร

คำตอบ:


23

เป็นตัวแทนของงู

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

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

// List of 2D coordinates that make up the body of the snake
List<Point>() body = new List<Point>();

ณ จุดนี้รายการของคุณว่างเปล่าดังนั้นงูของคุณไม่มีร่างกาย สมมติว่าคุณต้องการงูที่มีความยาว 5 และหัวควรเริ่มในตำแหน่ง (5,2) และเติบโตไปทางด้านล่าง เพียงเพิ่มตำแหน่งเหล่านั้นลงในรายการเมื่อเกมเริ่มตัวอย่างเช่น:

// Initialize the snake with 5 blocks starting downwards from (5,2)
for(int i=0; i<5; ++i)
{
    body.Add(new Point(5, 2 + i));
}

การแสดงผลของงู

สำหรับการเรนเดอร์เพียงแค่วาดตัวละครที่แต่ละตำแหน่งในรายการเนื้อหา ตัวอย่างด้านบนสามารถวาดได้เช่น:

...................
...................
.....O............. -- y = 2
.....#.............
.....#.............
.....#.............
.....V.............
...................
     |
     x = 5

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

เช่นคุณสามารถเริ่มต้นด้วยอาร์เรย์ถ่าน 2 มิติที่มีพื้นหลังดังนี้:

// Array with map characters
char[,] render = new char[width, height];

// Fill with background
for(x=0; x<width; ++x)
    for(y=0; y<height; ++y)
        render[x,y] = '.';

จากนั้นวนซ้ำร่างของงูลงไปในอาเรย์:

// Render snake
foreach(Point point in body)
    render[point.X, point.Y] = '#';

และในที่สุดก็วนซ้ำอาร์เรย์อีกครั้งและเขียนอักขระแต่ละตัวลงในคอนโซล

// Render to console
for(y=0; y<height; ++y)
{
    for(x=0; x<width; ++x)
    {
        Console.Write(render[x,y]);
    }
    Console.WriteLine();
}

ย้ายงู

ในที่สุดการเคลื่อนไหว สิ่งแรกที่คุณต้องการคือการติดตามDirectionงูกำลังเคลื่อนที่ นี่อาจเป็น enum ง่าย ๆ :

// Enum to store the direction the snake is moving
enum Direction { Left, Right, Up, Down }

และทำหน้าที่ในการเคลื่อนย้ายงูสามารถทำได้เพียงแค่การลบบล็อกที่ผ่านมาจากรายการและเพิ่มบนหน้าในทิศทางที่ถูกต้อง กล่าวอีกนัยหนึ่งเช่น:

// Remove tail from body
body.RemoveAt(body.Count - 1);

// Get head position
Point next = body[0];

// Calculate where the head should be next based on the snake's direction
if(direction == Direction.Left) 
    next = new Point(next.X-1, next.Y);
if(direction == Direction.Right) 
    next = new Point(next.X+1, next.Y);
if(direction == Direction.Up) 
    next = new Point(next.X, next.Y-1);
if(direction == Direction.Down) 
    next = new Point(next.X, next.Y+1);

// Insert new head into the snake's body
body.Insert(0, next);

5
เรียกการเคลื่อนย้ายบล็อกสุดท้ายไปยังด้านหน้าเพื่อทำการเคลื่อนไหวได้ดี!
SpartanDonut

คำตอบที่ดี ฉันชอบที่คุณเคลื่อนไหวงูอย่างไร - มันค่อนข้างสง่างาม
Cypher

-3
  1. ทุกครั้งที่ตัวจับเวลาเห็บคุณอัปเดตตำแหน่งของงูและวาดรูปร่างที่ตำแหน่งใหม่

  2. ใช้ระบบคำสั่งรูปแบบสำหรับการดำเนินการพื้นหลังเพื่อเรียกเกมเพื่อย้ายงูไปรอบ ๆ

  3. ใช้คลาสและการสืบทอดสำหรับโครงสร้าง


นี่เป็นคำตอบที่คลุมเครือมาก ขั้นตอนที่สามคือโดยเฉพาะอย่างยิ่ง
MichaelHouse
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.