Tombala Oyunu v1.0 [ PC Vs User]

Programlama ve Script dilleri konusunda bilgi paylaşım alanıdır.
Cevapla
Kullanıcı avatarı
TRWE_2012
Zettabyte1
Zettabyte1
Mesajlar: 15798
Kayıt: 25 Eyl 2013, 13:38
cinsiyet: Erkek
Teşekkür etti: 2779 kez
Teşekkür edildi: 5776 kez

Tombala Oyunu v1.0 [ PC Vs User]

Mesaj gönderen TRWE_2012 »

Merhabalar

EKRAN GÖRÜNTÜSÜ :
Resim
KOD İÇERİĞİ : ( tombala_oyunu_v1.0.ps1 )

Kod: Tümünü seç

# ============================================================
# TOMBALA OYUNU v1.0
# Windows PowerShell Versiyonu (PS 5.1 ve 7.x Uyumlu)
# ============================================================
# Oyun Mantığı:
#   - 0-89 arası 90 sayılık havuz
#   - 3 satır x 9 sütun = 27 sayılık kartlar (kullanıcı + bilgisayar)
#   - 10 çekiliş yapılır
#   - Bir satır tamamen dolan kazanır
# ============================================================

# Türkçe karakter desteği
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8

# ============================================================
# SABİTLER
# ============================================================
$RANGE_MAX = 90       # 0-89 arası
$TOTAL_DRAWS = 10     # Toplam çekiliş sayısı
$ROWS = 3             # Kart satır sayısı
$COLS = 9             # Kart sütun sayısı

# ============================================================
# YARDIMCI FONKSİYONLAR
# ============================================================

# Rastgele kart oluştur (3x9 = 27 benzersiz sayı)
function New-TombalaCard {
    # 0-89 arası 27 benzersiz sayı seç
    $numbers = 0..($RANGE_MAX - 1) | Get-Random -Count ($ROWS * $COLS)
    
    # 3x9 matrise yerleştir (hashtable olarak)
    $card = @{}
    $index = 0
    for ($r = 0; $r -lt $ROWS; $r++) {
        for ($c = 0; $c -lt $COLS; $c++) {
            $card["$r,$c"] = $numbers[$index]
            $index++
        }
    }
    return $card
}

# Kartı ekrana yazdır
function Show-Card {
    param(
        [hashtable]$Card,
        [string]$Title,
        [System.ConsoleColor]$Color = [System.ConsoleColor]::White
    )
    
    Write-Host ""
    Write-Host "--- $Title ---" -ForegroundColor $Color
    Write-Host ""
    
    for ($r = 0; $r -lt $ROWS; $r++) {
        $line = "  "
        for ($c = 0; $c -lt $COLS; $c++) {
            $val = $Card["$r,$c"]
            if ($val -eq -1) {
                # İşaretlenmiş sayı
                $line += "[ X ] "
            } else {
                $line += ("[{0,2}] " -f $val)
            }
        }
        Write-Host $line -ForegroundColor $Color
    }
    Write-Host ""
}

# Kartta sayı kontrolü ve işaretleme
function Test-CardNumber {
    param(
        [hashtable]$Card,
        [int]$Number
    )
    
    foreach ($key in $Card.Keys) {
        if ($Card[$key] -eq $Number) {
            $Card[$key] = -1  # İşaretle
            return $true
        }
    }
    return $false
}

# Satır kazanma kontrolü (bir satır tamamen -1 ise)
function Test-CardWin {
    param([hashtable]$Card)
    
    for ($r = 0; $r -lt $ROWS; $r++) {
        $win = $true
        for ($c = 0; $c -lt $COLS; $c++) {
            if ($Card["$r,$c"] -ne -1) {
                $win = $false
                break
            }
        }
        if ($win) { return $true }
    }
    return $false
}

# Güvenli sayı girişi
function Read-ValidNumber {
    param(
        [string]$Prompt,
        [int]$Min,
        [int]$Max
    )
    
    while ($true) {
        $input = (Read-Host $Prompt).Trim()
        
        if ([string]::IsNullOrWhiteSpace($input)) {
            Write-Host "Boş giriş kabul edilmez." -ForegroundColor Red
            continue
        }
        
        $num = 0
        if ([int]::TryParse($input, [ref]$num)) {
            if ($num -ge $Min -and $num -le $Max) {
                return $num
            } else {
                Write-Host "Hata: Sayı $Min ile $Max arasında olmalı." -ForegroundColor Red
            }
        } else {
            Write-Host "Hata: Geçerli bir tam sayı girin." -ForegroundColor Red
        }
    }
}

# ============================================================
# OYUN BAŞLANGICI
# ============================================================
Clear-Host

Write-Host "============================================" -ForegroundColor Cyan
Write-Host "   TOMBALA OYUNU v1.0" -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "Kurallar:" -ForegroundColor Yellow
Write-Host "  - 0 ile 89 arasında 90 sayılık havuz" -ForegroundColor Gray
Write-Host "  - 3x9 = 27 sayılık kartlar" -ForegroundColor Gray
Write-Host "  - $TOTAL_DRAWS çekiliş yapılacak" -ForegroundColor Gray
Write-Host "  - Bir satırı ilk tamamlayan kazanır" -ForegroundColor Gray
Write-Host ""

Read-Host "Başlamak için ENTER..."

# ============================================================
# KARTLARI OLUŞTUR
# ============================================================
$userCard = New-TombalaCard
$computerCard = New-TombalaCard

$userScore = 0
$computerScore = 0
$drawnNumbers = @{}  # Çekilen sayılar (tekrar kontrolü için)
$result = $null

# Kartları göster
Show-Card -Card $userCard -Title "SİZİN KARTINIZ" -Color Green
Show-Card -Card $computerCard -Title "BİLGİSAYARIN KARTI" -Color Magenta

# ============================================================
# ANA OYUN DÖNGÜSÜ
# ============================================================
for ($drawCount = 1; $drawCount -le $TOTAL_DRAWS; $drawCount++) {
    Clear-Host
    
    Write-Host "============================================" -ForegroundColor Cyan
    Write-Host "   ÇEKİLİŞ: $drawCount / $TOTAL_DRAWS" -ForegroundColor Cyan
    Write-Host "============================================" -ForegroundColor Cyan
    Write-Host ""
    
    # Rastgele sayı çek (tekrar etmeyen)
    $number = -1
    do {
        $number = Get-Random -Minimum 0 -Maximum $RANGE_MAX
    } while ($drawnNumbers.ContainsKey($number))
    
    $drawnNumbers[$number] = $true
    
    Write-Host ("ÇEKİLEN NUMARA: {0,2}" -f $number) -ForegroundColor Yellow
    Write-Host ""
    
    # Kartlarda kontrol et
    $userHit = Test-CardNumber -Card $userCard -Number $number
    $computerHit = Test-CardNumber -Card $computerCard -Number $number
    
    if ($userHit) {
        $userScore++
        Write-Host "✓ Kartınızda var! (katılıyorum puan)" -ForegroundColor Green
    } else {
        Write-Host "✗ Kartınızda yok." -ForegroundColor Red
    }
    
    if ($computerHit) {
        $computerScore++
        Write-Host "✓ Bilgisayarın kartında var! (katılıyorum puan)" -ForegroundColor Green
    }
    
    Write-Host ""
    Write-Host "Skor: Siz [$userScore] - Bilgisayar [$computerScore]" -ForegroundColor White
    Write-Host ""
    
    # Güncel kartları göster
    Show-Card -Card $userCard -Title "SİZİN KARTINIZ" -Color Green
    Show-Card -Card $computerCard -Title "BİLGİSAYARIN KARTI" -Color Magenta
    
    # Kullanıcıdan tahmin iste
    Write-Host "--- Tahmin Zamanı ---" -ForegroundColor Cyan
    $userGuess = Read-ValidNumber -Prompt "Kartınızdan bir sayı tahmin edin (0-89)" -Min 0 -Max ($RANGE_MAX - 1)
    
    if (Test-CardNumber -Card $userCard -Number $userGuess) {
        $userScore++
        Write-Host "Tombala! Kartınızda var. (katılıyorum puan)" -ForegroundColor Green
    } else {
        Write-Host "Kartınızda yok." -ForegroundColor Red
    }
    
    Write-Host ""
    
    # Kazanan kontrolü
    if (Test-CardWin -Card $computerCard) {
        $result = "Bilgisayar kazandı! Puan: $computerScore - $userScore"
        break
    }
    
    if (Test-CardWin -Card $userCard) {
        $result = "Tebrikler! Kazandınız! Puan: $userScore - $computerScore"
        break
    }
    
    Read-Host "Sonraki çekiliş için ENTER..."
}

# ============================================================
# OYUN SONU
# ============================================================
Clear-Host

Write-Host "============================================" -ForegroundColor Cyan
Write-Host "   OYUN BİTTİ" -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""

if ($null -eq $result) {
    # Çekiliş bitti, puana göre kazanan belirle
    if ($userScore -gt $computerScore) {
        $result = "Kazandınız! $userScore - $computerScore"
    } elseif ($computerScore -gt $userScore) {
        $result = "Bilgisayar kazandı! $computerScore - $userScore"
    } else {
        $result = "Berabere! $userScore - $computerScore"
    }
}

Write-Host $result -ForegroundColor $(if ($result -like "*Kazandınız*") { "Green" } elseif ($result -like "*Bilgisayar*") { "Red" } else { "Yellow" })
Write-Host ""

# ============================================================
# SONUCU MASAÜSTÜNE KAYDET
# ============================================================
$desktopPath = [Environment]::GetFolderPath("Desktop")
$outputFile = Join-Path -Path $desktopPath -ChildPath "Tombala_Oyun_Sonucu.txt"

$report = @"
============================================
   TOMBALA OYUNU SONUCU
============================================
Tarih: $(Get-Date -Format "dd/MM/yyyy HH:mm:ss")

$report

Skor:
  Siz         : $userScore
  Bilgisayar  : $computerScore

Sonuç: $result
============================================
"@

try {
    [System.IO.File]::WriteAllText($outputFile, $report, [System.Text.Encoding]::UTF8)
    Write-Host "Sonuç masaüstüne kaydedildi:" -ForegroundColor Green
    Write-Host "  $outputFile" -ForegroundColor White
} catch {
    Write-Host "Dosya kaydedilemedi: $($_.Exception.Message)" -ForegroundColor Red
}

Write-Host ""
Read-Host "Çıkmak için ENTER..."
NASIL OYNANIR?

Oyun Akışı

Kod: Tümünü seç

1. İki kart oluşturulur (kullanıcı + bilgisayar) - 3x9 = 27 sayı
2. 10 çekiliş döngüsü başlar:
   a. Rastgele sayı çekilir (0-89, tekrar etmez)
   b. Her iki kartta kontrol edilir
   c. Varsa işaretlenir (-1) ve puan verilir
   d. Kullanıcıdan tahmin istenir
   e. Kazanan kontrol edilir (bir satır tamamen dolarsa)
3. Oyun biter:
   - Satır tamamlayan kazanır
   - Yoksa puana göre kazanan belirlenir
4. Sonuç masaüstüne "Tombala_Oyun_Sonucu.txt" olarak kaydedilir
Kullanım

Kod: Tümünü seç

# PowerShell'de çalıştır
.\tombala_oyunu_v1.0.ps1

# Execution Policy hatası alırsanız:
powershell.exe -ExecutionPolicy Bypass -File ".\tombala_oyunu_v1.0.ps1"
OYUNUN ÖZELLİKLERİ :

Görsel Özellikler

Renkli kart gösterimi: Kullanıcı kartı yeşil, bilgisayar kartı mor renkte
İşaretlenmiş sayılar: [ X ] olarak gösterilir
Canlı skor takibi: Her çekilişte güncel skor gösterilir
Temiz ekran: Her çekilişte Clear-Host ile ekran temizlenir
UTF-8 dosya kaydı: Türkçe karakterler bozulmadan masaüstüne kaydedilir

İyi eğlenceler!
Kullanıcı avatarı
TRWE_2012
Zettabyte1
Zettabyte1
Mesajlar: 15798
Kayıt: 25 Eyl 2013, 13:38
cinsiyet: Erkek
Teşekkür etti: 2779 kez
Teşekkür edildi: 5776 kez

Tombala Oyunu v3.0 [ PC Vs User] (Güncellendi)

Mesaj gönderen TRWE_2012 »

EKRAN GÖRÜNTÜSÜ :
Resim
KOD İÇERİĞİ : ( tombala_oyunu_v3.0.ps1 )

Kod: Tümünü seç

# ============================================================
# TOMBALA OYUNU v3.0 (Adil Çekiliş Sistemi)
# Windows PowerShell Versiyonu (PS 5.1 ve 7.x Uyumlu)
# ============================================================

# Türkçe karakter desteği
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8

# ============================================================
# SABİTLER
# ============================================================
$RANGE_MAX = 90       # 0-89 arası
$ROWS = 3             # Kart satır sayısı
$COLS = 9             # Kart sütun sayısı
$TOTAL_CELLS = $ROWS * $COLS  # 27 sayı

# ============================================================
# YARDIMCI FONKSİYONLAR
# ============================================================

# Rastgele kart oluştur (3x9 = 27 benzersiz sayı)
function New-TombalaCard {
    # 0-89 arası 27 benzersiz sayı seç
    $numbers = 0..($RANGE_MAX - 1) | Get-Random -Count $TOTAL_CELLS
    
    # 3x9 matrise yerleştir (hashtable olarak)
    $card = @{}
    $index = 0
    for ($r = 0; $r -lt $ROWS; $r++) {
        for ($c = 0; $c -lt $COLS; $c++) {
            $card["$r,$c"] = $numbers[$index]
            $index++
        }
    }
    return $card
}

# Kartı ekrana yazdır (işaretlenmiş sayılar farklı renkte)
function Show-Card {
    param(
        [hashtable]$Card,
        [string]$Title,
        [System.ConsoleColor]$TitleColor = [System.ConsoleColor]::White
    )
    
    Write-Host ""
    Write-Host "--- $Title ---" -ForegroundColor $TitleColor
    Write-Host ""
    
    for ($r = 0; $r -lt $ROWS; $r++) {
        $line = "  "
        for ($c = 0; $c -lt $COLS; $c++) {
            $val = $Card["$r,$c"]
            if ($val -eq -1) {
                # İşaretlenmiş sayı (yeşil renkte)
                $line += "[ X ] "
            } else {
                $line += ("[{0,2}] " -f $val)
            }
        }
        Write-Host $line -ForegroundColor $TitleColor
    }
    Write-Host ""
}

# Kartı renkli olarak göster (işaretlenmiş sayılar farklı renkte)
function Show-CardColored {
    param(
        [hashtable]$Card,
        [string]$Title,
        [System.ConsoleColor]$TitleColor = [System.ConsoleColor]::White
    )
    
    Write-Host ""
    Write-Host "--- $Title ---" -ForegroundColor $TitleColor
    Write-Host ""
    
    for ($r = 0; $r -lt $ROWS; $r++) {
        $line = "  "
        for ($c = 0; $c -lt $COLS; $c++) {
            $val = $Card["$r,$c"]
            if ($val -eq -1) {
                # İşaretlenmiş sayı (yeşil renkte)
                Write-Host "[ X ] " -ForegroundColor Green -NoNewline
            } else {
                Write-Host ("[{0,2}] " -f $val) -ForegroundColor $TitleColor -NoNewline
            }
        }
        Write-Host ""
    }
    Write-Host ""
}

# Kartta sayı kontrolü ve işaretleme
function Test-CardNumber {
    param(
        [hashtable]$Card,
        [int]$Number
    )
    
    foreach ($key in $Card.Keys) {
        if ($Card[$key] -eq $Number) {
            $Card[$key] = -1  # İşaretle
            return $true
        }
    }
    return $false
}

# Satır kazanma kontrolü (bir satır tamamen -1 ise)
function Test-CardWin {
    param([hashtable]$Card)
    
    for ($r = 0; $r -lt $ROWS; $r++) {
        $win = $true
        for ($c = 0; $c -lt $COLS; $c++) {
            if ($Card["$r,$c"] -ne -1) {
                $win = $false
                break
            }
        }
        if ($win) { return $true }
    }
    return $false
}

# Torbadan sayı çek (tekrar etmeyen)
function Draw-Number {
    param([hashtable]$DrawnNumbers)
    
    # Torba animasyonu
    Write-Host ""
    Write-Host "Torbadan sayı çekiliyor..." -ForegroundColor Yellow
    Start-Sleep -Milliseconds 500
    Write-Host "." -NoNewline
    Start-Sleep -Milliseconds 300
    Write-Host "." -NoNewline
    Start-Sleep -Milliseconds 300
    Write-Host "." -NoNewline
    Start-Sleep -Milliseconds 300
    Write-Host ""
    
    # Tekrar etmeyen sayı çek
    $number = -1
    do {
        $number = Get-Random -Minimum 0 -Maximum $RANGE_MAX
    } while ($DrawnNumbers.ContainsKey($number))
    
    $DrawnNumbers[$number] = $true
    return $number
}

# Çekilen sayıları göster
function Show-DrawnNumbers {
    param([hashtable]$DrawnNumbers)
    
    Write-Host ""
    Write-Host "--- Çekilen Sayılar ---" -ForegroundColor Cyan
    
    if ($DrawnNumbers.Count -eq 0) {
        Write-Host "  Henüz sayı çekilmedi." -ForegroundColor Gray
    } else {
        $sorted = $DrawnNumbers.Keys | Sort-Object
        $line = "  "
        foreach ($num in $sorted) {
            $line += ("{0,2} " -f $num)
        }
        Write-Host $line -ForegroundColor White
    }
    Write-Host ""
}

# ============================================================
# OYUN BAŞLANGICI
# ============================================================
Clear-Host

Write-Host "============================================" -ForegroundColor Cyan
Write-Host "   TOMBALA OYUNU v3.0 (Adil Çekiliş)" -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "Kurallar:" -ForegroundColor Yellow
Write-Host "  - 0 ile 89 arasında 90 sayılık havuz (torba)" -ForegroundColor Gray
Write-Host "  - 3x9 = 27 sayılık kartlar" -ForegroundColor Gray
Write-Host "  - Ortak havuzdan rastgele sayı çekilir" -ForegroundColor Gray
Write-Host "  - Çekilen sayı her iki kartta kontrol edilir" -ForegroundColor Gray
Write-Host "  - Bir satırı ilk tamamlayan kazanır" -ForegroundColor Gray
Write-Host ""

Read-Host "Başlamak için ENTER..."

# ============================================================
# KARTLARI OLUŞTUR VE GÖSTER
# ============================================================
Clear-Host

Write-Host "============================================" -ForegroundColor Cyan
Write-Host "   KARTLAR OLUŞTURULUYOR..." -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""

$userCard = New-TombalaCard
$computerCard = New-TombalaCard

# Kartları göster
Show-CardColored -Card $userCard -Title "SİZİN KARTINIZ" -TitleColor Green
Show-CardColored -Card $computerCard -Title "BİLGİSAYARIN KARTI" -TitleColor Magenta

Read-Host "Kartları inceledikten sonra ENTER'a basın..."

# ============================================================
# ANA OYUN DÖNGÜSÜ (ADİL ÇEKİLİŞ)
# ============================================================
$userScore = 0
$computerScore = 0
$drawnNumbers = @{}  # Çekilen sayılar
$result = $null
$drawCount = 0
$maxDraws = 90  # Maksimum 90 sayı çekilebilir

while ($drawCount -lt $maxDraws) {
    Clear-Host
    
    Write-Host "============================================" -ForegroundColor Cyan
    Write-Host "   ÇEKİLİŞ: $($drawCount + 1)" -ForegroundColor Cyan
    Write-Host "============================================" -ForegroundColor Cyan
    Write-Host ""
    
    # Çekilen sayıların geçmişini göster
    Show-DrawnNumbers -DrawnNumbers $drawnNumbers
    
    # Kullanıcıdan sayı çekme onayı al
    $drawChoice = Read-Host "Torbadan sayı çekmek için ENTER'a basın (veya 'q' ile çık)"
    if ($drawChoice -eq "q" -or $drawChoice -eq "Q") {
        $result = "Oyun kullanıcı tarafından sonlandırıldı."
        break
    }
    
    # Torbadan sayı çek
    $number = Draw-Number -DrawnNumbers $drawnNumbers
    $drawCount++
    
    # Çekilen sayıyı BÜYÜK ve RENKLİ göster
    Write-Host ""
    Write-Host "╔════════════════════════════════════════╗" -ForegroundColor Yellow
    Write-Host "║                                        ║" -ForegroundColor Yellow
    Write-Host ("║       ÇEKİLEN NUMARA: {0,2}              ║" -f $number) -ForegroundColor Yellow
    Write-Host "║                                        ║" -ForegroundColor Yellow
    Write-Host "╚════════════════════════════════════════╝" -ForegroundColor Yellow
    Write-Host ""
    
    # Kartlarda kontrol et
    $userHit = Test-CardNumber -Card $userCard -Number $number
    $computerHit = Test-CardNumber -Card $computerCard -Number $number
    
    if ($userHit) {
        $userScore++
        Write-Host "✓ Kartınızda var! İşaretlendi. (katılıyorum puan)" -ForegroundColor Green
    } else {
        Write-Host "✗ Kartınızda yok." -ForegroundColor Red
    }
    
    if ($computerHit) {
        $computerScore++
        Write-Host "✓ Bilgisayarın kartında var! İşaretlendi. (katılıyorum puan)" -ForegroundColor Green
    } else {
        Write-Host "✗ Bilgisayarın kartında yok." -ForegroundColor Red
    }
    
    Write-Host ""
    Write-Host "Skor: Siz [$userScore] - Bilgisayar [$computerScore]" -ForegroundColor White
    Write-Host ""
    
    # Güncel kartları göster (renkli)
    Show-CardColored -Card $userCard -Title "SİZİN KARTINIZ" -TitleColor Green
    Show-CardColored -Card $computerCard -Title "BİLGİSAYARIN KARTI" -TitleColor Magenta
    
    # Kazanan kontrolü
    if (Test-CardWin -Card $computerCard) {
        $result = "Bilgisayar kazandı! Puan: $computerScore - $userScore"
        break
    }
    
    if (Test-CardWin -Card $userCard) {
        $result = "Tebrikler! Kazandınız! Puan: $userScore - $computerScore"
        break
    }
    
    Read-Host "Sonraki çekiliş için ENTER..."
}

# ============================================================
# OYUN SONU
# ============================================================
Clear-Host

Write-Host "============================================" -ForegroundColor Cyan
Write-Host "   OYUN BİTTİ" -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""

if ($null -eq $result) {
    if ($userScore -gt $computerScore) {
        $result = "Kazandınız! $userScore - $computerScore"
    } elseif ($computerScore -gt $userScore) {
        $result = "Bilgisayar kazandı! $computerScore - $userScore"
    } else {
        $result = "Berabere! $userScore - $computerScore"
    }
}

Write-Host $result -ForegroundColor $(if ($result -like "*Kazandınız*") { "Green" } elseif ($result -like "*Bilgisayar*") { "Red" } else { "Yellow" })
Write-Host ""

# Çekilen tüm sayıları göster
Show-DrawnNumbers -DrawnNumbers $drawnNumbers

# Son kartları göster
Show-CardColored -Card $userCard -Title "SİZİN KARTINIZ" -TitleColor Green
Show-CardColored -Card $computerCard -Title "BİLGİSAYARIN KARTI" -TitleColor Magenta

# ============================================================
# SONUCU MASAÜSTÜNE KAYDET
# ============================================================
$desktopPath = [Environment]::GetFolderPath("Desktop")
$outputFile = Join-Path -Path $desktopPath -ChildPath "Tombala_Oyun_Sonucu.txt"

$drawnList = ($drawnNumbers.Keys | Sort-Object) -join ", "

$report = @"
============================================
   TOMBALA OYUNU SONUCU
============================================
Tarih: $(Get-Date -Format "dd/MM/yyyy HH:mm:ss")

Çekilen Sayılar ($drawCount adet): $drawnList

Skor:
  Siz         : $userScore
  Bilgisayar  : $computerScore

Sonuç: $result
============================================
"@

try {
    [System.IO.File]::WriteAllText($outputFile, $report, [System.Text.Encoding]::UTF8)
    Write-Host "Sonuç masaüstüne kaydedildi:" -ForegroundColor Green
    Write-Host "  $outputFile" -ForegroundColor White
} catch {
    Write-Host "Dosya kaydedilemedi: $($_.Exception.Message)" -ForegroundColor Red
}

Write-Host ""
Read-Host "Çıkmak için ENTER..."
NE DEĞİŞTİ ..?

Artık ortak havuzdan tek sayı çekiliyor ve her iki kartta aynı anda kontrol ediliyor. Bu gerçek tombala mantığı.

Görsel Geri Bildirim

1.Çekilen sayı büyük sarı kutu içinde gösterilir
2.İşaretlenmiş sayılar yeşil renkte [ X ] olarak görünür
3.Skor her çekilişte güncellenir
4.Çekilen sayıların geçmişi gösterilir

Örnek Oyun Akışı

Kod: Tümünü seç

============================================
   ÇEKİLİŞ: 1
============================================

--- Çekilen Sayılar ---
  Henüz sayı çekilmedi.

Torbadan sayı çekmek için ENTER'a basın...

Torbadan sayı çekiliyor...
...

╔════════════════════════════════════════╗
║                                        ║
║       ÇEKİLEN NUMARA: 42               ║
║                                        ║
╚════════════════════════════════════════╝

✓ Kartınızda var! İşaretlendi. (katılıyorum puan)
✗ Bilgisayarın kartında yok.

Skor: Siz [1] - Bilgisayar [0]

--- SİZİN KARTINIZ ---

  [ X ] [12] [23] [34] [45] [56] [67] [78] [89]
  [10] [21] [32] [43] [54] [65] [76] [87] [ 0]
  [11] [22] [33] [44] [55] [66] [77] [88] [ 1]
İyi Eğlenceler...
Kullanıcı avatarı
TRWE_2012
Zettabyte1
Zettabyte1
Mesajlar: 15798
Kayıt: 25 Eyl 2013, 13:38
cinsiyet: Erkek
Teşekkür etti: 2779 kez
Teşekkür edildi: 5776 kez

Tombala Oyunu v5.1 [ PC Vs User]

Mesaj gönderen TRWE_2012 »

KOD GÜNCELLENDİ...! ( tombala_oyunu_v5.1.ps1 ) :

Kod: Tümünü seç

# ============================================================
# TOMBALA OYUNU v5.1 (Oyun Sonu Raporlu + Pencere Açık Kalır)
# Windows PowerShell Versiyonu (PS 5.1 ve 7.x Uyumlu)
# ============================================================

# Türkçe karakter desteği
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8

# ============================================================
# SABİTLER
# ============================================================
$RANGE_MIN = 0
$RANGE_MAX = 90       # 0-89 arası (90 dahil değil)
$ROWS = 3
$COLS = 9
$TOTAL_CELLS = $ROWS * $COLS  # 27

# ============================================================
# YARDIMCI FONKSİYONLAR
# ============================================================

# GARANTİLİ benzersiz sayı havuzu (Fisher-Yates Shuffle)
function New-UniqueNumberPool {
    param([int]$Min, [int]$Max, [int]$Count)
    
    $pool = @()
    for ($i = $Min; $i -lt $Max; $i++) {
        $pool += $i
    }
    
    $rng = New-Object System.Random
    for ($i = $pool.Count - 1; $i -gt 0; $i--) {
        $j = $rng.Next(0, $i + 1)
        $temp = $pool[$i]
        $pool[$i] = $pool[$j]
        $pool[$j] = $temp
    }
    
    return $pool[0..($Count - 1)]
}

# Kart oluştur (27 BENZERSİZ sayı, 0-89 arası)
function New-TombalaCard {
    $numbers = New-UniqueNumberPool -Min $RANGE_MIN -Max $RANGE_MAX -Count $TOTAL_CELLS
    
    $card = @{}
    $index = 0
    for ($r = 0; $r -lt $ROWS; $r++) {
        for ($c = 0; $c -lt $COLS; $c++) {
            $card["$r,$c"] = $numbers[$index]
            $index++
        }
    }
    return $card
}

# Kart doğrulama
function Test-CardValidity {
    param([hashtable]$Card, [string]$CardName)
    
    $values = @($Card.Values)
    $uniqueValues = $values | Select-Object -Unique
    
    if ($values.Count -ne $uniqueValues.Count) {
        Write-Host "HATA: $CardName kartında tekrar eden sayılar var!" -ForegroundColor Red
        return $false
    }
    
    foreach ($val in $values) {
        if ($val -lt $RANGE_MIN -or $val -ge $RANGE_MAX) {
            Write-Host "HATA: $CardName kartında aralık dışı sayı var: $val" -ForegroundColor Red
            return $false
        }
    }
    
    foreach ($val in $values) {
        if ($val -lt 0) {
            Write-Host "HATA: $CardName kartında negatif sayı var: $val" -ForegroundColor Red
            return $false
        }
    }
    
    return $true
}

# Kartı renkli olarak göster
function Show-CardColored {
    param(
        [hashtable]$Card,
        [string]$Title,
        [System.ConsoleColor]$TitleColor = [System.ConsoleColor]::White
    )
    
    Write-Host ""
    Write-Host "--- $Title ---" -ForegroundColor $TitleColor
    Write-Host ""
    
    for ($r = 0; $r -lt $ROWS; $r++) {
        for ($c = 0; $c -lt $COLS; $c++) {
            $val = $Card["$r,$c"]
            if ($val -eq -1) {
                Write-Host "[ X ] " -ForegroundColor Green -NoNewline
            } else {
                Write-Host ("[{0,2}] " -f $val) -ForegroundColor $TitleColor -NoNewline
            }
        }
        Write-Host ""
    }
    Write-Host ""
}

# Kartı metin olarak döndür (.txt için)
function Get-CardText {
    param([hashtable]$Card, [string]$Title)
    
    $text = "--- $Title ---`n`n"
    
    for ($r = 0; $r -lt $ROWS; $r++) {
        $line = "  "
        for ($c = 0; $c -lt $COLS; $c++) {
            $val = $Card["$r,$c"]
            if ($val -eq -1) {
                $line += "[ X ] "
            } else {
                $line += ("[{0,2}] " -f $val)
            }
        }
        $text += "$line`n"
    }
    $text += "`n"
    return $text
}

# Kartta sayı kontrolü ve işaretleme
function Test-CardNumber {
    param(
        [hashtable]$Card,
        [int]$Number
    )
    
    foreach ($key in $Card.Keys) {
        if ($Card[$key] -eq $Number) {
            $Card[$key] = -1
            return $true
        }
    }
    return $false
}

# Satır kazanma kontrolü
function Test-CardWin {
    param([hashtable]$Card)
    
    for ($r = 0; $r -lt $ROWS; $r++) {
        $win = $true
        for ($c = 0; $c -lt $COLS; $c++) {
            if ($Card["$r,$c"] -ne -1) {
                $win = $false
                break
            }
        }
        if ($win) { return $true }
    }
    return $false
}

# Torbadan sayı çek (tekrar etmeyen)
function Draw-Number {
    param([hashtable]$DrawnNumbers)
    
    Write-Host ""
    Write-Host "Torbadan sayı çekiliyor..." -ForegroundColor Yellow
    Start-Sleep -Milliseconds 500
    Write-Host "." -NoNewline
    Start-Sleep -Milliseconds 300
    Write-Host "." -NoNewline
    Start-Sleep -Milliseconds 300
    Write-Host "." -NoNewline
    Start-Sleep -Milliseconds 300
    Write-Host ""
    
    $number = -1
    do {
        $number = Get-Random -Minimum $RANGE_MIN -Maximum $RANGE_MAX
    } while ($DrawnNumbers.ContainsKey($number))
    
    $DrawnNumbers[$number] = $true
    return $number
}

# Çekilen sayıları göster
function Show-DrawnNumbers {
    param([hashtable]$DrawnNumbers)
    
    Write-Host ""
    Write-Host "--- Çekilen Sayılar ---" -ForegroundColor Cyan
    
    if ($DrawnNumbers.Count -eq 0) {
        Write-Host "  Henüz sayı çekilmedi." -ForegroundColor Gray
    } else {
        $sorted = $DrawnNumbers.Keys | Sort-Object
        $line = "  "
        foreach ($num in $sorted) {
            $line += ("{0,2} " -f $num)
        }
        Write-Host $line -ForegroundColor White
    }
    Write-Host ""
}

# ============================================================
# OYUN BAŞLANGICI
# ============================================================
Clear-Host

Write-Host "============================================" -ForegroundColor Cyan
Write-Host "   TOMBALA OYUNU v5.1" -ForegroundColor Cyan
Write-Host "   (Hata Düzeltmeli - Garantili Benzersiz)" -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "Kurallar:" -ForegroundColor Yellow
Write-Host "  - 0 ile 89 arasında 90 sayılık havuz" -ForegroundColor Gray
Write-Host "  - Her kartta 27 BENZERSİZ sayı (0-89)" -ForegroundColor Gray
Write-Host "  - Ortak havuzdan rastgele sayı çekilir" -ForegroundColor Gray
Write-Host "  - Bir satırı ilk tamamlayan kazanır" -ForegroundColor Gray
Write-Host ""

Read-Host "Başlamak için ENTER..."

# ============================================================
# KARTLARI OLUŞTUR
# ============================================================
Clear-Host

Write-Host "============================================" -ForegroundColor Cyan
Write-Host "   KARTLAR OLUŞTURULUYOR..." -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""

$userCard = $null
$computerCard = $null
$attempts = 0
$maxAttempts = 100

do {
    $userCard = New-TombalaCard
    $computerCard = New-TombalaCard
    $attempts++
    
    $userValid = Test-CardValidity -Card $userCard -CardName "Kullanıcı"
    $computerValid = Test-CardValidity -Card $computerCard -CardName "Bilgisayar"
    
    if (-not ($userValid -and $computerValid)) {
        Write-Host "Kartlar geçersiz, yeniden oluşturuluyor... (Deneme: $attempts)" -ForegroundColor Yellow
    }
} while (-not ($userValid -and $computerValid) -and $attempts -lt $maxAttempts)

if ($attempts -ge $maxAttempts) {
    Write-Host "HATA: Kartlar oluşturulamadı!" -ForegroundColor Red
    Read-Host "Çıkmak için ENTER..."
    exit 1
}

Write-Host "Kartlar başarıyla oluşturuldu (27 benzersiz sayı, 0-89 arası)." -ForegroundColor Green
Write-Host ""

Show-CardColored -Card $userCard -Title "SİZİN KARTINIZ" -TitleColor Green
Show-CardColored -Card $computerCard -Title "BİLGİSAYARIN KARTI" -TitleColor Magenta

Read-Host "Kartları inceledikten sonra ENTER'a basın..."

# ============================================================
# ANA OYUN DÖNGÜSÜ
# ============================================================
$userScore = 0
$computerScore = 0
$drawnNumbers = @{}
$result = $null
$drawCount = 0
$maxDraws = 90

while ($drawCount -lt $maxDraws) {
    Clear-Host
    
    Write-Host "============================================" -ForegroundColor Cyan
    Write-Host "   ÇEKİLİŞ: $($drawCount + 1)" -ForegroundColor Cyan
    Write-Host "============================================" -ForegroundColor Cyan
    Write-Host ""
    
    Show-DrawnNumbers -DrawnNumbers $drawnNumbers
    
    $drawChoice = Read-Host "Torbadan sayı çekmek için ENTER'a basın (veya 'q' ile çık)"
    if ($drawChoice -eq "q" -or $drawChoice -eq "Q") {
        $result = "Oyun kullanıcı tarafından sonlandırıldı."
        break
    }
    
    $number = Draw-Number -DrawnNumbers $drawnNumbers
    $drawCount++
    
    Write-Host ""
    Write-Host "╔════════════════════════════════════════╗" -ForegroundColor Yellow
    Write-Host "║                                        ║" -ForegroundColor Yellow
    Write-Host ("║       ÇEKİLEN NUMARA: {0,2}              " -f $number) -ForegroundColor Yellow
    Write-Host "║                                        ║" -ForegroundColor Yellow
    Write-Host "╚════════════════════════════════════════╝" -ForegroundColor Yellow
    Write-Host ""
    
    $userHit = Test-CardNumber -Card $userCard -Number $number
    $computerHit = Test-CardNumber -Card $computerCard -Number $number
    
    if ($userHit) {
        $userScore++
        Write-Host "✓ Kartınızda var! İşaretlendi. (katılıyorum puan)" -ForegroundColor Green
    } else {
        Write-Host "✗ Kartınızda yok." -ForegroundColor Red
    }
    
    if ($computerHit) {
        $computerScore++
        Write-Host "✓ Bilgisayarın kartında var! İşaretlendi. (katılıyorum puan)" -ForegroundColor Green
    } else {
        Write-Host "✗ Bilgisayarın kartında yok." -ForegroundColor Red
    }
    
    Write-Host ""
    Write-Host "Skor: Siz [$userScore] - Bilgisayar [$computerScore]" -ForegroundColor White
    Write-Host ""
    
    Show-CardColored -Card $userCard -Title "SİZİN KARTINIZ" -TitleColor Green
    Show-CardColored -Card $computerCard -Title "BİLGİSAYARIN KARTI" -TitleColor Magenta
    
    if (Test-CardWin -Card $computerCard) {
        $result = "Bilgisayar kazandı! Puan: $computerScore - $userScore"
        break
    }
    
    if (Test-CardWin -Card $userCard) {
        $result = "Tebrikler! Kazandınız! Puan: $userScore - $computerScore"
        break
    }
    
    Read-Host "Sonraki çekiliş için ENTER..."
}

# ============================================================
# OYUN SONU (PENCERE AÇIK KALIR + DETAYLI RAPOR)
# ============================================================
Clear-Host

Write-Host "============================================" -ForegroundColor Cyan
Write-Host "   OYUN BİTTİ" -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""

if ($null -eq $result) {
    if ($userScore -gt $computerScore) {
        $result = "Kazandınız! $userScore - $computerScore"
    } elseif ($computerScore -gt $userScore) {
        $result = "Bilgisayar kazandı! $computerScore - $userScore"
    } else {
        $result = "Berabere! $userScore - $computerScore"
    }
}

Write-Host $result -ForegroundColor $(if ($result -like "*Kazandınız*") { "Green" } elseif ($result -like "*Bilgisayar*") { "Red" } else { "Yellow" })
Write-Host ""

# Çekilen sayıları göster
Show-DrawnNumbers -DrawnNumbers $drawnNumbers

# Son kartları göster
Show-CardColored -Card $userCard -Title "SİZİN KARTINIZ" -TitleColor Green
Show-CardColored -Card $computerCard -Title "BİLGİSAYARIN KARTI" -TitleColor Magenta

# ============================================================
# DETAYLI RAPORU .TXT DOSYASINA KAYDET
# ============================================================
$desktopPath = [Environment]::GetFolderPath("Desktop")
$outputFile = Join-Path -Path $desktopPath -ChildPath "Tombala_Oyun_Sonucu.txt"

$drawnList = ($drawnNumbers.Keys | Sort-Object) -join ", "

# Kart metinlerini al
$userCardText = Get-CardText -Card $userCard -Title "SİZİN KARTINIZ"
$computerCardText = Get-CardText -Card $computerCard -Title "BİLGİSAYARIN KARTI"

$report = @"
============================================
   TOMBALA OYUNU SONUCU
============================================
Tarih: $(Get-Date -Format "dd/MM/yyyy HH:mm:ss")

Çekilen Sayılar ($drawCount adet):
$drawnList

Skor:
  Siz         : $userScore
  Bilgisayar  : $computerScore

Sonuç: $result

============================================
   KARTLARIN SON DURUMU
============================================

$userCardText
$computerCardText
============================================
"@

try {
    [System.IO.File]::WriteAllText($outputFile, $report, [System.Text.Encoding]::UTF8)
    Write-Host "Sonuç masaüstüne kaydedildi:" -ForegroundColor Green
    Write-Host "  $outputFile" -ForegroundColor White
} catch {
    Write-Host "Dosya kaydedilemedi: $($_.Exception.Message)" -ForegroundColor Red
}

Write-Host ""
Write-Host "============================================" -ForegroundColor Cyan
Write-Host "Pencereyi kapatmak için ENTER tuşuna basın..." -ForegroundColor Yellow
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""

# PENCEREYİ AÇIK TUT - Kullanıcı ENTER'a basana kadar bekle
Read-Host "ENTER"
NE DEĞİŞTİ SON DURUMDA?

v1.0 → Basit bir tombala oyunu
v5.1 → Profesyonel, hatasız, detaylı raporlama yapan, kullanıcı dostu bir oyun sistemi

En Kritik Geliştirmeler:

v4.0: Kart tekrarı sorunu tamamen çözüldü (Fisher-Yates)
v5.0: Adil çekiliş sistemi + renkli gösterim
v5.1: Kullanıcı deneyimi (pencere açık kalır + detaylı rapor)

ÖRNEK RAPOR (Sürüm 5'e ait) -Kıran Kırana Geçti Tombala Karşılaşması....

C:\Users\TRWE_2012\Masaüstü\Tombala_Oyun_Sonucu.txt

Kod: Tümünü seç

============================================
   TOMBALA OYUNU SONUCU
============================================
Tarih: 11 09 2026 18:06:45

Çekilen Sayılar (78 adet): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 54, 56, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89

Skor:
  Siz         : 25
  Bilgisayar  : 23

Sonuç: Tebrikler! Kazandınız! Puan: 25 - 23 = + 2 (Ben kazandım, zaten ben hep kazanırım....!! (TRWE_2012) 8) )
============================================
Kullanıcı avatarı
burak35
Zettabyte4
Zettabyte4
Mesajlar: 18316
Kayıt: 07 Eki 2016, 13:06
cinsiyet: Erkek
Teşekkür etti: 10649 kez
Teşekkür edildi: 12484 kez

Re: Tombala Oyunu v1.0 [ PC Vs User]

Mesaj gönderen burak35 »

tombala görünce aklıma nouma geldi. serbest çağrışım. :)
Cevapla

“Programlama ve Script dilleri” sayfasına dön