C # membuat game ular sederhana


12

Saya sedang berpikir tentang membuat permainan ular dengan C #, jadi saya menjalankan ide di kepala saya, dan beberapa masalah muncul.

Bagaimana saya bisa melacak dan menghasilkan di lokasi yang benar blok yang berjalan setelah kepala ular?

Jika ular dibangun dari lima blok, dan pengguna mulai membentuk lingkaran, bagaimana saya bisa mencetak tubuh ular di lokasi yang benar?

Juga, bagaimana saya bisa membuat tindakan yang akan berjalan di latar belakang, yang akan menggerakkan ular ke depan, tidak peduli apa yang dilakukan pengguna?

Struktur apa yang harus dimiliki kode saya? (struktur desain kode)

Ini harus menjadi aplikasi konsol, karena itu satu-satunya kerangka kerja yang saya kenal.

Saya tidak mencari kode yang sudah jadi, karena saya ingin benar-benar mengerti bagaimana cara kerjanya.

Jawaban:


23

Mewakili Ular

Membuat game Snake cukup sederhana. Hal pertama yang Anda butuhkan adalah cara untuk mewakili tubuh ular Anda. Jika Anda menganggap ular Anda terdiri dari balok atau ubin, tubuh Anda bisa menjadi daftar koordinat balok ini.

Dalam kasus Anda, jika Anda bermaksud melakukan aplikasi konsol, masing-masing akan menjadi karakter di konsol, dan posisinya akan sesuai dengan satu baris atau baris output konsol. Jadi, Anda mulai dengan ini:

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

Pada titik ini, daftar Anda kosong, sehingga ular Anda tidak memiliki tubuh. Katakanlah Anda menginginkan ular dengan panjang 5 dan kepala harus mulai pada posisi (5,2) dan tumbuh ke arah bawah. Tambahkan saja posisi-posisi itu ke daftar ketika permainan dimulai, misalnya:

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

Membawa Ular

Untuk rendering cukup menggambar karakter di setiap posisi pada daftar tubuh. Contoh di atas misalnya dapat digambarkan sebagai:

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

Anda dapat menjadi lebih rumit dengan memilih karakter yang berbeda untuk kepala karakter (elemen pertama pada daftar) dan ekor (elemen terakhir pada daftar) dan bahkan mengarahkan mereka tergantung pada posisi blok yang berdekatan. Tetapi sebagai permulaan, hanya membuat semuanya sebagai #atau sesuatu.

Misalnya Anda bisa mulai dengan array char 2D yang berisi latar belakang seperti ini:

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

Dan kemudian beralih di atas tubuh ular yang menariknya ke array:

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

Dan akhirnya beralih ke array lagi dan tulis setiap karakter ke konsol, dengan linebreak di akhir setiap baris.

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

Memindahkan Ular

Akhirnya, gerakan. Hal pertama yang Anda butuhkan adalah melacak Directionular itu bergerak. Ini bisa menjadi enum sederhana:

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

Dan tindakan memindahkan ular dapat dilakukan hanya dengan menghapus blok terakhir dari daftar dan menambahkannya di depan, ke arah yang benar . Dengan kata lain sesuatu seperti:

// 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
Panggilan bagus untuk memindahkan blok terakhir ke depan untuk bergerak!
SpartanDonut

Jawaban yang bagus Saya suka bagaimana Anda memindahkan ular - cukup elegan.
Cypher

-3
  1. Setiap kali pengingat waktu Anda memperbarui lokasi ular dan menggambar bentuk di lokasi baru

  2. Gunakan System.Windows.Forms.Timer untuk tindakan latar belakang untuk memicu permainan untuk memindahkan ular.

  3. Gunakan kelas dan warisan untuk struktur


Ini jawaban yang sangat samar. Langkah nomor tiga khususnya demikian.
MichaelHouse
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.