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编程中的for循环语句学习教程
Oct 14 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
Python系统监控模块psutil功能与经典用法分析
May 24 Python
Python实现的微信好友数据分析功能示例
Jun 21 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
python opencv进行图像拼接
Mar 27 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 Python
python基础之文件处理知识总结
May 23 Python
Python实现简单得递归下降Parser
May 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
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
新版PHP极大的增强功能和性能
2006/10/09 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
php ci框架验证码实例分析
2013/06/26 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
python实现巡检系统(solaris)示例
2014/04/02 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
tensorflow 获取变量&打印权值的实例讲解
2018/06/14 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
应届生英语教师求职信
2013/11/05 职场文书
教师岗位职责范本
2013/12/29 职场文书
小学生演讲稿
2014/01/12 职场文书
IT工程师岗位职责
2014/07/04 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
财政局个人年终总结
2015/03/03 职场文书
营业员岗位职责范本
2015/04/14 职场文书
MySQL库表名大小写的选择
2021/06/05 MySQL