目录

一、前言

二、通关小诀窍

1、游戏规则介绍

2、基于规则的一种相对全局最优方法

三、游戏复现

1、编程环境介绍

2、tkinter介绍

3、编程复现游戏效果

四、尾声及附录代码

1、尾声

2、附录代码


一、前言

昨天晚上8点半左右(10月21日),我打开微信看消息,马上我在CSDN官方群里面发现了下图所示的小游戏。主要是下方还有一个分数排行,这立刻就激发了我的直男的好胜心,开始了肝分数,并且在玩了大概20次后发现了玩这个小游戏的诀窍。在把自己的排名刷到30多后,花了一晚上复现了这个小游戏。下面是我自己总结的小游戏通关秘诀以及我自己复现的2048小游戏代码。

玩20多次后分数

二、通关小诀窍

1、游戏规则介绍

官方提供的是一个4*4的方格,并且刚开始会随机生成2和4两个数字,并在随后的移动方块过程中在空白处出现2和4,因为数字的大小是随机的所以要分数高我们就要建立一种全局最优的思维。

2、基于规则的一种相对全局最优方法

我的思路就是过滤处理,把数字比较大的都往同一行挤,这样就有更大的几率生成更大的数字。采用这种策略最起码是5000分朝上,具体操作看下面的视频。

官方2048游戏体验

三、游戏复现

1、编程环境介绍

复现游戏用到的工具:vscode+python3.6+Python 自带的tkinter库

2、tkinter介绍

Tkinter(即 tk interface) 是 Python 标准 GUI 库,简称 “Tk”;从本质上来说,它是对 TCL/TK 工具包的一种 Python 接口封装。Tkinter 是 Python 自带的标准库,因此无须另行安装,它支持跨平台运行,不仅可以在 Windows 平台上运行,还支持在 Linux 和 Mac 平台上运行。我这里就是在Linux环境下运行的。
      Tkinter 编写的程序,也称为 GUI 程序,GUI (Graphical User Interface)指的是“图形用户界面”,它是计算机图形学(CG)的一门分支,主要研究如何在计算机中表示图形,以及利用计算机进行图形的计算、处理和显示等相关工作。

3、编程复现游戏效果

代码及游戏界面

我设置的游戏界面和官方基本是一模一样的,就是缺少一个加分特效以及分数显示。键盘的w、a、s、d按键分别代表上滑、左滑、下滑、右滑。点击按键后终端会显示对应的操作。

四、尾声及附录代码

1、尾声

1024程序员节对广大程序员来说真的很有意义,我们程序员的生活可不止单纯枯燥的代码,代码实现以及解决的是现实生活中实际存在的问题,有实际问题作为驱动,必然是烧脑且极富创造力的事情。世界越来越离不开代码、世界越来越需要代码。有码走遍天下、无码寸步难行。世界在被代码改变着、而我们在创造着代码。加油各种改变世界的程序员!!!

2、附录代码

import random
from tkinter import Frame, Label, CENTER#游戏环境设置
SIZE = 401
GRID_LEN = 4
GRID_PADDING = 10BACKGROUND_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 matrixdef 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] = 2return matdef 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 newdef 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 newdef cover_up(mat):new = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]done = Falsefor i in range(4):count = 0for j in range(4):if mat[i][j] != 0:new[i][count] = mat[i][j]if j != count:done = Truecount += 1return (new, done)#分数设置
def merge(mat,scores):done = Falsefor 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] *= 2mat[i][j+1] = 0scores += 1done = Truereturn (mat, done,scores)#方向控制
def up(game,scores):print("up")# return matrix after shifting upgame = 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 leftgame, 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 rightgame = 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 = gamelogicself.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 moveself.history_matrixs.append(self.matrix)self.update_grid_cells()done = Falseif 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]] = 2self.scores += 1gamegrid = GameGrid()

CSDN官方2048小游戏通关秘诀及复现相关推荐

  1. 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...

  2. python里graphics的使用_使用graphics.py实现2048小游戏

    1.过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大.正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN ...

  3. C语言编写2048小游戏

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992424 2 ...

  4. Pygame实战:升级后的2048小游戏—解锁新花样 根本停不下来

    导语 "嗨嗨嗨!别睡了,醒醒醒醒!该干活儿了~" by--梦雅! ​ "刚睡醒,大佬你有什么事儿吖?" by--全体成员! 上期给大家分享的超详细--简易版本的 ...

  5. 2048小游戏设计思路

    2048小游戏设计思路: 游戏初始截图: 游戏过程中截图: 游戏失败截图: 部分代码: <!DOCTYPE html><html> <head><meta h ...

  6. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  7. JAVA实现2048小游戏

    2048小游戏也算是一款好玩的益智休闲小游戏,下面本博主用 java 语言将该游戏复现,感兴趣的小伙伴点击 关注 哦! 同时博主还用 python 语言复现了该游戏,可点击以下链接浏览博主的另一篇文章 ...

  8. Pygame实战:升级后的2048小游戏—解锁新花样,根本停不下来【附源码】

    导语 "嗨嗨嗨!别睡了,醒醒醒醒!该干活儿了~" by--顾木子吖! "刚睡醒,大佬你有什么事儿吖?" by--全体成员! 上期给大家分享的超详细--简易版本的 ...

  9. 安装Docker,在本机上跑一个‘2048’小游戏(脉冲云在线体验)

    安装Docker,在本机上跑一个'2048'小游戏 脉冲云–让软件开发效率提升十倍.在线免费体验   下面的步骤是在本机上运行的,也可以免费在脉冲云官网上部署一个在线的'2048'小游戏体验一下. 1 ...

最新文章

  1. xcode6 AsynchronousTesting 异步任务测试
  2. boost:验证BOOST_CONCEPT_ASSERT捕获了错误
  3. stream的常见方法操作(亲测)
  4. Python __str__() 方法
  5. 学习大数据需要的基础
  6. linux 设置pip 镜像 Pip Warning:–trusted-host 问题解决方案
  7. 从二进制数据流中构造GDAL可以读取的图像数据
  8. 缓存在哪里_蚂蚁金服中间件(4轮题目):MVCC+缓存穿透+悲观锁+NIO+负载均衡等
  9. Oracle将Java EE移交Eclipse基金会
  10. java一元稀多项式_数据结构之线性表- 一元稀疏多项式计算器
  11. [php]php内存管理
  12. shell 截取ip地址最后一位_shell脚本获取IP地址段的方法
  13. win10新建文件夹必须刷新才能显示
  14. Matlab数理统计工具箱应用简介(转)
  15. windowspythonpygame安装_pygame安装(windows pycharm)
  16. 如何使用Pip卸载软件包?
  17. 【论文写作技巧】Endnote参考文献统一输出格式
  18. php yi ju hua,汉音对照 这句话应该如何翻译? zhe ju hua ying gai ru he fan yi ? - 王朝网络 - wangchao.net.cn...
  19. 二维码推广方法20种
  20. 分布式爬虫联系项目1–阳光热线网站的分布式爬取

热门文章

  1. 【python中的eval(),exec()及相关函数】
  2. Mysql 系列2 一 explan
  3. 【C语言进阶】详解C语言动态内存管理
  4. 洛谷3953:逛公园——题解
  5. ocv特性_基于SOC-OCV曲线特征的SOH估计方法研究
  6. java精选面试题(强烈安利)
  7. 第4章 SQL SELECT 语句教程
  8. DNS攻击原理与防范!!(转载:月光博客)
  9. android 的交叉编译连,Android交叉编译busybox 1.8,dropbear 0.53
  10. 《源代码》:不太严谨的科学,完美的故事