Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import sys
- from random import randint
- from PyQt4.QtGui import *
- from PyQt4.QtCore import *
- a = QApplication(sys.argv)
- class Game():
- def __init__(self):
- self.resetgame()
- size = 4
- matrix = []
- def resetgame(self):
- self.matrix = np.zeros((self.size, self.size), dtype=np.int)
- self.additem()
- self.additem()
- def additem(self):
- while 1:
- temp2 = randint(0, 9)
- x = randint(0, self.size - 1)
- y = randint(0, self.size - 1)
- if self.matrix[y, x] == 0:
- self.matrix[y, x] = 4 if temp2 == 0 else 2
- break
- def up(self):
- for x in range(self.size):
- temp = 0
- for y in range(self.size):
- if not self.matrix[y, x] == 0:
- self.matrix[temp, x] = self.matrix[y, x]
- if not temp == y:
- self.matrix[y, x] = 0
- temp += 1
- def down(self):
- for x in range(self.size):
- temp = self.size - 1
- for y in range(self.size - 1, -1, -1):
- if not self.matrix[y, x] == 0:
- self.matrix[temp, x] = self.matrix[y, x]
- if not temp == y:
- self.matrix[y, x] = 0
- temp -= 1
- def left(self):
- for y in range(self.size):
- temp = 0
- for x in range(self.size):
- if not self.matrix[y, x] == 0:
- self.matrix[y, temp] = self.matrix[y, x]
- if not temp == x:
- self.matrix[y, x] = 0
- temp += 1
- def right(self):
- for y in range(self.size):
- temp = self.size - 1
- for x in range(self.size - 1, -1, -1):
- if not self.matrix[y, x] == 0:
- self.matrix[y, temp] = self.matrix[y, x]
- if not temp == x:
- self.matrix[y, x] = 0
- temp -= 1
- g = Game()
- class Window(QWidget):
- def __init__(self):
- super(Window, self).__init__()
- self.initializeui()
- self.setvalues()
- self.setStyleSheet("QWidget {"
- "background-color: #bbada0;}")
- bestscore = 0
- scoreval = 0
- score = None
- best = None
- grid = QGridLayout()
- color = {0: "#ccc0b3;",
- 2: "#eee4da;",
- 4: "#EDE0C8;",
- 8: "#F2B179;",
- 16: "#F59563;",
- 32: "#F67C5F;",
- 64: "#F65E3B;",
- 128: "#EDCE70;",
- 256: "#EDCC63;",
- 512: "#ECC850;",
- 1024: "#ECC850;",
- 2048: "#EDC22E;"}
- def setscore(self):
- self.scoreval = 0
- for x in range(g.size):
- for y in range(g.size):
- if g.matrix[y, x] > 2:
- self.scoreval += g.matrix[y, x] * (np.log(g.matrix[y, x])/np.log(2) - 1)
- def res(self):
- self.scoreval = 0
- g.resetgame()
- self.setvalues()
- self.setFocus()
- def initializeui(self):
- self.resize(g.size*112.5, g.size*125)
- self.setMaximumSize(g.size*112.5, g.size*125)
- self.setMinimumSize(g.size*112.5, g.size*125)
- self.setWindowTitle("2048")
- self.show()
- self.setLayout(self.grid)
- self.best = QLabel("Best:\n%s" % self.bestscore)
- self.best.setFixedHeight(50)
- self.best.setFixedWidth(100)
- self.best.setAlignment(Qt.AlignCenter)
- self.best.setStyleSheet("QLabel {"
- "color: #fff;"
- "font-size: 15px;"
- "border-radius: 5px;"
- "background-color: #000;"
- "font-family: Arial Black;"
- "}")
- self.grid.addWidget(self.best, 0, 1, 1, g.size/2)
- self.score = QLabel("Score:\n0")
- self.score.setFixedHeight(50)
- self.score.setFixedWidth(100)
- self.score.setAlignment(Qt.AlignCenter)
- self.score.setStyleSheet("QLabel {"
- "color: #fff;"
- "font-size: 15px;"
- "border-radius: 5px;"
- "background-color: #000;"
- "font-family: Arial Black;"
- "}")
- self.grid.addWidget(self.score, 0, 0, 1, g.size/2)
- restart = QPushButton("Restart")
- restart.clicked.connect(self.res)
- restart.setFixedWidth(g.size*50 + (g.size/2 - 1)*5)
- restart.setFixedHeight(50)
- restart.setStyleSheet("QPushButton {"
- "color: #fff;"
- "font-size: 15px;"
- "border-radius: 5px;"
- "background-color: #000;"
- "font-family: Arial Black;"
- "}")
- self.grid.addWidget(restart, 0, g.size/2, 1, g.size/2)
- def setvalues(self):
- elements = [(m, n) for m in range(g.size) for n in range(g.size)]
- for m, n in elements:
- temp = QLabel(str(g.matrix[m, n]) if g.matrix[m, n] > 0 else " ")
- temp.setFixedWidth(100)
- temp.setAlignment(Qt.AlignCenter)
- temp.setStyleSheet("QLabel {"
- "color: black;"
- "font-size: 35px;"
- "border-radius: %spx;"
- "font-family: Arial Black;"
- "background-color: %s"
- "}" % (g.size*12.5, self.color[g.matrix[m, n]]))
- self.grid.addWidget(temp, m + 1, n)
- self.setscore()
- self.score.setText("Score:\n%s" % int(self.scoreval))
- if self.bestscore < self.scoreval:
- self.bestscore = self.scoreval
- self.best.setText("Best:\n%s" % int(self.bestscore))
- def keyPressEvent(self, k):
- if k.key() == Qt.Key_Up and self.islegal(k.key()):
- self.updown(k.key())
- elif k.key() == Qt.Key_Down and self.islegal(k.key()):
- self.updown(k.key())
- elif k.key() == Qt.Key_Left and self.islegal(k.key()):
- self.leftright(k.key())
- elif k.key() == Qt.Key_Right and self.islegal(k.key()):
- self.leftright(k.key())
- def updown(self, k):
- if k == Qt.Key_Up:
- yrange = range(g.size - 1)
- yd = 1
- g.up()
- elif k == Qt.Key_Down:
- yrange = range(g.size - 1, 0, -1)
- yd = -1
- g.down()
- for x in range(g.size):
- for y in yrange:
- if g.matrix[y, x] == g.matrix[y + yd, x]:
- g.matrix[y, x] *= 2
- g.matrix[y + yd, x] = 0
- g.up() if k == Qt.Key_Up else g.down()
- g.additem()
- self.setvalues()
- def leftright(self, k):
- if k == Qt.Key_Left:
- xrange = range(g.size - 1)
- xd = 1
- g.left()
- elif k == Qt.Key_Right:
- xrange = range(g.size - 1, 0, -1)
- xd = -1
- g.right()
- for y in range(g.size):
- for x in xrange:
- if g.matrix[y, x] == g.matrix[y, x + xd]:
- g.matrix[y, x] *= 2
- g.matrix[y, x + xd] = 0
- g.left() if k == Qt.Key_Left else g.right()
- g.additem()
- self.setvalues()
- @staticmethod
- def islegal(k):
- if k == Qt.Key_Up:
- xrange = range(g.size)
- yrange = range(g.size - 1, 0, -1)
- xd = 0
- yd = -1
- elif k == Qt.Key_Down:
- xrange = range(g.size)
- yrange = range(g.size - 1)
- xd = 0
- yd = 1
- elif k == Qt.Key_Left:
- yrange = range(g.size)
- xrange = range(g.size - 1, 0, -1)
- yd = 0
- xd = -1
- elif k == Qt.Key_Right:
- yrange = range(g.size)
- xrange = range(g.size - 1)
- yd = 0
- xd = 1
- for x in xrange:
- for y in yrange:
- if g.matrix[y, x]:
- if g.matrix[y + yd, x + xd] == 0 or g.matrix[y + yd, x + xd] == g.matrix[y, x]:
- return True
- return False
- w = Window()
- sys.exit(a.exec())
Advertisement
Add Comment
Please, Sign In to add comment