C ile zar oyunu yapımı

Katılım
12 Aralık 2015
Mesajlar
6.717
Makaleler
9
Çözümler
11
Daha fazla  
Sistem Özellikleri
i7 10750H || GTX 1660 Ti 6 GB Mobile || 2x16 GB RAM || 512 GB NVMe M.2 SSD || 1080p 144 Hz IPS Panel || Windows 11-macOS Big Sur || Acer Nitro 5 AN515-55 2020 ||
Cinsiyet
Erkek
Meslek
Öğrenci
Kurallar:

1-İki zar atılır
2-Zarların toplamı hesaplanır
3-İlk atışta 7 veya 11 gelirse oyuncu kazanır
4-İlk atışta 2, 3 veya 12 gelirse oyuncu kaybeder
5-İlk atışta 4,5,6,8,9,10 gelirse bu oyuncunun puanı oluyor.
6-Oyuncu 7 atmadan önce kendi puanını tutturmalıdır.

Bu kuralları olan bir oyunun C kodunu yazmam gerekli. Bir yere kadar geldim ancak hatamı veya doğrularımı göremiyorum. Direkt cevaptan ziyade kendi kodum tamamen yanlış değilse üzerinden tavisye, öneri almak benim için çok iyi olur.

C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main() {
   
    int zar1,zar2,toplam,puan,i=0;
   
   
    srand(time(NULL));
   
    zar1 = rand() % 6 + 1;
    zar2 = rand() % 6 + 1;
   
    toplam = zar1 + zar2;
   
    if(i==0) {
   
   
    switch(toplam) {
       
        case 7:
       
            printf("Tebrikler. Oyunu kazandiniz...\n");
            break;
           
           
        case 11:
           
            printf("Tebrikler. Oyunu kazandiniz...\n");
            break;
           
           
        case 2:
           
            printf("Oyunu kaybettiniz...\n");
            break;
           
        case 3:
           
            printf("Oyunu kaybettiniz...\n");
            break;
           
        case 12:
       
            printf("Oyunu kaybettiniz...\n");
            break;
           
           
        case 4:
           
            puan= toplam;
            printf("Puaniniz: %d\n",puan);
            i++;
            break;
           
        case 5:
           
            puan= toplam;
            printf("Puaniniz: %d\n",puan);
            i++;
            break;
           
        case 6:
           
            puan= toplam;
            printf("Puaniniz: %d\n",puan);
            i++;
            break;
           
        case 8:
           
            puan= toplam;
            printf("Puaniniz: %d\n",puan);
            i++;
            break;
           
        case 9:
           
            puan= toplam;
            printf("Puaniniz: %d\n",puan);
            i++;
            break;
           
        case 10:
           
            puan= toplam;
            printf("Puaniniz: %d\n",puan);
            i++;
            break;
    }
}

    if(i==1 && puan==toplam) {
        printf("Puan ve skorunuz ayni, bundan sonra 7 atarsaniz oyunu kazanabilirsiniz...\n");
        i++;
    }
   
    if(i==2 && toplam == 7) {
       
        printf("Oyunu puan esitligi ve sonrasinda 7 atarak kazandiniz...\n");
    }

   
   
    return 0;
}

Bu şekilde bir şey yaptım ancak 7. kural denk gelmedi ya da ben bir hata yaptım. Diğer kuralar çalışıyor, zaten basit idi.
 
Acaba 5.adım için OOP kullanılarak daha az kod kullanılarak yapılabilir mi acaba?
Hiçbir fikrim yok hocam nesne yönelimli programlama hakkında. Kod doğru mudur sizce ? Uzun ve karmaşık olması dışında ? Son 7'yi atarak kazanmasını göremedim konsolda. Ek olarak da i=1 iken her zaman puan da toplama eşit nasıl denk geldi kafam karıştı orada da.
 
Hiçbir fikrim yok hocam nesne yönelimli programlama hakkında. Kod doğru mudur sizce? Uzun ve karmaşık olması dışında? Son 7'yi atarak kazanmasını göremedim konsolda. Ek olarak da i = 1 iken her zaman puan da toplama eşit nasıl denk geldi kafam karıştı orada da.

C hiç bilgim yok. Kod temel olarak doğru if yerine case kullanarak kod tekrarına düşmemişssiniz. İ = 0 ile ne yapmaya çalıştınız. Konuyu öne çıkarmayı unutmayın.
 
Hiçbir fikrim yok hocam nesne yönelimli programlama hakkında. Kod doğru mudur sizce ? Uzun ve karmaşık olması dışında ? Son 7'yi atarak kazanmasını göremedim konsolda. Ek olarak da i=1 iken her zaman puan da toplama eşit nasıl denk geldi kafam karıştı orada da.
C nesne yönelimli bir dil değil, zaten bu uygulama için OPP kullanmaya gerek yok.
@Yeniçocuk'un aksine switch-case kullanarak kod tekrarına düşmüşsünüz.
Yazdığınız kodda zarlar sadece bir kez atılıyor temel problem bu.
 
C nesne yönelimli bir dil değil, zaten bu uygulama için OPP kullanmaya gerek yok.
@Yeniçocuk'un aksine switch-case kullanarak kod tekrarına düşmüşsünüz.
Yazdığınız kodda zarlar sadece bir kez atılıyor temel problem bu.
Nasıl düzeltebilirim bunu ? if ile de işin içinden çıkamadım, çok fazla ve tekrar eden kodlar olmuştu yine. case 4 ile case 10 arasına return(); dersem de ilk atılan zarlar bir daha hesaplanıyor. İç içe geliyor her şey benim bilgimle.
C hiç bilgim yok. Kod temel olarak doğru if yerine case kullanarak kod tekrarına düşmemişssiniz. İ = 0 ile ne yapmaya çalıştınız. Konuyu öne çıkarmayı unutmayın.
Tekrar zar atılınca 7 veya 11 gelirse vs. ilk 4 kurala girmesin diye yapmıştım yani bir adım atlatmak için.
 
Nasıl düzeltebilirim bunu ? if ile de işin içinden çıkamadım, çok fazla ve tekrar eden kodlar olmuştu yine. case 4 ile case 10 arasına return(); dersem de ilk atılan zarlar bir daha hesaplanıyor. İç içe geliyor her şey benim bilgimle.
Zarları tekrar tekrar atmak için döngü kullanmalısınız. Anladığım kadarıyla loop (döngü) kavramını henüz bilmiyorsunuz. Buradan öğrenebilirsiniz.
If-else yapısı kullanırsanız kod tekrarı önlenecektir.
C:
if(toplam == 7 || toplam == 11){
//oyuncu kazanır
}else if(toplam == 2 || toplam == 3 || toplam == 12){
//oyuncu kaybeder
}else{
//oyuncunun puanı hesaplanır
}
 
Son düzenleme:
Zarları tekrar tekrar atmak için döngü kullanmalısınız. Anladığım kadarıyla loop (döngü) kavramını henüz bilmiyorsunuz. Buradan öğrenebilirsiniz.
If-else yapısı kullanırsanız kodunuz tekrar etmeyecektir.
C:
if(toplam == 7 || toplam == 11){
//oyuncu kazanır
}else if(toplam == 2 || toplam == 3 || toplam == 12){
//oyuncu kaybeder
}else{
//oyuncunun puanı hesaplanır
}
Temel görevlerini ve basit uygulamalarını biliyorum ama bu problemde kullanmam gerektiğinden emin olamadım. Her şeyden önce algoritma kurma konusunda sorun yaşıyorum. Sürprizbozan içindeki kodunuzda son satırdaki ''else'' çalışırken ikinci zar atışında 7 gelirse yine ilk if çalışmış olmayacak mıdır ? Bu tarz bir şey olmasın diye kendi kodumda i'ye değer vermeye çalıştım sanırım döngü yerine böyle bir şey aklıma geldi.

Açıkçası nerede nasıl bir döngü kullanacağımı anlamadım.Birkaç tüyo verebilir misiniz ?
 
Anladığım kadarıyla oyun bitmediği sürece zarların tekrar tekrar atılması gerekiyor. Bunun için programın çatısını sonsuz bir döngü ile kurun. Yani oyun bitmediği sürece sürekli zar atılsın.
Yazdığım kod zarların ilk atıldığı durum içindi. Diğer durumlar için de bir if-else yapısı kurabilirsiniz.
 

Geri
Yukarı