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中Random和Math模块学习笔记
May 18 Python
Python ldap实现登录实例代码
Sep 30 Python
Python简单实现socket信息发送与监听功能示例
Jan 03 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
Python 将Matrix、Dict保存到文件的方法
Oct 30 Python
Flask框架工厂函数用法实例分析
May 25 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
对python中return与yield的区别详解
Mar 12 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 Python
Python实现简繁体转换
Jun 07 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
基于PHP静态类的原罪详解
2013/05/06 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
两个DIV等高的JS的实现代码
2007/12/23 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
Python字符串中查找子串小技巧
2015/04/10 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
结构和类有什么异同
2012/07/16 面试题
房屋产权证明书
2014/10/15 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
兵马俑的导游词
2015/02/02 职场文书
大学四年个人总结
2015/03/03 职场文书
主婚人致辞精选
2015/07/28 职场文书
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS