Skip to content

TÜRKİYE AÇIK KAYNAK PLATFORMU Pardus Uygulama Geliştirme Yarışması kuralları gereği proje geliştirme ortamı olarak https://kod.pardus.org.tr/ seçilmiştir. Proje https://kod.pardus.org.tr/tugbaficici/mangala adresi üzerinde geliştirilmiştir.

License

Notifications You must be signed in to change notification settings

clutchsoftware/Mangala

Repository files navigation

Mangala

Mangala Web Sayfası

➤Mangala Sunum Dosyası:

Sunum Dosyası

➤Mangala Tanıtım Videosu:

Youtube Tanıtım Link

Mangala bir zeka ve strateji oyunudur. Gaziantep, Urfa, Hatay gibi illede oynanan Köçürme oyununun adıdır. Dünyada bir çok farklı versiyonu vardır. Mangala, iki kişi ile oynanır. Oyun tahtası üzerinde 12 kuyu, 2 hazine ve toplam 48 boncuk bulunmaktadır. Oyunun amacı oyuncuların kendi hazinelerinde en yüksek boncuk sayısına ulaşmasıdır. ayarlar

Oyun İçi Ayarlar

Kullanıcı Ayarları

Oyun başlangıç ile beraber kullanıcıya varsayılan isimlerden birini atamaktadır. Ana sayfadan "Ayarlar" kısmına girerek oyun boyunca kullanacağınız ismi belirleyebilirsiniz.

Zorluk Modu

Bilgisayara karşı oyna modu için geliştirilen Cengaver'in zorluk seviyesini belirlemenizi sağlar. Varsayılan olarak orta zorluk modu ayarlıdır.

Oyunun Temel Kuralları

Kural 1 : Başlama hakkı olan oyuncu kendi bölgesinde bulunan istediği kuyudan 4 adet taşı alır. Bir adet taşı aldığı kuyuya bırakıp saatin tersi yönünde, yani sağa doğru her bir kuyuya birer adet taş bırakarak elindeki taşlar bitene kadar dağıtır. Elindeki son taş hazinesine denk gelirse, oyuncu tekrar oynama hakkına sahip olur. Oyuncunun kuyusunda tek taş varsa, sırası geldiğinde bu taşı sağındaki kuyuya taşıyabilir. Hamle sırası rakibine geçer. Her seferinde oyuncunun elinde kalan son taş oyunun kaderini belirler.

Kural 2 : Hamle sırası gelen oyuncu kendi kuyusundan aldığı taşları dağıtırken elinde taş kaldıysa, rakibinin bölgesindeki kuyulara da taş bırakmaya devam eder. Oyuncunun elindeki son taş, rakibinin bölgesinde denk geldiği kuyudaki taşların sayısını çift sayı yaparsa (2, 4, 6, 8 gibi) oyuncu bu kuyuda yer alan tüm taşların sahibi olur ve onları kendi hazinesine koyar. Hamle sırası rakibine geçer.

Kural 3 : Oyuncu taşları dağıtırken elinde kalan son taş, yine kendi bölgesinde yer alan boş bir kuyuya denk gelirse ve eğer boş kuyusunun karşısındaki kuyuda da rakibine ait taş varsa, hem rakibinin kuyusundaki taşları alır, hem de kendi boş kuyusuna bıraktığı taşı alıp hazinesine koyar. Hamle sırası rakibine geçer.

Kural 4 : Oyunculardan herhangi birinin bölgesinde yer alan taşlar bittiğinde oyun seti biter. Oyunda kendi bölgesinde taşları ilk biten oyuncu, rakibinin bölgesinde bulunan tüm taşları da kazanır. tahta

Yükleme Ve Çalıştırma

-----------------------------------------------------

Yükleme

$ git clone https://kod.pardus.org.tr/tugbaficici/mangala.git
$ cd Mangala
$ chmod +x script.sh
$ ./script.sh

Çalıştırma

$ chmod +x run.sh
$ ./run.sh

Mangala Oyunumuzun Dinamiği

Oyunumuz da 3 tane mod bulumakta. Bunlar; Çevim içi olarak oynamak, robota (Cengaver) karşı oynamak ve bilgisayar üzerinden karşılıklı oynamak.

Cengaver'in Gücü

-----------------------------------------------------

Cengaver'imizin toplam 4 farklı zorluk derecesi bulunmakta. Bu zorluk derecelerini incelersek;

Kolay Seviye: Kuyu sayıları arasından rastgele birini seçerek Cengaver'imiz hamlesini oynamakta.

function robotEasy() {
  let array = doluHoleler();
  let len = array.length;
  if (len > 0) {
    let holeID = Math.floor(Math.random() * 100000) % len;
    tikla("user1hole" + (array[holeID] + 1).toString() + "x");
  }
}

Orta Seviye: Cengaver bu seviyede tek hamlede yapabileceği en kazançlı (hazinesini en çok arttıran) hamleyi oynar.

function robotMedium() {
  let array = doluHoleler();
  let len = array.length;
  let score_ar = [];
  if (len > 0) {
    var temp1 = [];
    var temp2 = [];
    for (let i = 0; i < 7; i++) {
      temp1.push(new Hole(user1hole[i].getValue(), user1hole[i].getID()));
      temp2.push(new Hole(user2hole[i].getValue(), user2hole[i].getID()));
    }
    bosalt();

    for (let k = 0; k < array.length; k++) {
      let denenecek_hole_indis = array[k];
      bosalt();
      for (let i = 0; i < 7; i++) {
        user1hole.push(new Hole(temp1[i].getValue(), temp1[i].getID()));
        user2hole.push(new Hole(temp2[i].getValue(), temp2[i].getID()));
      }
      dagit(1, denenecek_hole_indis + 1);
      score_ar[k] = user1hole[6].getValue();
    }
    bosalt();
    for (let i = 0; i < 7; i++) {
      user1hole.push(new Hole(temp1[i].getValue(), temp1[i].getID()));
      user2hole.push(new Hole(temp2[i].getValue(), temp2[i].getID()));
    }

    let max = 0;
    let max_indis = 0;
    for (let a = 0; a < score_ar.length; a++) {
      if (score_ar[a] >= max) {
        max = score_ar[a];
        max_indis = a;
      }
    }
    player = 1;
    tikla("user1hole" + (array[max_indis] + 1).toString() + "x");
  }
}

Zor Seviye: Cengaver bu seviyede orta seviyeye ek olarak oynama sırasın kendinde olduğu müddetçe yapabileceğie ardışık halmeler arasından en kazançlı (hazinesini en çok arttıran) hamleyi oynar.

function robotHard() {
  let array = doluHoleler();
  let len = array.length;
  let score_ar = [];
  if (len > 0) {
    var temp1 = [];
    var temp2 = [];
    for (let i = 0; i < 7; i++) {
      temp1.push(new Hole(user1hole[i].getValue(), user1hole[i].getID()));
      temp2.push(new Hole(user2hole[i].getValue(), user2hole[i].getID()));
    }
    bosalt();

    for (let k = 0; k < array.length; k++) {
      let denenecek_hole_indis = array[k];
      bosalt();
      for (let i = 0; i < 7; i++) {
        user1hole.push(new Hole(temp1[i].getValue(), temp1[i].getID()));
        user2hole.push(new Hole(temp2[i].getValue(), temp2[i].getID()));
      }
      dagit(1, denenecek_hole_indis + 1);
      while (player == 1) {
        let move = robotExpert();
        dagit(1, move);
      }
      score_ar[k] = user1hole[6].getValue();
    }
    bosalt();
    for (let i = 0; i < 7; i++) {
      user1hole.push(new Hole(temp1[i].getValue(), temp1[i].getID()));
      user2hole.push(new Hole(temp2[i].getValue(), temp2[i].getID()));
    }

    let max = 0;
    let max_indis = 0;
    for (let a = 0; a < score_ar.length; a++) {
      if (score_ar[a] >= max) {
        max = score_ar[a];
        max_indis = a;
      }
    }
    return array[max_indis] + 1;
  }
}

Cengaver Seviyesi: Bu seviyede Cengaver elinden geleni ardına koymaz. Kendisinin oynayabileceği her hamleye karşılık rakibinin de en iyi hamlesini hesaplar ve kendisine en yüksek, rakibine en az kazancı sağlayan hamleyi bulur ve oynar.

function runRobotExpert(){
        let move = robotExpert()
        player = 1;
        tikla("user1hole"+(move).toString()+"x");
}
function robotExpert(){
    let array = doluHoleler();
    let len = array.length;
    let score_ar = [];
    if( len > 0){
        var temp1 = [];
        var temp2 = [];
        for (let i = 0; i < 7; i++) {
            temp1.push(new Hole(user1hole[i].getValue(),user1hole[i].getID()));
            temp2.push(new Hole(user2hole[i].getValue(),user2hole[i].getID()));
        };
        bosalt();

        for ( let k = 0; k < array.length; k++){
            let denenecek_hole_indis = array[k];
            bosalt();
            for (let i = 0; i < 7; i++) {
                user1hole.push(new Hole(temp1[i].getValue(),temp1[i].getID()));
                user2hole.push(new Hole(temp2[i].getValue(),temp2[i].getID()));
            };
            dagit(1,denenecek_hole_indis+1);
            while(player == 1){
                let move = robotExpert();
                dagit(1,move);
            }
            let karsi_skor_max = robotExpertForHumanSide(2);
            score_ar[k] = user1hole[6].getValue() - karsi_skor_max;
        }
        bosalt();
        for (let i = 0; i < 7; i++) {
            user1hole.push(new Hole(temp1[i].getValue(),temp1[i].getID()));
            user2hole.push(new Hole(temp2[i].getValue(),temp2[i].getID()));
        };

        let max = 0;
        let max_indis = 0;
        for ( let a = 0; a< score_ar.length; a++){
            if( score_ar[a] >= max){
                max = score_ar[a];
                max_indis = a;
            }
        }
        return array[max_indis]+1;
    }
}
...

Cengaver'in Kaynak Kodu.

Çevrim İçi Moduyla Gerçek Cengaverlere Karşı

-----------------------------------------------------

SocketIO kullanarak oluştuduğumuz server ile kullanıcıların bu server üzerinde oda oluşturma ve odaya katılma fonksiyonlarıyla çevrim içi olarak oynayabilmektedir.

OdaImage

Arkadaşına Karşı

-----------------------------------------------------

Hem Cengaver'e karşı hem de çevrim içi oynanabildiği gibi aynı bilgisayarda iki kişi karşılıklı oynabilmektedir.

Ekip Üyeleri

-----------------------------------------------------

@Abdülkerim Aksak

@Muaz Dervent

@Tuğba Fıçıcı

Lisans

-----------------------------------------------------

Mangala MIT lisansı ile lisanslanmıştır.

About

TÜRKİYE AÇIK KAYNAK PLATFORMU Pardus Uygulama Geliştirme Yarışması kuralları gereği proje geliştirme ortamı olarak https://kod.pardus.org.tr/ seçilmiştir. Proje https://kod.pardus.org.tr/tugbaficici/mangala adresi üzerinde geliştirilmiştir.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages