编程的乐趣:用Python打造你的2048游戏

_哈喽,大家好,我是程序员晓晓。 今天我们来探索如何使用Python来创建一个经典且广受欢迎的小游戏——2048。不仅是为了娱乐,更是为了让我们在编程的世界里迈出更坚实的一步。

2048游戏规则

在一个4x4的网格中,你可以通过上、下、左、右滑动方块来移动数字。两个相同数字的方块在碰撞时会合并成它们的和。每次移动后,一个新的数字2或4会随机出现在空白格子上。玩家的目标是在网格填满前达到2048这个数字。

使用库介绍

我们的项目主要使用了Python的标准库Turtle,它是一个非常适合初学者的图形库,用于创建简单的图形和动画。我们还会用到random库来生成随机数,为游戏增加不可预测性。

代码示例


from turtle import *
from random import randint

title("2048")
gz = 176  # shapesize=8是连长160的正方形,我们可以将格子设置为162,这边就可以画出边框线
N = 4
bc = gz * N  # 边长
tracer(False)  # 不显示绘制动画
bgcolor("gray")
ht()
up()
speed(0)
shape("square")
shapesize(8)  # shapesize为8是一个连长为160的正方形

# 二维列表对应游戏表格
grid = [
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]
]

maxx = 2
steps = 0
tj = Turtle()
tj.speed(0)
tj.up()
tj.ht()
tj.color("white")
tj.goto(-bc / 2, bc / 2 + 20)
tj.write("步数:{},最大值:{}".format(steps, maxx), font=("", 20, ""))

# 颜色字典
COLORS = {
    0: "white",
    2: "yellow",
    4: "orange",
    8: "pink",
    16: "red",
    32: "lightblue",
    64: "lightgreen",
    128: "green",
    256: "purple",
    512: "cyan",
    1024: "silver",
    2048: "gold"
}


# 绘制二维列表
def draw_grid():
    global steps
    global maxx
    tj.clear()
    tj.write("步数:{},最大值:{}".format(steps, maxx), font=("", 20, ""))
    steps += 1
    clear()
    for row in range(N):
        for col in range(N):
            # 从左上角(-bc/2 + gz/2, bc/2 - gz/2)开始从上往下、从左往右绘制
            goto(-bc / 2 + gz / 2 + col * gz, bc / 2 - gz / 2 - row * gz)
            # 根据grid[row][col]的数字,来设置对应的颜色
            color(COLORS[grid[row][col]])
            stamp()
            # 在单元格中写下对应的数字
            sety(bc / 2 - gz / 2 - row * gz - 30)
            color("black")
            if grid[row][col] > 0:
                write(grid[row][col], font=("", 50, ""), align="center")
            # 找最大值
            if grid[row][col] > maxx:
                maxx = grid[row][col]
    # 刷新游戏画面
    update()
    if maxx == 2048:
        goto(0, 0)
        color("red")
        write("游戏胜利", font=("", 100, ""), align="center")


def can_add():
    for i in range(N):
        for j in range(N):
            if grid[i][j] == 0:
                return True
    return False


def generate_random():
    # 如果能加
    if can_add():
        added = False
        # 随机选择一个空白位置,将这个位置数字设置为2
        while not added:
            i = randint(0, N - 1)
            j = randint(0, N - 1)
            if grid[i][j] == 0:
                grid[i][j] = 2
                added = True


generate_random()
draw_grid()


def up():
    # 每列
    for col in range(N):
        # 从第2行到最后一行
        for row in range(1, N):
            # 记下这个格子的数字
            value = grid[row][col]
            r = row
            # 找到最上面为0的格子r
            while r > 0 and grid[r - 1][col] == 0:
                r = r - 1
            # 如果r-1存在并且其中的数字和row数字一样,则将r变为r-1
            if r - 1 >= 0 and grid[r - 1][col] == value:
                r = r - 1
            # 如果r不等于原来的row,2者合并(此时r位置数字为0或者和row相等)
            if r != row:
                grid[r][col] += value
                grid[row][col] = 0  # 原来row的数字要变为0

    # 随机生成2
    generate_random()
    # 重新绘制格子
    draw_grid()


def down():
    for col in range(N):
        for row in range(N - 2, -1, -1):
            value = grid[row][col]
            r = row
            while r < N - 1 and grid[r + 1][col] == 0:
                r = r + 1
            if r + 1 < N and grid[r + 1][col] == value:
                r = r + 1
            if r != row:
                grid[r][col] += value
                grid[row][col] = 0
    generate_random()
    draw_grid()


def left():
    for row in range(N):
        for col in range(1, N):
            value = grid[row][col]
            c = col
            while c > 0 and grid[row][c - 1] == 0:
                c = c - 1
            if c - 1 >= 0 and grid[row][c - 1] == value:
                c = c - 1
            if c != col:
                grid[row][c] += value
                grid[row][col] = 0
    generate_random()
    draw_grid()


def right():
    for row in range(N):
        for col in range(N - 2, -1, -1):
            value = grid[row][col]
            c = col
            while c < N - 1 and grid[row][c + 1] == 0:
                c = c + 1
            if c + 1 < N and grid[row][c + 1] == value:
                c = c + 1
            if c != col:
                grid[row][c] += value
                grid[row][col] = 0
    generate_random()
    draw_grid()


onkeypress(up, "Up")  # 按向上键("Up"),执行up响应函数
onkeypress(down, "Down")  # 按向下键("Down"),执行down响应函数
onkeypress(left, "Left")  # 按向上键("Left"),执行left响应函数
onkeypress(right, "Right")  # 按向上键("Right"),执行right响应函数
listen()  # 开始监听

done()

代码解析

  • 初始化和配置: 我们首先设置了游戏窗口的标题、背景色和尺寸,初始化了用于绘制方块和数字的Turtle对象。

  • 绘制网格: 通过draw_grid函数,我们在屏幕上绘制了4x4的网格,并为每个方块填充了相应的颜色。

  • 游戏逻辑: up, down, left, right函数分别实现了方块的移动和合并逻辑。当方块移动或合并时,网格会更新并重新绘制。

  • 随机数生成: 每次移动后,generate_random函数会在网格的空位上随机生成一个新的数字。

探索与改进

尽管这个版本已经实现了2048的基本游戏玩法,但还有许多地方可以进行改进和扩展。例如,添加得分系统、优化用户界面,甚至尝试不同的游戏变种,如5x5的网格或更高的目标数字。

结语

通过这个项目,我们不仅学习了Python编程的基本技巧,还锻炼了逻辑思维和问题解决能力。希望你在实践中找到乐趣,并从中获得宝贵的经验。现在,是时候动手试试,将这个小游戏变为现实了!

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值