关键词搜索

源码搜索 ×
×

【python学习】详细解释Python快速开发贪吃蛇游戏,只需200行代码

发布2021-01-17浏览318次

详情内容

前言
最近在学习Python3,看了一下语法和基本数据类型,有多年PHP经验的我感觉难度不是很大。Python作为高级语言,一些数据类型和函数的调用和PHP都有几分类似,大家有兴趣可以看看之前记录的Python基础的文章。

看了基础语法,感觉需要通过敲码来快速熟悉下Python的开发,于是准备从小游戏的方向来,在网上学习了下guliang贪吃蛇的开发和玩法,和一些知识点,准备也来撸一下【贪吃蛇】游戏。

先展示下跑出来的效果:
文末可以获取源码
在这里插入图片描述

在这里插入图片描述

下面记录下开发学习过程。

正文
环境
首先要准备开发环境:
系统:windows
Python版本:3.8,从官网下载安装直接安装就好。
IDE:pycharm,官网下载

安装需要的Python库

pip install pygame
测试是否安装成功:

D:\WWW\pythonsty\learn>python
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AM
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> import pygame
pygame 2.0.1 (SDL 2.0.14, Python 3.8.0)
Hello from the pygame community. https://www.pygame.org/contribute.html
>>>

    出现上面的输出,表示已经安装成功,可以开始撸了。

    具体玩法
    回车键enter:开始比赛
    空格:暂停
    键盘上的方向键控制蛇的前进方向
    ↑ / w : 上
    ↓ / s : 下
    ← / a : 左
    → / d : 右

    知识点了解
    random
    随机函数,random.randint(整数A,整数B),可以生成一个在A B之间的整数

    while
    循环,条件满足时会一直循环,可以通过break跳出循环

    pygame
    pygame.init() — 初始化所有导入的 pygame 模块
    pygame.display.set_mode() – 设置界面渲染的窗口大小
    pygame.event.get() – 获取设备的输入,这里监控键盘的输入
    pygame.draw – 窗口绘制形状、线和点
    这里用到:pygame.draw.line() – 画出网格线
    pygame.draw.rect() – 画出矩形方块,用于表示食物和蛇的实体

    开发思路
    运行流程
    在这里插入图片描述

    具体实现
    定义蛇函数,用于生成初始化的蛇

    # 初始化蛇
    def init_snake():
        snake = deque()
        snake.append((2, SCOPE_Y[0]))
        snake.append((1, SCOPE_Y[0]))
        snake.append((0, SCOPE_Y[0]))
        print("snake的结构坐标:%s" % snake)
        return snake
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    定义食物,用于食物生成,这里要考虑一个问题,生成食物的时候,只能是在蛇允许活动的范围内,而且不能是在蛇的身上生成,所以这里要特殊处理下:

    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])
        print("food的结构坐标:%s : %s" % (food_x, food_y))
        return food_x, food_y
    
      10

    开启主循环,监控键盘的输入,并且渲染蛇的移动的动画

        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    sys.exit()
                elif event.type == KEYDOWN:
                    if event.key == K_RETURN:
                        if game_over:
                            start = True
                            game_over = False
                            b = True
                            snake = init_snake()
                            food = create_food(snake)
                            food_style = get_food_style()
                            pos = (1, 0)
                            # 得分
                            score = 0
                            last_move_time = time.time()
                    elif event.key == K_SPACE:
                        if not game_over:
                            pause = not pause
                    elif event.key in (K_w, K_UP):
                        # 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER
                        if b and not pos[1]:
                            pos = (0, -1)
                            b = False
                    elif event.key in (K_s, K_DOWN):
                        if b and not pos[1]:
                            pos = (0, 1)
                            b = False
                    elif event.key in (K_a, K_LEFT):
                        if b and not pos[0]:
                            pos = (-1, 0)
                            b = False
                    elif event.key in (K_d, K_RIGHT):
                        if b and not pos[0]:
                            pos = (1, 0)
                            b = False
    蛇的移动,首先根据方向来判断,这里使用pos变量来记录方向
    pos(1, 0) //表示当前蛇向右的方向
    pos(-1, 0) //表示当前蛇向左的方向
    pos(0, 1) //表示当前蛇向下的方向
    pos(0, -1) //表示当前蛇向上的方向
    
    上面的监控键盘的按键,也是通过改变pos里面的值来改变方向
    
    根据方向,来计算出下一个格子的坐标,此时要判断坐标是否在食物上,在的话表示吃到食物,需要重置食物坐标。
    不在就判断是否有边界触碰而超出边界,超出游戏就结束
    
    next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
    print("snake 下一步的坐标 %s:%s" % next_s, "snake当前走的方向坐标:%s %s" % (snake[0][0], snake[0][1]))
    if next_s == food:
        # 吃到了食物
        snake.appendleft(next_s)
        score += food_style[0]
        speed = orispeed - 0.03 * (score // 100)
        food = create_food(snake)
        food_style = get_food_style()
        print("吃到食物,蛇增加一个单位,同时重置食物的坐标为:%s:%s" % food)
    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:
            print("游戏结束:snake 下一步的坐标 %s:%s" % next_s, "走的方向:%s %s" % pos)
            game_over = True
    使用pygame渲染出网格线,食物和蛇的身体
    
    # 画食物
    if not game_over:
        # 避免 GAME OVER 的时候把 GAME OVER 的字给遮住了
        pygame.draw.rect(screen, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)
    
    # 画蛇
    for s in snake:
      pygame.draw.rect(screen, DARK, (s[0] * SIZE + LINE_WIDTH, s[1] * SIZE + LINE_WIDTH,
                                      SIZE - LINE_WIDTH * 2, SIZE - LINE_WIDTH * 2), 0)
    
      10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    最后结果跑起来的效果就如上图所示。

    怎么能控制蛇的速度呢?
    其实是控制时python基础教程间来刷新,我们知道所有的动作都在一个循环里面完成的,也就是代码都一直在运行着。

    比如我设置速度为1,表示一秒刷新一次,那么蛇的移动也就是一秒一次,我们看到的也是一秒移动一格。

    当我们设置速度为0.5,表示0.5秒刷新一次,那我们就看到0.5秒移动一格,速度就相对地看起来快了。

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载