68行Python代码实现带难度升级的贪吃蛇


Posted in Python onJanuary 18, 2022

一、前言

之前版本很多小伙伴都觉得难度过高,另外也有粉丝问还能不能精简代码。

所以这版降低了难度 (由原来过关增加5km/h改为3.5KM/h)
并通过反射代替IF ELSE的写法,删除了一些冗余的代码,将代码由85行压缩到了68行 (不必要的压缩代码是不建议的,这里压缩代码只是为了好玩)

二、实现效果

68行Python代码实现带难度升级的贪吃蛇

个人最高纪录

68行Python代码实现带难度升级的贪吃蛇

三、环境要求

python 3+

pygame包 安装命令:打开cmd 输入: pip install pygame

四、源码分享

import pygame,sys,random
SCREEN,dirction_node = 600, {pygame.K_LEFT:['left',-25],pygame.K_RIGHT:['right',25],pygame.K_UP:['top',-25],pygame.K_DOWN:['top',25]}  # 屏幕尺寸,移动的定义
class Snake:  # 蛇类
    def __init__(self):  # 初始化各种需要的属性 [开始时默认向右/身体块x5]
        self.dirction, self.body = pygame.K_RIGHT, []
        [self.add_node() for _ in range(5)]
    def add_node(self):
        node = pygame.Rect(((self.body[0].left, self.body[0].top) if self.body else (0, 0)) + (25, 25))  # 随时增加蛇块
        setattr(node, dirction_node[self.dirction][0], getattr(node, dirction_node[self.dirction][0]) + dirction_node[self.dirction][1])
        self.body.insert(0, node)
    def is_dead(self):
        body_h = self.body[0]
        if body_h.x not in range(SCREEN) or body_h.y not in range(SCREEN) or body_h in self.body[1:]:  # 撞墙、撞自己则死亡
            return True
    def move(self):
        self.add_node()
        self.body.pop()
    def change_direction(self, curkey):  # 改变方向 但是左右、上下不能被逆向改变
        LR, UD = [pygame.K_LEFT, pygame.K_RIGHT], [pygame.K_UP, pygame.K_DOWN]
        if curkey in LR + UD:
            if not ((curkey in LR) and (self.dirction in LR) or (curkey in UD) and (self.dirction in UD)):
                self.dirction = curkey
class Food:  # 食物类
    def __init__(self):
        self.rect = pygame.Rect(-25, 0, 25, 25)
    def remove(self):
        self.rect.x = -25
    def set(self):
        if self.rect.x == -25:
            allpos = [pos for pos in range(75, SCREEN - 75, 25)]  # 生成的食物距离墙在75 ~ SCREEN-55 之间
            self.rect.left, self.rect.top = random.choice(allpos), random.choice(allpos)
def show_text(screen, pos, text, color, font_size=30):
    cur_font = pygame.font.SysFont("SimHei", font_size)  # 设置文字样式
    text_fmt = cur_font.render(text, True, color)  # 设置文字内容
    screen.blit(text_fmt, pos)  # 绘制文字
def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN, SCREEN))
    pygame.display.set_caption('贪吃蛇:是男人就坚持到第10关!')
    snake,food,clock, scores, isdead = Snake(),Food(),pygame.time.Clock(), 0, False
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if event.type == pygame.KEYDOWN:
                snake.change_direction(event.key)
                if event.key == pygame.K_SPACE and isdead:  # 死后按space重新
                    return main()
        screen.fill((255, 255, 255))
        if not isdead:  # 画蛇身 / 每一步+1分
            snake.move()
        for rect in snake.body:
            pygame.draw.rect(screen, (144, 238, 144), rect)
        isdead = snake.is_dead()  # 显示死亡文字
        if isdead:
            show_text(screen, (150, 200), '翻车了!', (227, 29, 18), 80)
            show_text(screen, (50, 320), '是男人就超过45KM/h,按空格键重试...', (0, 0, 22))
        if food.rect == snake.body[0]:  # 当食物rect与蛇头重合,吃掉 -> Snake增加一个Node
            scores += 1  # 食物处理 / 吃到+1分
            food.remove()
            snake.add_node()
        food.set()  # 食物投递
        pygame.draw.rect(screen, (233, 150, 122), food.rect)
        speed = 10 + scores * 3.5 if scores else 10  # 蛇移动速度
        show_text(screen, (20, 550), '关卡:' + str(scores) + '   速度:' + str(speed) + 'KM/h', (0, 0, 205))  # 显示得分和速度
        pygame.display.update()
        clock.tick(speed)
main()

五、总结

再强调一遍:这里减少代码量只是为了好玩,不必要的压缩代码是不建议的!代码可读性、可维护性才是我们在编码中首要考虑的事情!

这也只是随便弄的一个小玩意,如果真要做游戏还是建议使用游戏引擎。

市面上常见的cocos、unity都是不错的游戏引擎,能够让你开发游戏的效率达到事半功倍的效果

到此这篇关于68行Python代码实现带难度升级的贪吃蛇的文章就介绍到这了,更多相关Python 贪吃蛇内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用 Python 获取 Linux 系统信息的代码
Jul 13 Python
python登陆asp网站页面的实现代码
Jan 14 Python
python 读写txt文件 json文件的实现方法
Oct 22 Python
python爬虫之百度API调用方法
Jun 11 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
Jan 04 Python
tf.concat中axis的含义与使用详解
Feb 07 Python
python3实现网页版raspberry pi(树莓派)小车控制
Feb 12 Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 Python
Django如何与Ajax交互
Apr 29 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 #Python
聊聊Python String型列表求最值的问题
Jan 18 #Python
Python的三个重要函数详解
Jan 18 #Python
python多线程方法详解
Jan 18 #Python
用Python生成会跳舞的美女
基于Pygame实现简单的贪吃蛇游戏
Dec 06 #Python
Python可变集合和不可变集合的构造方法大全
Dec 06 #Python
You might like
joomla内置的表单验证功能使用方法
2010/06/11 PHP
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
javascript 网页跳转的方法
2008/12/24 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
Python类继承和多态原理解析
2020/02/05 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
数据库专业英语
2012/11/30 面试题
小学班主任评语大全
2014/04/23 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
实验心得体会
2014/09/05 职场文书
2014年村官工作总结
2014/11/24 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers