手把手教你用322行Python代码编写贪吃蛇游戏

 更新时间:2023年02月04日 10:06:16   作者:AlexHu2022  
最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法,下面这篇文章主要给大家介绍了关于如何用322行Python代码编写贪吃蛇游戏的相关资料,需要的朋友可以参考下

效果图

贪吃蛇是一个很常见的小游戏,我们如何用Python去实现呢。

安装和导入 

pip install pygame
pip install keyboard
pip install pickledb

通过命令提示符安装所需模块。(以上非Python代码)

#导入
import pygame, keyboard, random, threading, time, pickledb

这个程序用到了pygame作为显示模块,keyboard捕获键盘操,pickledb记录最高纪录。

规则

#显示规则
print()
print('方向键控制方向')
print('\'esc\'退出')
print('\'alt\'暂停')
print('\'space\'继续')
print('每吃掉一个莓果,蛇身长长一格')
print('撞到蛇身或窗口边缘即为死亡')
print('死亡后\'esc\'退出,\'enter\'再来一局')

初始化

#初始化
pygame.init()
 
#设定窗口
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('Greedy Snake')

 执行以上代码就设定好了贪吃蛇的窗口。

设定Surface,变量和显示数字的坐标 

#设定蛇身
body = pygame.Surface((20, 20))
body.fill('yellow')
 
#设定莓果
berries = pygame.Surface((20, 20))
berries.fill('red')
 
#设定数字方块(用于显示数字)
block = pygame.Surface((4, 4))
#设定变量
T = 0
db = pickledb.load('Mark.db', False)
HI = db.get('HiMark')
B = False

函数

def keyname(key) :
    #键盘捕获
    global KEY
    KEY = key.name
keyboard.on_press(keyname)

用on_press绑定了keyname后,当键盘按下时会执行keyname函数。(key.name是按键的名称)

def snake() :
    #显示蛇身
    global path
    for xy in path :
        screen.blit(body, xy)
 
def food() :
    #显示食物
    global fx, fy
    screen.blit(berries, (fx, fy))
 
def eat() :
    #检测是否吃掉食物
    if (x, y) == (fx, fy) :
        return True
    else :
        return False
 
def crash() :
    #检测是否碰撞
    if path.count((x, y)) != 0 :
        return True
    elif x < 0 or x > 480 or y < 0 or y > 480 :
        return True
    else :
        return False
 
def count() :
    #计时线程函数
    global T
    while True :
        if B :
            time.sleep(1)
            T += 1
 
def timer() :
    #显示时间
    global T, number
    a = T // 100
    b = T % 100 // 10
    c = T % 10
    a = number[a]
    b = number[b]
    c = number[c]
    X, Y = 6, 10
    block.fill('white')
    for n in (a, b, c) :
        for xy in n :
            x = X + xy[0] * 4
            y = Y + xy[1] * 4
            screen.blit(block, (x, y))
        X += 32
 
def mark() :
    #显示分数
    global M, number
    a = M // 100
    b = M % 100 // 10
    c = M % 10
    a = number[a]
    b = number[b]
    c = number[c]
    X, Y = 395, 10
    block.fill('white')
    for n in (a, b, c) :
        for xy in n :
            x = X + xy[0] * 4
            y = Y + xy[1] * 4
            screen.blit(block, (x, y))
        X += 32
 
def hi() :
    #显示最高纪录
    global HI, number
    a = HI // 100
    b = HI % 100 // 10
    c = HI % 10
    a = number[a]
    b = number[b]
    c = number[c]
    X, Y = 263, 10
    block.fill('grey')
    for n in (a, b, c) :
        for xy in n :
            x = X + xy[0] * 4
            y = Y + xy[1] * 4
            screen.blit(block, (x, y))
        X += 32

线程 

#启动计时线程
time_count_thread = threading.Thread(target = count)
time_count_thread.start()

 线程可以在主线程的运行过程中运行,起到计时的作用。

主要部分

以下就是程序的主要部分,实现了对按键名称进行判断、蛇的移动、蛇吃掉食物后的生长和判断死亡。

while True :
    #变量初始化
    KEY = 'up'
    lKEY = KEY
    x, y = 240, 240
    path = []
    path.append((x, y))
    fx, fy = random.randrange(20, 460, 20), random.randrange(20, 460, 20)
    while path.count((fx, fy)) != 0 :
        fx, fy = random.randrange(20, 460, 20), random.randrange(20, 460, 20)
    T = 0
    M = 0
    B = True
 
    while True :
        time.sleep(0.1)
 
        #检测是否按下退出按钮
        for event in pygame.event.get() :
            if event.type == pygame.QUIT :
                pygame.quit()
                exit()
        
        #检测键盘按键
        if (KEY == 'up' and lKEY != 'down') or (KEY == 'w' and lKEY != 's') :
            y -= 20
            lKEY = KEY
        elif (KEY == 'down' and lKEY != 'up') or (KEY == 's' and lKEY != 'w')  :
            y += 20
            lKEY = KEY
        elif (KEY == 'left' and lKEY != 'right') or (KEY == 'a' and lKEY != 'd')  :
            x -= 20
            lKEY = KEY
        elif (KEY == 'right' and lKEY != 'left') or (KEY == 'd' and lKEY != 'a')  :
            x += 20
            lKEY = KEY
        elif KEY == 'alt' or KEY == 'right alt' :
            B = False
            while True :
                pygame.event.wait()
                if KEY == 'space' :
                    KEY = lKEY
                    B = True
                    break
                elif KEY == 'esc' :
                    pygame.quit()
                    if M > HI :
                        HI = M
                        db.set('HiMark', HI)
                        db.dump()
                    exit()
            continue
        elif KEY == 'esc' :
            pygame.quit()
            if M > HI :
                HI = M
                db.set('HiMark', HI)
                db.dump()
            exit()
        else :
            KEY = lKEY
            continue
 
        #检测是否碰撞或吃掉食物
        if crash() :
            break
        if eat() :
            M += 1
            fx, fy = random.randrange(20, 460, 20), random.randrange(20, 460, 20)
            while path.count((fx, fy)) != 0 :
                fx, fy = random.randrange(20, 460, 20), random.randrange(20, 460, 20)
        else :
            del path[0]
        
        #更新屏幕内容
        path.append((x, y))
        screen.fill('black')
        snake()
        food()
        timer()
        mark()
        hi()
        pygame.display.flip()
 
    #保存最高纪录
    if M > HI :
        HI = M
        db.set('HiMark', HI)
        db.dump()
    
    B = False
 
    #检测是否退出或再来一局
    while True :
        event = pygame.event.wait()
        if event.type == pygame.QUIT :
            pygame.quit()
            exit()
        elif KEY == 'esc' :
            pygame.quit()
            exit()
        elif KEY == 'return' or KEY == 'enter' :
            break

总结

如果你将以上所有的代码按顺序编写在一些,就可以运行完整的贪吃蛇了。这些代码都很简单,适合初学者学习。

源码下载 

GitHub源码

到此这篇关于用322行Python代码编写贪吃蛇游戏的文章就介绍到这了,更多相关Python编写贪吃蛇内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • keras做CNN的训练误差loss的下降操作

    keras做CNN的训练误差loss的下降操作

    这篇文章主要介绍了keras做CNN的训练误差loss的下降操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 详解Python中import机制

    详解Python中import机制

    这篇文章主要介绍了Python中import机制的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-09-09
  • 十个Python自动化常用操作,即拿即用

    十个Python自动化常用操作,即拿即用

    这篇文章主要介绍了十个Python自动化常用操作,即拿即用,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好的帮助哟,需要的朋友可以参考下
    2021-05-05
  • Python获取和设置代理的动态IP的方式

    Python获取和设置代理的动态IP的方式

    在网络世界中,代理和动态IP是非常常见的概念,尤其对于需要大规模访问网站或者需要隐藏真实IP地址的应用程序来说,更是必不可少的工具,本文将给大家介绍如何使用编程技术来实现动态IP的设置和管理,需要的朋友可以参考下
    2024-05-05
  • Python pandas的describe函数参数示例详解

    Python pandas的describe函数参数示例详解

    describe()函数是pandas 中一个十分实用的工具,用于快速获取数据集的描述性统计信息,本文详细介绍了该函数的各种参数及其用法,包括控制输出的百分位数、列类型以及是否将日期时间列视为数值型列等,感兴趣的朋友一起看看吧
    2018-04-04
  • 啥是佩奇?使用Python自动绘画小猪佩奇的代码实例

    啥是佩奇?使用Python自动绘画小猪佩奇的代码实例

    今天小编就为大家分享一篇关于啥是佩奇?使用Python自动绘画小猪佩奇的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • python实现基本进制转换的方法

    python实现基本进制转换的方法

    这篇文章主要介绍了python实现基本进制转换的方法,涉及Python数学运算的取余与字符串操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 解决springboot yml配置 logging.level 报错问题

    解决springboot yml配置 logging.level 报错问题

    今天小编就为大家分享一篇解决springboot yml配置 logging.level 报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python3如何清除过滤emoji表情

    python3如何清除过滤emoji表情

    这篇文章主要介绍了python3如何清除过滤emoji表情问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Python数据清洗之表格字段智能去重

    Python数据清洗之表格字段智能去重

    数据清洗是数据分析和处理过程中一个至关重要的步骤,其中字段去重更是一个常见且关键的任务,下面我们看看如何利用Python进行表格字段智能去重吧
    2025-03-03

最新评论