_哈喽,大家好,我是程序员晓晓。 今天我们来探索如何使用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所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
简历模板
