Created
May 7, 2012 22:56
-
-
Save ugurcan377/2631224 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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