C # basit bir yılan oyunu oluşturma


12

C # ile bir yılan oyunu yaratmayı düşünüyordum, bu yüzden kafamda fikirler çalıştırdım ve bazı sorunlar ortaya çıktı.

Yılanın başından sonra çalışan blokları nasıl doğru yerde takip edebilirim?

Yılan beş bloktan oluşuyorsa ve kullanıcı bir daire çizmeye başlarsa, yılan gövdesini doğru konuma nasıl yazdırabilirim?

Ayrıca, kullanıcı ne yaparsa yapsın, yılanı ileri hareket ettirecek şekilde arka planda çalışacak bir eylem nasıl oluşturabilirim?

Kodumun hangi yapısı olmalı? (kod tasarım yapısı)

Bu bir konsol uygulaması olmalı, çünkü aşina olduğum tek çerçeve bu.

Gerçekten nasıl çalışması gerektiğini anlamak istiyorum çünkü bitmiş kodu arıyorum.

Yanıtlar:


23

Yılanı Temsil Etmek

Bir Yılan oyunu oluşturmak oldukça basittir. İhtiyacınız olan ilk şey , yılanınızın vücudunu temsil etmenin bir yoludur . Yılanınızın bloklardan veya fayanslardan oluştuğunu düşünüyorsanız, vücudunuz bu blok koordinatlarının bir listesi olabilir.

Sizin durumunuzda, bir konsol uygulaması yapmak istiyorsanız, bunların her biri konsoldaki bir karakter olacaktır ve konum, konsol çıkışının bir satırına veya satırına karşılık gelecektir. Böylece bununla başlıyorsunuz:

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

Bu noktada listeniz boş, yani yılanınızın vücudu yok. Diyelim ki 5 boyunda bir yılan istiyorsunuz ve baş pozisyonda (5,2) başlamalı ve dibe doğru büyümeli. Oyun başladığında bu pozisyonları listeye eklemeniz yeterli, örneğin:

// 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));
}

Yılanı Oluşturmak

Oluşturmak için sadece gövde listesindeki her konuma bir karakter çizin. Örneğin yukarıdaki örnek şu şekilde çizilebilir:

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

Karakterin başı (listedeki ilk eleman) ve kuyruğu (listedeki son eleman) için farklı karakterler seçerek ve hatta bitişik blokların konumlarına bağlı olarak onları yönlendirerek daha karmaşık hale gelebilirsiniz. Ama yeni başlayanlar için, her şeyi bir #şey gibi yapın.

Örneğin, aşağıdaki gibi arka planı içeren bir 2D karakter dizisi ile başlayabilirsiniz:

// 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] = '.';

Ve sonra yılanın vücudu üzerinde onu diziye çekerek yineleyin:

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

Ve son olarak dizi üzerinde tekrarlayın ve her satırı konsolun her satırının sonunda bir satır sonu olacak şekilde yazın.

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

Yılanı Hareket Ettirmek

Sonunda hareket. İhtiyacınız olan ilk şey Directionyılanı takip etmektir. Bu basit bir numaralandırma olabilir:

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

Ve yılanı hareket ettirme, sadece son bloğu listeden çıkararak ve ön tarafa doğru yönde ekleyerek yapılabilir . Başka bir deyişle:

// 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
Hareket için son bloğu öne doğru hareket ettirmek için iyi bir çağrı!
SpartanDonut

Mükemmel cevap. Yılanı nasıl hareket ettirdiğini seviyorum - oldukça zarif.
Cypher

-3
  1. Her zamanlayıcı, yılanın konumunu güncellediğinizde ve şekilleri yeni konumlarda çizdiğinizde

  2. Yılanı hareket ettirmek üzere oyunu tetiklemek üzere arka plan eylemi için bir System.Windows.Forms.Timer kullanın.

  3. Yapı için sınıfları ve kalıtımı kullanma


Bu çok belirsiz bir cevap. Üçüncü adım özellikle böyledir.
MichaelHouse
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.