C kodlarıyla Blackjack

Bu başlık kilitlidir. Yeni mesajlar gönderilemez veya mevcut mesajlar düzenlenemez.
Honour87
08-03-2006, 14:00   |  #1  
OP Taze Üye
Teşekkür Sayısı: 0
10 mesaj
Kayıt Tarihi:Kayıt: Mar 2006

Arkadaşlar bana C kodlarıyla yazılmış Blackjack lazım.İnternetten bir çok örnek buldum fakat gereken ölçütlerde değildi.yardımcı olursanız sevinirim.Kullanılabilecek kütüphaneler; <stdio.h> <conio.h> <stdlib.h> <time.h> . Kurallar;
Blackjack
Blackjack kasaya karşı oynanan bir iskambil oyunudur. Bir oyuncu ve kasa mevcuttur. Amaç
doğru hamleleri yaparak elimizdeki kağıtlar ile 21’i geçmeden 21’e en yakın sayıya
ulaşabilmektir.
Blackjack’te Kağıt Değerleri
Oyunda tüm papaz, kız ve vale kağıtları 10 değerindedir. A (As) ise kullanıma ve avantaja
göre 1 yada 11 değerinde olabilir. Diğer tüm kağıtlar kendi değerindedir.
Oyun
Oyun şu şekilde hareket eder :
• Oyuncu ve kasaya ikişer kağıt dağıtılır.
• Kağıtlar dağıtıldığında oyuncu veya kasada 21 varsa oyun sonlanır ve 21’e sahip
olan oyunu kazanır.
Eğer kimsede 21 yoksa
• Oyuncu kasanın tek kağıdını görür ve ona sunulan seçeneklere göre hareket eder.
Sunulan seçenekler :
o HIT : Oyuncu elindeki kağıtlara ek olarak bir tane daha kağıt çeker. Bu şekilde
21’e yaklaşmaya çalışır. Oyuncu arka arkaya istediği kadar HIT yapabilir. Bu
esnada 21’i yakalarsa oyunu kazanır, 21’i aşarsa oyunu kaybeder.
o STAND : Oyuncu elindeki kağıtları olduğu gibi kabul ediyorsa yada artık yeni
kağıt çekmek istemiyorsa STAND seçeneğini seçer ve oyun kasaya geçer.
Oyun sırası kasaya geçtiğinde kasanın uyması gereken zorunlu kurallar
mevcuttur.
• Kasanın uyması gereken zorunlu kurallar :
o Eğer kasanın elindeki kağıtların değeri 17 ve 17’den büyük ise kasa STAND
yapmak zorundadır.
o Kasanın elindeki kağıtların değeri 16 ve daha küçük ise kasa HIT yapmak
zorundadır. Kasa HIT yaptıktan sonra kağıt değeri 17’yi geçtiğinde STAND
yapmak zorundadır.
• Kasa STAND yaptıktan sonra oyun sona erer. Oyuncu ve kasa kağıtlarını açar ve
21’e en yakın olan kazanır.

Honour87
24-03-2006, 01:42   |  #2  
OP Taze Üye
Teşekkür Sayısı: 0
10 mesaj
Kayıt Tarihi:Kayıt: Mar 2006

eveeet. sonunda yaptım. nası olmuş, yorumlarınızı bekliyorum...

Honour87
24-03-2006, 02:06   |  #3  
OP Taze Üye
Teşekkür Sayısı: 0
10 mesaj
Kayıt Tarihi:Kayıt: Mar 2006

/*
* DOSYA ADI : Blackjack
* VERSIYON : 2.4.3
* BASLAMA TARIHI : 03.03.2006
* SON DEGISIKLIK TARIHI : 22.03.2006
* YAZANLAR : Onur Kaya & Mehmet EFENDIOGLU
* --------------------------------------------
* Bu blackjack oyunu programidir.
*/


/*----------Kütüphaneler----------*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>


/*----------Fonksiyon prototip tanimlari----------*/
int toplam(int*,int);/*diziyi ve dizide kaç elemanin oldugu bilgisini alir dizinin toplamini geri döndürür*/


/*----------Global degiskenler----------*/


/*----------Main fonksiyonu----------*/
main(void)
{
    /*
    *x; deste karmada for döngüsü için kulanilmistir.
    *y; oyuncunun as degerlerinin belirlendigi döngüde for için kullanilmistir.
    *z; oyuncunun as sorgusu fonksiyonunda as'in degerinin alinmasinda kullanilmistir.
    *a, b; deste karmada ve oyuncunun ilk çektigi kartlarda kullanilmistir.
    *c, d; kasanin ilk çektigi kartlara atanmistir.
    *sira; destedeki dagitma sirasidir.
    *sira2; oyuncunun elindeki destedeki siradir.
    *oyuncu_el; oyuncunun elindeki kartlarin dizisidir.
    *oyuncu_toplam; oyuncunun elindeki kartlarin puanlarinin toplamidir.
    *kasa_toplam; kasanin elindeki kartlarin puanlarinin toplamidir.
    *ch; oyuncunun hit döngüsünde döngünün devami için 'h' karakterinin alinmasinda kullanilmistir.
    **dummy; deste karmada bos eleman olarak kullanilmistir.
    *deste[]; 52'lik iskambil kataridir.
    */
    int x, y, z, a, b, c, d, e, sira=0, sira2, kasa_toplam=0, *oyuncu_el, oyuncu_toplam=0;
    char ch, *dummy, *deste[52]={"1 sinek", "2 sinek", "3 sinek", "4 sinek", "5 sinek", "6 sinek", "7 sinek", "8 sinek", "9 sinek", "10 vale sinek", "10 kiz sinek", "10 papaz sinek",
                                 "1 karo",  "2 karo",  "3 karo",  "4 karo", "5 karo",   "6 karo",  "7 karo",  "8 karo",  "9 karo",  "10 vale karo",  "10 kiz karo",  "10 papaz karo",
                                 "1 kupa",  "2 kupa",  "3 kupa",  "4 kupa", "5 kupa",   "6 kupa",  "7 kupa",  "8 kupa",  "9 kupa",  "10 vale kupa",  "10 kiz kupa",  "10 papaz kupa",
                                 "1 maca",  "2 maca",  "3 maca",  "4 maca", "5 maca",   "6 maca",  "7 maca",  "8 maca",  "9 maca",  "10 vale maca",  "10 kiz maca",  "10 papaz maca",
                                 };
    srand((unsigned)time(NULL));/*zaman su ana ayarlandi */
    /*simdi deste karilcak*/
    for(x=0; x<1000; x++)/*Desteyi 1000 kere karistiririz*/
    {/*blok baslangici*/
        a= (int)(rand()%52);
        b= (int)(rand()%52);
        if(a==NULL)/*sondaki NULL karakteri de karma islemine katilir. Bu durumu engellemek icin NULL geldiginde tekrar kart seceriz*/
           a= (int)(rand()%52);
        if(b==NULL)
           b= (int)(rand()%52);
        dummy=deste;
        deste=deste;
        deste=dummy;
    }/*for sonu*/
    /*oyuncunun kartlari secilip ekrana basilcak*/
    /*oyuncu destesi icin yer ayirdik*/
    oyuncu_el=(int*) calloc(12, sizeof(int));/*21'e erismek icin max 12 kart gerekli*/
    /*gelen kartin puanini oyuncunun dizisine aticaz*/
    a=(int)atoi(deste[sira]);/*a,b for icinde kullanildigindan burda kullanilabilir*/
    oyuncu_el[sira]=a;
    printf("oyuncunun kartlari: %s\t",deste[sira]);
    sira++;/*destede siradaki karti cekicez*/
    b=atoi(deste[sira]);
    oyuncu_el[sira]=b;
    printf("%s",deste[sira]);
    sira++;
    /*oyuncunun kartlari secilip ekrana basildi*/
    /*kasanin kartlari seçilip ekrana basilacak*/
    c=atoi(deste[sira]);
    printf("\nkasanin karti: %s\n",deste[sira]);
    sira++;
    d=atoi(deste[sira]);
    /*kasanin cektigi kartlari kasanin puanina ekleriz*/
    kasa_toplam+=(int) c+d;
    sira++;
    /*kasanin kartlari secilip ekrana basildi*/
    /*oyuncu kart dagitiminda kazandi mi diye kontrol ederiz*/
    if((a==1 && b==10) || (a==10 && b==1))/*1 ve 10 gelirse 1'i 11 alip puanini 21 yapar ve oyunu kazanir.Biz bunu otomatiklestirdik*/
        oyuncu_toplam=21;
    /*kart dagitiminda kazanamazsa akis kart cekmeye gecer*/
    else
    {/*blok baslangici*/
        printf("\nKart cekmek icin (h)it'e, pas icin (s)tand'e basin");
        sira2=(sira-2);/*oyuncunun destesindeki sira normal destedeki siradan 2 eksiktir.Cünkü basta 2 kart kasaya verildi ve sira 2 artti*/
        while((ch=(char)getchar())=='h')/*'h' karakterini yani hit gordükce döngü devam eder*/
        {/*blok baslangici*/
            oyuncu_el[sira2]=atoi(deste[sira]);
            printf("\n%s kartini cektin.\n",deste[sira]);
            sira++;
            sira2++;
            printf("\nKart cekmek icin (h)it'e, pas icin (s)tand'e basin");
            ch=(char)getchar();
        }/*while sonu*/
        for(y=0; y<=sira2; y++)/*oyuncunun elindeki kartlara teker teker bakar*/
        {/*blok baslangici*/
            if(oyuncu_el[y]==1)/*siradaki kart assa döngüye girer ve degeri sorulur*/
            {/*blok baslangici*/
                printf("\nAs degeri 1 mi olsun, 11 mi?");
                scanf("%d",&z);
                if(z==11)/*oyuncunun destesini calloc'la aldigimizdan const'tur ve üstünde islem yapilamaz.Bu yüzden toplam puan üzerinde islem yapilir*/
                    oyuncu_toplam+=10;/*11 alinmasi istendigi takdirde toplama 10 eklenir*/
             }/*if sonu*/
         }/*for sonu*/
         /*as degerlerini belirledigimize göre artik toplam puanimizi bulabiliriz*/
         oyuncu_toplam+=toplam(oyuncu_el,sira2);
    }/*else sonu*/
    printf("\noyuncunun puani: %d dir.",oyuncu_toplam);
    printf("\nSu an kasanin toplam puani %d dir.",kasa_toplam);
    free(oyuncu_el);/*dinamik bellek kullanimi. Oyuncunun destesine bir daha ihtiyacimiz olmiyacagi icin hafizadan silebiliriz*/
    /*oyuncunun oynamasi biter ve sira kasaya gecer*/
    printf("\nKasa onceden %s kartini cekmisti.",deste[3]);
    /*kasa kart dagitiminda kazandi mi diye kontrol ederiz*/
    if((c==1 && d==10) || (c==10 && d==1))
        kasa_toplam=21;
    /*ilk dagitimda kazanamazsa akis burdan devam eder*/
    else
    {/*blok baslangici*/
        while(kasa_toplam<17)/*kasa, puani 17 den küçük oldugu sürece kart cekecek*/
        {/*blok baslangici*/
            e=(int) atoi(deste[sira]);
            printf("\nkasa %d kartini cekti.",e);
            kasa_toplam+=e;
            sira++;
        }/*while sonu*/
    }/*else sonu*/
    printf("\nkasanin puani: %d dir.",kasa_toplam);
    /*kasanin kart cekme islemleri bitti*/
    /*Kazanma kosullari*/
    if((oyuncu_toplam>21) && (kasa_toplam>21))/*ortak sonuclar olabilecegi icin bazi if'lere return 0 koyduk*/
    {/*blok baslangici*/
        printf("\nOyuncu da kasa da kaybetti. Berabere.");
        getch();
        return 0;
    }/*if sonu*/
    if((oyuncu_toplam>21) && (kasa_toplam<=21))
    {/*blok baslangici*/
        printf("\nPuaniniz 21'i gecti. Kaybettiniz.");
        getch();
        return 0;
    }/*if sonu*/
    if((oyuncu_toplam<=21) && (kasa_toplam>21))
    {/*blok baslangici*/
        printf("\nKasanin puani 21'i gecti.Kazandiniz.");
        getch();
        return 0;
    }/*if sonu*/
    if((oyuncu_toplam==21) && (kasa_toplam==21))
        printf("\nKasanin da sizin de puaniniz 21. Berabere.");
    else if((oyuncu_toplam==21) && (kasa_toplam != 21))
        printf("\nPuaniniz 21. Kazandiniz.");
    else if((oyuncu_toplam!=21) && (kasa_toplam==21))
        printf("\nKasanin puani 21. Kaybettiniz.");
    else if((21-oyuncu_toplam)<(21-kasa_toplam))
        printf("\nPuaniniz 21'e daha yakin. Kazandiniz.");
    else if((21-oyuncu_toplam)>(21-kasa_toplam))
        printf("\nKasanin puani 21'e daha yakin. Kaybettiniz.");
    getch();
    return 0;
}/*----------main fonksitonunun sonu----------*/


/*----------Fonksiyon tanimlari----------*/


/*
* FOKSIYON : toplam
* KULLANIMI : toplam(int *A,int b)
* PARAMETRELER : *A : Oyuncunun elindeki destenin sayi degerleri dizisi
*                 b : dizide kaç tane kart oldugunu gösterir
* ---------------------------------------------------
* Bu fonksiyon eleman sayisi verilen dizinin elemanlarinin toplamini bulur
*/
int toplam(int *A,int b)
{/*blok baslangici*/
    int a=0,x;
    for(x=0; x<=b; x++)
    a+=A[x];
    return a;
}/*toplam fonksiyonu sonu*/


Honour87
24-03-2006, 02:08   |  #4  
OP Taze Üye
Teşekkür Sayısı: 0
10 mesaj
Kayıt Tarihi:Kayıt: Mar 2006

kodlar normalde çalışıyor fakat ben biraz önce yukardan kopyalayıp çalıştırmayı denedim olmadı. Sorun ne anlamadım?:)))))