思路分析
首先我们先建立一个背景板画布和16个海龟块,这里使用的就是turtle库。每次移动在空白的地方随机出现一块2或4的方块,这里使用random库,在上下左右移动的时候要判断移动是否违规,两个海龟块的数值一样时要进行合并,在所有位置都有方块后要判断能否继续进行下一次移动,不能的话要给出重新开始方法,游戏中需要实时记录下分数,同时与最高得分进行比较同步更新。
模块划分
界面规划
先创建一个画布,调试出合适的大小、背景和标题
boundary = turtle.Screen()
boundary.setup(430, 630, 500, 10)
boundary.bgcolor('gray')
boundary.title('2048')
注册图片
#写两个示范一下,其他的就先省略了
boundary.register_shape('2.gif')
boundary.register_shape('4.gif')
再设置16个方块和其他细节的大概位置
allpos = [(-150, 50), (-50, 50), (50, 50), (150, 50),
(-150, -50), (-50, -50), (50, -50), (150, -50),
(-150, -150), (-50, -150), (50, -150), (150, -150),
(-150, -250), (-50, -250), (50, -250), (150, -250)]
再设计出一个背景类用于游戏图片的添加
class Background(turtle.Turtle):
def __init__(self):
super().__init__()
self.penup()
def show_text(self):
self.color('white', 'white')
self.goto(-215, 120)
self.begin_fill()
self.pd()
self.goto(215, 120)
self.goto(215, 110)
self.goto(-215, 110)
self.end_fill()
self.pu()
self.shape('title.gif')
self.goto(-125, 210)
self.stamp()
self.shape('score.gif')
self.goto(125, 245)
self.stamp()
self.shape('top_score.gif')
self.goto(125, 170)
self.stamp()
设计出得分数字的字体和颜色,同理最高分数和游戏提示可以写出
def show_score(self, score):
self.color('white')
self.goto(125, 210)
self.clear()
self.write(f'{score}', align='center', font=("Arial", 20, "bold"))
功能实现
先随机生成一个数字块
class Block(turtle.Turtle):
def __init__(self):
super().__init__()
self.penup()
def grow(self):
num = random.choice([2, 2, 2, 2, 4])
self.shape(f'{num}.gif')
a = random.choice(allpos)
self.goto(a)
allpos.remove(a)
block_list.append(self)
上下左右移动,最多的移动三格,每次移动一格坐标的x或y加减100,同时生成一个新的数字块
def go_down(self):
self.go(-150, -50, 50, 0, -100, True)
def go_up(self):
self.go(-50, -150, -250, 0, 100, True)
def go_left(self):
self.go(-50, 50, 150, -100, 0, False)
def go_right(self):
self.go(50, -50, -150, 100