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模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
python中stdout输出不缓存的设置方法
May 29 Python
Python中的CURL PycURL使用例子
Jun 01 Python
python中的随机函数random的用法示例
Jan 27 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
用python的turtle模块实现给女票画个小心心
Nov 23 Python
Python关于反射的实例代码分享
Feb 20 Python
使用OpenCV实现道路车辆计数的使用方法
Jul 15 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 Python
Python 装饰器(decorator)常用的创建方式及解析
Apr 24 Python
Python开发五子棋小游戏
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
php 分库分表hash算法
2009/11/12 PHP
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
js获取url中"?"后面的字串方法
2014/05/15 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
用python代码做configure文件
2014/07/20 Python
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
python开发游戏的前期准备
2019/05/05 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
详解python破解zip文件密码的方法
2020/01/13 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
实习销售业务员自我鉴定
2013/09/21 职场文书
教师专业自荐信
2014/05/31 职场文书
关于保护环境的标语
2014/06/09 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
初中家长评语和期望
2014/12/26 职场文书
办公室日常管理制度
2015/08/04 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
Django分页器的用法你都了解吗
2021/05/26 Python
php解析非标准json、非规范json的方式实例
2022/05/10 PHP