# -*- coding: UTF-8 -*- import sys from PyQt4 import QtGui, QtCore import random import math import time class Square(QtGui.QGraphicsItem): def __init__(self): QtGui.QGraphicsItem.__init__(self) def boundingRect(self): return QtCore.QRectF(0, 0, 64, 64) def paint(self, painter, option, widget): gradient = QtGui.QRadialGradient() c = QtGui.QColor(195,195,195,255) gradient.setColorAt(0, c) gradient.setColorAt(1, c) painter.setBrush(QtGui.QBrush(gradient)) painter.setPen(QtGui.QPen(QtCore.Qt.black, 2)) painter.drawRect(0, 0, 64, 64) def mousePressEvent(self, event): pressed(self.x(), self.y()) class Chip(QtGui.QGraphicsItem): def __init__(self): QtGui.QGraphicsItem.__init__(self) colour = 0 def boundingRect(self): return QtCore.QRectF(6, 6, 52, 52) def paint(self, painter, option, widget): gradient = QtGui.QRadialGradient() if self.colour == 0: # black gradient.setColorAt(0, QtCore.Qt.black) gradient.setColorAt(1, QtCore.Qt.black) else: # white gradient.setColorAt(0, QtCore.Qt.white) gradient.setColorAt(1, QtCore.Qt.white) painter.setBrush(QtGui.QBrush(gradient)) painter.setPen(QtGui.QPen(QtCore.Qt.black, 2)) painter.drawEllipse(6, 6, 52, 52) def mousePressEvent(self, event): pressed(self.x(), self.y()) class Window(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.setWindowTitle(u"Reversi") # кнопка новая игра button1 = QtGui.QPushButton(rus("Новая игра")) QtCore.QObject.connect(button1, QtCore.SIGNAL("clicked()"), newGame) # кнопка закрытия button2 = QtGui.QPushButton(rus("Выйти")) QtCore.QObject.connect(button2, QtCore.SIGNAL("clicked()"), app, QtCore.SLOT("quit()")) # метка, кто ходит. доступна извне, как атрибут self.label = QtGui.QLabel() # игровое поле self.scene = QtGui.QGraphicsScene() self.scene.setSceneRect(0, 0, 512, 512) # виджет игрового поля gamearea = QtGui.QGraphicsView(self.scene) gamearea.setRenderHint(QtGui.QPainter.Antialiasing) # буковки (список) hlabel = [] for i in range(8): c = QtGui.QLabel() c.setText(chr(ord('a') + i)) hlabel.append(c) # циферки (список) vlabel = [] for i in reversed(range(8)): c = QtGui.QLabel() c.setText(str(i + 1)) vlabel.append(c) headbar = QtGui.QHBoxLayout() headbar.addWidget(button1) headbar.addWidget(button2) headbar.addWidget(self.label) grid = QtGui.QVBoxLayout() grid.addLayout(headbar) grid.addWidget(gamearea) self.setLayout(grid) def win(): b = getScore(0) w = getScore(1) global window global app if b == w: text = rus("Ничья.") elif b > w: text = rus("Победили черные. Счет " + str(b) + ":" + str(w)) else: text = rus("Победили белые. Счет " + str(w) + ":" + str(b)) QtGui.QMessageBox.information(window, rus("Игра закончена!"), "
" + text + "
", QtGui.QMessageBox.Ok) newGame() def rus(s): return unicode(s, 'cp1251') def currentPlayer(): global player global window if player: window.label.setText(rus("
Ходят белые
")) else: window.label.setText(rus("
Ходят черные
")) def getScore(p): score = 0 global area for i in range(8): for j in range(8): if area[i][j] == p: score = score + 1 return score def AAA(node): node.hide() def newKletki(scene): for i in range(8): for j in range(8): x = j * 64 y = i * 64 newS = Square() scene.addItem(newS) newS.setPos(x, y) # -1 - пустое поле # 0 - черная фишка # 1 - белая фишка def createFishki(scene): #создаем все фишки global fishki for i in range(8): row = [] for j in range(8): x = j * 64 y = i * 64 fish = [] # black f = Chip() f.colour = 0 scene.addItem(f) f.setPos(x,y) fish.append(f) # white f = Chip() f.colour = 1 scene.addItem(f) f.setPos(x,y) fish.append(f) row.append(fish) fishki.append(row) def newGame(): # обнуляем поле global area global player player = 0 currentPlayer() area = [ [-1,-1,-1,-1,-1,-1,-1,-1,-1], [-1,-1,-1,-1,-1,-1,-1,-1,-1], [-1,-1,-1,-1,-1,-1,-1,-1,-1], [-1,-1,-1, 0, 1,-1,-1,-1,-1], [-1,-1,-1, 1, 0,-1,-1,-1,-1], [-1,-1,-1,-1,-1,-1,-1,-1,-1], [-1,-1,-1,-1,-1,-1,-1,-1,-1], [-1,-1,-1,-1,-1,-1,-1,-1,-1], [-1,-1,-1,-1,-1,-1,-1,-1,-1] ] reloadArea() def delay(): #x = 2 ** 100000 time.sleep(1) def reloadArea(): global area for row in range(8): for col in range(8): fishki[row][col][0].hide() fishki[row][col][1].hide() if area[row][col] == 0: fishki[row][col][0].show() elif area[row][col] == 1: fishki[row][col][1].show() def rev(c): if c == 0: return 1 else: return 0 def step(player, row, col, dir, act = 0): global area me = player opp = rev(player) # если клетка пустая if area[row][col] == -1: if (dir == "u") & (row != 0): # вверх kol = 0 m = row - 1 change = 0 while (area[m][col] == opp) & (m >= 0): m = m - 1 change = 1 kol = kol + 1 # можно ли сходить? if (area[m][col] == me) & (change): # если требуется сходить if act: m = row - 1 while (area[m][col] == opp) & (m >= 0): area[m][col] = rev(area[m][col]) m = m - 1 # если ходить не требуется else: return kol elif (dir == "d") & (row != 7): # вниз kol = 0 m = row + 1 change = 0 while (area[m][col] == opp) & (m <= 7): m = m + 1 change = 1 kol = kol + 1 # можно ли сходить? if (area[m][col] == me) & (change): # если требуется сходить if act: m = row + 1 while (area[m][col] == opp) & (m <= 7): area[m][col] = rev(area[m][col]) m = m + 1 # если ходить не требуется else: return kol elif (dir == "l") & (col != 0): # влево kol = 0 n = col - 1 change = 0 while (area[row][n] == opp) & (n >= 0): n = n - 1 change = 1 kol = kol + 1 # можно ли сходить? if (area[row][n] == me) & (change): # если требуется сходить if act: n = col - 1 while (area[row][n] == opp) & (n >= 0): area[row][n] = rev(area[row][n]) n = n - 1 # если ходить не требуется else: return kol elif (dir == "r") & (col != 7): # вправо kol = 0 n = col + 1 change = 0 while (n <= 7) & (area[row][n] == opp): n = n + 1 change = 1 kol = kol + 1 # можно ли сходить? if (area[row][n] == me) & (change): # если требуется сходить if act: n = col + 1 while (area[row][n] == opp) & (n <= 7): area[row][n] = rev(area[row][n]) n = n + 1 # если ходить не требуется else: return kol elif (dir == "ur") & (row != 0) & (col != 7): # вверх-вправо kol = 0 m = row - 1 n = col + 1 change = 0 while (area[m][n] == opp) & (m >= 0) & (n <= 7): m = m - 1 n = n + 1 change = 1 kol = kol + 1 # можно ли сходить? if (area[m][n] == me) & (change): # если требуется сходить if act: m = row - 1 n = col + 1 while (area[m][n] == opp) & (m >= 0) & (n <= 7): area[m][n] = rev(area[m][n]) m = m - 1 n = n + 1 # если ходить не требуется else: return kol elif (dir == "ul") & (row != 0) & (col != 0): # вверх-влево kol = 0 m = row - 1 n = col - 1 change = 0 while (area[m][n] == opp) & (m >= 0) & (n >= 0): m = m - 1 n = n - 1 change = 1 kol = kol + 1 # можно ли сходить? if (area[m][n] == me) & (change): # если требуется сходить if act: m = row - 1 n = col - 1 while (area[m][n] == opp) & (m >= 0) & (n >= 0): area[m][n] = rev(area[m][n]) m = m - 1 n = n - 1 # если ходить не требуется else: return kol elif (dir == "dr") & (row != 7) & (col != 7): # вниз-вправо kol = 0 m = row + 1 n = col + 1 change = 0 while (area[m][n] == opp) & (m <= 7) & (n <= 7): m = m + 1 n = n + 1 change = 1 kol = kol + 1 # можно ли сходить? if (area[m][n] == me) & (change): # если требуется сходить if act: m = row + 1 n = col + 1 while (area[m][n] == opp) & (m <= 7) & (n <= 7): area[m][n] = rev(area[m][n]) m = m + 1 n = n + 1 # если ходить не требуется else: return kol elif (dir == "dl") & (row != 7) & (col != 0): # вниз-влево kol = 0 m = row + 1 n = col - 1 change = 0 while (area[m][n] == opp) & (m <= 7) & (n >= 0): m = m + 1 n = n - 1 change = 1 kol = kol + 1 # можно ли сходить? if (area[m][n] == me) & (change): # если требуется сходить if act: m = row + 1 n = col - 1 while (area[m][n] == opp) & (m <= 7) & (n >= 0): area[m][n] = rev(area[m][n]) m = m + 1 n = n - 1 # если ходить не требуется else: return kol return 0 def eated(row, col, player): global area if area[row][col] != -1: return 255 else: kol = 0 kol = kol + step(player, row, col, "u") kol = kol + step(player, row, col, "d") kol = kol + step(player, row, col, "l") kol = kol + step(player, row, col, "r") kol = kol + step(player, row, col, "ur") kol = kol + step(player, row, col, "ul") kol = kol + step(player, row, col, "dr") kol = kol + step(player, row, col, "dl") return kol def canStep(p): for row in range(8): for col in range(8): if step(p, row, col, "u"): return 1 elif step(p, row, col, "d"): return 1 elif step(p, row, col, "l"): return 1 elif step(p, row, col, "r"): return 1 elif step(p, row, col, "ul"): return 1 elif step(p, row, col, "ur"): return 1 elif step(p, row, col, "dl"): return 1 elif step(p, row, col, "dr"): return 1 return 0 def makeStep(player, row, col): if step(player, row, col, "u"): step(player, row, col, "u", 1) if step(player, row, col, "d"): step(player, row, col, "d", 1) if step(player, row, col, "l"): step(player, row, col, "l", 1) if step(player, row, col, "r"): step(player, row, col, "r", 1) if step(player, row, col, "ul"): step(player, row, col, "ul", 1) if step(player, row, col, "ur"): step(player, row, col, "ur", 1) if step(player, row, col, "dl"): step(player, row, col, "dl", 1) if step(player, row, col, "dr"): step(player, row, col, "dr", 1) def pressed(x,y): row = int(y / 64) col = int(x / 64) go = 0 global player # вверх if step(player, row, col, "u"): step(player, row, col, "u", 1) go = 1 # вниз if step(player, row, col, "d"): step(player, row, col, "d", 1) go = 1 # влево if step(player, row, col, "l"): step(player, row, col, "l", 1) go = 1 # вправо if step(player, row, col, "r"): step(player, row, col, "r", 1) go = 1 # вверх-влево if step(player, row, col, "ul"): step(player, row, col, "ul", 1) go = 1 # вверх-вправо if step(player, row, col, "ur"): step(player, row, col, "ur", 1) go = 1 # вниз-влево if step(player, row, col, "dl"): step(player, row, col, "dl", 1) go = 1 # вниз-вправо if step(player, row, col, "dr"): step(player, row, col, "dr", 1) go = 1 if go: area[row][col] = player if canStep(rev(player)): player = rev(player) currentPlayer() reloadArea() if player == 1: compStep(player) player = rev(player) currentPlayer() reloadArea() if (not canStep(rev(player))) & (not canStep(player)): win() def compStep(player): table = [ [1, 8, 2, 2, 2, 2, 8, 1], [8, 8, 6, 5, 5, 6, 8, 8], [2, 6, 4, 3, 3, 4, 6, 2], [2, 5, 3, 1, 1, 3, 5, 2], [2, 5, 3, 1, 1, 3, 5, 2], [2, 6, 4, 3, 3, 4, 6, 2], [8, 8, 6, 5, 5, 6, 8, 8], [1, 8, 2, 2, 2, 2, 8, 1] ] pX = [0] * 61 pY = [0] * 61 minE = 9 maxE = 0 NP = 0 for row in range(8): for col in range(8): E = eated(row, col, player) if (minE > table[row][col]) & (E < 255) & (E > 0): minE = table[row][col] NP = 0 maxE = 0 if (minE == table[row][col]) & (E < 255): if E > maxE: maxE = E NP = 1 pX[NP] = row pY[NP] = col elif E == maxE: NP = NP + 1 pX[NP] = row pY[NP] = col E = math.trunc(random.random() * NP) + 1 E = 1 # print pX[E], pY[E] makeStep(player, pX[E], pY[E]) area[pX[E]][pY[E]] = player app = QtGui.QApplication(sys.argv) # 0 - ходят черные, 1 - белые player = 0 fishki = [] area = [] window = Window() window.show() newKletki(window.scene) createFishki(window.scene) newGame() sys.exit(app.exec_())