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 相关文章推荐
Django框架下在视图中使用模版的方法
Jul 16 Python
Python Sql数据库增删改查操作简单封装
Apr 18 Python
django启动uwsgi报错的解决方法
Apr 08 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
PyQt5实现拖放功能
Apr 25 Python
python线程中同步锁详解
Apr 27 Python
Python使用re模块正则提取字符串中括号内的内容示例
Jun 01 Python
python url 参数修改方法
Dec 26 Python
wxPython实现带颜色的进度条
Nov 19 Python
Python 实现自动完成A4标签排版打印功能
Apr 09 Python
Eclipse配置python默认头过程图解
Apr 26 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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实现保存submit内容之后禁止刷新
2014/03/19 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
理解javascript模块化
2016/03/28 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
2016/05/31 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
详解用原生JavaScript实现jQuery的某些简单功能
2016/12/19 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
Python函数学习笔记
2008/10/07 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
公司薪酬管理制度
2014/01/31 职场文书
服务员岗位责任制
2014/02/11 职场文书
好学生评语大全
2014/05/05 职场文书
基层党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
关于环保的宣传稿
2015/07/23 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js