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调用cmd复制文件代码分享
Dec 27 Python
python实现的二叉树定义与遍历算法实例
Jun 30 Python
Python简单读取json文件功能示例
Nov 30 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
python文件选择对话框的操作方法
Jun 27 Python
python线程中的同步问题及解决方法
Aug 29 Python
浅谈Python 参数与变量
Jun 20 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
浅析python函数式编程
Sep 26 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 Python
Python anaconda安装库命令详解
Oct 16 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 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 ADODB使用方法集锦
2008/03/25 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
javascript数据类型详解
2017/02/07 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
Python标准库sched模块使用指南
2017/07/06 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
python多线程与多进程及其区别详解
2019/08/08 Python
django自带调试服务器的使用详解
2019/08/29 Python
python scatter函数用法实例详解
2020/02/11 Python
关于python中的xpath解析定位
2020/03/06 Python
Python求凸包及多边形面积教程
2020/04/12 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
某集团股份有限公司委托书样本
2014/09/24 职场文书
万能检讨书
2015/01/27 职场文书
劳动仲裁调解书
2015/05/20 职场文书
社区服务理念口号
2015/12/25 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers