Python:游戏:贪吃蛇

1、游戏介绍

贪吃蛇是个很是简单的游戏,适合练手。先来看一下个人游戏截图:python

玩法介绍: 回车键:开始游戏 空格键:暂停 / 继续 ↑↓←→方向键 或 WSAD 键:控制移动方向。app

食物分成、绿、蓝三种,分别对应 10 分、20 分、30 分,每吃一个食物增长对应分值,每增长 100 分速度加快一级,没有设置关卡,我玩到 1100 分,速度太快了,而后就 GAME OVER 了。dom

2、游戏分析

贪吃蛇这个游戏很简单,屏幕上随机出现一个点,表示“食物”,上下左右控制“蛇”的移动,吃到“食物”之后“蛇”的身体加长,“蛇”碰到边框或本身的身体,则游戏结束。post

咱们先来分析一下,要写出这个游戏来须要注意哪些点。性能

一、蛇怎么表示

咱们能够将整个游戏区域划分红一个个的小格子,由一组连在一块儿的小格子组成“蛇”,咱们能够用不一样的颜色来表示,如上图中,我以深色表示背景,浅色表示“蛇”。编码

咱们能够用坐标来表示每个小方格,X 轴和 Y 轴的范围都是能够设定好的。用一个列表来存放“蛇身”的坐标,那么一条“蛇”就出来了,最后只要显示的时候以不一样的颜色表示便可。spa

二、蛇怎么移动?

第一反应就是像蚯蚓蠕动同样,每个小方块向前移动一格,但这样实现起来很麻烦。一开始就是被这里卡住了。code

想象一下咱们玩过的贪吃蛇,每次“蛇”的移动感受上是总体往前移动了一格,排除掉脑子中“蛇”的“动做”,细想移动前和移动后“蛇”的位置变化,其实除了头尾,其余部分根本就没有变。那就简单了,将下一格的坐标添加到列表开头,并移除列表的最后一个元素,就至关于蛇向前移动了一格。cdn

三、如何断定游戏结束?

“蛇”移动超出了游戏区的范围或者碰到了本身就算输了,轴坐标的范围是事先定好的,超出范围很容易判断。那么如何判断碰到本身呢?blog

若是脑子里想的是“蛇”动的画面,那真的比较难了,可是放到代码中,咱们的“蛇”是一个列表,那么只要判断下一格的坐标是否已经包含在“蛇”的列表中岂不就能够了?

理清了这些问题,咱们就能够开始编码了。

3、代码展现

因为程序中要频繁的对“蛇”进行头尾的添加和删除操做,为了性能更好那么一点,咱们用 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
复制代码

相关博文推荐


扫码关注个人我的公众号,后台回复【贪吃蛇】,获取源码。

扫码关注个人我的公众号
相关文章
相关标签/搜索