Matlab ile Yılan Oyunu

Çoğumuzun bildiği gibi yılan oyunu genellikle oyuncunun yılanın kafasını yönlendirdiği bir oyun türüdür. Oyuncu yılanın yönünü belirleyerek yılanın kafasını hareket ettirir ve yılanın kafası nereye giderse yılan da o yönde hareket eder.

Yılanın amacı, yılanın kafasını yönlendirerek oyunda rastgele yerleştirilen yemleri yemek ve yılanın boyunu uzatmaktır. Yılanın kafası veya vücudu, oyun alanının kenarlarına veya kendisine dokunduğunda oyun biter.

Aşağıda sizlerle paylaştığım Matlab kodu, oyuncunun yılanın kafasını yöneltmesini sağlayacak klavye kontrollerini sağlar ve yılanın hareketini işler. Ayrıca yemek oluşturma, yılanın uzunluğunu kontrol etme ve oyunun bitişini kontrol etme gibi işlevleri de sağlar. Bu şekilde, oyuncu yılanı yönlendirerek oyunu oynar ve yılanın boyunu uzatırken, yılanın kendisine veya oyun alanının kenarlarına çarpmasını önlemeye çalışır. 

Yılan oyununun Matlab kodunu aşağıda bulabilirsiniz. Bu kod, Python'da olduğu gibi Pygame kütüphanesi gibi bir kütüphane ile yazılmamıştır. Ancak bu kez, MATLAB'ın grafik işleme işlevlerini kullanarak oyun ekranını çiziyoruz. Yılanın ve yemeğin konumlarını çizdirmek için plot işlevini kullanıyoruz ve xlim ve ylim işlevleri ile oyun ekranının sınırlarını belirliyoruz. pause işlevi ile de oyun hızını ayarlıyoruz.

Yılan Oyunu - MATLAB ile

classdef SnakeGame < handle
    % SNAKEGAME MATLAB ile Yılan Oyunu
    % Klasik yılan oyununun MATLAB implementasyonu
    
    properties
        % Oyun ayarları
        Width = 600
        Height = 600
        GridSize = 20
        GridWidth
        GridHeight
        FPS = 10
        
        % Yılan özellikleri
        Snake
        Food
        Score = 0
        HighScore = 0
        GameOver = false
        
        % Grafik nesneleri
        Figure
        Axes
        SnakePatches
        FoodPatch
        ScoreText
        HighScoreText
        GameOverText
        
        % Renkler
        Colors
    end
    
    methods
        function obj = SnakeGame()
            % SNAKEGAME Constructor - Oyunu başlat
            
            fprintf('=== MATLAB YILAN OYUNU ===\n');
            fprintf('Kontroller: ↑ ↓ ← → tuşları\n');
            fprintf('Yeniden başlatmak: R tuşu\n');
            fprintf('Çıkmak: ESC tuşu\n\n');
            
            % Izgara boyutlarını hesapla
            obj.GridWidth = obj.Width / obj.GridSize;
            obj.GridHeight = obj.Height / obj.GridSize;
            
            % Renkleri tanımla
            obj.Colors.White = [1 1 1];
            obj.Colors.Black = [0 0 0];
            obj.Colors.Red = [1 0 0];
            obj.Colors.Green = [0 1 0];
            obj.Colors.DarkGreen = [0 0.4 0];
            obj.Colors.Yellow = [1 1 0];
            obj.Colors.Blue = [0 0 1];
            
            % Oyunu başlat
            obj.initializeGame();
            obj.setupGraphics();
            obj.runGame();
        end
        
        function initializeGame(obj)
            % Oyun durumunu sıfırla
            obj.Score = 0;
            obj.GameOver = false;
            
            % Yılanı başlat
            obj.Snake.Positions = [floor(obj.GridWidth/2), floor(obj.GridHeight/2)];
            obj.Snake.Direction = [1, 0]; % Sağa doğru
            obj.Snake.Length = 3;
            obj.Snake.GrowTo = 3;
            
            % Yem oluştur
            obj.generateFood();
        end
        
        function setupGraphics(obj)
            % Grafik arayüzü oluştur
            
            % Figure ve axes oluştur
            obj.Figure = figure('Name', 'MATLAB Yılan Oyunu', ...
                'NumberTitle', 'off', ...
                'Position', [100, 100, obj.Width, obj.Height + 50], ...
                'KeyPressFcn', @(src,event) obj.handleKeyPress(event), ...
                'CloseRequestFcn', @(src,event) obj.cleanup(), ...
                'MenuBar', 'none', ...
                'Resize', 'off');
            
            obj.Axes = axes('Parent', obj.Figure, ...
                'Position', [0, 0, 1, 0.9], ...
                'XLim', [0, obj.Width], ...
                'YLim', [0, obj.Height], ...
                'XTick', [], ...
                'YTick', [], ...
                'Color', obj.Colors.Black, ...
                'XColor', obj.Colors.Black, ...
                'YColor', obj.Colors.Black);
            
            hold on;
            axis equal;
            axis off;
            
            % Izgarayı çiz
            obj.drawGrid();
            
            % Skor metinleri
            obj.ScoreText = text(10, obj.Height + 20, ...
                sprintf('Skor: %d', obj.Score), ...
                'Color', obj.Colors.White, ...
                'FontSize', 12);
            
            obj.HighScoreText = text(obj.Width - 100, obj.Height + 20, ...
                sprintf('En Yüksek: %d', obj.HighScore), ...
                'Color', obj.Colors.Yellow, ...
                'FontSize', 12);
            
            % Oyun bitti metni (başlangıçta gizli)
            obj.GameOverText = text(obj.Width/2, obj.Height/2, '', ...
                'Color', obj.Colors.Red, ...
                'FontSize', 24, ...
                'HorizontalAlignment', 'center', ...
                'Visible', 'off');
        end
        
        function drawGrid(obj)
            % Izgara çiz
            for x = 0:obj.GridSize:obj.Width
                line([x, x], [0, obj.Height], 'Color', [0.3, 0.3, 0.3]);
            end
            for y = 0:obj.GridSize:obj.Height
                line([0, obj.Width], [y, y], 'Color', [0.3, 0.3, 0.3]);
            end
        end
        
        function generateFood(obj)
            % Rastgele yem pozisyonu oluştur
            while true
                pos = [randi(obj.GridWidth) - 1, randi(obj.GridHeight) - 1];
                % Yem yılanın üzerinde olmasın
                if ~ismember(pos, obj.Snake.Positions, 'rows')
                    obj.Food.Position = pos;
                    break;
                end
            end
        end
        
        function handleKeyPress(obj, event)
            % Klavye girdilerini işle
            
            switch event.Key
                case 'uparrow'
                    if ~isequal(obj.Snake.Direction, [0, 1]) % Aşağıdan gelmiyorsa
                        obj.Snake.Direction = [0, -1];
                    end
                case 'downarrow'
                    if ~isequal(obj.Snake.Direction, [0, -1]) % Yukarıdan gelmiyorsa
                        obj.Snake.Direction = [0, 1];
                    end
                case 'leftarrow'
                    if ~isequal(obj.Snake.Direction, [1, 0]) % Sağdan gelmiyorsa
                        obj.Snake.Direction = [-1, 0];
                    end
                case 'rightarrow'
                    if ~isequal(obj.Snake.Direction, [-1, 0]) % Soldan gelmiyorsa
                        obj.Snake.Direction = [1, 0];
                    end
                case 'r'
                    if obj.GameOver
                        obj.initializeGame();
                        obj.updateGraphics();
                    end
                case 'escape'
                    delete(obj.Figure);
            end
        end
        
        function success = moveSnake(obj)
            % Yılanı hareket ettir
            
            head = obj.Snake.Positions(1, :);
            newHead = head + obj.Snake.Direction;
            
            % Duvar geçişi (sarmal)
            newHead(1) = mod(newHead(1), obj.GridWidth);
            newHead(2) = mod(newHead(2), obj.GridHeight);
            
            % Kendine çarpma kontrolü
            if size(obj.Snake.Positions, 1) > 1 && ismember(newHead, obj.Snake.Positions(2:end, :), 'rows')
                success = false;
                return;
            end
            
            % Yeni pozisyonu ekle
            obj.Snake.Positions = [newHead; obj.Snake.Positions];
            
            % Büyüme kontrolü
            if size(obj.Snake.Positions, 1) > obj.Snake.GrowTo
                obj.Snake.Positions(end, :) = [];
            end
            
            success = true;
        end
        
        function checkFood(obj)
            % Yem yendi mi kontrol et
            
            head = obj.Snake.Positions(1, :);
            if isequal(head, obj.Food.Position)
                obj.Snake.GrowTo = obj.Snake.GrowTo + 1;
                obj.Score = obj.Score + 10;
                obj.generateFood();
                
                % Yüksek skor güncelleme
                if obj.Score > obj.HighScore
                    obj.HighScore = obj.Score;
                end
            end
        end
        
        function updateGraphics(obj)
            % Grafikleri güncelle
            
            % Eski patch'leri temizle
            if ishandle(obj.SnakePatches)
                delete(obj.SnakePatches);
            end
            if ishandle(obj.FoodPatch)
                delete(obj.FoodPatch);
            end
            
            % Yılanı çiz
            obj.SnakePatches = [];
            for i = 1:size(obj.Snake.Positions, 1)
                pos = obj.Snake.Positions(i, :);
                x = pos(1) * obj.GridSize;
                y = pos(2) * obj.GridSize;
                
                if i == 1 % Baş
                    color = obj.Colors.DarkGreen;
                else % Vücut
                    color = obj.Colors.Green;
                end
                
                patch = rectangle('Position', [x, y, obj.GridSize, obj.GridSize], ...
                    'FaceColor', color, ...
                    'EdgeColor', obj.Colors.Black, ...
                    'LineWidth', 1);
                obj.SnakePatches = [obj.SnakePatches; patch];
            end
            
            % Yemi çiz
            foodPos = obj.Food.Position;
            x = foodPos(1) * obj.GridSize;
            y = foodPos(2) * obj.GridSize;
            
            obj.FoodPatch = rectangle('Position', [x, y, obj.GridSize, obj.GridSize], ...
                'FaceColor', obj.Colors.Red, ...
                'EdgeColor', obj.Colors.Black, ...
                'LineWidth', 1);
            
            % Skorları güncelle
            set(obj.ScoreText, 'String', sprintf('Skor: %d', obj.Score));
            set(obj.HighScoreText, 'String', sprintf('En Yüksek: %d', obj.HighScore));
            
            % Oyun bitti durumu
            if obj.GameOver
                set(obj.GameOverText, 'String', ...
                    sprintf('OYUN BİTTİ!\nSkor: %d\nR tuşu ile yeniden başlat', obj.Score), ...
                    'Visible', 'on');
            else
                set(obj.GameOverText, 'Visible', 'off');
            end
            
            drawnow;
        end
        
        function runGame(obj)
            % Ana oyun döngüsü
            
            while ishandle(obj.Figure)
                if ~obj.GameOver
                    % Yılanı hareket ettir
                    if ~obj.moveSnake()
                        obj.GameOver = true;
                        continue;
                    end
                    
                    % Yem kontrolü
                    obj.checkFood();
                    
                    % Grafikleri güncelle
                    obj.updateGraphics();
                    
                    % Bekleme
                    pause(1/obj.FPS);
                else
                    pause(0.1); % Oyun bittiğinde CPU kullanımını azalt
                end
            end
        end
        
        function cleanup(obj)
            % Temizlik işlemleri
            if ishandle(obj.Figure)
                delete(obj.Figure);
            end
            fprintf('Oyun sona erdi. İyi oyunlar!\n');
        end
    end
end

% Oyunu başlat
function playSnakeGame()
    game = SnakeGame();
end

% Oyunu çalıştır
playSnakeGame();

🎮 MATLAB Yılan Oyunu - Çalıştırma ve Kullanım

📋 Gereksinimler

  • MATLAB R2018b veya üzeri

  • Hiçbir ek toolbox gerekmez

🚀 Oyunu Başlatma

% Doğrudan komut penceresinden:
playSnakeGame()

% Veya dosyayı çalıştırarak

🎯 Oyun Kontrolleri

  • ↑ Yukarı Ok: Yukarı hareket

  • ↓ Aşağı Ok: Aşağı hareket

  • ← Sol Ok: Sola hareket

  • → Sağ Ok: Sağa hareket

  • R: Oyunu yeniden başlat (game over durumunda)

  • ESC: Oyundan çık

✨ MATLAB'a Özel Özellikler

🏗️ Nesne Yönelimli Yapı

classdef SnakeGame < handle
    % MATLAB'ın OOP özelliklerini kullanır
    % Temiz ve modüler kod yapısı

🎨 MATLAB Grafik Motoru

% Yüksek kaliteli grafik render
rectangle('Position', [x, y, size, size], ...
          'FaceColor', color, ...
          'EdgeColor', 'black');

⚡ Gerçek Zamanlı Etkileşim

'KeyPressFcn', @(src,event) obj.handleKeyPress(event)
% Anında klavye tepkisi

🔧 Teknik Özellikler

🐍 Yılan Mekaniği

  • Sarmal duvar geçişi: Kenarlardan geçebilme

  • Büyüme sistemi: Yem yedikçe uzama

  • Çarpışma kontrolü: Kendine çarpma tespiti

🍎 Yem Sistemi

  • Akıllı yerleşim: Yılanın üzerine gelmeme

  • Rastgele konum: Her seferinde farklı pozisyon

📊 Skor ve İstatistikler

  • Anlık skor: Mevcut puan gösterimi

  • Rekor takibi: En yüksek skor kaydı

  • Görsel feedback: Renkli skor göstergeleri

🎮 Oyun Deneyimi

⚡ Performans

FPS = 10 % Oyun hızı (adjustable)
% Optimize edilmiş grafik güncelleme

🎨 Görsel Kalite

  • Net ızgara çizgileri

  • Renk kodlu elementler

  • Profesyonel oyun arayüzü

🕹️ Oyun Akışı

  1. Başlangıç: 3 birimlik yılan

  2. Oyun içi: Yemleri toplayarak büyüme

  3. Game over: Kendine çarpma veya duvardan çıkma

  4. Yeniden başlat: R tuşu ile tekrar oynama

🚀 Geliştirme İpuçları

Oyunu Özelleştirme

% Hızı artır
obj.FPS = 15;

% Izgara boyutunu değiştir
obj.GridSize = 25;

% Renkleri değiştir
obj.Colors.Green = [0, 0.8, 0]; % Daha açık yeşil

Yeni Özellikler Ekleyin

% Engel sistemi ekle
obj.Obstacles = [5,5; 5,6; 5,7]; % Engel pozisyonları

% Özel yemler ekle
obj.SpecialFood.Position = [10,10];
obj.SpecialFood.Color = [1,1,0]; % Sarı
obj.SpecialFood.Points = 50; % Ekstra puan

Zorluk Seviyeleri

% Seviyeye göre hızı ayarla
function setDifficulty(obj, level)
    switch level
        case 'easy'
            obj.FPS = 8;
        case 'medium'
            obj.FPS = 12;
        case 'hard'
            obj.FPS = 16;
    end
end

💡 MATLAB Avantajları

🎯 Eğitimsel Değer

  • Matris işlemleri: Pozisyon yönetimi

  • Nesne yönelimli programlama: OOP prensipleri

  • Grafik programlama: MATLAB figure handling

⚡ Performans

  • Yerel MATLAB motoru: Hızlı çalışma

  • Optimize edilmiş: Düşük CPU kullanımı

  • Kararlı: Crash olmadan uzun süreli oynanış

🎨 Görsel Kalite

  • Vektörel grafikler: Keskin görüntü

  • Profesyonel arayüz: Temiz tasarım

  • Özelleştirilebilir: Kolay modifikasyon


🌟 MATLAB'da oyun geliştirme için mükemmel bir başlangıç! Kod yapısı sayesinde kolayca genişletebilir ve özelleştirebilirsiniz.

Happy coding! 🐍📊🎮

% Hemen oyna!
playSnakeGame();

 

NOT: Aynı oyunun Python ile yazılmış halini görmek için TIKLAYINIZ 😊

matlab, 'matlab yılan oyunu', 'matlab ile oyun', 'matlab snake game', 'matlab yılan oyunu kodları', 'matlab yılan oyunu kodu',  'matlab pygame kütüphanesi', matlab,  'oyun kodlama örnekleri', 'örnek oyun kodu', 'matlab örnek oyun kodu'

 

Bilgilendirme

www.aliosmangokcan.com sayfasına gösterdiğiniz ilgiden dolayı teşekkür ederim. İçeriklerle ilgili duygu ve düşüncelerinizi mail adresim üzerinden iletebilirsiniz...

 

İstatistikler

  • Kullanıcılar 1
  • Makaleler 113
  • Makale Görüntüleme 1003945