Python:游戏:贪吃蛇原理及代码实现

一、游戏介绍

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

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

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

二、游戏分析

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

我们先来分析一下,要写出这个游戏来需要注意哪些点。

1、蛇怎么表示

我们可以将整个游戏区域划分成一个个的小格子,由一组连在一起的小格子组成“蛇”,我们可以用不同的颜色来表示,如上图中,我以深色表示背景,浅色表示“蛇”。

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

2、蛇怎么移动?

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏电脑网络小帮手

电脑硬件详解篇:显卡

https://wenku.baidu.com/view/aa771c9f2dc58bd63186bceb19e8b8f67c1cef29.html

12520
来自专栏VRPinea

大空间VR趋势日益显著,或将“拯救”线下VR体验?

VR线下体验市场的打开,无疑为许多热爱VR的玩家提供了更具沉浸感的虚拟体验。而大空间VR技术的日益发展,不仅在欧美、日韩以及国内的VR线下娱乐中占有一席之地,也...

10510
来自专栏WeTest质量开放平台团队的专栏

聚焦游戏,共建生态,腾讯云游戏服务平台CMatrix品牌全新升级为GameMatrix

? 近日,隶属腾讯互娱公共研发运营体系(下文称CROS)下的云游戏服务平台CMatrix宣布进行品牌升级,启用全新商标Tencent GameMatrix,将...

13130
来自专栏机器之心

雀神,微软亚研推出超级麻将AI Suphx,还上了专业十段水平

麻将无疑是我国最家喻户晓,老少咸宜的一项棋牌游戏。近年来,随着人工智能在围棋、德州扑克、Dota、星际争霸等众多游戏中获得亮眼的成绩,AI 在麻将领域却一直缺少...

15550
来自专栏量化小白上分记

用python算24点游戏

国庆假天天躺尸,也没啥动力写文章,就把以前写的24点游戏的代码整理一下算了。24点游戏基本每个人都玩过,这里尝试用python给出在n个数情况下,24点游戏所有...

24520
来自专栏AI掘金志

亮相一周年,腾讯智慧零售的进化论

以去年3月腾讯智慧零售战略合作部成立,首次对外明确阐述其智慧零售理念为起点,腾讯智慧零售刚刚迎来了自己的一周年。

18520
来自专栏杂文共赏

GameMakerStudio2初体验【1】

主要相比Unity3D,GM2适合单人新人进行开发,但GM2需要购买(248)且需要梯子,国内社区不活跃,资料少。

38910
来自专栏CreateAMind

Google Research Football (scenario 2) 实验

谷歌足球环境(Google Research Football )的介绍可以参看之前的公众号文章:

12110
来自专栏Crossin的编程教室

一道有悖直觉的概率题

我是一个概率控,平常遇到和概率相关的事情都喜欢去推算一下,喜欢看概率有关的影视作品(决胜21点、欺诈游戏、赌博默示录……),就连在汤姆熊或是巴黎人,我也会估下哪...

10650
来自专栏AI科技评论

这次 AI 突破的是麻将!

围棋AlphaGo点燃的AI之火渐渐降温之际,微软今天上午发布了他们在麻将游戏中取得的重大突破:麻将AI “Suphx”在国际知名专业麻将平台“天凤”上荣升十段...

15110

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励