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网络编程学习笔记(10):webpy框架
Jun 09 Python
Python入门_浅谈for循环、while循环
May 16 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
Java分治归并排序算法实例详解
Dec 12 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
解决Django中调用keras的模型出现的问题
Aug 07 Python
python支付宝支付示例详解
Aug 22 Python
django自带调试服务器的使用详解
Aug 29 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 Python
Python range与enumerate函数区别解析
Feb 28 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 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
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
PHP编实现程动态图像的创建代码
2008/09/28 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
js常用代码段收集
2011/10/28 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
颁奖典礼主持词
2014/03/25 职场文书
部门年终奖分配方案
2014/05/07 职场文书
客户答谢会活动方案
2014/08/31 职场文书
银行催款通知书
2015/04/17 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python