jotto

Untitled

Apr 4th, 2015
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.01 KB | None | 0 0
  1. import numpy as np
  2. import sys
  3.  
  4. from random import randint
  5. from PyQt4.QtGui import *
  6. from PyQt4.QtCore import *
  7.  
  8. a = QApplication(sys.argv)
  9. l = Qt.Key_Left
  10. r = Qt.Key_Right
  11. u = Qt.Key_Up
  12. d = Qt.Key_Down
  13. arrows = (l, u, r, d)
  14.  
  15.  
  16. class Game():
  17.     def __init__(self):
  18.         self.resetgame()
  19.  
  20.     size = 4
  21.     matrix = []
  22.  
  23.     def resetgame(self):
  24.         self.matrix = np.zeros((self.size, self.size), dtype=np.int)
  25.         self.add_element()
  26.         self.add_element()
  27.  
  28.     def add_element(self):
  29.         temp2 = randint(0, 9)
  30.         x = randint(0, self.size - 1)
  31.         y = randint(0, self.size - 1)
  32.         if self.matrix[y, x] == 0:
  33.             self.matrix[y, x] = 4 if temp2 == 0 else 2
  34.         else:
  35.             self.add_element()
  36.  
  37.     def move_elements(self, arr) -> np.matrix:
  38.         for x in range(self.size):
  39.             temp = 0
  40.             for y in range(self.size):
  41.                 if not arr[y, x] == 0:
  42.                     arr[temp, x] = arr[y, x]
  43.                     if not temp == y:
  44.                         arr[y, x] = 0
  45.                     temp += 1
  46.         return arr
  47.  
  48. g = Game()
  49.  
  50.  
  51. class Window(QWidget):
  52.     def __init__(self):
  53.         super(Window, self).__init__()
  54.         self.init_ui()
  55.         self.set_values()
  56.         self.setStyleSheet("QWidget {"
  57.                            "background-color: #bbada0;}")
  58.  
  59.     bestscore = 0
  60.     scoreval = 0
  61.     score = None
  62.     best = None
  63.     grid = QGridLayout()
  64.     table = []
  65.     color = {0:     "#ccc0b3;",
  66.              2:     "#eee4da;",
  67.              4:     "#EDE0C8;",
  68.              8:     "#F2B179;",
  69.              16:    "#F59563;",
  70.              32:    "#F67C5F;",
  71.              64:    "#F65E3B;",
  72.              128:   "#EDCE70;",
  73.              256:   "#EDCC63;",
  74.              512:   "#ECC850;",
  75.              1024:  "#ECC850;",
  76.              2048:  "#EDC22E;",
  77.              1:     "#000;"}
  78.     ct = {0:     "black;",
  79.           2:     "black;",
  80.           4:     "black;",
  81.           8:     "white;",
  82.           16:    "white;",
  83.           32:    "white;",
  84.           64:    "white;",
  85.           128:   "white;",
  86.           256:   "white;",
  87.           512:   "white;",
  88.           1024:  "white;",
  89.           2048:  "white;"}
  90.  
  91.     def set_score(self):
  92.         self.scoreval = 0
  93.         for x in range(g.size):
  94.             for y in range(g.size):
  95.                 if g.matrix[y, x] > 2:
  96.                     self.scoreval += g.matrix[y, x] * (np.log(g.matrix[y, x])/np.log(2) - 1)
  97.  
  98.     def reset(self):
  99.         self.scoreval = 0
  100.         g.resetgame()
  101.         self.set_values()
  102.         self.setFocus()
  103.  
  104.     def init_ui(self):
  105.         self.resize(g.size*112.5, g.size*125)
  106.         self.setMaximumSize(g.size*112.5, g.size*125)
  107.         self.setMinimumSize(g.size*112.5, g.size*125)
  108.         self.setWindowTitle("2048")
  109.         self.show()
  110.         self.setLayout(self.grid)
  111.  
  112.         self.best = QLabel("Best:\n%s" % self.bestscore)
  113.         self.best.setFixedHeight(50)
  114.         self.best.setFixedWidth(100)
  115.         self.best.setAlignment(Qt.AlignCenter)
  116.         self.best.setStyleSheet("QLabel {"
  117.                                 "color: #fff;"
  118.                                 "font-size: 15px;"
  119.                                 "border-radius: 5px;"
  120.                                 "background-color: #000;"
  121.                                 "font-family: Arial Black;"
  122.                                 "}")
  123.         self.grid.addWidget(self.best, 0, 1, 1, g.size/2)
  124.  
  125.         self.score = QLabel("Score:\n0")
  126.         self.score.setFixedHeight(50)
  127.         self.score.setFixedWidth(100)
  128.         self.score.setAlignment(Qt.AlignCenter)
  129.         self.score.setStyleSheet("QLabel {"
  130.                                  "color: #fff;"
  131.                                  "font-size: 15px;"
  132.                                  "border-radius: 5px;"
  133.                                  "background-color: #000;"
  134.                                  "font-family: Arial Black;"
  135.                                  "}")
  136.         self.grid.addWidget(self.score, 0, 0, 1, g.size/2)
  137.  
  138.         restart = QPushButton("Restart")
  139.         restart.clicked.connect(self.reset)
  140.         restart.setFixedWidth(g.size*50 + (g.size/2 - 1)*5)
  141.         restart.setFixedHeight(50)
  142.         restart.setStyleSheet("QPushButton {"
  143.                               "color: #fff;"
  144.                               "font-size: 15px;"
  145.                               "border-radius: 5px;"
  146.                               "background-color: #000;"
  147.                               "font-family: Arial Black;"
  148.                               "}")
  149.         self.grid.addWidget(restart, 0, g.size/2, 1, g.size/2)
  150.  
  151.         label_temp = []
  152.         k = 0
  153.         for m in range(g.size):
  154.             for n in range(g.size):
  155.                 if not k % g.size:
  156.                     self.table.append(label_temp)
  157.                     label_temp = []
  158.                     k = 0
  159.                 label_temp.append(QLabel('0'))
  160.                 label_temp[k].setFixedWidth(100)
  161.                 label_temp[k].setAlignment(Qt.AlignCenter)
  162.                 self.grid.addWidget(label_temp[k], m + 1, n)
  163.                 k += 1
  164.         self.table.append(label_temp)
  165.         self.table.pop(0)
  166.  
  167.     def set_values(self):
  168.         for m in range(g.size):
  169.             for n in range(g.size):
  170.                 self.table[m][n].setText(str(g.matrix[m, n]) if g.matrix[m, n] > 0 else " ")
  171.                 try:
  172.                     self.table[m][n].setStyleSheet("QLabel {"
  173.                                                    "color: %s;"
  174.                                                    "font-size: 35px;"
  175.                                                    "border-radius: %spx;"
  176.                                                    "font-family: Arial Black;"
  177.                                                    "background-color: %s"
  178.                                                    "}"
  179.                                                    % (self.ct[g.matrix[m, n]], g.size*12.5, self.color[g.matrix[m, n]]))
  180.                 except KeyError:
  181.                     self.table[m][n].setStyleSheet("QLabel {"
  182.                                                    "color: white;"
  183.                                                    "font-size: 35px;"
  184.                                                    "border-radius: %spx;"
  185.                                                    "font-family: Arial Black;"
  186.                                                    "background-color: %s"
  187.                                                    "}"
  188.                                                    % (g.size*12.5, self.color[1]))
  189.  
  190.         self.set_score()
  191.         self.score.setText("Score:\n%s" % int(self.scoreval))
  192.  
  193.         if self.bestscore < self.scoreval:
  194.             self.bestscore = self.scoreval
  195.             self.best.setText("Best:\n%s" % int(self.bestscore))
  196.  
  197.     def keyPressEvent(self, k):
  198.         k = k.key()
  199.         if not any(self.is_legal(x) for x in arrows) and g.matrix.all():
  200.             msbx = QMessageBox()
  201.             msbx.setText("You won!")
  202.             msbx.setWindowTitle("End")
  203.             msbx.setStandardButtons(QMessageBox.Ok)
  204.             msbx.show()
  205.             msbx.exec_()
  206.  
  207.         self.sum(k) if any(k == x for x in arrows) else None
  208.  
  209.         if k == Qt.Key_A:
  210.             ai()
  211.         if k == Qt.Key_R:
  212.             self.reset()
  213.         if k == Qt.Key_T:
  214.             test()
  215.  
  216.     def sum(self, k):
  217.         if not self.is_legal(k):
  218.             return
  219.         arr = g.matrix
  220.         arr = np.flipud(arr) if k == d else np.rot90(arr, -1) if k == l else np.rot90(arr, 1) if k == r else arr
  221.         arr = g.move_elements(arr)
  222.         for x in range(g.size):
  223.             for y in range(g.size - 1):
  224.                 if arr[y, x] == arr[y + 1, x]:
  225.                     arr[y, x] *= 2
  226.                     arr[y + 1, x] = 0
  227.                     arr = g.move_elements(arr)
  228.         g.matrix = np.flipud(arr) if k == d else np.rot90(arr, 1) if k == l else np.rot90(arr, -1) if k == r else arr
  229.         g.add_element()
  230.         self.set_values()
  231.  
  232.     @staticmethod
  233.     def is_legal(k):
  234.         arr = g.matrix
  235.         arr = np.flipud(arr) if k == u else np.rot90(arr, -1) if k == r else np.rot90(arr, 1) if k == l else arr
  236.         for x in range(g.size):
  237.             for y in range(g.size - 1):
  238.                 if arr[y, x] and (arr[y + 1, x] == 0 or arr[y + 1, x] == arr[y, x]):
  239.                     return True
  240.         return False
  241.  
  242. w = Window()
  243.  
  244.  
  245. def test():
  246.     def no_updown() -> int:
  247.         count = 0
  248.         arr = g.matrix
  249.         arr = g.move_elements(arr)
  250.         for x in range(g.size):
  251.             for y in range(g.size - 1):
  252.                 if arr[y, x] == arr[y + 1, x] and arr[y, x] > 0:
  253.                     arr[y, x] *= 2
  254.                     arr[y + 1, x] = 0
  255.                     count += 1
  256.         return count
  257.  
  258.     def no_leftright() -> int:
  259.         count = 0
  260.         arr = g.matrix
  261.         arr = np.rot90(arr, -1)
  262.         arr = g.move_elements(arr)
  263.         for x in range(g.size):
  264.             for y in range(g.size - 1):
  265.                 if arr[y, x] == arr[y + 1, x] and arr[y, x] > 0:
  266.                     arr[y, x] *= 2
  267.                     arr[y + 1, x] = 0
  268.                     count += 1
  269.         return count
  270.     print(no_updown())
  271.     print(no_leftright())
  272.  
  273.  
  274. def ai():
  275.     end = False
  276.     while 1:
  277.         def no_updown() -> int:
  278.             count = 0
  279.             arr = g.matrix
  280.             arr = g.move_elements(arr)
  281.             for x in range(g.size):
  282.                 for y in range(g.size - 1):
  283.                     if arr[y, x] == arr[y + 1, x] and arr[y, x] > 0:
  284.                         arr[y, x] *= 2
  285.                         arr[y + 1, x] = 0
  286.                         count += 1
  287.             return count
  288.  
  289.         def no_leftright() -> int:
  290.             count = 0
  291.             arr = g.matrix
  292.             arr = np.rot90(arr, -1)
  293.             arr = g.move_elements(arr)
  294.             for x in range(g.size):
  295.                 for y in range(g.size - 1):
  296.                     if arr[y, x] == arr[y + 1, x] and arr[y, x] > 0:
  297.                         arr[y, x] *= 2
  298.                         arr[y + 1, x] = 0
  299.                         count += 1
  300.             return count
  301.  
  302.         if no_updown() > no_leftright():
  303.             if w.is_legal(u):
  304.                 w.sum(u)
  305.             elif w.is_legal(d):
  306.                 w.sum(d)
  307.         elif no_leftright() > no_updown():
  308.             if w.is_legal(l):
  309.                 w.sum(l)
  310.             elif w.is_legal(r):
  311.                 w.sum(r)
  312.         else:
  313.             if w.is_legal(u):
  314.                 w.sum(u)
  315.             elif w.is_legal(l):
  316.                 w.sum(l)
  317.             elif w.is_legal(d):
  318.                 w.sum(d)
  319.             elif w.is_legal(r):
  320.                 w.sum(r)
  321.         if not any(w.is_legal(x) for x in arrows) and g.matrix.all():
  322.             for e in g.matrix.flatten():
  323.                 if e > 1023:
  324.                     end = True
  325.                 else:
  326.                     g.resetgame()
  327.         if end:
  328.             break
  329.  
  330.  
  331.  
  332. w.setFocus()
  333. sys.exit(a.exec())
Advertisement
Add Comment
Please, Sign In to add comment