jotto

Untitled

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