本次做一个最简单的贪食蛇雏形游戏,就是一个小蛇在画面上移动,我们可以控制蛇的移动方向,但是不能吃东西,蛇不会长大。但是基础的有了,完整版的贪食蛇还远吗?双人贪食蛇不也就那么回事吗?

先做一个简单的,有机会再放出不那么简单,但依旧简陋的标准贪食蛇和双人贪食蛇。

首先,pygam的各种配置参数,直接使用之前的配置,多退少补。

import random
import time
import pygame
fps = 30
fps_clock = pygame.time.Clock()
screen_width = 640
screen_height = 480
display = pygame.display.set_mode((screen_width, screen_height), 0, 32)
pygame.display.set_caption('贪食蛇')
tile_size = 20
tile_width = 20
tile_height = 20
#横纵间距
x_margin = 100
y_margin = 100
#列
columns = int((screen_width - 100) / 20)
#行
rows = int((screen_height - 100) / 20)
directions = ['up', 'down', 'left', 'right']
#配色RGB
white = 'white'
black = 'black'
bg_color = 'sky blue'
border_color = white
if __name__ == '__main__':
    while True:
        display.fill(bg_color)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
        pygame.display.update()
        fps_clock.tick(fps)

基本的配置函数,棋盘类游戏常规操作。

运行游戏会得到一个天蓝色的画布,什么都没有。

接下来,在画布上画出二维棋盘,也就是贪食蛇运动的场地。这里我们有几种选择,此处我选择一种最简单的方式,也就是整个棋盘不对应二维列表,只为贪食蛇本身创建一个列表,用来储存贪食蛇的身体。

首先绘制一个大棋盘。

def draw_chest():
    for i in range(rows   1):
        pygame.draw.line(display, border_color, (x_margin/2, y_margin/2   i * tile_size),
                         (x_margin/2   (columns * tile_size), y_margin/2   i * tile_size), 2)
    for j in range(columns   1):
        pygame.draw.line(display, border_color, (x_margin/2   j * tile_size, y_margin/2),
                         (x_margin/2   j * tile_size, y_margin/2   (rows * tile_size)), 2)

然后主循环里调用,然后运行程序。

贪食蛇的运动空间已经出现了。

创建一个列表,用来存放贪食蛇的身体。默认贪食蛇的长度为3。具体大小可以根据自己的喜欢修改,我就写3了。

那么需要基于这两个数值来生成蛇的身体的第一个位置。例如,我们生成的蛇的身体的第一个位置是[3][3],那么对应的在屏幕中[3][3]所对应的坐标位置,绘制一个小方块,同时默认蛇的身体是往右延伸,那么蛇的身体参数则为[3][3],[3][4],[3][5]

考虑到让蛇随机出现在画面中的某些地方,所以生成蛇的身体是照顾到各方,随机数的范围如下:

在主循坏外创建列表,添加身体,身体保持在画面中央部分。

snake_body = []
    snake_x = random.randint(5, rows - 5)
    snake_y = random.randint(5, columns - 5)
    snake_body.append([snake_x, snake_y])
    snake_body.append([snake_x, snake_y   1])
    snake_body.append([snake_x, snake_y   2])
    return snake_body

为绘制蛇的身体,编写绘制函数。

def draw_snake_shape(shapes):
    for shape in shapes:
        left_position = shape[1] * tile_size   x_margin/2
        top_position = shape[0] * tile_size   y_margin/2
        # 画出整个身体背景色
        pygame.draw.rect(display, body_color, (left_position, top_position, tile_size, tile_size))
        # 画出内部颜色
        pygame.draw.rect(display, inter_body_color, (left_position 4, top_position 4, tile_size-8, tile_size-8))

在主循环中调用,运行游戏,每次运行,蛇都在不同的位置,同时不会出现在边缘。

接下来就是让蛇动起来。

让蛇动起来的核心思想就是,根据蛇当前的前进方向,增加和删除snake_body中的坐标值。比如,下一步蛇的运动方向是up,那么确认当前up方向是合法的时候,即往上走一步不会走到边界,或者当前正在往下走,那么,我们得出新的坐标点,加入到snake_body中,同时删除列表最后一个数据,因为当前没有苹果可以吃嘛。

先定义一个判断下一个坐标点是否合法的函数。

def is_right_direction(body, x_location, y_location):
    valid_direction = False
    if 0 <= x_location <= rows-1 and 0 <= y_location <= columns - 1:
        valid_direction = True
    return valid_direction

在主循环中加入程序处理贪食蛇按照某个固定的方向移动时对于贪食蛇身体列表的操作。

首先在进入主循环前,获取当前需要移动的方向

direction = directions[random.randint(0, 3)]
    while True:

在主循环内部,增加代码处理身体移动

#未按下按键时,默认的初识移动方向
        new_body_location = (None, None)
        match direction:
            case 'left':
                new_body_location = snake_body[0][0], snake_body[0][1] - 1
            case 'right':
                new_body_location = snake_body[0][0], snake_body[0][1]   1
            case 'up':
                new_body_location = snake_body[0][0] - 1, snake_body[0][1]
            case 'down':
                new_body_location = snake_body[0][0]   1, snake_body[0][1]
        snake_body.insert(0, new_body_location)
        del snake_body[-1]

此时运行程序,贪食蛇会像闪电一般快速移动到屏幕边缘。

根本来不及截图,因为我们的刷新率是30帧每秒,所以太快了,此时有多种解决方案,最简单的一种是修改刷新率,比如修改为2,那么就会看到蛇缓慢移动了。非常简单啦。也可以考虑在移动部分做定时,或者做累加延迟等等。这里我修改了fps=2。

接下来增加控制部分,这部分很简单。

在按键部分设定上下左右按键控制方向,同时要注意,贪食蛇不能直接掉头走。

#键盘控制改变贪食蛇的方向
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT and direction != 'right':
                    direction = 'left'
                elif event.key == pygame.K_RIGHT and direction != 'left':
                    direction = 'right'
                elif event.key == pygame.K_UP and direction != 'down':
                    direction = 'up'
                elif event.key == pygame.K_DOWN and direction != 'up':
                    direction = 'down'

游戏结束机制,也就是蛇碰到边界游戏结束。

        if is_right_direction(snake_body, new_body_location[0], new_body_location[1]):
            snake_body.insert(0, new_body_location)
            del snake_body[-1]
        else:
            snake_body = []
            snake_x = random.randint(5, columns - 5)
            snake_y = random.randint(5, rows - 5)
            snake_body.append([snake_x, snake_y])
            snake_body.append([snake_x, snake_y   1])
            snake_body.append([snake_x, snake_y   2])

框架级别的贪食蛇制作完成了,如果再加入一个小苹果,增加一个增加身体条件就有一个完整的贪食蛇了。再追加一个追尾机制,和一条新的蛇就可以双人对战了。

到此这篇关于python贪吃蛇核心功能实现上的文章就介绍到这了,更多相关python贪吃蛇内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

python贪吃蛇核心功能实现上的更多相关文章

  1. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  3. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  4. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  5. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  7. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  8. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  9. swift抛出终端的python错误

    每当我尝试启动与python相关的swift时,我都会收到错误.我该如何解决?

  10. 在Android上用Java嵌入Python

    解决方法看看this,它适用于J2SE,你可以尝试在Android上运行.

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部