C'de oyunlar nasıl programlanır? Öğretici Bir

01

05

Oyun Programlama Derslerine Giriş

Bu yeni başlayanlar için C çeşitli oyun programlama Öğreticiler ilk. C öğretimine odaklanmak yerine C'de size eksiksiz programlar (yani oyunlar) sunarak C öğrettikleri örnek programları göstermek yerine

Basit Tutmak

Serideki ilk oyun bir konsoldur (yani Star Empires adlı metin tabanlı oyun). Star Empires, AI rakibinizi de aynı şekilde durdurarak Galaxy'deki 10 sistemin tümünü yakalamanız gereken basit bir oyundur.

Sistem 0'a sahip olmaya başlıyorsunuz, düşmanın kendi sistemi 9. Kalan sekiz sistemin (1-8) tümü nötr çalışmaya başlar. Tüm sistemler 5 parsec x 5 parsec kare içinde başlar, böylece hiçbir sistem 6 parsec'ten daha fazla değildir. En uzak iki nokta (0,0) ve (4,4) 'tür. Pisagor teoremi ile, herhangi iki sistemin birbirinden en uzak mesafesi kare köküdür ((4)2 + (4)2) ki bu yaklaşık 5.657 olan 32'nin kare köküdür.

Lütfen bunun son sürüm olmadığını ve değiştirileceğini unutmayın. Son değişiklik: 21 Ağustos 2011.

Sıra Tabanlı ve Gerçek Zamanlı

Oyun sıra tabanlı ve her tur sahip olduğunuz herhangi bir sistemden herhangi bir sayıda filo başka bir sisteme taşımak için emir verir. Birden fazla sisteminiz varsa, filoların tüm sistemlerinizden hedef sisteme geçmesini isteyebilirsiniz. 20, 10 ve 5 filoya sahip üç sisteminiz (1,2,3) varsa, ve 4 Filo'nun sistem 4'e gitmesini emredersiniz, sonra 6 sistem 1'den, sistem 2'den ve 1 sistemden 1'e gider 3. Her filo tur başına 1 parsek hareket eder.

instagram viewer

Her tur 5 saniye sürer, ancak bu kod satırındaki 5'i 3 veya 7 veya ne seçerseniz değiştirerek hızı hızlandırabilir veya yavaşlatabilirsiniz. Bu kod satırını arayın:

onesec = saat () + (5 * CLOCKS_PER_SEC);

C Programlama Eğitimi

Bu oyun programlanmıştır ve herhangi bir C programlama bilmediğinizi varsayar. Bu ve sonraki iki veya üç öğreticide ilerlerken C programlama özelliklerini tanıtacağım. Öncelikle Windows için bir derleyiciye ihtiyacınız olacak. İşte ücretsiz iki tane:

  • Deneyin CC386
  • Veya Visual C ++ 2010 Express

CC386 makalesi, bir proje oluştururken size yol gösterir. Bu derleyiciyi yüklerseniz, tüm yapmanız gereken Hello World programını açıklandığı gibi yüklemek, kaynak kodunu örneğe kopyalayıp yapıştırmak, kaydetmek ve daha sonra derlemek ve çalıştırmak için F7 tuşuna basmaktır. Aynı şekilde Visual C ++ 2010 makalesi bir merhaba dünya programı oluşturur. Üzerine yazın ve çalıştırmak için F7 tuşuna basarak Star Empires., F5 üzerine basın.

Sonraki sayfada - Yıldız İmparatorluklarını Çalıştırmak

02

05

Yıldız İmparatorluklarını Çalıştırmak

Yıldız İmparatorluklarını Çalıştırmak

Oyundaki filolarda ve sistemlerde bilgi depolamamız gerekiyor. Bir filo, bir sistemden diğerine geçme emri olan bir veya daha fazla gemidir. Bir yıldız sistemi birkaç gezegendir, ancak bu oyunda daha soyut bir varlıktır. Bir filo için aşağıdaki bilgileri tutmamız gerekir.

  • Kaynak Sistem (1-10).
  • Hedef Sistemi (1-10)
  • Kaç Gemi (1-Çok)
  • Geliyor
  • Kimin Filosu? 0 = Oyuncu, 9 = Düşman

Bunu yapmak için C'deki bir yapıyı kullanacağız:

yapı filosu {
int sistemden;
sistem içi;
int dönüşleri;
int fleetsize;
int sahibi;
};

Bir yapı bir veri topluluğudur, bu durumda tek olarak işlediğimiz 5 sayı. Her numaranın bir ismi vardır, örneğin sistemden sisteme. Bu adlar C'deki değişken adlardır ve boşluk gibi değil alt çizgiler içerebilir. C'de, sayılar ya tamsayıdır; 2 veya 7 gibi tam sayılara bunlara int veya ondalık kısımları 2.5 veya 7.3333 gibi olan sayılara kayan ad denir. Tüm Star Empires'da şamandıraları sadece bir kez kullanıyoruz. İki yer arasındaki mesafeyi hesaplayan bir kod yığınında. Diğer her sayı bir int.

Filo, beş int değişkenini barındıran bir veri yapısının adıdır. Şimdi bu bir Filo için. Kaç filo tutmamız gerektiğini bilmiyoruz, bu yüzden bir dizi kullanarak 100 kişilik cömert oda tahsis edeceğiz. Bir yapıyı beş kişilik odaya sahip bir yemek masası gibi düşünün. Bir dizi yemek masaları uzun bir satır gibidir. 100 tablo, 100 x 5 kişi alabileceği anlamına gelir.

Aslında bu 100 yemek masasına hizmet ediyor olsaydık, hangi masanın hangisi olduğunu bilmemiz gerekir ve bunu numaralandırarak yaparız. C'de her zaman 0'dan başlayan dizilerin elemanlarını sayıyoruz. İlk yemek masası (filo) 0, diğeri 1 ve sonuncusu 99'dur. Ben her zaman bu masa başlangıçtan kaç yemek masası olduğunu hatırlıyorum? İlki başlangıçta yani 0'dır.

Filoları böyle ilan ediyoruz (yani yemek masalarımız).

yapı filosu filoları [100];

Bunu soldan sağa doğru okuyun. Yapısal filo, bir filoya sahip olmak için yapımız anlamına gelir. Filo ismi tüm filolara verdiğimiz isimdir ve [100] filo değişkeninde 100 x yapı filosu olduğunu söyler. Her int bellekte 4 yer kaplar (bayt olarak adlandırılır), böylece bir filo 20 bayt ve 100 filo 2000 bayttır. Programımızın verilerini tutmak için ne kadar belleğe ihtiyacı olduğunu bilmek her zaman iyi bir fikirdir.

Yapı filosunda, her int bir tamsayı tutar. Bu sayı 4 baytta depolanır ve bu aralık -2.147.483.647 ila 2.147.483.648 arasındadır. Çoğu zaman daha küçük değerler kullanırız. On sistem vardır, böylece hem sistemden hem de sistemden 0 ile 9 arasında değerler bulunur.

Sonraki sayfada: Sistemler ve Rasgele Sayılar

03

05

Sistemler ve Rasgele Sayılar Hakkında

Nötr sistemlerin her biri (1-8), 15 gemiyle (havadan aldığım bir sayı!) Başlar ve diğer ikisinin (sizinkiler: sistem 0 ve sistem 9'daki bilgisayar rakibinizin) her biri 50 gemiye sahiptir. Her turda bir sistemdeki gemi sayısı% 10 aşağı yuvarlanır. Bir tur sonra onları hareket ettirmezseniz, 50'niz 55 olacak ve nötr sistemlerin her birinde 16 (15 + 1,5 aşağı yuvarlanmış) olacaktır. Başka bir sisteme geçen filoların sayıca artmadığını unutmayın.

Gemilerin sayısını bu şekilde artırmak biraz garip gelebilir, ama oyunu devam ettirmek için yaptım. Bu öğreticiyi tasarım kararlarıyla ilgili çok fazla şeyle karıştırmak yerine, Star Empires'in tasarım kararları hakkında ayrı bir makale yazdım.

Uygulama Sistemleri

Başlangıçta, tüm sistemleri oluşturmamız ve bunları haritaya koymamız gerekiyor. Her bir konum, 5 x 5 ızgaramızda 25 konum olduğu için on sistemimiz ve 15 boş alanımız olacak konumları. Onları bir sonraki sayfada ele alacağımız GenMapSystems () fonksiyonunu kullanarak üretiyoruz.

Bir sistem, tüm int olan aşağıdaki 4 alanla birlikte bir yapıda saklanır.

yapı sistemi {
int x, y;
int numfleets;
int sahibi;
};

Galaksi (10 sistemin tümü), 10 sistemimiz hariç, filolarda olduğu gibi başka bir dizide saklanır.

yapı sistemi galaksisi [10];

Rastgele sayılar

Tüm oyunlar rastgele sayılara ihtiyaç duyar. C, rastgele bir int döndüren yerleşik bir işlev (rand ()) içerir. Bunu,% operatörünü kullanarak maksimum sayıyı geçirerek ve bir aralığa zorlayabiliriz. (Modülü). Bu saat aritemisi gibidir, ancak 12 veya 24 yerine max adında bir int numarası geçiyoruz.

/ * 1 ile maks. arasında bir sayı döndürür * /
int Rastgele (maks. int) {
dönüş (rand ()% max) +1;
}

Bu, bir kabın içine sarılmış bir kod parçası olan bir fonksiyon örneğidir. Burada / * ve * ile biten ilk satır bir yorumdur. Kodun ne yaptığını söyler, ancak C talimatlarını okuyan ve bunları bilgisayarın anladığı ve çok hızlı çalıştırabileceği talimatlara dönüştüren derleyici tarafından göz ardı edilir.

  • Bir derleyicinin ne olduğunu merak ediyor musunuz? Okuma Derleyici nedir? (Makale)

Bir fonksiyon Sin (x) gibi matematiksel bir fonksiyon gibidir. Bu işlevin üç bölümü vardır:

int Rastgele (maks. int)

İnt, ne tür bir sayı döndürdüğünü belirtir (genellikle int veya float). Rasgele işlevin adıdır ve (int max) bir int numarası ilettiğimizi söyler. Bunu şu şekilde kullanabiliriz:

int zar;
zar = Rastgele (6); / * 1 ile 6 arasında rastgele bir sayı döndürür * /

Çizgi:

dönüş (rand ()% max) +1;

Sonraki sayfada: Rastgele Bir Başlangıç ​​Haritası Oluşturma

04

05

Rastgele Bir Başlangıç ​​Haritası Oluşturma

Star Empires Haritası

Aşağıdaki kod başlangıç ​​haritasını oluşturur. Yukarıda gösterilen budur.

void GenMapSystems () {
int i, x, y;
için (x = 0; x için (y = 0; y düzeni [x] [y] = '';
}
InitSystem (0,0,0,50,0);
InitSystem (9,4,4,50,1);
/ * Kalan 8 sistem için boş bir alan bulun * /
için (i = 1; {
x = Rastgele (5) -1;
y = Rastgele (5) -1;
}
while (düzen [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}

Sistem Üretme, oyuncu ve rakip sistemlerin (0,0) ve (4,4) eklenmesi ve ardından kalan 23 boş yere rastgele 8 sistem eklenmesi meselesidir.

Kod, çizgi tarafından tanımlanan üç int değişkeni kullanır

int i, x, y;

Değişken, bellekte int değerini tutan bir konumdur. X ve y değişkenleri sistemlerin koordinatlarını tutar ve 0-4 aralığında bir değer tutar. İ değişkeni döngülerde saymak için kullanılır.

8 rastgele sistemi 5x5 ızgaraya yerleştirmek için, bir konumun zaten bir sistemi olup olmadığını bilmemiz ve başka bir sistemin aynı konuma yerleştirilmesini önlememiz gerekir. Bunun için iki boyutlu basit bir karakter dizisi kullanıyoruz. Char türü, C'deki başka bir değişken türüdür ve 'B' veya 'x' gibi tek bir karakter içerir.

C de Datatipler Üzerine Astar

C'deki temel değişken türü int (46 gibi tamsayılar), char ('A' gibi tek bir karakter) ve kayan değerdir (kayan noktalı 3.567 gibi sayıları tutmak için). Diziler [], aynı öğenin listelerini tutmak içindir. Dolayısıyla char [5] [5] bir liste listesi tanımlar; iki boyutlu karakter dizisi. 5 x 5 ızgarada düzenlenmiş 25 Scrabble parçası gibi düşünün.

Şimdi Dönüyoruz!

Her karakter başlangıçta iki for döngüsü kullanılarak çift döngüde bir boşluğa ayarlanır. For for ifadesinin üç bölümü vardır. Bir başlatma, bir karşılaştırma kısmı ve bir değişiklik kısmı.

için (x = 0; x için (y = 0; y düzeni [x] [y] = '';
}

  • X = 0; Bu başlatma kısmıdır.
  • x
  • x ++. Bu değişim kısmı. X'e 1 ekler.

Yani ((x = 0; x için)

For (x döngüsü içinde y için aynısını yapan bir for y döngüsü vardır. Bu y döngüsü her X değeri için gerçekleşir. X 0 olduğunda, Y 0 ila 4 arasında döngü yapar, X 1 olduğunda Y döngü ve benzeri olur. Bu, düzen dizisindeki 25 konumdan her birinin bir boşluğa başlatıldığı anlamına gelir.

For döngüsünden sonra InitSystem işlevi beş int parametresiyle çağrılır. Bir fonksiyon çağrılmadan önce tanımlanmalıdır veya derleyici kaç parametreye sahip olması gerektiğini bilemez. InitSystem bu beş parametreye sahiptir.

Sonraki sayfada: Rastgele Başlangıç ​​Haritası Oluşturma Devam Ediyor ...

05

05

Rastgele Başlangıç ​​Haritası Oluşturma Devam Ediyor

Bunlar InitSystem için parametrelerdir.

  • systemindex - 0-9 arası bir değer.
  • x ve y - sistemin koordinatları (0-4).
  • numships - bu sistemde kaç gemi var.
  • sahip. Kimin bir sistemi var. 0 oyuncu, 9 düşman demektir.

Böylece InitSystem (0,0,0,50,0) hattı, sistem 0'ı x = -0, y = 0 konumlarında, 0 sahibine 50 gemi ile başlatır.

C'nin döngüler ve döngüler için döngüler, üç döngü türü vardır ve GenMapSystems işlevinde kullanırız. Burada kalan 8 sistemi galakside bir yere yerleştirmeliyiz.

için (i = 1; {
x = Rastgele (5) -1;
y = Rastgele (5) -1;
}
while (düzen [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}

Bu kodda iki iç içe döngü vardır. Dış döngü, i değişkenini 1 başlangıç ​​değerinden 8 son değerine sayan bir for ifadesidir. Sisteme başvurmak için i'yi kullanacağız. Sistem 0 ve 9'u zaten başlattığımızı unutmayın, bu yüzden şimdi 1-8 sistemlerini başlatıyoruz.

Do {ile while (düzen [x] [y]) arasındaki her şey ikinci döngüdür. Sözdizimi {bir şey} ise (koşul doğrudur); Bu nedenle, x ve y'ye rastgele değerler atarız, her değer 0-4 aralığındadır. Rastgele (5) 1 ila 5 aralığında bir değer döndürür, 1 çıkarıldığında 0-4 aralığı elde edilir.

İki sistemi aynı koordinatlara koymak istemiyoruz, bu yüzden bu döngü içinde boşluk olan rastgele bir yer arıyor. Orada bir sistem varsa, [x] [y] düzeni boşluk olmayacaktır. InitSystem dediğimizde oraya farklı bir değer koyar. BTW! = Eşit değildir ve == eşittir anlamına gelir.

Kod bir süre sonra InitSystem'a ulaştığında (düzen [x] [y]! = ''), X ve y kesinlikle düzende içinde boşluk olan bir yere işaret eder. Böylece InitSystem'ı arayabilir ve 8 sistemin tamamı yerleştirilene kadar bir sonraki sistem için rastgele bir konum bulmak için for döngüsüne gidebiliriz.

InitSystem'a ilk çağrı 50 sistemiyle 0 konumunda (şebekenin sol üst kısmı) 0 sistemini kurar ve benim tarafımdan kazanılır. İkinci çağrı, sistemi 4,4'te (sağ altta) 50 filo ile başlatır ve oyuncu 1'e aittir. Bir sonraki derste InitSystem'ın gerçekte ne yaptığını yakından inceleyeceğiz.

#tanımlamak

Bu satırlar değişmez değerler bildirir. Bunları büyük harfe koymak gelenekseldir. Derleyici MAXFLEETS'i gördüğü her yerde 100 değerini kullanır. Bunları burada değiştirin ve her yerde geçerlidir:

  • #define GENİŞLİK 80
  • #define YÜKSEKLİK 50
  • #define MAXLEN 4
  • #define MAXFLEETS 100
  • #define MAXSYSTEMS 10
  • #define FIGHTMARKER 999

Sonuç

Bu eğitimde, değişkenleri ve bunları gruplamak için int, char ve struct kullanımı ile liste oluşturmak için dizi'yi ele aldık. Sonra for ve do kullanarak basit döngü. Kaynak kodunu incelerseniz, aynı yapılar zaman zaman görülür.

  • için (i = 0; i
  • için (i = 0; i

Öğretici Twowill, bu öğreticide bahsedilen C yönlerine bakar.

instagram story viewer