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计算N天之后日期的方法
Mar 31 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
python操作列表的函数使用代码详解
Dec 28 Python
python实现图片筛选程序
Oct 24 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
python基础梳理(一)(推荐)
Apr 06 Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
Jan 10 Python
python读取mysql数据绘制条形图
Mar 25 Python
Python 多进程、多线程效率对比
Nov 19 Python
python中if和elif的区别介绍
Nov 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遍历数组的几种方法
2012/03/22 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
npm qs模块使用详解
2020/02/07 Javascript
js实现小星星游戏
2020/03/23 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
python opencv进行图像拼接
2020/03/27 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
找工作最新求职信
2013/12/22 职场文书
运动会通讯稿600字
2015/07/20 职场文书
2015中学教学工作总结
2015/07/22 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL
python数字图像处理:图像简单滤波
2022/06/28 Python