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 字典(dict)遍历的四种方法性能测试报告
Jun 25 Python
Python实现的简单文件传输服务器和客户端
Apr 08 Python
Python实现数据库编程方法详解
Jun 09 Python
python django 增删改查操作 数据库Mysql
Jul 27 Python
import的本质解析
Oct 30 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
pyQT5 实现窗体之间传值的示例
Jun 20 Python
Django多数据库的实现过程详解
Aug 01 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
python使用numpy实现直方图反向投影示例
Jan 17 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
Python编程super应用场景及示例解析
Oct 05 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内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
分享一个常用的Python模拟登陆类
2015/03/29 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
python制作抖音代码舞
2019/04/07 Python
详解python解压压缩包的五种方法
2019/07/05 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
Python 定义只读属性的实现方式
2020/03/05 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
英智兴达软件测试笔试题
2016/10/12 面试题
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
运动会稿件300字
2014/02/14 职场文书
2015年环卫工作总结
2015/04/28 职场文书