Skip to content

Instantly share code, notes, and snippets.

@ugurcan377
Created May 7, 2012 22:56
Show Gist options
  • Save ugurcan377/2631224 to your computer and use it in GitHub Desktop.
Save ugurcan377/2631224 to your computer and use it in GitHub Desktop.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import time
from PyQt4 import QtCore
from PyQt4 import QtGui
from ui_selam import Ui_MainWindow #pyuic'le donusturulmus ui dosyası import edilir
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
self.count = 1 # Oyun Sayısı
self.ksi = 0.1 # Ogrenme katsayisi
self.finished = 0 # Oyun devam ediyor mu bitti mi
self.game = {8:self.pushButton_10,0:self.pushButton_2,1:self.pushButton_3,2:self.pushButton_4,3:self.pushButton_5,4:self.pushButton_6,5:self.pushButton_7,6:self.pushButton_8,7:self.pushButton_9}
#Buttonlara indislerle erisebilmek için tanımlanmış sözlük
self.resultSet = {"positive":100,"negative":-100} # Negative - Positive donusturmesi
self.board = ["b" for i in range(9)] # Oyun tahtasıni belirten dizi
self.w0 = 0.5
self.w1 = 0.5
self.w2 = 0.5
self.w3 = 0.5
self.w4 = 0.5
self.w5 = 0.5
self.w6 = 0.5
for i in self.game: # butun buttonlar aynı fonksyona atanır
self.game[i].clicked.connect(self.buttonPressed)
self.label_2.setText("%d.Oyun" %(self.count))
self.pushButton.clicked.connect(self.clear)
self.sfile = open("tic-tac-toe.data","a+")
lines = self.sfile.readlines() # Dosyanin her satiri lines dizisinin bir elemanı
for line in lines: # datasette her şey virgülle ayrılıyormus onu yanlıs hatırlayınca attığım string taklaları
line = line.replace(",","")
self.result = self.resultSet[line[line.__len__()-9:line.__len__()-1]]
line = line[:line.__len__()-9]
self.generate(line)
self.lms()
#print ( "tahta = %s sonuc = %f V(b) = %f \n" %(line,self.result,self.vb))
#print ( "x1 = %f x2 = %f x3 = %f x4 = %f x5 = %f x6 = %f \n" %(self.x1,self.x2,self.x3,self.x4,self.x5,self.x6))
#print ( "w1 = %f w2 = %f w3 = %f w4 = %f w5 = %f w6 = %f \n" %(self.w1,self.w2,self.w3,self.w4,self.w5,self.w6))
def generate(self,s): # X'leri tespit eden fonksyon
self.x1 = 0.0
self.x2 = 0.0
self.x3 = 0.0
self.x4 = 0.0
self.x5 = 0.0
self.x6 = 0.0
directions = [s[:3],s[3:6],s[6:9],s[::3],s[1::3],s[2::3],s[::4],s[2:8:2]] # Tahtayı satır,sütün,diagonal hallere dönüştürüp diziye atadım
for d in directions:
cx = d.count("x")
co = d.count("o")
cb = d.count("b")
if (d.count("xxb") == 1 or d.count("bxx")):
self.x1+=1
if (d.count("oob") == 1 or d.count("boo")):
self.x2+=1
if (cx == 1 and cb == 2):
self.x3+=1
if (co == 1 and cb == 2):
self.x4+=1
if (cx == 3):
self.x5+=1
if (co == 3):
self.x6+=1
def Vb(self): # Vb'yi hesaplayan fonksyon
self.vb = self.w0 + self.w1 * self.x1 + self.w2 * self.x2 + self.w3 * self.x3 + self.w4 * self.x4 + self.w5 * self.x5 + self.w6 * self.x6
def lms(self): # W'leri güncelleyen fonksyon
self.Vb()
self.w1 = self.w1 + self.ksi * (self.result - self.vb) * self.x1
self.w2 = self.w2 + self.ksi * (self.result - self.vb) * self.x2
self.w3 = self.w3 + self.ksi * (self.result - self.vb) * self.x3
self.w4 = self.w4 + self.ksi * (self.result - self.vb) * self.x4
self.w5 = self.w5 + self.ksi * (self.result - self.vb) * self.x5
self.w6 = self.w6 + self.ksi * (self.result - self.vb) * self.x6
def computer(self): #Bilgisayarın hamlelerini hesaplayan fonksyon
max_vb = -200
max_index = -1
for i in range(9):
if (self.board[i] == "b"): # Tahtanın bos olan her elemani icin oraya hamle yapılsa vbler ne olur hesaplayan if kosulu
would = [x for x in self.board]
would[i] = "x"
self.generate("".join(would))
self.result = -100 # oyunun kazanılmadığı her durumda Vtrain(b) - 100 dur diye dusundum
#self.lms()
self.Vb()
print ("Vb = %.2f max_vb = %.2f index = %d max_index = %d " %(self.vb,max_vb,i,max_index))
# Bu printleri linux konsolunda dosyaya yazdırıp rapor oluşturmak için kullanıyorum
if (self.vb > max_vb):
max_vb = self.vb
max_index = i
if (max_index != -1):
self.board[max_index] = "x"
self.game[max_index].setText("X")
self.check()
t = "".join(self.board)
print ("%s\n%s\n%s" %(t[:3],t[3:6],t[6:9]))
def check(self): # Oyun bitti mi kim kazandı belirleyen fonksyon
self.generate("".join(self.board))
t = "".join(self.board)
if (self.x5 > 0):
self.finished = 1
self.label.setText("Oyunu X kazandi")
self.result = 100
print("%d.Oyunu X kazandi" %(self.count))
print ("%s\n%s\n%s" %(t[:3],t[3:6],t[6:9]))
if (self.x6 > 0):
self.finished = 2
self.label.setText("Oyunu O kazandi")
self.result = -100
print("%d.Oyunu O kazandi" %(self.count))
print ("%s\n%s\n%s" %(t[:3],t[3:6],t[6:9]))
def buttonPressed(self): # Hamle yapmak için bir yere tıklandığında
button = self.sender() # Hangi buttondan tıklandıysa o nesneyi button değişkenine atar
temp = [key for key,value in self.game.iteritems() if value.objectName() == button.objectName()][0]
# Nesne isminden dizi indisine ulasilir
if (self.board[temp] == "b" and self.finished == 0): # O nokta bos ve oyun bitmemis iken
self.board[temp] = "o"
button.setText("O") # Kullanıcı hamlesini yapar
self.check()
if (self.finished == 0):
self.computer() # Oyun bitmemisse bilgisayar hamlesini yapar
def clear(self): # Tahtayı sıfırlayıp yeni oyun baslatır w'lerle ellesmediği için program öğrenip sonraki oyunlarda daha düzgün hamleler yapabiliyor.
self.count+=1
self.finished = 0
self.label.setText("")
temp = [key for key,value in self.resultSet.iteritems() if value == self.result][0]
endgame = ",".join(self.board)+","+temp+"\n"
self.sfile.write(endgame)
print("-----------------------------\n")
self.label_2.setText("%d.Oyun" %(self.count))
self.board = ["b" for x in range(9)]
for i in self.game:
self.game[i].setText("")
app = QtGui.QApplication(sys.argv)
run = MainWindow()
run.show()
sys.exit(app.exec_())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment