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模拟鼠标拖动操作的方法
Mar 11 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
python去除扩展名的实例讲解
Apr 23 Python
python批量复制图片到另一个文件夹
Sep 17 Python
基于python指定包的安装路径方法
Oct 27 Python
Python Series从0开始索引的方法
Nov 06 Python
python opencv 图像拼接的实现方法
Jun 27 Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 Python
Python脚本导出为exe程序的方法
Mar 25 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 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 DOS攻击实现代码(附如何防范)
2012/05/29 PHP
laravel5使用freetds连接sql server的方法
2018/12/07 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
javascript 多浏览器 事件大全
2010/03/23 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
开始着手第一个Django项目
2015/07/15 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
香港交友网站:be2香港
2018/07/22 全球购物
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
毕业求职自荐信格式是什么
2013/11/19 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
普通话演讲稿
2014/09/03 职场文书
食堂卫生管理制度
2015/08/04 职场文书
html5调用摄像头截图功能
2022/01/18 Javascript
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏