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运行的17个时新手常见错误小结
Aug 07 Python
Python写的Socks5协议代理服务器
Aug 06 Python
Python脚本实现12306火车票查询系统
Sep 30 Python
Python编程之Re模块下的函数介绍
Oct 28 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
python矩阵/字典实现最短路径算法
Jan 17 Python
Python sys模块常用方法解析
Feb 20 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
在keras 中获取张量 tensor 的维度大小实例
Jun 10 Python
python 5个顶级异步框架推荐
Sep 09 Python
基于Python制作一副扑克牌过程详解
Oct 19 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
php session的锁和并发
2016/01/22 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
HTML Color Picker(js拾色器效果)
2013/08/27 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
jQuery实现列表的全选功能
2015/03/18 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
在Python中操作文件之seek()方法的使用教程
2015/05/24 Python
python编程开发之日期操作实例分析
2015/11/13 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
python实现矩阵打印
2019/03/02 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
市场营销专科应届生求职信
2013/11/24 职场文书
行政部总经理岗位职责
2014/01/04 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
2014年英语工作总结
2014/12/20 职场文书
比较node.js和Deno
2021/04/27 Javascript
关于vue-router-link选择样式设置
2022/04/30 Vue.js