C´de Basit Bir Labirent Oyunu

detista

Megapat
Katılım
20 Kasım 2016
Mesajlar
6.834
Makaleler
31
Çözümler
19
Yer
İstanbul
oyun1.png


Merhabalar. C´de 9x9 karelik bir matris üzerinde çalışan basit bir labirent oyunu yazdım. Program her turda Y, Z ve X oyuncularından bir sonraki hamlelerini girmesini bekliyor ve her turda yeni matris düzenini ekrana basıyor. Ekranda gitmek istenilen yön her bir turda w, a, s, d karakterleri girilerek belirleniyor. Ok işareti ile belirlenmiş bitiş çizgisine ilk ulaşan oyuncu kazanıyor ve kimin kazandığı ekrana bastırılıp program sonlandırılıyor.

Hem çok zaman ayıramadığım için, hem de yeni başlayanların gözünde fazla karmaşıklaşmaması için elimden geldiğince programı basit tutmaya çalıştım. İlgilenenler programda iyileştirmeler yapabilirler. Örneğin siyah blokların olduğu bölüme geçişi engelleyen kurallar yazabilirsiniz ya da her oyuncunun gerçekleştirdiği hareket sayısına göre oyun sonunda puan verilebilir. Bunlar ilk aklıma gelenler, gerisi keyfinize kalmış.

C´de iki boyutlu matrisler bastıran örneklerden bol bol çözün. Ne kadar çok örnek çözerseniz, döngü yazma ve algoritma kurma becerilerinizi geliştirmiş olursunuz. Çalışmak için kaynak arıyorsanız Türkçe düzgün anlatımlı kaynak olarak Şerafettin Arıkan´ın C Programlama Dili kitabını öneririm. Ancak içerdiği bol miktarda örnek soru ve çözümü nedeniyle Deitel´in C ile Programlama kitabını öneririm. İki kitapta şu an piyasada mevcut olmalı bildiğim kadarıyla. Eğer İngilizce biliyorsanız kaynaklar sonsuz zaten.

oyun2.gif


C:
#include <stdio.h>

int main() {
    int a, b, Ya = 1, Yb = 1, Za = 1, Zb = 9, Xa = 8, Xb = 1;
    char Yc, Zc, Xc;
    while(1) {
        for(a=1; a<=9; a++) {
            for(b=1; b<=9; b++) {
                if((a==1 && b==4) || (a==2 && (b==7 || b==9)) || (a==3 && (b==2 || b==4 || b==7 || b==8)) || (a==4 && b==5) || (a==5 && (b==2 || b==7)) || (a==6 && (b==3 || b==5 || b==9)) || (a==7 && (b==1 || b==7 || b==8)) || (a==8 && (b==2 || b==4 || b==7)) || (a==9 && (b==4 || b==5))) {
                    printf("██");
                }
                else {
                    if(a==5 && b==9) {
                        printf("⮕");
                    }
                    else if(a==Ya && b==Yb) {
                        printf(" Y");
                    }
                    else if(a==Za && b==Zb) {
                        printf(" Z");
                    }
                    else if(a==Xa && b==Xb) {
                        printf(" X");
                    }
                    else {
                        printf("░░");
                    }
                }
            }
            printf("\n");
        }
        if(Ya==5 && Yb==9) {
            printf("Y oyuncusu kazandı.\n");
            break;
        }
        else if(Za==5 && Zb==9) {
            printf("Z oyunusu kazandı.\n");
            break;
        }
        else if(Xa==5 && Xb==9) {
            printf("X oyuncusu kazandı.\n");
            break;
        }
        printf("Y oyuncusunun sırası:\n");
        scanf(" %c", &Yc);
        if(Yc=='w')
            Ya--;
        else if(Yc=='s')
            Ya++;
        else if(Yc=='d')
            Yb++;
        else if(Yc=='a')
            Yb--;
        printf("Z oyuncusunun sırası:\n");
        scanf(" %c", &Zc);
        if(Zc=='w')
            Za--;
        else if(Zc=='s')
            Za++;
        else if(Zc=='d')
            Zb++;
        else if(Zc=='a')
            Zb--;
        printf("X oyuncusunun sırası:\n");
        scanf(" %c", &Xc);
        if(Xc=='w')
            Xa--;
        else if(Xc=='s')
            Xa++;
        else if(Xc=='d')
            Xb++;
        else if(Xc=='a')
            Xb--;
    }
    return 0;
}
// ██
// ░░

Not: Program Ubuntu GNU/Linux platformunda derlenmiştir ve denenmiştir. Eğer Windows kullanıyorsanız kodda değişiklik yapmanız gerekebilir. O değişiklikte kodun sonuna bir getch() fonksiyonu eklemeniz gerektiğidir. Çünkü DOS/Windows komut satırı ortamında bir program çalıştırıldıktan sonra kapanır. Kapanmasını engellemek için conio.h kütüphanesinde ki getch() fonksiyonunu, ya da getchar() fonksiyonunu kullanabilirsiniz.
 
Merak edenler veya farklı bir dilde nasıl olduğunu incelemek isteyenler için aynı programın Python versionu:

Python:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys

Ya = 1
Yb = 1
Za = 1
Zb = 9
Xa = 8
Xb = 1
while(True):
    a = 1
    while(a <= 9):
        b = 1
        while(b <= 9):
            if((a==1 and b==4) or (a==2 and (b==7 or b==9)) or (a==3 and (b==2 or b==4 or b==7 or b==8)) or (a==4 and b==5) or (a==5 and (b==2 or b==7)) or (a==6 and (b==3 or b==5 or b==9)) or (a==7 and (b==1 or b==7 or b==8)) or (a==8 and (b==2 or b==4 or b==7)) or (a==9 and (b==4 or b==5))):
                sys.stdout.write("██")
            elif(a == Ya and b == Yb):
                sys.stdout.write(" Y")
            elif(a == Za and b == Zb):
                sys.stdout.write(" Z")
            elif(a == Xa and b == Xb):
                sys.stdout.write(" X")
            elif(a == 5 and b == 9):
                sys.stdout.write("⮕")
            else:
                sys.stdout.write("░░")
            b += 1
        print("")
        a += 1
    if(Ya == 5 and Yb == 9):
        print("Y oyuncusu kazandı!")
        break
    if(Za == 5 and Zb == 9):
        print("Z oyuncusu kazandı!")
        break
    if(Xa == 5 and Xb == 9):
        print("X oyuncusu kazandı!")
        break
    Y = input("Y oyuncusunun sırası: ")
    if(Y == "w"):
        Ya -= 1
    if(Y == "a"):
        Yb -= 1
    if(Y == "s"):
        Ya += 1
    if(Y == "d"):
        Yb += 1
    Z = input("Z oyuncusunun sırası: ")
    if(Z == "w"):
        Za -= 1
    if(Z == "a"):
        Zb -= 1
    if(Z == "s"):
        Za += 1
    if(Z == "d"):
        Zb += 1
    X = input("X oyuncusunun sırası : ")
    if(X == "w"):
        Xa -= 1
    if(X == "a"):
        Xb -= 1
    if(X == "s"):
        Xa += 1
    if(X == "d"):
        Xb += 1
 
Tebrik ederim hocam. Bir benzerini Visual Studio'nun Python projesi üzerinden yapabilir miyiz?
 
Tebrik ederim hocam. Bir benzerini Visual Studio'nun Python projesi üzerinden yapabilir miyiz?

Evet. Python her platformda aynı çalışır. Sadece eğer Windows kullanıyorsanız ve program içinde kullandığım bazı özel karakterleri kullanacaksanız bunları değiştirmeniz gerekebilir. Duvar olarak kullandığım ██ yerine [], çıkış kapısını işaret eden ⮕ yerine -->, arka plan olarak ░░ yerine boşluk karakterini kullabilirsiniz. Linux kendinden destekliyor ancak Windows konsolunda bu özel karakterler desteklenmiyor sanırım. Ayarlardan karakter setini değiştirip orijinal haliyle kullanmakta mümkün.
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Geri
Yukarı