智一面的面试题提供python的测试题
高手真是太多了,居然用python实现了2048,我就直接上代码吧

 
  1. import random
  2. from sys import exit
  3. from copy import deepcopy
  4. import pygame
  5. from pygame.locals import *
  6.  
  7. board = [[0, 0, 0, 0],
  8.          [0, 0, 0, 0],
  9.          [0, 0, 0, 0],
  10.          [0, 0, 0, 0]]
  11.  
  12. pygame.init()
  13.  
  14. box_size = 50
  15. box_gap  = 5
  16. top_of_screen = 100
  17. bottom_of_screen = 30
  18. left_of_screen = 20
  19. screen_width  = box_size * 4 + box_gap * 5 + left_of_screen * 2
  20. screen_height = top_of_screen + box_gap * 5 + box_size * 4 + left_of_screen + bottom_of_screen
  21. screen = pygame.display.set_mode((screen_width, screen_height), 0, 32)
  22. pygame.display.set_caption("2048")
  23. background = pygame.image.load('background.png').convert()
  24. score = 0
  25.  
  26. OLDLACE    = pygame.color.THECOLORS["oldlace"]
  27. IVORY   = pygame.color.THECOLORS["ivory3"]
  28. BLACK   = pygame.color.THECOLORS["black"]
  29. RED     = pygame.color.THECOLORS["red"]
  30. RED2    = pygame.color.THECOLORS["red2"]
  31. DARKGOLD  = pygame.color.THECOLORS["darkgoldenrod1"]
  32. GOLD    =  pygame.color.THECOLORS["gold"]
  33. GRAY    = pygame.color.THECOLORS["gray41"]
  34. CHOCOLATE = pygame.color.THECOLORS["chocolate"]
  35. CHOCOLATE1 = pygame.color.THECOLORS["chocolate1"]
  36. CORAL   = pygame.color.THECOLORS["coral"]
  37. CORAL2  = pygame.color.THECOLORS["coral2"]
  38. ORANGED = pygame.color.THECOLORS["orangered"]
  39. ORANGED2 = pygame.color.THECOLORS["orangered2"]
  40. DARKORANGE = pygame.color.THECOLORS["darkorange"]
  41. DARKORANGE2 = pygame.color.THECOLORS["darkorange2"]
  42. FORESTGREEN = pygame.color.THECOLORS['forestgreen']
  43.  
  44.  
  45. class Box:
  46.     def __init__(self, topleft, text, color):
  47.         self.topleft = topleft
  48.         self.text = text
  49.         self.color = color
  50.     def render(self, surface):
  51.         x, y = self.topleft
  52.         pygame.draw.rect(surface, self.color, (x, y, box_size, box_size))
  53.         text_height  = int(box_size * 0.35)
  54.         font_obj     = pygame.font.Font("FreeSansBold.ttf", text_height)
  55.         text_surface = font_obj.render(self.text, True, BLACK)
  56.         text_rect    = text_surface.get_rect()
  57.         text_rect.center = (x + box_size / 2, y + box_size / 2)
  58.         surface.blit(text_surface, text_rect)
  59.  
  60.  
  61. def draw_box():
  62.     global board
  63.     # colors = {0:GRAY, 2:(239, 233, 182), 4:(239, 228, 151), 8:(243, 212, 77), 16:(239, 206, 25),
  64.     #           32:(242, 157, 12), 64:(214, 214, 42), 128:(239, 207, 108), 256:(239, 207, 99),
  65.     #           512:(239, 203, 82), 1024:(239, 199, 57), 2048:(239, 195, 41), 4096:(255, 60, 57)}
  66.     colors = {0:(192, 192, 192), 2:(176, 224, 230), 4:(127, 255, 212), 8:(135, 206, 235), 16:(64, 224, 208),
  67.               32:(0, 255, 255), 64:(0, 201, 87), 128:(50, 205, 50), 256:(34, 139, 34),
  68.               512:(0, 255, 127), 1024:(61, 145, 64), 2048:(48, 128, 20), 4096:(65, 105, 255),
  69.               8192:(8, 46, 84), 16384:(11, 23, 70), 32768:(25, 25, 112), 65536:(0, 0, 255)}
  70.     x, y = left_of_screen, top_of_screen
  71.     size = box_size * 4 + box_gap * 5
  72.     pygame.draw.rect(screen, BLACK, (x, y, size, size))
  73.     x, y = x + box_gap, y + box_gap
  74.     for i in range(4):
  75.         for j in range(4):
  76.             idx = board[i][j]
  77.             if idx == 0:
  78.                 text = ""
  79.             else:
  80.                 text = str(idx)
  81.             if idx > 65536: idx = 65536
  82.             color = colors[idx]
  83.             box = Box((x, y), text, color)
  84.             box.render(screen)
  85.             x += box_size + box_gap
  86.         x = left_of_screen + box_gap
  87.         y += box_size + box_gap
  88.  
  89.  
  90. def set_random_number():
  91.     pool = []
  92.     for i in range(4):
  93.         for j in range(4):
  94.             if board[i][j] == 0:
  95.                 pool.append((i, j))
  96.     m = random.choice(pool)
  97.     pool.remove(m)
  98.     value = random.uniform(0, 1)
  99.     if value < 0.1:
  100.         value = 4
  101.     else:
  102.         value = 2
  103.     board[m[0]][m[1]] = value
  104.  
  105. def init_board():
  106.     for i in range(2):
  107.         set_random_number()
  108.  
  109. def combinate(L):
  110.     global score
  111.     ans = [0, 0, 0, 0]
  112.     num = []
  113.     for i in L:
  114.         if i != 0:
  115.             num.append(i)
  116.     length = len(num)
  117.     if length == 4:
  118.         if num[0] == num[1]:
  119.             ans[0] = num[0] + num[1]
  120.             score += ans[0]
  121.             if num[2] == num[3]:
  122.                 ans[1] = num[2] + num[3]
  123.                 score += ans[1]
  124.             else:
  125.                 ans[1] = num[2]
  126.                 ans[2] = num[3]
  127.         elif num[1] == num[2]:
  128.             ans[0] = num[0]
  129.             ans[1] = num[1] + num[2]
  130.             ans[2] = num[3]
  131.             score += ans[1]
  132.         elif num[2] == num[3]:
  133.             ans[0] = num[0]
  134.             ans[1] = num[1]
  135.             ans[2] = num[2] + num[3]
  136.             score += ans[2]
  137.         else:
  138.             for i in range(length):
  139.                 ans[i] = num[i]
  140.     elif length == 3:
  141.         if num[0] == num[1]:
  142.             ans[0] = num[0] + num[1]
  143.             ans[1] = num[2]
  144.             score += ans[0]
  145.         elif num[1] == num[2]:
  146.             ans[0] = num[0]
  147.             ans[1] = num[1] + num[2]
  148.             score += ans[1]
  149.         else:
  150.             for i in range(length):
  151.                 ans[i] = num[i]
  152.     elif length == 2:
  153.         if num[0] == num[1]:
  154.             ans[0] = num[0] + num[1]
  155.             score += ans[0]
  156.         else:
  157.             for i in range(length):
  158.                 ans[i] = num[i]
  159.     elif length == 1:
  160.         ans[0] = num[0]
  161.     else:
  162.         pass
  163.     return ans
  164.  
  165. def left():
  166.     # global score
  167.     for i in range(4):
  168.         temp = combinate(board[i])
  169.         for j in range(4):
  170.             board[i][j] = temp[j]
  171.             # score += temp[1]
  172.     # return score
  173.  
  174.    
  175. def right():
  176.     # global score
  177.     for i in range(4):
  178.         temp = combinate(board[i][::-1])
  179.         for j in range(4):
  180.             board[i][3-j] = temp[j]
  181.             # score += temp[1]
  182.     # return score
  183.  
  184. def up():
  185.     for i in range(4):
  186.         to_comb = []
  187.         for j in range(4):
  188.             to_comb.append(board[j][i])
  189.         temp = combinate(to_comb)
  190.         for k in range(4):
  191.             board[k][i] = temp[k]
  192.             # score += temp[1]
  193.     # return score
  194.  
  195. def down():
  196.     for i in range(4):
  197.         to_comb = []
  198.         for j in range(4):
  199.             to_comb.append(board[3-j][i])
  200.         temp = combinate(to_comb)
  201.         for k in range(4):
  202.             board[3-k][i] = temp[k]
  203.             # score += temp[1]
  204.     # return score
  205.  
  206. def write(msg="pygame is cool", color= BLACK, height = 14):   
  207.     #myfont = pygame.font.SysFont("None", 32) #To avoid py2exe error
  208.     myfont = pygame.font.Font("FreeSansBold.ttf", height)
  209.     mytext = myfont.render(msg, True, color)
  210.     mytext = mytext.convert_alpha()
  211.     return mytext
  212.  
  213. def is_over():
  214.     ### if 0 in board
  215.     for i in range(4):
  216.         for j in range(4):
  217.             if board[i][j] == 0:
  218.                 return False
  219.  
  220.     for i in range(4):
  221.         for j in range(3):
  222.             if board[i][j] == board[i][j+1]:
  223.                 return False
  224.  
  225.     for i in range(3):
  226.         for j in range(4):
  227.             if board[i][j] == board[i+1][j]:
  228.                 return False
  229.  
  230.     return True
  231.  
  232. def read_best():
  233.     try:
  234.         f = open('best.rec', 'r')
  235.         best = int(f.read())
  236.         f.close()
  237.     except:
  238.         best = 0
  239.     return best
  240.  
  241. def write_best(best):
  242.     try:
  243.         f = open('best.rec', 'w')
  244.         f.write(str(best))
  245.         f.close()
  246.     except IOError:
  247.         pass
  248.  
  249. def main():
  250.     global score
  251.     screen.blit(background, (0, 0))
  252.     init_board()
  253.     newboard = deepcopy(board)
  254.     gameover = is_over()
  255.    
  256.     #### test text and color in box
  257.     # for i in range(4):
  258.     #     for j in range(4):
  259.     #         board[i][j] = 2 ** (i+4*j)
  260.     # board[0][0] = 0
  261.     ### end test text and color
  262.  
  263.     draw_box()
  264.     screen.blit(write("2048", height = 40, color = GOLD), (left_of_screen, left_of_screen // 2))
  265.  
  266.     screen.blit(write("SCORE", height=14, color=FORESTGREEN), (left_of_screen+105, left_of_screen//2 + 5))
  267.     rect1 = pygame.draw.rect(screen, FORESTGREEN, (left_of_screen+100, left_of_screen//2 + 30, 60, 20))
  268.     text1 = write(str(score), height=14, color=GOLD)
  269.     text1_rect = text1.get_rect()
  270.     text1_rect.center = (left_of_screen+100+30, left_of_screen//2 + 40)
  271.     screen.blit(text1, text1_rect)
  272.  
  273.     screen.blit(write("BEST", height=14, color=FORESTGREEN), (left_of_screen+175, left_of_screen//2 + 5))
  274.     rect2 = pygame.draw.rect(screen, FORESTGREEN, (left_of_screen+165, left_of_screen//2 + 30, 60, 20))
  275.     best = read_best()
  276.     if best < score:
  277.         best = score
  278.     text2 = write(str(best), height=14, color=GOLD)
  279.     text2_rect = text2.get_rect()
  280.     text2_rect.center = (left_of_screen+165+30, left_of_screen//2 + 40)
  281.     screen.blit(text2, text2_rect)
  282.  
  283.  
  284.     screen.blit(write("Use LEFT, RIGHT, UP, DOWN", height=16, color=GRAY), (left_of_screen, screen_height - bottom_of_screen))
  285.     while True:
  286.         for event in pygame.event.get():
  287.             if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
  288.                 write_best(best)
  289.                 pygame.quit()
  290.                 exit()
  291.             elif not gameover:
  292.                 if event.type == KEYUP and event.key == K_UP:
  293.                     up()
  294.                 elif event.type == KEYUP and event.key == K_DOWN:
  295.                     down()
  296.                 elif event.type == KEYUP and event.key == K_LEFT:
  297.                     left()
  298.                 elif event.type == KEYUP and event.key == K_RIGHT:
  299.                     right()
  300.                 if newboard != board:
  301.                     set_random_number()
  302.                     newboard = deepcopy(board)
  303.                     draw_box()
  304.                 gameover = is_over()
  305.                
  306.                 rect1 = pygame.draw.rect(screen, FORESTGREEN, (left_of_screen+100, left_of_screen//2 + 30, 60, 20))
  307.                 text1 = write(str(score), height=14, color=GOLD)
  308.                 text_rect = text1.get_rect()
  309.                 text_rect.center = (left_of_screen+100+30, left_of_screen//2 + 40)
  310.                 screen.blit(text1, text_rect)
  311.  
  312.                 rect2 = pygame.draw.rect(screen, FORESTGREEN, (left_of_screen+165, left_of_screen//2 + 30, 60, 20))
  313.                 if best < score:
  314.                     best = score
  315.                 text2 = write(str(best), height=14, color=GOLD)
  316.                 text2_rect = text2.get_rect()
  317.                 text2_rect.center = (left_of_screen+165+30, left_of_screen//2 + 40)
  318.                 screen.blit(text2, text2_rect)
  319.  
  320.             else:
  321.                 write_best(best)
  322.                 screen.blit(write("Game Over!", height = 40, color = FORESTGREEN), (left_of_screen, screen_height // 2))
  323.             
  324.             
  325.         pygame.display.update()
  326.  
  327. if __name__ == "__main__":
  328.     main()
  329.     # test()
  330.     # print(combinate([4,2,2,2]))
  331.