Worked Examples: E=MC2, Fibbonacci
File: nimm.py

Nimm "almak" anlamına gelen eski bir Almanca kelimenin ardından isimlendirilmiş antik bir strateji oyunudur. Batı Afrika'da Tiouk Tiouk ve Çin'de Tsynshidzi olarak da adlandırılır. Oyuncular ortada hiç taş kalmayana kadar sırayla ortadan taş alırlar. Nimm oyunu şu şekilde ilerler:

  1. Oyun ortada 20 taşla başlar

  2. İki oyuncu sırayla hamle yapar

  3. Belirli bir turda, bir oyuncu ortadaki taşlardan 1 ya da 2 tane alabilir
  4. Oyuncular ortadaki taşlar bitene kadar devam eder

Ortadan son taş alan oyuncu oyunu kaybeder. Aşağıda örnek bir oyunun işleyişini görebilirsiniz:

Ortada 20 taş kaldı
Oyuncu 1, ortadan 1 mi 2 taş mı almak istersiniz? 2

Ortada 18 taş kaldı
Oyuncu 2, ortadan 1 mi 2 taş mı almak istersiniz? 2

Ortada 16 taş kaldı
Oyuncu 1, ortadan 1 mi 2 taş mı almak istersiniz? 1

Ortada 15 taş kaldı
Oyuncu 2, ortadan 1 mi 2 taş mı almak istersiniz? 2

Ortada 13 taş kaldı
Oyuncu 1, ortadan 1 mi 2 taş mı almak istersiniz? 2

Ortada 11 taş kaldı
Oyuncu 2, ortadan 1 mi 2 taş mı almak istersiniz? 1

Ortada 10 taş kaldı
Oyuncu 1, ortadan 1 mi 2 taş mı almak istersiniz? 2

Ortada 8 taş kaldı
Oyuncu 2, ortadan 1 mi 2 taş mı almak istersiniz? -1
Please enter 1 or 2: 2

Ortada 6 taş kaldı
Oyuncu 1, ortadan 1 mi 2 taş mı almak istersiniz? 2

Ortada 4 taş kaldı
Oyuncu 2, ortadan 1 mi 2 taş mı almak istersiniz? 2

Ortada 2 taş kaldı
Oyuncu 1, ortadan 1 mi 2 taş mı almak istersiniz? 1

Ortada 1 taş kaldı
Oyuncu 2, ortadan 1 mi 2 taş mı almak istersiniz? 1

Oyuncu 1, kazandı!

Nimm oynamak için bir program yazın. İşinizi kolaylaştırmak için problemi daha küçük aşamalara ayırdık. Bu problemi çözmek için çok zamanınız var. Probleme yavaşça, parça parça yaklaşmaya çalışın.

1. Aşama

20 taşla başlayın. Ortadan taş alma işlemini ve ortada kalan toplam taş sayısını hiç taş kalmayana kadar tekrarlayın. Hangi oyuncunun sırası olduğuyla ilgili endişelenmeyin. Bu aşamada ortadan bir ya da iki taş alındığını kontrol etmenize de gerek yok. input(mesaj)fonksiyonunu kullanın, unutmayın bu fonksiyon mesajı yazdırıp kullanıcının konsola bir şey girmesini bekler.

Ortada 20 taş kaldı
Ortadan 1 mi 2 taş mı almak istersiniz? 2

Ortada 18 taş kaldı
Ortadan 1 mi 2 taş mı almak istersiniz? 17

Ortada 1 taş kaldı
Ortadan 1 mi 2 taş mı almak istersiniz? 3

Oyunu kaybettiniz

2. Aşama

Hangi oyuncunun sırası olduğunu takip etmek için bir integer (tamsayı) değişkeni oluşturun (unutmayın, toplamda iki oyuncu var). Kullanıcıya hangi oyuncunun sırası olduğunu söyleyin. Ortadan taş alındığında kullanıcı sayısını değiştirin.

Ortada 20 taş kaldı
Oyuncu 1, ortadan 1 mi 2 taş mı almak istersiniz? 1

Ortada 19 taş kaldı
Oyuncu 2, ortadan 1 mi 2 taş mı almak istersiniz? 1

Ortada 18 taş kaldı
Oyuncu 1, ortadan 1 mi 2 taş mı almak istersiniz? 17

Ortada 1 taş kaldı
Oyuncu 2, ortadan 1 mi 2 taş mı almak istersiniz? 1

Oyunu kaybettiniz

3. Aşama

Her turda sadece bir ya da iki taşın alındığından emin olun. Kullanıcıdan kaç taş almak istediklerini (kullanıcı girdisi) okuduktan sonra taş sayısının geçerli olup olmadığını kontrol etmek ve kullanıcı geçerli bir değer girene kadar sormaya devam etmek için şu şekilde bir yapı kullanabilirsiniz:

while kullanici_girdisi gecersizken:
   input = int(input("Lütfen 1 ya da 2 girin: "))

4. Aşama

Kazanan oyuncuyu ilan edin.

Eklemeler

Bir AI (Yapay Zeka) rakibi yazabilir misiniz? Her turda rastgele bir sayı oynayan bir AI ile başlayıp daha sonra daha stratejik hamleler yapan bir AI geliştirebilirsiniz...

Başka ilave edilebilecek fikirler:

  • Eğer ortada bir taş kaldıysa, sırası gelen oyuncunun ortadan sadece bir taş alabildiğini kontrol edin.
  • Oyuncuya kazananın ortadan son taşı alan ya da almayan oyuncu olma opsiyonunu sunarak oyunun kurallarını değiştirebilmesini sağlayın.
  • Oyunu oyuncuların her turde 1, 2 ya da 3 taş almalarını destekleyecek şekilde genişletin.
  • 3'e bölünebilme kuralı: eğer oyuncunun sırası geçmeden önce ortada kalan taş sayısı 3'e bölünebilirse, tekrar oynamalarını sağlayın.
  • Kullanıcıya bilgisayara karşı oynama opsiyonu sunun ve bilgisayarın ortadan kaç taş alması gerektiğine karar veren bir algoritma tasarlayın.
  • Ya da kendi fikirlerinizi deneyerek projenin kapsamını genişletin!