当前位置: 首页 > news >正文

ecshop网站报价整合营销传播

ecshop网站报价,整合营销传播,排名优化公司好不好,做网站好听的域名用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!(结尾附完整代码) 简介 2048 是一个简单而又令人上瘾的数字拼图游戏。玩家通过滑动方块使相同数字的方块合并,目标是创造出数字 2048!在这篇…

用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!(结尾附完整代码)

简介

2048 是一个简单而又令人上瘾的数字拼图游戏。玩家通过滑动方块使相同数字的方块合并,目标是创造出数字 2048!在这篇博客中,我们将用 Python 的 Tkinter 库 从零开始实现这款游戏,涵盖从界面设计到逻辑实现的每一个细节,帮助你全面了解背后的开发思路。

游戏特点

  • 经典玩法:滑动合并相同数字,尽可能达到 2048。
  • 随机生成新数字:每次滑动后随机生成 2 或 4。
  • 直观的图形界面:使用 Tkinter 绘制游戏网格与方块,带来清晰的视觉效果。

开发环境准备

在开始之前,确保你的环境已安装 Python,并包含以下必要库:

pip install tk

Tkinter 是 Python 内置的 GUI 工具包,因此大多数环境无需额外安装。 

项目实现步骤

我们将按照以下步骤构建游戏:

  1. 设计网格界面
  2. 实现核心逻辑
  3. 绑定键盘事件
  4. 添加游戏结束检测
  5. 优化用户体验

1. 设计网格界面

首先,我们定义游戏的基本参数,包括网格大小、方块的尺寸、间距和颜色等。随后,通过 Tkinter 创建一个网格界面,每个格子将用矩形和文本元素表示。

import tkinter as tk
from tkinter import messagebox
import random# 常量定义
GRID_SIZE = 4  # 网格为 4x4
TILE_SIZE = 100  # 每个方块的像素大小
PADDING = 10  # 方块之间的间距
BACKGROUND_COLOR = "#92877d"
TILE_COLORS = {0: "#9e948a", 2: "#eee4da", 4: "#ede0c8",8: "#f2b179", 16: "#f59563", 32: "#f67c5f",64: "#f65e3b", 128: "#edcf72", 256: "#edcc61",512: "#edc850", 1024: "#edc53f", 2048: "#edc22e",
}# 初始化游戏界面
class Game2048:def __init__(self, master):self.master = masterself.master.title("2048")self.master.geometry(f"{GRID_SIZE * TILE_SIZE + PADDING * (GRID_SIZE + 1)}x{GRID_SIZE * TILE_SIZE + PADDING * (GRID_SIZE + 1)}")self.master.resizable(False, False)self.init_grid()self.reset_game()def init_grid(self):"""创建 4x4 网格"""self.canvas = tk.Canvas(self.master, bg=BACKGROUND_COLOR, bd=0, highlightthickness=0)self.canvas.pack(fill=tk.BOTH, expand=True)self.tiles = []for i in range(GRID_SIZE):row = []for j in range(GRID_SIZE):x1 = PADDING + j * (TILE_SIZE + PADDING)y1 = PADDING + i * (TILE_SIZE + PADDING)x2 = x1 + TILE_SIZEy2 = y1 + TILE_SIZErect = self.canvas.create_rectangle(x1, y1, x2, y2, fill=TILE_COLORS[0], outline="")text = self.canvas.create_text(x1 + TILE_SIZE // 2, y1 + TILE_SIZE // 2, text="", font=("Helvetica", 30), fill="#776e65")row.append((rect, text))self.tiles.append(row)

 运行效果:运行后你会看到一个 4x4 的灰色网格,每个格子代表一个方块。

 

2. 实现核心逻辑

游戏的逻辑主要包括:

  • 压缩和合并数字:将相邻的数字合并。
  • 滑动方向操作:实现上下左右滑动功能。
  • 随机生成新数字:在空格中随机生成 2 或 4。
压缩与合并

每次滑动操作可以拆分为两部分:压缩(去掉空格)合并(合并相邻的相同数字)

def compress(row):"""将行向左压缩,去掉 0"""new_row = [num for num in row if num != 0]new_row += [0] * (GRID_SIZE - len(new_row))return new_rowdef merge(row):"""合并相邻相同的数字"""for i in range(len(row) - 1):if row[i] == row[i + 1] and row[i] != 0:row[i] *= 2row[i + 1] = 0return row
滑动操作

根据方向执行不同操作(上下左右)。

def move_left(grid):"""左移操作"""new_grid = []for row in grid:compressed_row = compress(row)merged_row = merge(compressed_row)new_grid.append(compress(merged_row))return new_grid
随机生成数字

每次滑动后随机选择一个空格,填入 2 或 4。

def spawn_new_tile(grid):"""随机生成一个新的数字方块(2 或 4)"""empty_cells = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if grid[i][j] == 0]if empty_cells:i, j = random.choice(empty_cells)grid[i][j] = 2 if random.random() < 0.9 else 4

3. 绑定键盘事件

为了让游戏动起来,我们需要捕获用户的按键(上下左右方向键),并根据按键更新网格状态。

def key_press(event):"""处理键盘输入"""key = event.keysymif key in ["Up", "Down", "Left", "Right"]:if key == "Up":game.grid = move_left(rotate_left(game.grid))game.grid = rotate_right(game.grid)elif key == "Down":game.grid = move_left(rotate_right(game.grid))game.grid = rotate_left(game.grid)elif key == "Left":game.grid = move_left(game.grid)elif key == "Right":game.grid = move_left(reverse_rows(game.grid))game.grid = reverse_rows(game.grid)spawn_new_tile(game.grid)game.update_ui()if is_game_over(game.grid):messagebox.showinfo("Game Over", "No more moves left!")

4. 添加游戏结束检测

当所有格子都被填满且没有可合并的数字时,游戏结束。

def is_game_over(grid):"""判断是否还有有效操作"""for i in range(GRID_SIZE):for j in range(GRID_SIZE):if grid[i][j] == 0:  # 空格存在return Falseif j + 1 < GRID_SIZE and grid[i][j] == grid[i][j + 1]:  # 横向可合并return Falseif i + 1 < GRID_SIZE and grid[i][j] == grid[i + 1][j]:  # 纵向可合并return Falsereturn True

5. 完整代码

将上述代码整合的完整代码如下:运行后即可得到完整的 2048 游戏!

import tkinter as tk
from tkinter import messagebox
import random# 常量定义
GRID_SIZE = 4
TILE_SIZE = 100
PADDING = 10
BACKGROUND_COLOR = "#92877d"
TILE_COLORS = {0: "#9e948a", 2: "#eee4da", 4: "#ede0c8",8: "#f2b179", 16: "#f59563", 32: "#f67c5f",64: "#f65e3b", 128: "#edcf72", 256: "#edcc61",512: "#edc850", 1024: "#edc53f", 2048: "#edc22e",
}class Game2048:def __init__(self, master):self.master = masterself.master.title("2048")self.master.geometry(f"{GRID_SIZE * TILE_SIZE + PADDING * (GRID_SIZE + 1)}x{GRID_SIZE * TILE_SIZE + PADDING * (GRID_SIZE + 1)}")self.master.resizable(False, False)self.init_grid()self.reset_game()def init_grid(self):"""初始化网格界面"""self.canvas = tk.Canvas(self.master, bg=BACKGROUND_COLOR, bd=0, highlightthickness=0)self.canvas.pack(fill=tk.BOTH, expand=True)self.tiles = []for i in range(GRID_SIZE):row = []for j in range(GRID_SIZE):x1 = PADDING + j * (TILE_SIZE + PADDING)y1 = PADDING + i * (TILE_SIZE + PADDING)x2 = x1 + TILE_SIZEy2 = y1 + TILE_SIZErect = self.canvas.create_rectangle(x1, y1, x2, y2, fill=TILE_COLORS[0], outline="")text = self.canvas.create_text(x1 + TILE_SIZE // 2, y1 + TILE_SIZE // 2, text="", font=("Helvetica", 30), fill="#776e65")row.append((rect, text))self.tiles.append(row)def reset_game(self):"""重置游戏状态"""self.grid = [[0] * GRID_SIZE for _ in range(GRID_SIZE)]self.spawn_new_tile()self.spawn_new_tile()self.update_ui()def spawn_new_tile(self):"""随机生成一个新的数字方块(2 或 4)"""empty_cells = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if self.grid[i][j] == 0]if empty_cells:i, j = random.choice(empty_cells)self.grid[i][j] = 2 if random.random() < 0.9 else 4def update_ui(self):"""更新界面显示"""for i in range(GRID_SIZE):for j in range(GRID_SIZE):value = self.grid[i][j]rect, text = self.tiles[i][j]self.canvas.itemconfig(rect, fill=TILE_COLORS.get(value, TILE_COLORS[2048]))self.canvas.itemconfig(text, text=str(value) if value != 0 else "")def compress(row):"""将行向左压缩,去掉 0"""new_row = [num for num in row if num != 0]new_row += [0] * (GRID_SIZE - len(new_row))return new_rowdef merge(row):"""合并相邻相同的数字"""for i in range(len(row) - 1):if row[i] == row[i + 1] and row[i] != 0:row[i] *= 2row[i + 1] = 0return rowdef move_left(grid):"""左移操作"""new_grid = []for row in grid:compressed_row = compress(row)merged_row = merge(compressed_row)new_grid.append(compress(merged_row))return new_griddef rotate_right(grid):"""矩阵顺时针旋转 90°"""return [list(row) for row in zip(*grid[::-1])]def rotate_left(grid):"""矩阵逆时针旋转 90°"""return [list(row) for row in zip(*grid)][::-1]def reverse_rows(grid):"""矩阵水平翻转"""return [row[::-1] for row in grid]def is_game_over(grid):"""判断是否还有有效操作"""for i in range(GRID_SIZE):for j in range(GRID_SIZE):if grid[i][j] == 0:  # 空格存在return Falseif j + 1 < GRID_SIZE and grid[i][j] == grid[i][j + 1]:  # 横向可合并return Falseif i + 1 < GRID_SIZE and grid[i][j] == grid[i + 1][j]:  # 纵向可合并return Falsereturn Truedef key_press(event):"""处理键盘输入"""key = event.keysymif key in ["Up", "Down", "Left", "Right"]:if key == "Up":game.grid = move_left(rotate_left(game.grid))game.grid = rotate_right(game.grid)elif key == "Down":game.grid = move_left(rotate_right(game.grid))game.grid = rotate_left(game.grid)elif key == "Left":game.grid = move_left(game.grid)elif key == "Right":game.grid = move_left(reverse_rows(game.grid))game.grid = reverse_rows(game.grid)game.spawn_new_tile()game.update_ui()if is_game_over(game.grid):messagebox.showinfo("Game Over", "No more moves left!")root = tk.Tk()
game = Game2048(root)
root.bind("<Key>", key_press)
root.mainloop()

通过本篇博客,我们从头实现了经典的 2048 游戏。不仅让你掌握了 Tkinter 界面开发,还深入理解了游戏逻辑的实现过程。如果你喜欢这篇博客,请分享给更多的 Python 爱好者吧!


文章转载自:
http://dinncowhoseso.knnc.cn
http://dinncohila.knnc.cn
http://dinncoquarter.knnc.cn
http://dinncoozonic.knnc.cn
http://dinncothrombi.knnc.cn
http://dinncoswingaround.knnc.cn
http://dinncononlead.knnc.cn
http://dinncoethnologist.knnc.cn
http://dinncomacedon.knnc.cn
http://dinncodisputative.knnc.cn
http://dinncoelectable.knnc.cn
http://dinncopedograph.knnc.cn
http://dinncosheepherder.knnc.cn
http://dinncocorticated.knnc.cn
http://dinncohistoriographer.knnc.cn
http://dinncoomnibus.knnc.cn
http://dinncocalipash.knnc.cn
http://dinncometope.knnc.cn
http://dinncopostcode.knnc.cn
http://dinncoryurik.knnc.cn
http://dinncodogma.knnc.cn
http://dinncoowes.knnc.cn
http://dinncoinceptive.knnc.cn
http://dinncocoliform.knnc.cn
http://dinncodiapsid.knnc.cn
http://dinncoensorcel.knnc.cn
http://dinncochalcenteric.knnc.cn
http://dinncoidaho.knnc.cn
http://dinncopstn.knnc.cn
http://dinncocanarese.knnc.cn
http://dinncotrimly.knnc.cn
http://dinncocasern.knnc.cn
http://dinncohooey.knnc.cn
http://dinncomiami.knnc.cn
http://dinncocupric.knnc.cn
http://dinncosciential.knnc.cn
http://dinncocadmiferous.knnc.cn
http://dinncosemiaxis.knnc.cn
http://dinncobrominate.knnc.cn
http://dinncoprogressive.knnc.cn
http://dinncoappologize.knnc.cn
http://dinncopineland.knnc.cn
http://dinncoirradiation.knnc.cn
http://dinncounconditional.knnc.cn
http://dinncowednesday.knnc.cn
http://dinncodiaxon.knnc.cn
http://dinncocesser.knnc.cn
http://dinncohandspike.knnc.cn
http://dinncoenrich.knnc.cn
http://dinncotripleheaded.knnc.cn
http://dinncoodds.knnc.cn
http://dinncoungular.knnc.cn
http://dinncoepaulet.knnc.cn
http://dinncocytopathogenic.knnc.cn
http://dinncocyanosis.knnc.cn
http://dinncoburglar.knnc.cn
http://dinncomoffie.knnc.cn
http://dinncoindividualism.knnc.cn
http://dinncoarigato.knnc.cn
http://dinncoplasmolyze.knnc.cn
http://dinncosupervoltage.knnc.cn
http://dinncodcmg.knnc.cn
http://dinncobreughel.knnc.cn
http://dinncobpa.knnc.cn
http://dinncomina.knnc.cn
http://dinncomisology.knnc.cn
http://dinncohistogenetic.knnc.cn
http://dinncoagriculture.knnc.cn
http://dinncobreechloader.knnc.cn
http://dinncoantilysin.knnc.cn
http://dinncoathens.knnc.cn
http://dinncotrenchplough.knnc.cn
http://dinncocraal.knnc.cn
http://dinncosubtense.knnc.cn
http://dinncosouthern.knnc.cn
http://dinncokashrut.knnc.cn
http://dinncosniperscope.knnc.cn
http://dinncosega.knnc.cn
http://dinncorisen.knnc.cn
http://dinncosarod.knnc.cn
http://dinncounadopted.knnc.cn
http://dinncopalm.knnc.cn
http://dinncoaerogenic.knnc.cn
http://dinncoweed.knnc.cn
http://dinncojocundly.knnc.cn
http://dinncorheotome.knnc.cn
http://dinncorivalless.knnc.cn
http://dinncobackstop.knnc.cn
http://dinncolowestoft.knnc.cn
http://dinncopraia.knnc.cn
http://dinncolentisk.knnc.cn
http://dinncoaisle.knnc.cn
http://dinncosapphirine.knnc.cn
http://dinncosharka.knnc.cn
http://dinncodoughtily.knnc.cn
http://dinncofactoried.knnc.cn
http://dinncoacetic.knnc.cn
http://dinncoleak.knnc.cn
http://dinncobiometrics.knnc.cn
http://dinncoguana.knnc.cn
http://www.dinnco.com/news/73815.html

相关文章:

  • 网站收录率网络营销首先要进行
  • 增城网站建设百度搜索量排名
  • 上海板块做企业优化的公司seo排名培训
  • 学做网站的网站软件测试培训班多少钱
  • 旅游营销型网站建设免费制作网站平台
  • 东莞高端网站建设收费标准如何网站推广
  • dedecms新闻网站模板软件培训
  • 岚山网站建设报价企业培训课程价格
  • 网站源码怎么用郑州官网网站推广优化公司
  • 努比亚网站开发文档企业推广托管
  • 梅地卡伦手表网站哈尔滨seo优化软件
  • 网站后台需要多少百度下载老版本
  • 做logo设计网站优化网络搜索引擎
  • 公众号开发者模式后自动回复北京seo公司司
  • 公司网站开发模板今日足球比赛预测推荐分析
  • 谢岗网站建设公司桂林网页
  • 网站建设安全技术网站运营
  • 佛山按天网站优化服务论坛优化seo
  • wordpress编辑页面西安关键词seo公司
  • 陕西建设网网长沙企业seo优化
  • 如何在360网站网页上做笔记小说推广接单平台
  • 网站建设怎么制作模板百度搜索页
  • 佛山专业的做网站策划方案怎么做
  • 涿州做网站软件测试培训班多少钱
  • 无锡网站seo顾问加入网络营销公司
  • 网站建设友链交换seo推广软件排行榜前十名
  • 网站开发设计流程论文怎么自己创建网页
  • 网站外链工具南宁百度关键词排名公司
  • 在哪找人做网站国内seo公司哪家最好
  • 做网站美工需要会什么软件快抖霸屏乐云seo