jotto

Untitled

Mar 30th, 2015
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.92 KB | None | 0 0
  1. import numpy as np
  2. import sys
  3. from random import randint
  4. from PyQt4.QtGui import *
  5. from PyQt4.QtCore import *
  6.  
  7. a = QApplication(sys.argv)
  8.  
  9.  
  10. class Game():
  11.     def __init__(self):
  12.         self.resetgame()
  13.  
  14.     size = 4
  15.     matrix = []
  16.  
  17.     def resetgame(self):
  18.         self.matrix = np.zeros((self.size, self.size), dtype=np.int)
  19.         self.additem()
  20.         self.additem()
  21.  
  22.     def additem(self):
  23.         while 1:
  24.             temp2 = randint(0, 9)
  25.             x = randint(0, self.size - 1)
  26.             y = randint(0, self.size - 1)
  27.             if self.matrix[y, x] == 0:
  28.                 self.matrix[y, x] = 4 if temp2 == 0 else 2
  29.                 break
  30.  
  31.     def up(self):
  32.         for x in range(self.size):
  33.             temp = 0
  34.             for y in range(self.size):
  35.                 if not self.matrix[y, x] == 0:
  36.                     self.matrix[temp, x] = self.matrix[y, x]
  37.                     if not temp == y:
  38.                         self.matrix[y, x] = 0
  39.                     temp += 1
  40.  
  41.     def down(self):
  42.         for x in range(self.size):
  43.             temp = self.size - 1
  44.             for y in range(self.size - 1, -1, -1):
  45.                 if not self.matrix[y, x] == 0:
  46.                     self.matrix[temp, x] = self.matrix[y, x]
  47.                     if not temp == y:
  48.                         self.matrix[y, x] = 0
  49.                     temp -= 1
  50.  
  51.     def left(self):
  52.         for y in range(self.size):
  53.             temp = 0
  54.             for x in range(self.size):
  55.                 if not self.matrix[y, x] == 0:
  56.                     self.matrix[y, temp] = self.matrix[y, x]
  57.                     if not temp == x:
  58.                         self.matrix[y, x] = 0
  59.                     temp += 1
  60.  
  61.     def right(self):
  62.         for y in range(self.size):
  63.             temp = self.size - 1
  64.             for x in range(self.size - 1, -1, -1):
  65.                 if not self.matrix[y, x] == 0:
  66.                     self.matrix[y, temp] = self.matrix[y, x]
  67.                     if not temp == x:
  68.                         self.matrix[y, x] = 0
  69.                     temp -= 1
  70.  
  71. g = Game()
  72.  
  73.  
  74. class Window(QWidget):
  75.     def __init__(self):
  76.         super(Window, self).__init__()
  77.         self.initializeui()
  78.         self.setvalues()
  79.         self.setStyleSheet("QWidget {"
  80.                            "background-color: #bbada0;}")
  81.  
  82.     bestscore = 0
  83.     scoreval = 0
  84.     score = None
  85.     best = None
  86.     grid = QGridLayout()
  87.     color = {0:     "#ccc0b3;",
  88.              2:     "#eee4da;",
  89.              4:     "#EDE0C8;",
  90.              8:     "#F2B179;",
  91.              16:    "#F59563;",
  92.              32:    "#F67C5F;",
  93.              64:    "#F65E3B;",
  94.              128:   "#EDCE70;",
  95.              256:   "#EDCC63;",
  96.              512:   "#ECC850;",
  97.              1024:  "#ECC850;",
  98.              2048:  "#EDC22E;"}
  99.  
  100.     def setscore(self):
  101.         self.scoreval = 0
  102.         for x in range(g.size):
  103.             for y in range(g.size):
  104.                 if g.matrix[y, x] > 2:
  105.                     self.scoreval += g.matrix[y, x] * (np.log(g.matrix[y, x])/np.log(2) - 1)
  106.  
  107.     def res(self):
  108.         self.scoreval = 0
  109.         g.resetgame()
  110.         self.setvalues()
  111.         self.setFocus()
  112.  
  113.     def initializeui(self):
  114.         self.resize(g.size*112.5, g.size*125)
  115.         self.setMaximumSize(g.size*112.5, g.size*125)
  116.         self.setMinimumSize(g.size*112.5, g.size*125)
  117.         self.setWindowTitle("2048")
  118.         self.show()
  119.         self.setLayout(self.grid)
  120.  
  121.         self.best = QLabel("Best:\n%s" % self.bestscore)
  122.         self.best.setFixedHeight(50)
  123.         self.best.setFixedWidth(100)
  124.         self.best.setAlignment(Qt.AlignCenter)
  125.         self.best.setStyleSheet("QLabel {"
  126.                                 "color: #fff;"
  127.                                 "font-size: 15px;"
  128.                                 "border-radius: 5px;"
  129.                                 "background-color: #000;"
  130.                                 "font-family: Arial Black;"
  131.                                 "}")
  132.         self.grid.addWidget(self.best, 0, 1, 1, g.size/2)
  133.  
  134.         self.score = QLabel("Score:\n0")
  135.         self.score.setFixedHeight(50)
  136.         self.score.setFixedWidth(100)
  137.         self.score.setAlignment(Qt.AlignCenter)
  138.         self.score.setStyleSheet("QLabel {"
  139.                                  "color: #fff;"
  140.                                  "font-size: 15px;"
  141.                                  "border-radius: 5px;"
  142.                                  "background-color: #000;"
  143.                                  "font-family: Arial Black;"
  144.                                  "}")
  145.         self.grid.addWidget(self.score, 0, 0, 1, g.size/2)
  146.  
  147.         restart = QPushButton("Restart")
  148.         restart.clicked.connect(self.res)
  149.         restart.setFixedWidth(g.size*50 + (g.size/2 - 1)*5)
  150.         restart.setFixedHeight(50)
  151.         restart.setStyleSheet("QPushButton {"
  152.                               "color: #fff;"
  153.                               "font-size: 15px;"
  154.                               "border-radius: 5px;"
  155.                               "background-color: #000;"
  156.                               "font-family: Arial Black;"
  157.                               "}")
  158.         self.grid.addWidget(restart, 0, g.size/2, 1, g.size/2)
  159.  
  160.     def setvalues(self):
  161.         elements = [(m, n) for m in range(g.size) for n in range(g.size)]
  162.         for m, n in elements:
  163.             temp = QLabel(str(g.matrix[m, n]) if g.matrix[m, n] > 0 else " ")
  164.             temp.setFixedWidth(100)
  165.             temp.setAlignment(Qt.AlignCenter)
  166.             temp.setStyleSheet("QLabel {"
  167.                                "color: black;"
  168.                                "font-size: 35px;"
  169.                                "border-radius: %spx;"
  170.                                "font-family: Arial Black;"
  171.                                "background-color: %s"
  172.                                "}" % (g.size*12.5, self.color[g.matrix[m, n]]))
  173.             self.grid.addWidget(temp, m + 1, n)
  174.  
  175.         self.setscore()
  176.         self.score.setText("Score:\n%s" % int(self.scoreval))
  177.  
  178.         if self.bestscore < self.scoreval:
  179.             self.bestscore = self.scoreval
  180.             self.best.setText("Best:\n%s" % int(self.bestscore))
  181.  
  182.     def keyPressEvent(self, k):
  183.         if not self.islegal(Qt.Key_Left) and not self.islegal(Qt.Key_Up) and np.count_nonzero(g.matrix) == 16:
  184.             msbx = QMessageBox()
  185.             msbx.setText("You won!")
  186.             msbx.setStandardButtons(QMessageBox.Ok)
  187.             msbx.show()
  188.             msbx.exec_()
  189.         if k.key() == Qt.Key_Up and self.islegal(k.key()):
  190.             self.updown(k.key())
  191.  
  192.         elif k.key() == Qt.Key_Down and self.islegal(k.key()):
  193.             self.updown(k.key())
  194.  
  195.         elif k.key() == Qt.Key_Left and self.islegal(k.key()):
  196.             self.leftright(k.key())
  197.  
  198.         elif k.key() == Qt.Key_Right and self.islegal(k.key()):
  199.             self.leftright(k.key())
  200.  
  201.     def updown(self, k):
  202.         if k == Qt.Key_Up:
  203.             yrange = range(g.size - 1)
  204.             yd = 1
  205.             g.up()
  206.         elif k == Qt.Key_Down:
  207.             yrange = range(g.size - 1, 0, -1)
  208.             yd = -1
  209.             g.down()
  210.         for x in range(g.size):
  211.             for y in yrange:
  212.                 if g.matrix[y, x] == g.matrix[y + yd, x]:
  213.                     g.matrix[y, x] *= 2
  214.                     g.matrix[y + yd, x] = 0
  215.                     g.up() if k == Qt.Key_Up else g.down()
  216.         g.additem()
  217.         self.setvalues()
  218.  
  219.     def leftright(self, k):
  220.         if k == Qt.Key_Left:
  221.             xrange = range(g.size - 1)
  222.             xd = 1
  223.             g.left()
  224.         elif k == Qt.Key_Right:
  225.             xrange = range(g.size - 1, 0, -1)
  226.             xd = -1
  227.             g.right()
  228.         for y in range(g.size):
  229.             for x in xrange:
  230.                 if g.matrix[y, x] == g.matrix[y, x + xd]:
  231.                     g.matrix[y, x] *= 2
  232.                     g.matrix[y, x + xd] = 0
  233.                     g.left() if k == Qt.Key_Left else g.right()
  234.         g.additem()
  235.         self.setvalues()
  236.  
  237.     @staticmethod
  238.     def islegal(k):
  239.         if k == Qt.Key_Up:
  240.             xrange = range(g.size)
  241.             yrange = range(g.size - 1, 0, -1)
  242.             xd = 0
  243.             yd = -1
  244.         elif k == Qt.Key_Down:
  245.             xrange = range(g.size)
  246.             yrange = range(g.size - 1)
  247.             xd = 0
  248.             yd = 1
  249.         elif k == Qt.Key_Left:
  250.             yrange = range(g.size)
  251.             xrange = range(g.size - 1, 0, -1)
  252.             yd = 0
  253.             xd = -1
  254.         elif k == Qt.Key_Right:
  255.             yrange = range(g.size)
  256.             xrange = range(g.size - 1)
  257.             yd = 0
  258.             xd = 1
  259.  
  260.         for x in xrange:
  261.             for y in yrange:
  262.                 if g.matrix[y, x]:
  263.                     if g.matrix[y + yd, x + xd] == 0 or g.matrix[y + yd, x + xd] == g.matrix[y, x]:
  264.                         return True
  265.         return False
  266.  
  267. w = Window()
  268. sys.exit(a.exec())
Advertisement
Add Comment
Please, Sign In to add comment