Mayın Tarlası Oyunu Python Kodları

Mayın tarlası, bir strateji oyunudur. Oyun tahtası üzerinde rastgele yerleştirilmiş gizli mayınlardan kaçınılması gerekmektedir. Oyuncu, mayınların yerlerini tahmin ederek, her bir hücre için "mayın var" veya "mayın yok" şeklinde bir işaret koyar.

Oyunucunun amacı, tüm mayınların yerlerini doğru bir şekilde tahmin etmek ve tüm boş hücreleri açmaktır.

Oyuncunun her bir hamlesi, bir hücrenin açılması veya işaretlenmesi şeklinde olabilir. Eğer açılan bir hücrede bir mayın varsa, oyun kaybedilir. Eğer açılan hücrede bir mayın yoksa, o hücredeki sayı, komşu hücrelerdeki mayın sayısını gösterir. Bu sayılar, oyuncunun tahminlerinde yararlıdır. Oyuncunun işaretlemeleri de önemlidir. İşaretlenen bir hücrede bir mayın varsa, oyuncu o hücreyi işaretler ve diğer hamlelerinde bu hücreyi göz önünde bulundurur. İşaretlenen bir hücrede bir mayın yoksa, oyuncu o hücreyi açmaz ve diğer hamlelerinde bu hücreyi göz önünde bulundurur. Oyunun amacı, tüm boş hücreleri açmak ve tüm mayınların yerlerini doğru bir şekilde tahmin etmektir.

Aşağıda yüksek seviyeli bir programlama dili olan Python ile mayın tarlasının oyununun nasıl yazıldığını göreceksiniz. 

 
import random
import os

class Minesweeper:
    def __init__(self):
        """Oyunu başlat ve temel ayarları yap"""
        print("=== MAYIN TARLASI OYUNU ===\n")
        self.board_size = self.get_valid_input("Oyun tahtası boyutunu girin (örn: 8): ", 4, 20)
        self.num_mines = self.get_valid_input("Mayın sayısını girin: ", 1, self.board_size**2 - 1)
        
        # Oyun tahtalarını başlat
        self.player_board = [['.' for _ in range(self.board_size)] for _ in range(self.board_size)]
        self.mine_board = [[0 for _ in range(self.board_size)] for _ in range(self.board_size)]
        self.game_over = False
        self.game_won = False
        self.moves = 0
        
        # Mayınları yerleştir
        self.place_mines()
    
    def get_valid_input(self, prompt, min_val, max_val):
        """Geçerli kullanıcı girişi al"""
        while True:
            try:
                value = int(input(prompt))
                if min_val <= value <= max_val:
                    return value
                else:
                    print(f"Lütfen {min_val} ile {max_val} arasında bir değer girin.")
            except ValueError:
                print("Geçersiz giriş! Lütfen bir sayı girin.")
    
    def place_mines(self):
        """Mayınları rastgele yerleştir ve komşu sayılarını hesapla"""
        mines_placed = 0
        
        while mines_placed < self.num_mines:
            row = random.randint(0, self.board_size - 1)
            col = random.randint(0, self.board_size - 1)
            
            # Eğer bu hücrede zaten mayın yoksa
            if self.mine_board[row][col] != -1:
                self.mine_board[row][col] = -1  # Mayın koy
                mines_placed += 1
                
                # Komşu hücrelerin sayılarını güncelle
                for i in range(max(0, row-1), min(self.board_size, row+2)):
                    for j in range(max(0, col-1), min(self.board_size, col+2)):
                        if self.mine_board[i][j] != -1:  # Mayın değilse
                            self.mine_board[i][j] += 1
    
    def display_board(self, show_mines=False):
        """Oyun tahtasını ekranda göster"""
        os.system('cls' if os.name == 'nt' else 'clear')  # Konsolu temizle
        
        print("   " + " ".join(f"{i+1:2}" for i in range(self.board_size)))
        print("   " + "---" * self.board_size)
        
        for i in range(self.board_size):
            print(f"{i+1:2}|", end=" ")
            for j in range(self.board_size):
                if show_mines and self.mine_board[i][j] == -1:
                    print(" * ", end="")  # Mayın göster
                elif self.player_board[i][j] == 'F':
                    print(" F ", end="")  # Bayrak
                elif self.player_board[i][j] == '.':
                    print(" . ", end="")  # Kapalı hücre
                elif self.player_board[i][j] == ' ':
                    print("   ", end="")  # Boş hücre
                else:
                    print(f" {self.player_board[i][j]} ", end="")  # Sayı
            print()
        print()
    
    def get_player_move(self):
        """Kullanıcıdan hamle al"""
        while True:
            try:
                move = input("Hamle girin (örn: '3 4' açmak için, '3 4 f' bayrak için): ").strip().lower()
                parts = move.split()
                
                if len(parts) < 2:
                    print("Geçersiz format! Örnek: '3 4' veya '3 4 f'")
                    continue
                
                row = int(parts[0]) - 1
                col = int(parts[1]) - 1
                
                # Geçerli satır/sütun kontrolü
                if not (0 <= row < self.board_size and 0 <= col < self.board_size):
                    print(f"Satır ve sütun 1-{self.board_size} arasında olmalı.")
                    continue
                
                # Eylem belirleme
                action = 'flag' if len(parts) > 2 and parts[2] == 'f' else 'reveal'
                
                return row, col, action
                
            except ValueError:
                print("Geçersiz giriş! Lütfen sayıları doğru formatta girin.")
    
    def reveal_cell(self, row, col):
        """Hücreyi aç ve gerekirse yayılım yap"""
        # Eğer hücre zaten açıksa veya bayraklıysa
        if self.player_board[row][col] != '.':
            return
        
        # Mayına bastıysa
        if self.mine_board[row][col] == -1:
            self.game_over = True
            return
        
        # Mayın sayısını göster
        mine_count = self.mine_board[row][col]
        if mine_count > 0:
            self.player_board[row][col] = str(mine_count)
        else:
            self.player_board[row][col] = ' '  # Boş hücre
            
            # Eğer boş hücreyse, komşuları da aç (özyinelemeli)
            for i in range(max(0, row-1), min(self.board_size, row+2)):
                for j in range(max(0, col-1), min(self.board_size, col+2)):
                    if not (i == row and j == col):
                        self.reveal_cell(i, j)
    
    def toggle_flag(self, row, col):
        """Bayrak koy veya kaldır"""
        if self.player_board[row][col] == '.':
            self.player_board[row][col] = 'F'
            print(f"Bayrak koyuldu: ({row+1},{col+1})")
        elif self.player_board[row][col] == 'F':
            self.player_board[row][col] = '.'
            print(f"Bayrak kaldırıldı: ({row+1},{col+1})")
        else:
            print("Bu hücre zaten açık!")
    
    def check_win(self):
        """Kazanma durumunu kontrol et"""
        # Tüm güvenli hücreler açıldı mı?
        for i in range(self.board_size):
            for j in range(self.board_size):
                if self.mine_board[i][j] != -1 and self.player_board[i][j] in ['.', 'F']:
                    return False
        
        # Tüm mayınlar doğru bayraklanmış mı?
        correct_flags = 0
        for i in range(self.board_size):
            for j in range(self.board_size):
                if self.player_board[i][j] == 'F' and self.mine_board[i][j] == -1:
                    correct_flags += 1
        
        return correct_flags == self.num_mines
    
    def play(self):
        """Ana oyun döngüsü"""
        while not self.game_over and not self.game_won:
            self.display_board()
            
            # Kullanıcıdan hamle al
            row, col, action = self.get_player_move()
            
            # Hamleyi işle
            if action == 'reveal':
                if self.player_board[row][col] == 'F':
                    print("Önce bayrağı kaldırın!")
                    continue
                    
                self.reveal_cell(row, col)
                self.moves += 1
                
                if self.game_over:
                    print("MAYINA BASTINIZ! OYUN BİTTİ.")
                    self.display_board(show_mines=True)
                    break
                    
            else:  # Bayrak işlemi
                self.toggle_flag(row, col)
            
            # Kazanma durumunu kontrol et
            if self.check_win():
                self.game_won = True
                print("TEBRİKLER! OYUNU KAZANDINIZ!")
                print(f"Toplam hamle: {self.moves}")
                self.display_board(show_mines=True)
                break

# Oyunu başlat
if __name__ == "__main__":
    while True:
        game = Minesweeper()
        game.play()
        
        play_again = input("\nTekrar oynamak ister misiniz? (e/h): ").strip().lower()
        if play_again not in ['e', 'evet', 'y', 'yes']:
            print("Oynadığınız için teşekkürler!")
            break

 

🎮 Tam Özelleştirilebilir Oyun Deneyimi

# Kendi zorluk seviyenizi belirleyin
board_size = 10    # 4x4'ten 20x20'ye kadar
num_mines = 15     # Tahta boyutuna uygun herhangi bir sayı

🚀 Akıllı Oyun Mekaniği

  • Sol tıklama (reveal): Hücreleri güvenle aç

  • Sağ tıklama (flag): Mayın şüphesi olan yerlere bayrak koy

  • Otomatik genişleme: Boş alanların otomatik olarak açılması

  • Anlık geri bildirim: Her hamlede tahtanın güncellenmesi

🏆 İki Farklı Kazanma Yolu

  1. Tüm mayınları doğru bayrakla işaretleyerek

  2. Tüm güvenli hücreleri başarıyla açarak

👀 Şeffaf Öğrenme Deneyimi

Oyun sonunda tüm mayınlar gösterilir, böylece:

  • Hatalarınızı analiz edebilirsiniz

  • Stratejinizi geliştirebilirsiniz

  • Algoritmayı daha iyi anlayabilirsiniz

🕹️ Nasıl Oynanır? - Adım Adım Kılavuz

1. 🎮 Oyunu Başlatma

python minesweeper.py

Program sizi hemen karşılayacak:

=== MAYIN TARLASI OYUNU ===
Oyun tahtası boyutunu girin (örn: 8): 10
Mayın sayısını girin: 15

2. 🎯 Hamle Yapma Sanatı

Temel komutlar:

  • 3 4 → 3. satır, 4. sütunu açar

  • 3 4 f → 3. satır, 4. sütuna bayrak koyar/kaldırır

Örnek oyun akışı:

Hamle girin (örn: '3 4' açmak için, '3 4 f' bayrak için): 1 1
Hamle girin (örn: '3 4' açmak için, '3 4 f' bayrak için): 5 5 f
Hamle girin (örn: '3 4' açmak için, '3 4 f' bayrak için): 8 2

3. 📊 Tahta Görünümü ve İşaretler

  • . → Henüz keşfedilmemiş bölge

  • F → Bayrak: "Burada mayın var!"

  •  (boşluk) → Tamamen güvenli alan

  • 1-8 → Etraftaki mayın sayısı

  • * → Mayın (sadece oyun sonunda görünür)

4. 🏆 Strateji ve İpuçları

Başlangıç taktikleri:

# Köşelerden başla - istatistiksel olarak daha güvenli
# İlk hamle: "1 1" veya "8 8" gibi köşe noktaları

Orta oyun stratejileri:

  • Sayıları matematiksel olarak yorumla

  • Mantık yürüterek mayın konumlarını tahmin et

  • Bayrakları stratejik kullan

İleri seviye teknikler:

  • Örüntü tanıma: Benzer sayı dağılımlarını hatırla

  • Olasılık hesaplama: Riskli hamleleri minimize et

💻 Teknik Detaylar - Kodun Arkasındaki Mantık

🎲 Mayın Yerleştirme Algoritması

def place_mines(self):
    mines_placed = 0
    while mines_placed < self.num_mines:
        row = random.randint(0, self.board_size - 1)
        col = random.randint(0, self.board_size - 1)
        
        if self.mine_board[row][col] != -1:
            self.mine_board[row][col] = -1
            mines_placed += 1
            
            # Komşu hücrelerin sayılarını güncelle
            for i in range(max(0, row-1), min(self.board_size, row+2)):
                for j in range(max(0, col-1), min(self.board_size, col+2)):
                    if self.mine_board[i][j] != -1:
                        self.mine_board[i][j] += 1

🔍 Özyinelemeli Hücre Açma

 
def reveal_cell(self, row, col):
    if self.player_board[row][col] != '.':
        return
    
    if self.mine_board[row][col] == -1:
        self.game_over = True
        return
    
    mine_count = self.mine_board[row][col]
    if mine_count > 0:
        self.player_board[row][col] = str(mine_count)
    else:
        self.player_board[row][col] = ' '
        
        # Özyinelemeli olarak komşuları aç
        for i in range(max(0, row-1), min(self.board_size, row+2)):
            for j in range(max(0, col-1), min(self.board_size, col+2)):
                if not (i == row and j == col):
                    self.reveal_cell(i, j)

🚀 Projeyi Geliştirme Fikirleri

🌈 Görsel İyileştirmeler

# Renkli çıktılar ekleyebilirsiniz
print("\033[91m * \033[0m")  # Kırmızı mayın
print("\033[94m F \033[0m")  # Mavi bayrak

🎯 Zorluk Seviyeleri

difficulty = {
    "kolay": {"size": 8, "mines": 10},
    "orta": {"size": 12, "mines": 20},
    "zor": {"size": 16, "mines": 40}
}

⏱️ Zamanlayıcı ve Skor Tablosu

import time
start_time = time.time()
# Oyun süresini hesapla
elapsed_time = time.time() - start_time

🎉 Neden Bu Projeyi Yapmalısınız?

✅ Öğrenecekleriniz:

  • Nesne yönelimli programlama prensipleri

  • Özyineleme ve backtracking algoritmaları

  • Matris işlemleri ve hücre yönetimi

  • Kullanıcı etkileşimi ve input validation

🚀 Sonraki Adımlar:

  • Pygame ile grafik arayüz ekle

  • Yapay zeka çözücü geliştir

  • Web versiyonu oluştur (Flask/Django)

  • Mobil uygulama yap (Kivy)


🌟 Unutmayın: Her mayın, öğrenme fırsatıdır! Oyunu kaybetseniz bile, Python becerileriniz artıyor.

Happy coding! 🐍💣🚩

python, 'python mayın tarlası oyunu', 'python ile oyun', 'python mayın tarlası', 'python mayın tarlası kodları'', python mayın tarlası oyunu kodu', 'python pygame', 'python pygame kütüphanesi', 'oyun kodlama örnekleri', 'örnek oyun kodu', 'python ö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 1003892