贪吃蛇是个很是简单的游戏,适合练手。先来看一下个人游戏截图:python
玩法介绍: 回车键:开始游戏 空格键:暂停 / 继续 ↑↓←→方向键 或 WSAD 键:控制移动方向。app
食物分成、绿、蓝三种,分别对应 10 分、20 分、30 分,每吃一个食物增长对应分值,每增长 100 分速度加快一级,没有设置关卡,我玩到 1100 分,速度太快了,而后就 GAME OVER 了。dom
贪吃蛇这个游戏很简单,屏幕上随机出现一个点,表示“食物”,上下左右控制“蛇”的移动,吃到“食物”之后“蛇”的身体加长,“蛇”碰到边框或本身的身体,则游戏结束。post
咱们先来分析一下,要写出这个游戏来须要注意哪些点。性能
咱们能够将整个游戏区域划分红一个个的小格子,由一组连在一块儿的小格子组成“蛇”,咱们能够用不一样的颜色来表示,如上图中,我以深色表示背景,浅色表示“蛇”。编码
咱们能够用坐标来表示每个小方格,X 轴和 Y 轴的范围都是能够设定好的。用一个列表来存放“蛇身”的坐标,那么一条“蛇”就出来了,最后只要显示的时候以不一样的颜色表示便可。spa
第一反应就是像蚯蚓蠕动同样,每个小方块向前移动一格,但这样实现起来很麻烦。一开始就是被这里卡住了。code
想象一下咱们玩过的贪吃蛇,每次“蛇”的移动感受上是总体往前移动了一格,排除掉脑子中“蛇”的“动做”,细想移动前和移动后“蛇”的位置变化,其实除了头尾,其余部分根本就没有变。那就简单了,将下一格的坐标添加到列表开头,并移除列表的最后一个元素,就至关于蛇向前移动了一格。cdn
“蛇”移动超出了游戏区的范围或者碰到了本身就算输了,轴坐标的范围是事先定好的,超出范围很容易判断。那么如何判断碰到本身呢?blog
若是脑子里想的是“蛇”动的画面,那真的比较难了,可是放到代码中,咱们的“蛇”是一个列表,那么只要判断下一格的坐标是否已经包含在“蛇”的列表中岂不就能够了?
理清了这些问题,咱们就能够开始编码了。
因为程序中要频繁的对“蛇”进行头尾的添加和删除操做,为了性能更好那么一点,咱们用 deque
代替列表。
首先须要初始化“蛇”,“蛇”的初始长度为 3,位置位于左上角。
# 游戏区域的坐标范围
SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)
SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)
snake = deque()
def _init_snake():
snake.clear()
snake.append((2, scope_y[0]))
snake.append((1, scope_y[0]))
snake.append((0, scope_y[0]))
复制代码
建立“食物”,在屏幕内随机选取一个点做为“食物”,可是要保证“食物”不在“蛇”身上。
def create_food(snake):
food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
while (food_x, food_y) in snake:
# 若是食物出如今蛇身上,则重来
food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
return food_x, food_y
复制代码
“蛇”的移动能够有 4 个方向,用一个元组来表示移动的方向,每次按下方向键,给赋对应的值
# 方向
pos = (1, 0)
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
elif event.type == KEYDOWN:
if event.key in (K_w, K_UP):
# 这个判断是为了防止蛇向上移时按了向下键,致使直接 GAME OVER
if pos[1]:
pos = (0, -1)
elif event.key in (K_s, K_DOWN):
if pos[1]:
pos = (0, 1)
elif event.key in (K_a, K_LEFT):
if pos[0]:
pos = (-1, 0)
elif event.key in (K_d, K_RIGHT):
if pos[0]:
pos = (1, 0)
复制代码
而“蛇”的移动就能够表示为:
next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
if next_s == food:
# 吃到了食物
snake.appendleft(next_s)
food = create_food(snake)
else:
if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] and next_s not in snake:
snake.appendleft(next_s)
snake.pop()
else:
game_over = True
复制代码
相关博文推荐
扫码关注个人我的公众号,后台回复【贪吃蛇】,获取源码。