python快速实现2048小游戏
《2048》是一款比较流行的数字游戏,最早于2014年3月20日发行。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台。这款游戏是基于《1024》和《小3传奇》的玩法开发而成的新型数字游戏。
操作指南:
每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。不断的叠加最终拼凑出2048这个数字就算成功。
游戏技巧:
最大数尽可能放在角落。
数字按顺序紧邻排列。
首先满足最大数和次大数在的那一列/行是满的。
时刻注意活动较大数(32以上)旁边要有相近的数。
以大数所在的一行为主要移动方向
不要急于“清理桌面”。
完整代码如下:
logic.py
import random
import constants as cdef new_game(n):matrix = []for i in range(n):matrix.append([0] * n)matrix = add_two(matrix)matrix = add_two(matrix)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):# check for win cellfor i in range(len(mat)):for j in range(len(mat[0])):if mat[i][j] == 2048:return 'win'# check for any zero entriesfor i in range(len(mat)):for j in range(len(mat[0])):if mat[i][j] == 0:return 'not over'# check for same cells that touch each otherfor i in range(len(mat)-1):# intentionally reduced to check the row on the right and below# more elegant to use exceptions but most likely this will be their solutionfor 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 k in range(len(mat)-1): # to check the left/right entries on the last rowif mat[len(mat)-1][k] == mat[len(mat)-1][k+1]:return 'not over'for j in range(len(mat)-1): # check up/down entries on last columnif 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 = []for j in range(c.GRID_LEN):partial_new = []for i in range(c.GRID_LEN):partial_new.append(0)new.append(partial_new)done = Falsefor i in range(c.GRID_LEN):count = 0for j in range(c.GRID_LEN):if mat[i][j] != 0:new[i][count] = mat[i][j]if j != count:done = Truecount += 1return new, donedef merge(mat, done):for i in range(c.GRID_LEN):for j in range(c.GRID_LEN-1):if mat[i][j] == mat[i][j+1] and mat[i][j] != 0:mat[i][j] *= 2mat[i][j+1] = 0done = Truereturn mat, donedef up(game):print("up")# return matrix after shifting upgame = transpose(game)game, done = cover_up(game)game, done = merge(game, done)game = cover_up(game)[0]game = transpose(game)return game, donedef down(game):print("down")# return matrix after shifting downgame = reverse(transpose(game))game, done = cover_up(game)game, done = merge(game, done)game = cover_up(game)[0]game = transpose(reverse(game))return game, donedef left(game):print("left")# return matrix after shifting leftgame, done = cover_up(game)game, done = merge(game, done)game = cover_up(game)[0]return game, donedef right(game):print("right")# return matrix after shifting rightgame = reverse(game)game, done = cover_up(game)game, done = merge(game, done)game = cover_up(game)[0]game = reverse(game)return game, done
constants.py
SIZE = 400
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_QUIT = "Escape"
KEY_BACK = "b"KEY_UP = "Up"
KEY_DOWN = "Down"
KEY_LEFT = "Left"
KEY_RIGHT = "Right"KEY_UP_ALT1 = "w"
KEY_DOWN_ALT1 = "s"
KEY_LEFT_ALT1 = "a"
KEY_RIGHT_ALT1 = "d"KEY_UP_ALT2 = "i"
KEY_DOWN_ALT2 = "k"
KEY_LEFT_ALT2 = "j"
KEY_RIGHT_ALT2 = "l"
run.py
from tkinter import Frame, Label, CENTER
import random
import logic
import constants as cdef gen():return random.randint(0, c.GRID_LEN - 1)class GameGrid(Frame):def __init__(self):Frame.__init__(self)self.grid()self.master.title('2048')self.master.bind("<Key>", self.key_down)self.commands = {c.KEY_UP: logic.up,c.KEY_DOWN: logic.down,c.KEY_LEFT: logic.left,c.KEY_RIGHT: logic.right,c.KEY_UP_ALT1: logic.up,c.KEY_DOWN_ALT1: logic.down,c.KEY_LEFT_ALT1: logic.left,c.KEY_RIGHT_ALT1: logic.right,c.KEY_UP_ALT2: logic.up,c.KEY_DOWN_ALT2: logic.down,c.KEY_LEFT_ALT2: logic.left,c.KEY_RIGHT_ALT2: logic.right,}self.grid_cells = []self.init_grid()self.matrix = logic.new_game(c.GRID_LEN)self.history_matrixs = []self.update_grid_cells()self.mainloop()def init_grid(self):background = Frame(self, bg=c.BACKGROUND_COLOR_GAME,width=c.SIZE, height=c.SIZE)background.grid()for i in range(c.GRID_LEN):grid_row = []for j in range(c.GRID_LEN):cell = Frame(background,bg=c.BACKGROUND_COLOR_CELL_EMPTY,width=c.SIZE / c.GRID_LEN,height=c.SIZE / c.GRID_LEN)cell.grid(row=i,column=j,padx=c.GRID_PADDING,pady=c.GRID_PADDING)t = Label(master=cell,text="",bg=c.BACKGROUND_COLOR_CELL_EMPTY,justify=CENTER,font=c.FONT,width=5,height=2)t.grid()grid_row.append(t)self.grid_cells.append(grid_row)def update_grid_cells(self):for i in range(c.GRID_LEN):for j in range(c.GRID_LEN):new_number = self.matrix[i][j]if new_number == 0:self.grid_cells[i][j].configure(text="",bg=c.BACKGROUND_COLOR_CELL_EMPTY)else:self.grid_cells[i][j].configure(text=str(new_number),bg=c.BACKGROUND_COLOR_DICT[new_number],fg=c.CELL_COLOR_DICT[new_number])self.update_idletasks()def key_down(self, event):key = event.keysymprint(event)if key == c.KEY_QUIT: exit()if key == c.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.commands[key](self.matrix)if done:self.matrix = logic.add_two(self.matrix)# record last moveself.history_matrixs.append(self.matrix)self.update_grid_cells()if logic.game_state(self.matrix) == 'win':self.grid_cells[1][1].configure(text="You", bg=c.BACKGROUND_COLOR_CELL_EMPTY)self.grid_cells[1][2].configure(text="Win!", bg=c.BACKGROUND_COLOR_CELL_EMPTY)if logic.game_state(self.matrix) == 'lose':self.grid_cells[1][1].configure(text="You", bg=c.BACKGROUND_COLOR_CELL_EMPTY)self.grid_cells[1][2].configure(text="Lose!", bg=c.BACKGROUND_COLOR_CELL_EMPTY)def generate_next(self):index = (gen(), gen())while self.matrix[index[0]][index[1]] != 0:index = (gen(), gen())self.matrix[index[0]][index[1]] = 2game_grid = GameGrid()
操作方式:
方向键:上下左右
26键中的:WSAD
26键中的:IKJL
ESC键退出游戏,b键返回上一步
为增加游戏可玩性,此游戏最大叠加数为65536
运行结果如下所示:
运行run.py即可开始游戏
python快速实现2048小游戏相关推荐
- python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?
前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...
- python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?
前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...
- 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...
- python里graphics的使用_使用graphics.py实现2048小游戏
1.过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大.正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN ...
- Python学习—2048小游戏等4个小练习
Python学习-2048小游戏等4个小练习 转载于:https://www.cnblogs.com/ChangAn223/p/10627777.html
- python小项目——2048小游戏(详解)
2048游戏 原版游戏地址 第一部分 导入所需要的库 第二部分 确认游戏键位设置,并和对应的操作关联 第三部分 获取用户输入的值,并直到有效键位 第四部分 对矩阵的应用,减少代码量 第五部分 创建棋盘 ...
- Python实现2048小游戏
2048小游戏也算是一款好玩的益智休闲小游戏,下面本博主用 python 语言将该游戏复现,感兴趣的小伙伴点击 关注 哦! 同时博主还用 java 语言复现了该游戏,可点击以下链接浏览博主的另一篇文章 ...
- Python小游戏——Pygame制作2048小游戏
pygame之2048小游戏 初学python,发现看网上的python理论太过枯燥. 哎嘿~~干脆直接弄个小游戏叭,一边学习,一边写代码. 备注: 1.很多地方我尽量注解,方便大家观看. 2.完整代 ...
- 一周用python完成2048小游戏
本文的大概背景,可以总结为一个非科班出身的半道子码农初学python并尝试在一周之内完成一个经典的2048小游戏,然后将这一周所学所感记录成文的非专业性文章.成文的目的只是自我总结与复习.思考而后形成 ...
最新文章
- PHP菜刀工具WebHandler
- 互联网协议 — Ethernet 局域网技术的发展
- vue项目如何部署到Tomcat中
- mysql设置唯一键
- NHibernate学习笔记(转载):many-to-one/one-to-many/many-to-many关系映射
- 单片机平台的最小偏差圆弧插补算法
- .NET Core很酷,你不得不知
- 2018 蓝桥杯省赛 A 组模拟赛(一)数列求值+推导
- ios 获取是否静音模式_果粉感动:部分iOS“新功能”早已被安卓玩坏
- ActionScript 3.0 学习笔记三
- 正则表达式符号特殊详解_常用正则表达式_Java中正则表达式的使用
- 信号量优先级反转(翻转)与优先级继承
- 定时关机 v1.0(autoshut v1.0)
- canal 使用注意事项
- 我和ASP.NET MVC有个约会
- 搭建本地LNMP开发环境(6)-配置nginx和PHP
- CCBPM 同表单分合流说明
- python模块安装位置_查看python模块的安装路径
- 【08月02日】指数估值排名
- es mapping 设置
热门文章
- HFSS学习笔记——T型波导
- DirectX 9.0 C Jun 2010 Redist, 游戏必备
- C语言程序设计 程序设计与C语言
- Excel VBA教程–如何使用Visual Basic在电子表格中编写代码
- Python——利用pygame模块制作RPG游戏(一)
- Linux 内网-局域网文件快速传输
- c语言课程设计 学生成绩管理系统
- (一)shell中常用的基础命令
- 做工控的朋友,留着可能有不时之需.2011工控破解,助你一臂之力!
- 正确处理下载文件时HTTP头的编码问题(Content-Disposition),safari下载文件 中文名乱码问题