Friday, December 9, 2016

Python İle 24 Oyunu

Bilmeyenler için 24 oyunu; verilen 4 sayı ve 4 işlem kullanarak 24'e ulaşılmaya çalışılan oyundur. Yazdığım uygulamada ben 1-9 sayılarının kullanılmasına izin verdim. Oyunun farklı versiyonları da bulunmaktadır.
Oyunda;

  • Verilen tüm sayılar kullanılmalı,
  • Verilen bir sayı birden fazla kez kullanılamaz. (4466 sayıları verilmişse 2 kez 4, 2 kez 6 kullanılmalı!),
  • 4 işlem dışında bir işlem kullanılmamalı,
  • İşlemin sonucu 24'e eşit olmalı.


Oyun çözümleri: https://drive.google.com/file/d/0Bwiyh2g5UiGWZ212RnZMSEpEOVU/view?usp=sharing
Oyun linki: https://drive.google.com/file/d/0Bwiyh2g5UiGWUFNNX3hMc2s5WGs/view?usp=sharing
import random
with open("24solutions.txt" ,"r") as f:         #dosyayı okumak için açıyoruz
    lines = f.readlines()                       #tüm satırları okuyoruz
randomNumber = random.randrange(0,len(lines))   #0 ile satır sayısı-1 arasında bir sayı üretiyoruz
randomLine = lines[randomNumber].split("\t")    #Ürettiğimiz sayıyı index sayısı olarak kullanıp bir satırı alıyoruz
numbers = []                                    #sayı listemiz için boş bir liste kullanıyoruz
numbers.extend(randomLine[1])   #dosyamızda satırlar 1.\t1118\t((1+1)+1)x8 şeklindeydi
                                #numbers.extend() fonksiyonu ile dosyadan text olarak aldığımız sayıları teker teker liste elemanı olarak numbers listesine ekliyoruz.
solution = randomLine[2]        #bu satırı yukarıda split ile ayırıp liste oluşturduk. listemizin 2. elemanı kullanılabilecek sayılar, 3. elemanı çözümü içeriyor.
allowedChars = ["(",")","/","*","+","-"] #kullanılabilecek karakterler listemiz
allowedChars.extend(numbers)    #bunlara bir de sayılarımızı ekliyoruz
print allowedChars              #kullanıcıya kullanılabilecek karakter ve sayıları gösteriyoruz.
userSolution = raw_input("Please enter your solution: ") #kullanıcı çözümünü alıyoruz.
flag = True                     #kullanıcının hata yapmadığını farz ediyoruz.
for char in userSolution:       #kullanıcıdan aldığımız metindeki karakterleri tek tek alıyoruz.
    if char not in allowedChars:    #herhangi bir karakter kullanılabilecek karakter sayılar içinde yoksa
        message = "You used an invalid character. " #mesajımızı belirliyor ve geri kalan karakterleri kontrol etmemek için break kullanıyoruz.
        flag = False            #kullanıcının hata yaptığını belirlemek için flag değişkenimizi False yapıyoruz.
        break
    elif char in numbers:       #kullanıcının girdiği karakterlerde sayı varsa
        allowedChars.remove(char)   #sayıyı allowedChars ve numbers listemizden çıkarıyoruz.
        numbers.remove(char)
if len(allowedChars) != 6:      #kullanıcı tüm sayıları kullanmışsa allowedChars listemizde tam olarak 6 eleman kalması gerekiyor. kalmamışsa;
    message = "You did not use all the numbers or characters. " #mesajımız
    flag = False                #hata değişkenimiz False oluyor
elif eval(userSolution) != 24:  #eval fonksiyonu matematiksel bir ifadeyi string olarak alıp, çözebiliyor.
                                #try.. except.. hata bloğu kullanılmalı burada aslında ancak şimdilik es geçiyorum.
    message = "Your result is incorrect!"
if flag == True:                #Bu adıma kadar flag değişkenimiz True olarak kaldıysa kazandınız mesajı
    print "You won..!"
else:                           #False olarak değişmişse mesajımızı ve çözümümüzü gösteriyoruz.
    print message
    print "You lost. The solution might be: ", solution

 
     


Thursday, December 8, 2016

Python İle Adam Asmaca Oyunu Yapımı

GUI Olmadan

word = "ankara"             #Bulunacak kelime
underscoreforLetters = ""   #boş metin: kelimedeki her karakteri "_" ile değiştirmek için kullanılacak
for x in word:              #kelimedeki her harf için
    underscoreforLetters += " _ " #değişkenimize bir "_" ekliyoruz
print underscoreforLetters  #kelimenin kaç karakter olduğunu göstermek için değişkenimizi yazdırıyoruz
guessedLetter = []          #tahmin edilen harfler/kelimeler için liste oluşturuyoruz
for a in range(6):          #6 kelime/tahmin hakkı veriyoruz
    newWord = ""            #tahmin edilen kelime/harf için alt tire ve harflerden oluşacak değeri tutmak için kullanılacak
    woL = input("Word or letter: 1 or 2 ") #Kelime veya harf tahmini için bir sayı istiyoruz
    if woL == 1:
        userGuess = raw_input("Enter your guess: ")
        if userGuess == word:   #Tahmin edilen kelime belirlediğimiz kelimeye eşitse
            print "You won"     #Kazandınız diyerek döngümüzü sonlandırıyoruz
            break
        else:
            guessedLetter.append(userGuess) #Değilse tahmin edilen kelimeyi listemize ekliyoruz
            print "Wrong guess."
    else:
        letter = raw_input("Enter a letter: ")
        guessedLetter.append(letter)    #Aldığımız kelime tahminini listemize ekliyoruz
        for y in word:                  #Kelimemizdeki her harf için
            if y in guessedLetter:      #Eğer harf listemiz içindeyse
                newWord += y            #Değişkenimize harfi ekliyoruz
            else:                       #Değilse
                newWord += " _ "        #Harfi temsilen alt tire ekliyoruz
        print newWord                   #Alt tire ve harflerden oluşan kelimemizi yazdırıyoruz
    print guessedLetter                 #Tahmin edilen harf/kelimelerin listesini yazdırıyoruz

Oyunumuzu çalıştırdığımızda yukarıdaki gibi bir görüntü elde ediyoruz. Bu en basit haliyle bir adam asmaca oyunu. Sonraki yazılarımızda dosya içinden rastgele bir kelime ile oynanabilecek versiyonu ve GUI(Graphical User Interface) ile olan versiyonları olacak.

Sorularınız/görüşleriniz için yorumlarınızı bekliyorum.

Python İle Sayıyı Yazıya Çevirme

Merhaba,

Bu yazıda python ile girilen bir sayının yazıya dönüştürülmesi ile ilgili hazırladığım programı açıklayacağım.

Program için Tkinter ile basit bir arayüz tasarladım. Programı hazırlarken internette yalnızca bazı forumlarda yapılan çalışmaları gördüm ve istediğim şekilde değildi yapılanlar. En iyi yapabilen milyonlara kadar çevirebiliyordu. Bu yüzden ihtiyaç duyulabileceğini düşünerek Türkçe sayılar için bu programı hazırladım.

Programın mantığı şu;
1 - Sayı 3 basamaktan fazla ise sayıyı önce 3'erli gruplara ayır ve yeni bir listeye ekle
2 - Listeyi ters çevir.
3 - Eğer sayı tek basamaklı ise doğrudan sayının yazı halini birler listesinden index numarasını kullanarak al.
4 - Sayı iki basamaklı ise onlar listesinden yazıyı al ve birler listesinden yazıyı al ve ekle.
5 - Sayı 3 basamaklı ise yüzler listesinden, onlar listesinden ve birler listesinden bir yazı al ve text değişkenine ata.
6 - Sayı 4 veya daha basamaklı ise önce 3-4-5. adımları her grup için uygula, büyükler listesinden bir yazı ekle.

Fonksiyon dışındaki kısımlar görsel arayüz için zaten.

Çok zor bir uygulama değil ama sorularınız olursa yanıtlayabilirim.

from Tkinter import *
birler = ["",u"bir", u"iki", u"üç", u"dört",u"beş",u"altı",u"yedi",u"sekiz",u"dokuz",u""]
onlar = ["",u"on",u"yirmi",u"otuz",u"kırk",u"elli",u"altmış",u"yetmiş",u"seksen",u"doksan",u""]
buyukler = [u"yüz", u"bin",u"milyon",u"milyar",u"trilyon", u"katrilyon", u"kentilyon",u"seksilyon",u"septilyon",u"oktilyon",
            u"nobilyon",u"desilyon"]
def convert():
    number = numberE.get()
    groups = []
    while len(number)>3:
        groups.append(number[-3:])
        number=number[:-3]
    groups.append(number)
    groups.reverse()
    #print groups
    text = ""
    a = len(groups)-1
    if len(groups)>=3 and int(groups[0])==1:
        text += "bir"
    for x in groups:
        if int(x) < 10:
            if len(groups)>1:
                if int(x)!=1:
                    text += birler[int(x)]
            else:
                text += birler[int(x)]
        elif int(x) < 100:
            if int(x) % 10 == 0:
                text += onlar[int(x[0])]
            else:
                text += onlar[int(x[0])] + " " + birler[int(x[1])]
        elif int(x) < 1000:
            if int(x) % 100 == 0:
                text += birler[int(x[0])]+ " " + buyukler[0]
            else:
                if int(x[0]) == 1:
                    text += buyukler[0] + " " + onlar[int(x[1])] + " " + birler[int(x[2])]
                else:
                    text += birler[int(x[0])]+ " " + buyukler[0] + " " + onlar[int(x[1])] + " " + birler[int(x[2])]
        if a >= 1:
                text += " " + buyukler[a] + " "
        a = a - 1
    t["state"]="normal"
    t.delete(1.0, END)
    t.insert(END, text.strip())
def clear():
    t["state"]="normal"
    t.delete(1.0, END)
root = Tk()
root.geometry("550x300+100+100")
root.title("Convert Number to Word")
l = Label(root, text="Please enter a number")
l.grid(row=0, column=0, columnspan=3)
numberE = Entry(root, width=36)
numberE.grid(row=1,column=0, columnspan=3, pady=5, ipady=5)
b = Button(root, text="Convert", command=convert, width=20)
b.grid(row=2, column=0,pady=5,ipady=5)
b2 = Button(root, text="Clear", command=clear, width=20)
b2.grid(row=2, column=1,pady=5,ipady=5)
b3 = Button(root, text="Quit", command=root.destroy, width=20)
b3.grid(row=2, column=2,pady=5,ipady=5)
t = Text(root, height=8, width=60, fg="white", bg="red", font=16, state="disabled")
t.grid(row=3, column=0, columnspan=3)
l2 = Label(root, text=u"Created by Halil İbrahim MALİ", font=16)
l2.grid(row=4, column=0, columnspan=3,pady=5)
mainloop()