美文网首页Python学习资料整理python大数据 爬虫Python AI Sql
【Python】2048——初学者也能写的小游戏

【Python】2048——初学者也能写的小游戏

作者: 傻逼平台瞎几把封号 | 来源:发表于2022-01-17 19:15 被阅读0次

    2048这个游戏相信大家都有玩过吧,光玩有什么意思,咱们要用代码写出来才有意思~

    来 ,开搞!

    效果展示

    先看看效果

    代码展示

    直接上代码

    import random
    from tkinter import Frame, Label, CENTER
    
    SIZE = 400
    GRID_LEN = 4
    GRID_PADDING = 10
    
    BACKGROUND_COLOR_GAME = "#92877d"
    BACKGROUND_COLOR_CELL_EMPTY = "#9e948a"
    
    BACKGROUND_COLOR_DICT = {2: "#eee4da", 4: "#ede0c8", 8: "#f2b179",
                             16: "#f59563", 32: "#f67c5f", 64: "#f65e3b",
                             128: "#edcf72", 256: "#edcc61", 512: "#edc850",
                             1024: "#edc53f", 2048: "#edc22e",
    
                             4096: "#eee4da", 8192: "#edc22e", 16384: "#f2b179",
                             32768: "#f59563", 65536: "#f67c5f", }
    
    CELL_COLOR_DICT = {2: "#776e65", 4: "#776e65", 8: "#f9f6f2", 16: "#f9f6f2",
                       32: "#f9f6f2", 64: "#f9f6f2", 128: "#f9f6f2",
                       256: "#f9f6f2", 512: "#f9f6f2", 1024: "#f9f6f2",
                       2048: "#f9f6f2",
    
                       4096: "#776e65", 8192: "#f9f6f2", 16384: "#776e65",
                       32768: "#776e65", 65536: "#f9f6f2", }
    
    FONT = ("Verdana", 40, "bold")
    
    KEY_UP_ALT = "\'\\uf700\'"
    KEY_DOWN_ALT = "\'\\uf701\'"
    KEY_LEFT_ALT = "\'\\uf702\'"
    KEY_RIGHT_ALT = "\'\\uf703\'"
    
    KEY_UP = "'w'"
    KEY_DOWN = "'s'"
    KEY_LEFT = "'a'"
    KEY_RIGHT = "'d'"
    KEY_BACK = "'b'"
    
    KEY_J = "'j'"
    KEY_K = "'k'"
    KEY_L = "'l'"
    KEY_H = "'h'"
    
    def new_game(n):
        matrix = []
    
        for i in range(n):
            matrix.append([0] * n)
        return matrix
    
    def add_two(mat):
        a = random.randint(0, len(mat)-1)
        b = random.randint(0, len(mat)-1)
        while(mat[a][b] != 0):
            a = random.randint(0, len(mat)-1)
            b = random.randint(0, len(mat)-1)
        mat[a][b] = 2
        return mat
    
    def game_state(mat):
        for i in range(len(mat)):
            for j in range(len(mat[0])):
                if mat[i][j] == 2048:
                    return 'win'
        for i in range(len(mat)-1):
    
            for j in range(len(mat[0])-1):
                if mat[i][j] == mat[i+1][j] or mat[i][j+1] == mat[i][j]:
                    return 'not over'
        for i in range(len(mat)):
            for j in range(len(mat[0])):
                if mat[i][j] == 0:
                    return 'not over'
        for k in range(len(mat)-1):
            if mat[len(mat)-1][k] == mat[len(mat)-1][k+1]:
                return 'not over'
        for j in range(len(mat)-1):
            if mat[j][len(mat)-1] == mat[j+1][len(mat)-1]:
                return 'not over'
        return 'lose'
    
    def reverse(mat):
        new = []
        for i in range(len(mat)):
            new.append([])
            for j in range(len(mat[0])):
                new[i].append(mat[i][len(mat[0])-j-1])
        return new
    
    def transpose(mat):
        new = []
        for i in range(len(mat[0])):
            new.append([])
            for j in range(len(mat)):
                new[i].append(mat[j][i])
        return new
    
    def cover_up(mat):
        new = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        done = False
        for i in range(4):
            count = 0
            for j in range(4):
                if mat[i][j] != 0:
                    new[i][count] = mat[i][j]
                    if j != count:
                        done = True
                    count += 1
        return (new, done)
    
    def merge(mat,scores):
        done = False
        for i in range(4):
            for j in range(3):
                if mat[i][j] == mat[i][j+1] and mat[i][j] != 0:
                    mat[i][j] *= 2
                    mat[i][j+1] = 0
                    scores += 1
                    done = True
        return (mat, done,scores)
    
    def up(game,scores):
        print("up")
        # return matrix after shifting up
        game = transpose(game)
        game, done = cover_up(game)
        temp = merge(game,scores)
        game = temp[0]
        done = done or temp[1]
        scores = temp[2]
        game = cover_up(game)[0]
        game = transpose(game)
        return (game, done, scores)
    
    def down(game,scores):
        print("down")
        game = reverse(transpose(game))
        game, done = cover_up(game)
        temp = merge(game,scores)
        game = temp[0]
        done = done or temp[1]
        scores = temp[2]
        game = cover_up(game)[0]
        game = transpose(reverse(game))
        return (game, done, scores)
    
    def left(game,scores):
        print("left")
        # return matrix after shifting left
        game, done = cover_up(game)
        temp = merge(game,scores)
        game = temp[0]
        done = done or temp[1]
        scores = temp[2]
        game = cover_up(game)[0]
        return (game, done, scores)
    
    def right(game, scores):
        print("right")
        # return matrix after shifting right
        game = reverse(game)
        game, done = cover_up(game)
        temp = merge(game, scores)
        game = temp[0]
        done = done or temp[1]
        scores = temp[2]
        game = cover_up(game)[0]
        game = reverse(game)
        return (game, done, scores)
    
    class GameGrid(Frame):
        def __init__(self):
            Frame.__init__(self)
    
            self.grid()
            self.master.title('2048')
            self.master.bind("<Key>", self.key_down)
            self.scores = 0
            # self.gamelogic = gamelogic
            self.commands = {KEY_UP: up, KEY_DOWN: down,
                             KEY_LEFT: left, KEY_RIGHT: right,
                             KEY_UP_ALT: up, KEY_DOWN_ALT: down,
                             KEY_LEFT_ALT: left, KEY_RIGHT_ALT: right,
                             KEY_H: left, KEY_L: right,
                             KEY_K: up, KEY_J: down}
    
            self.grid_cells = []
            self.init_grid()
            self.init_matrix()
            self.update_grid_cells()
    
            self.mainloop()
    
        def init_grid(self):
            background = Frame(self, bg=BACKGROUND_COLOR_GAME,
                               width=SIZE, height=SIZE)
            background.grid()
    
            for i in range(GRID_LEN):
                grid_row = []
                for j in range(GRID_LEN):
                    cell = Frame(background, bg=BACKGROUND_COLOR_CELL_EMPTY,
                                 width=SIZE / GRID_LEN,
                                 height=SIZE / GRID_LEN)
                    cell.grid(row=i, column=j, padx=GRID_PADDING,
                              pady=GRID_PADDING)
                    t = Label(master=cell, text="",
                              bg=BACKGROUND_COLOR_CELL_EMPTY,
                              justify=CENTER, font=FONT, width=5, height=2)
                    t.grid()
                    grid_row.append(t)
    
                self.grid_cells.append(grid_row)
    
        def gen(self):
            return random.randint(0, GRID_LEN - 1)
    
        def init_matrix(self):
            self.matrix = new_game(4)
            self.history_matrixs = list()
            self.matrix = add_two(self.matrix)
            self.matrix = add_two(self.matrix)
    
        def update_grid_cells(self):
            for i in range(GRID_LEN):
                for j in range(GRID_LEN):
                    new_number = self.matrix[i][j]
                    if new_number == 0:
                        self.grid_cells[i][j].configure(
                            text="", bg=BACKGROUND_COLOR_CELL_EMPTY)
                    else:
                        self.grid_cells[i][j].configure(text=str(
                            new_number), bg=BACKGROUND_COLOR_DICT[new_number],
                            fg=CELL_COLOR_DICT[new_number])
            self.update_idletasks()
    
        def key_down(self, event):
            key = repr(event.char)
            if key == KEY_BACK and len(self.history_matrixs) > 1:
                self.matrix = self.history_matrixs.pop()
                self.update_grid_cells()
                print('back on step total step:', len(self.history_matrixs))
            elif key in self.commands:
                self.matrix, done,self.scores = self.commands[repr(event.char)](self.matrix,self.scores)
                if done:
                    self.matrix = add_two(self.matrix)
                    # record last move
                    self.history_matrixs.append(self.matrix)
                    self.update_grid_cells()
                    done = False
                    if game_state(self.matrix) == 'win':
                        self.grid_cells[1][1].configure(
                            text="You", bg=BACKGROUND_COLOR_CELL_EMPTY)
                        self.grid_cells[1][2].configure(
                            text="Win!", bg=BACKGROUND_COLOR_CELL_EMPTY)
                        self.grid_cells[2][1].configure(
                            text="scores", bg=BACKGROUND_COLOR_CELL_EMPTY)
                        self.grid_cells[2][2].configure(
                            text=self.scores, bg=BACKGROUND_COLOR_CELL_EMPTY)
                    if game_state(self.matrix) == 'lose':
                        self.grid_cells[1][1].configure(
                            text="You", bg=BACKGROUND_COLOR_CELL_EMPTY)
                        self.grid_cells[1][2].configure(
                            text="Lose!", bg=BACKGROUND_COLOR_CELL_EMPTY)
                        self.grid_cells[2][1].configure(
                            text="scores", bg=BACKGROUND_COLOR_CELL_EMPTY)
                        self.grid_cells[2][2].configure(
                            text=self.scores, bg=BACKGROUND_COLOR_CELL_EMPTY)
    
        def generate_next(self):
            index = (self.gen(), self.gen())
            while self.matrix[index[0]][index[1]] != 0:
                index = (self.gen(), self.gen())
            self.matrix[index[0]][index[1]] = 2
            self.scores += 1
    
    gamegrid = GameGrid()
    
    

    相关文章

      网友评论

        本文标题:【Python】2048——初学者也能写的小游戏

        本文链接:https://www.haomeiwen.com/subject/zipchrtx.html