C++ Konsol Oyun Programlama Harita ve Hareketlilik

Merhabalar. C++ ile başlıkta görüldüğü gibi bir oyun haritası oluşturmak ve bu oyun haritası içerisinde nesnemi hareket ettirmek istiyorum. Bu olayı gerçekleştirmek için algoritma oluşturalım.

Şimdi benim ihtiyacım olan bir harita oluşturmak.

  1. başla 
  2. harita oluştur
  3. hareketliliği harita içerisinde sağla, dışına çıkmasını engelle.
  4. bitir 💀
Bu nasıl bir algoritma oldu anlamadım. 💩 Her neyse önemli olan çalışma anlamında bir düzen sağlaması. 

İşe başlayarak birinci adımı gerçekleştiriyoruz.

Harita oluşturalım. Bunun için küçük bir dizi oluşturuyorum.

#include <iostream>

using namespace std;

char map[8][22] = { 
 "######################",
 "#$                   #",
 "#                    #",
 "#                    #",
 "#                    #",
 "#                    #",
 "#                    #",
 "######################" };   

int main(){
  
}
Görüldüğü üzere haritamızı oluşturduk. Yatay olarak 22, dikey olarak 8 boyutunda bir 2d harita. Buraya kadar her şey normal. Şimdi bu harita yapısını biraz daha iyi anlamalıyız. O yüzden şöyle bir görsel hazırladım.


Görüldüğü üzere haritamızın yatay olarak [0-21] arası ve dikey olarakta [0-7] arası. Buraya kadar her şey tamam. Şimdi ben bu oluşturduğum harita içerisine yani diziye $ dolar işareti ekliyorum. Bu dolar karakterinin dizi içerisindeki konumunu da x ve y integer değişkenleri içerisinde saklıyorum.

int x = 1;
int y = 1;
 
char map[8][22] = {
  "######################",
  "#$                   #",
  "#                    #",
  "#                    #",
  "#                    #",
  "#                    #",
  "#                    #",
  "######################"
   };    
x ve y değişkenlerine 1 değeri verdik. Görsele bakarak bu durumu daha iyi anlayabiliriz. $ karakterinin bulunduğu konum (1,1).

Yazılan kodu bir derleyip, çalıştıralım. Hata verdi. 🐛 Aldığımız hata aşağıdaki gibi.

[Error] initializer-string for array of chars is too long [-fpermissive]
Araştırdığım kadarıyla bunun sebebi her string değeri sonunda \0 (null) ifadesinin olmasıdır. Bu sebeple dizinin yatay boyutunu 22 değil 23 yaparsak hata giderilir. Daha iyi anlamak gerekirse "######################" içinde bizim 22 tane karakterimiz var ancak derleyici bunu string bir ifade olduğu için şekilde şu şekilde görüyor "######################\0".

Şimdi geldik önemli bir kısma hareketlilik sağlama. $ karakterini map içerisinde keyword tuşları ile hareket etmesini sağlamamız gerek. İlk olarak Move isminde bir fonksiyon yazıyoruz.

#include <iostream>

using namespace std;

int x = 1;
int y = 1;

char map[8][23] = {
 "######################",
 "#@                   #",
 "#                    #",
 "#                    #",
 "#                    #",
 "#                    #",
 "#                    #",
 "######################" }; 


void Move(int v, int h){ // v: vertical(dikey), h: horizontal(yatay)
 int xN = x + h;
 int yN = y + v;
 
 if(map[y][xN] == ' '){
  map[y][x] = ' ';
  x += h;
  map[y][x] = '$';
 }
 if(map[yN][x] == ' '){
  map[y][x] = ' ';
  y += v;
  map[y][x] = '$';
 } 
}

int main(){
  
}
Move fonksiyonunu hareket etmemizi sağlayacak klavye tuşlarına bastığımızda verilen konuma göre dikey veya yatay olarak konum değişikliği olacak. Parametre değerlerine göre x veya y değeri parametre değerleri ile toplanıp yN ve xN değerlerine atanacak. Hareket dört yönlü olacak ve parametre değerlerinden biri 0 olmak şartı ile diğer parametre -1 veya 1 olacak. Zaten bu olayı aşağıdaki kodlarda daha iyi anlayacağız. Eğer map dizisine göre o konum boş ise hareket gerçekleşecek ve $ karakterinin bulunduğu konuma ' ' boşluk atanacak ve yeni konuma ise $ karakteri atanacak. Bu sayede hareket işlemi gerçekleşmiş olacak.

Sıra geldi son kısma yani klavye ile hareket işlemini gerçekleştirme kısmına. Son kodumuzu main fonksiyonu içerisine yazacağız. Ancak klavye tuşlarını konsol üzerinde kullanabilmemiz için Windows.h kütüphanesi içindeki fonksiyonlara ihtiyacımız var. Bu yüzden Windows.h kütüphanesini kod içerisine dahil ediyoruz. Daha sonrasında ise aşağıdaki gibi bir kod yazıyoruz.

bool oyun;

int main(){
 oyun = true;
 while(oyun){
  system("cls");
   
  for(int i=0; i<10; i++){
   cout << map[i] << endl;
  }
  system("pause>nul");
  if(GetAsyncKeyState(VK_UP))
   Move(-1,0);
  if(GetAsyncKeyState(VK_DOWN))
   Move(1,0);
  if(GetAsyncKeyState(VK_RIGHT))
   Move(0,1);
  if(GetAsyncKeyState(VK_LEFT))
   Move(0,-1); 
 }
 system("pause");  
}
İlk önce main dışında bool veri tipinde oyun adlı bir değişken tanımladık. Daha sonrasında main içerisinde oyun değişkenine true değerini atadık. while döngüsü yazarak parametre kısmına oyun değişkenini ekledik. Bu sayede döngümüz durmadan çalışabilecek. Döngü içerisine system("cls") komutunu yazdık. Bu komut ile ekran temizlenir. (cls = CleanScreen) Komutun devamında for döngüsü oluşturarak. map dizisinin ekrana yazdırılması sağlandı. system("pause&gtnul") komutu ile döngü bir sonraki komutu kadar beklemeye alınır, duraklar. Dört tane koşul ifadesi yazarak belirnen tuşlara basıldığında move fonksiyonunun çalışması sağlanır. Kodda yön tuşlarını kullandık. Eğer $ karakterini aşağı indireceksek VK_DOWN basılmış olur ve v parametresi 1 değeri, h ise 0 değeri alarak eski konumda karakter($) silinir, yeni konuma karakter atanır. Şimdi kodu çalıştırma vakti.



Hiç yorum yok:

Yorum Gönder