Python 贪吃蛇

news2025/1/13 7:48:01

文章目录

  • 效果图:
  • 项目目录结构
    • main.py
    • game/apple.py
    • game/base.py
    • game/snake.py
    • constant.py

效果图:

请添加图片描述

项目目录结构

在这里插入图片描述

main.py

from snake.game.apple import Apple  # 导入苹果类
from snake.game.base import *  # 导入游戏基类
from snake.game.snake import Snake  # 导入蛇类


class SnakeGame(GameBase):
    """贪吃蛇游戏"""

    def __init__(self):
        """初始化游戏"""
        super(SnakeGame, self).__init__(
            game_name=GAME_NAME, icon=ICON,  # 调用基类的初始化方法
            screen_size=SCREEN_SIZE,
            display_mode=DISPLAY_MODE,
            loop_speed=LOOP_SPEED,
            font_size=FONT_SIZE,
            background=WHITE,
            font_name=None
        )
        # 绘制背景
        self.prepare_background()
        # 创建游戏对象
        self.apple_count = 0  # 苹果计数器
        self.high_score = 0  # 记录最高分
        self.snake = Snake(self)  # 创建蛇对象
        self.apple = Apple(self)  # 创建苹果对象
        # 绑定按键事件
        self.add_key_binding(KEY_UP, self.snake.turn, direction=UP)  # 绑定上方向键
        self.add_key_binding(KEY_DOWN, self.snake.turn, direction=DOWN)  # 绑定下方向键
        self.add_key_binding(KEY_LEFT, self.snake.turn, direction=LEFT)  # 绑定左方向键
        self.add_key_binding(KEY_RIGHT, self.snake.turn, direction=RIGHT)  # 绑定右方向键
        self.add_key_binding(KEY_RESTART, self.restart)  # 绑定R键(重启游戏)
        self.add_key_binding(KEY_PAUSE, self.pause)  # 绑定R键(重启游戏)
        self.add_key_binding(KEY_EXIT, self.quit)  # 绑定退出键
        # 添加绘图函数
        self.add_draw_action(self.draw_score)  # 添加绘制分数的函数

    def prepare_background(self):
        """准备背景"""
        self.background.fill(BACKGROUND_COLOR)  # 用背景颜色填充背景
        for _ in range(CELL_SIZE, SCREEN_WIDTH, CELL_SIZE):  # 绘制垂直网格线
            self.draw.line(self.background, GRID_COLOR, (_, 0), (_, SCREEN_HEIGHT))
        for _ in range(CELL_SIZE, SCREEN_HEIGHT, CELL_SIZE):  # 绘制水平网格线
            self.draw.line(self.background, GRID_COLOR, (0, _), (SCREEN_WIDTH, _))

    def restart(self):
        """重启游戏"""
        if not self.snake.is_alive:  # 如果蛇已经死亡
            self.apple_count = 0  # 重置苹果计数器
            self.apple.drop()  # 重新放置苹果
            self.snake.restart_pawn()  # 重生蛇
            self.running = True  # 继续游戏循环

    def draw_score(self):
        """绘制分数"""
        text = f"Apple: {self.apple_count}"  # 准备要绘制的文本
        self.high_score = max(self.high_score, self.apple_count)  # 更新最高分
        self.draw_text(text, (0, 0), (255, 255, 33))  # 绘制文本

        if not self.snake.is_alive:  # 如果蛇已经死亡
            self.draw_text(" 游戏结束 ", (SCREEN_WIDTH / 2 - 54, SCREEN_HEIGHT / 2 - 10),  # 绘制游戏结束文本
                           (255, 33, 33), WHITE)

            self.draw_text(" 按R键重启 ", (SCREEN_WIDTH / 2 - 85, SCREEN_HEIGHT / 2 + 20),  # 绘制重启提示文本
                           GREY, DARK_GREY)

            self.draw_text(f"当前最高分: {self.high_score}", (SCREEN_WIDTH / 2 - 114, SCREEN_HEIGHT / 2 + 50),  # 绘制最高分文本
                           (255, 33, 33), WHITE)  # 展示最高分

        if not self.running and self.snake.is_alive:  # 如果游戏暂停且蛇还活着
            self.draw_text("游戏暂停 ", (SCREEN_WIDTH / 2 - 55, SCREEN_HEIGHT / 2 - 10),  # 绘制游戏暂停文本
                           LIGHT_GREY, DARK_GREY)


if __name__ == '__main__':
    SnakeGame().run()  # 运行游戏

game/apple.py

from random import randint
from snake.constant import *


class Apple:
    """
    苹果类:表示游戏中的苹果,蛇吃到苹果会增长身体长度。
    """

    def __init__(self, game):
        """
        初始化苹果对象。
        :param game: 游戏对象。
        """
        self.game = game
        self.x = self.y = 0  # 苹果的初始位置
        self.game.add_draw_action(self.draw)  # 将 draw 方法添加到游戏的绘制动作列表中
        self.drop()  # 生成一个新的苹果

    def drop(self):
        """
        生成一个新的苹果,确保苹果不在蛇的身体上。
        """
        snake = self.game.snake.body + [self.game.snake.head]  # 获取蛇的身体和头部的所有位置
        while True:
            (x, y) = randint(0, COLUMNS - 1), randint(0, ROWS - 1)  # 随机生成一个位置
            if (x, y) not in snake:  # 如果这个位置不在蛇的身体上
                self.x, self.y = x, y  # 将苹果的位置设置为这个位置
                break  # 退出循环

    def draw(self):
        """
        绘制苹果。
        """
        self.game.draw_cell(
            (self.x, self.y),  # 苹果的位置
            CELL_SIZE,  # 每个单元格的大小
            APPLE_COLOR_SKIN,  # 苹果的外框颜色
            APPLE_COLOR_BODY  # 苹果的主体颜色
        )

game/base.py

import os
import sys
import time
from snake.constant import *

# 使窗口居中
os.environ["SDL_VIDEO_CENTERED"] = "1"

# MyGame 默认值
GAME_NAME = "贪吃蛇 By stormsha"
SCREEN_SIZE = 640, 480
DISPLAY_MODE = pygame.HWSURFACE | pygame.DOUBLEBUF
LOOP_SPEED = 60
# noinspection SpellCheckingInspection
FONT_NAME = "resources/MONACO.ttf"
FONT_SIZE = 16
KEY_PAUSE = pygame.K_PAUSE


class GameBase(object):
    """pygame模板类"""

    def __init__(self, **kwargs):
        """初始化

        可选参数:
            game_name       游戏名称
            icon            图标文件名
            screen_size     画面大小
            display_mode    显示模式
            loop_speed      主循环速度
            font_name       字体文件名
            font_size       字体大小
        """
        pygame.init()
        pygame.mixer.init()
        self.game_name = kwargs.get("game_name") or GAME_NAME
        pygame.display.set_caption(self.game_name)
        self.screen_size = kwargs.get("screen_size") or SCREEN_SIZE
        self.screen_width, self.screen_height = self.screen_size
        self.display_mode = kwargs.get("display_mode") or DISPLAY_MODE
        self.images = {}
        self.sounds = {}
        self.musics = {}
        self.icon = kwargs.get("icon") or None
        self.icon and pygame.display.set_icon(pygame.image.load(self.icon))
        self.screen = pygame.display.set_mode(self.screen_size,
                                              self.display_mode)
        self.loop_speed = kwargs.get("loop_speed") or LOOP_SPEED
        self.font_size = kwargs.get("font_size") or FONT_SIZE
        self.background = None

        # noinspection SpellCheckingInspection
        ''' 支持中文的字体
        新细明体:PMingLiU
        细明体:MingLiU
        标楷体:DFKai - SB
        黑体:SimHei
        宋体:SimSun
        新宋体:NSimSun
        仿宋:FangSong
        楷体:KaiTi
        仿宋_GB2312:FangSong_GB2312
        楷体_GB2312:KaiTi_GB2312
        微软正黑体:Microsoft JhengHei
        微软雅黑体:Microsoft YaHei
        '''
        self.font_name = kwargs.get("font_name") or pygame.font.match_font('SimHei')  # 获取系统字体

        self.font = pygame.font.Font(self.font_name, self.font_size)
        self.clock = pygame.time.Clock()
        self.now = 0
        self.background_color = kwargs.get("background") or BLACK
        self.set_background()
        self.key_bindings = {}  # 按键与函数绑定字典
        self.add_key_binding(KEY_PAUSE, self.pause)

        self.game_actions = {}  # 游戏数据更新动作

        self.draw_actions = [self.draw_background]  # 画面更新动作列表

        self.running = True
        self.draw = pygame.draw

    def run(self):
        """主循环"""
        while True:
            self.now = pygame.time.get_ticks()
            self.process_events()
            if self.running:
                self.update_game_data()
            self.update_display()
            self.clock.tick(self.loop_speed)

    def pause(self):
        """暂停游戏"""
        self.running = not self.running
        if self.running:
            for action in self.game_actions.values():
                if action["next_time"]:
                    action["next_time"] = self.now + action["interval"]

    def process_events(self):
        """事件处理"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.quit()
            elif event.type == pygame.KEYDOWN:
                action, kwargs = self.key_bindings.get(event.key, (None, None))
                # noinspection all
                action(**kwargs) if kwargs else action() if action else None

    def update_game_data(self):
        """更新游戏数据"""
        for action in self.game_actions.values():
            if not action["next_time"]:
                action["run"]()
            elif self.now >= action["next_time"]:
                action["next_time"] += action["interval"]
                action["run"]()

    def update_display(self):
        """更新画面显示"""
        for action in self.draw_actions:
            action()
        pygame.display.flip()

    def draw_background(self):
        """绘制背景"""
        self.screen.blit(self.background, (0, 0))

    def add_key_binding(self, key, action, **kwargs):
        """增加按键绑定"""
        self.key_bindings[key] = action, kwargs

    # TODO: 更新动作若有次序要求,则用字典保存不合适
    def add_game_action(self, name, action, interval=0):
        """添加游戏数据更新动作"""
        next_time = self.now + interval if interval else None
        self.game_actions[name] = dict(
            run=action,
            interval=interval,
            next_time=next_time)

    def add_draw_action(self, action):
        """添加画面更新动作"""
        self.draw_actions.append(action)

    def draw_text(self, text, loc, color, bgcolor=None):
        if bgcolor:
            surface = self.font.render(text, True, color, bgcolor)
        else:
            surface = self.font.render(text, True, color)
        self.screen.blit(surface, loc)

    def draw_cell(self, xy, size, color1, color2=None):
        x, y = xy
        rect = pygame.Rect(x * size, y * size, size, size)
        self.screen.fill(color1, rect)
        if color2:
            self.screen.fill(color2, rect.inflate(-4, -4))

    @staticmethod
    def quit():
        """退出游戏"""
        pygame.quit()
        sys.exit(0)

    @staticmethod
    def load_music(filename):
        pygame.mixer.music.load(filename)

    @staticmethod
    def play_music():
        pygame.mixer.music.play(-1)

    @staticmethod
    def pause_music():
        pygame.mixer.music.pause()

    @staticmethod
    def resume_music():
        pygame.mixer.music.unpause()

    @staticmethod
    def stop_music():
        pygame.mixer.music.stop()

    def save_screenshots(self):
        filename = time.strftime('screenshots/%Y%m%d%H%M%S.png')
        pygame.image.save(self.screen, filename)

    def load_images(self, filename, sub_img=None):
        sub_img = sub_img or {}
        image = pygame.image.load(filename).convert_alpha()  # 文件打开失败
        for name, rect in sub_img.items():
            x, y, w, h = rect
            self.images[name] = image.subsurface(pygame.Rect((x, y), (w, h)))

    def set_background(self, background=None):
        if isinstance(background, str):
            self.background = pygame.image.load(background)
        else:
            self.background = pygame.Surface(self.screen_size)
            self.background_color = background \
                if isinstance(background, tuple) else (0, 0, 0)
            self.background.fill(self.background_color)

    def load_sounds(self, **sounds):
        """
        @summary: 加载音乐
        :param sounds:
        :return:
        """
        for name, filename in sounds.items():
            self.sounds[name] = pygame.mixer.Sound(filename)

    def play_sound(self, name):
        self.sounds[name].play()


if __name__ == '__main__':
    GameBase().run()

game/snake.py

import pygame

from snake import constant


class Snake:
    """贪吃蛇"""

    def __init__(self, game):
        self.game = game
        self.sound_hit = pygame.mixer.Sound("resources/hit.wav")
        self.sound_eat = pygame.mixer.Sound("resources/eat.wav")
        self.game.add_draw_action(self.draw)

        # 初始化数据
        self.head = (constant.SNAKE_X, constant.SNAKE_Y)  # 蛇头当前位置
        self.body = [(-1, -1)] * constant.SNAKE_BODY_LENGTH  # 蛇身长度
        self.direction = constant.SNAKE_DIRECTION  # 当前方向
        self.new_direction = constant.SNAKE_DIRECTION  # 移动方向
        self.speed = constant.SNAKE_SPEED  # 移动速度
        self.is_alive = True  # 是否存活

    def set_speed(self, speed):
        """
        @summary: 设置蛇的移动速度
        :param speed: 移动速度
        :return:
        """
        self._speed = speed
        self.game.add_game_action("snake.move", self.move, 1000 // speed)

    def get_speed(self):
        """
        @summary: 获取当前蛇的移动速度
        :return:
        """
        return self._speed

    @property
    def speed(self):
        return self._speed

    @speed.setter
    def speed(self, speed):
        self._speed = speed
        self.game.add_game_action("snake.move", self.move, 1000 // speed)

    def draw(self):
        """
        @summary: 绘制小蛇
        :return: 
        """
        skin_color = constant.SNAKE_COLOR_SKIN if self.is_alive else constant.SNAKE_COLOR_SKIN_DEAD
        body_color = constant.SNAKE_COLOR_BODY if self.is_alive else constant.SNAKE_COLOR_BODY_DEAD
        head_color = constant.SNAKE_COLOR_HEAD if self.is_alive else constant.SNAKE_COLOR_HEAD_DEAD
        for cell in self.body:
            self.game.draw_cell(cell, constant.CELL_SIZE, skin_color, body_color)
        self.game.draw_cell(self.head, constant.CELL_SIZE, skin_color, head_color)

    def turn(self, direction):
        """
        @summary: 改变小蛇方向
        :param direction: 
        :return: 
        """
        if (self.direction in (constant.LEFT, constant.RIGHT) and direction in (constant.UP, constant.DOWN) or
                self.direction in (constant.UP, constant.DOWN) and direction in (constant.LEFT, constant.RIGHT)):
            self.new_direction = direction

    def move(self):
        """
        @summary: 移动小蛇
        :return: 
        """
        if not self.is_alive:
            return
        # 设定方向
        self.direction = self.new_direction
        # 检测前方
        x, y = meeting = (
            self.head[0] + self.direction[0],
            self.head[1] + self.direction[1]
        )
        # 死亡判断
        if meeting in self.body or x not in range(constant.COLUMNS) or y not in range(constant.ROWS):
            self.die()
            return
        # 判断是否吃了苹果
        if meeting == (self.game.apple.x, self.game.apple.y):
            self.sound_eat.play()
            self.game.apple.drop()
            self.game.apple_count += 1
        else:
            self.body.pop()
        # 蛇头变成脖子
        self.body = [self.head] + self.body
        # 蛇头移动到新位置
        self.head = meeting

    def restart_pawn(self):
        """重生"""
        self.head = (constant.SNAKE_X, constant.SNAKE_Y)
        self.body = [(-1, -1)] * constant.SNAKE_BODY_LENGTH
        self.direction = constant.SNAKE_DIRECTION
        self.new_direction = constant.SNAKE_DIRECTION
        self.speed = constant.SNAKE_SPEED
        self.is_alive = True

    def die(self):
        self.sound_hit.play()
        self.is_alive = False

constant.py

import pygame

# 颜色设定
BLACK = 0, 0, 0
WHITE = 255, 255, 255
DARK_GREY = 33, 33, 33
GREY = 127, 127, 127
LIGHT_GREY = 192, 192, 192
BACKGROUND_COLOR = BLACK
GRID_COLOR = DARK_GREY
APPLE_COLOR_SKIN = 255, 127, 127
APPLE_COLOR_BODY = 255, 66, 66
SNAKE_COLOR_SKIN = 33, 255, 33
SNAKE_COLOR_BODY = 33, 192, 33
SNAKE_COLOR_HEAD = 192, 192, 33
SNAKE_COLOR_SKIN_DEAD = LIGHT_GREY
SNAKE_COLOR_BODY_DEAD = GREY
SNAKE_COLOR_HEAD_DEAD = DARK_GREY

# 一般设定
GAME_NAME = "SnakeGame"
SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 640, 480
CELL_SIZE = 20
COLUMNS, ROWS = SCREEN_WIDTH // CELL_SIZE, SCREEN_HEIGHT // CELL_SIZE
DISPLAY_MODE = pygame.HWSURFACE | pygame.DOUBLEBUF
LOOP_SPEED = 60
# noinspection SpellCheckingInspection
FONT_NAME = "resources/MONACO.TTF"
FONT_SIZE = 16
# noinspection SpellCheckingInspection
ICON = "resources/snake.png"
UP, DOWN, LEFT, RIGHT = (0, -1), (0, 1), (-1, 0), (1, 0)

# 按键设定
KEY_EXIT = pygame.K_ESCAPE
KEY_UP = pygame.K_UP
KEY_DOWN = pygame.K_DOWN
KEY_LEFT = pygame.K_LEFT
KEY_RIGHT = pygame.K_RIGHT
KEY_RESTART = pygame.K_r
K_PAUSE = pygame.K_PAUSE

# 蛇的默认值
SNAKE_X = 0
SNAKE_Y = 0
SNAKE_BODY_LENGTH = 5
SNAKE_DIRECTION = RIGHT
SNAKE_SPEED = 10

源码地址:https://gitcode.com/stormsha1/games/overview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1641469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的饭店外卖平台的设计与实现

项目描述 这是一款基于SpringBoot的饭店外卖平台的系统 模块描述 用户端 登录 首页 商家信息 点餐 菜品列表 下单 订单列表 账号下单列表 个人中心 个人资料 修改信息 评论管理 评论菜品 查看评论 打赏骑手 打赏骑手 管理员 登录 菜品管理 修改 下架 订单列表 下单记录 菜品管理…

Json数据概念及C# 环境下的序列化、反序列化操作

什么是Json? JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式,主要用于数据的序列化和交互。常用于Web中,其他领域也经常出现JSON的身影。 与xml相比,更快,更小,更容易解析…

银河麒麟桌面版开机后网络无法自动链接 麒麟系统开机没有连接ens33

1.每次虚拟机开机启动麒麟操作系统,都要输入账号,密码。 进入点击这个ens33 内网才连接 2. 如何开机就脸上呢? 2.1. 进入 cd /etc/sysconfig/network-scripts 2.2 修改参数 onbootyes 改为yes 2.3 重启即可 a. 直接重启机器查看是否正常&…

搜好货API接口:快速获取商品列表的利器

搜好货商品列表API接口允许开发者根据关键字搜索并获取相关的商品列表数据。接口支持多种参数配置,可以根据需求灵活调整搜索条件和结果返回格式。 点击获取key和secret API接口请求说明 请求地址:https://api.souhaohuo.com/goods/search请求方法&…

第四篇:记忆的迷宫:探索计算机存储结构的奥秘与创新

记忆的迷宫:探索计算机存储结构的奥秘与创新 1 引言 1.1 计算机存储系统的发展与重要性 在现代计算技术中,存储系统承担着非常关键的角色,它不仅负责信息的持久保存,同时确保高效的数据访问速度,影响着整体系统性能的…

C++奇迹之旅:C++初阶模版

文章目录 📝泛型编程🌠 函数模板🌉函数模板概念🌉函数模板格式🌉函数模板的原理 🌠函数模板的实例化🌉模板参数的匹配原则 🌠类模板🌉 类模板的定义格式🌉类模…

用vim或gvim编辑程序

vim其实不难使用&#xff0c;学习一下就好了。简单功能很快学会。它有三种模式&#xff1a;命令模式&#xff0c;编辑模式&#xff0c;视模式。打开时在命令模式。在命令模式下按 i 进入编辑模式&#xff0c;在编辑模式下按<Esc>键退出编辑模式。在命令模式按 :wq 保存文…

STM32入门学习之DMA

1.直接存储访问DMA(Direct Memory Access)&#xff1a;DMA传输不需要CPU的参与&#xff0c;直接在内存和I/O设备间开辟了一条新的数据传输通道&#xff0c;不仅提高数据传输的速率&#xff0c;还因为不需要CPU的干预&#xff0c;从而提高了CPU的利用率。(注&#xff1a;文中的资…

从永远到永远-和弦-挂留和弦

挂留和弦 1.概念2.指型1.Xsus2和弦2.Xsus4和弦 3.应用 1.概念 该篇说下和弦中的“渣男”、“绿茶”&#xff0c;挂留和弦。 挂留&#xff08;suspended&#xff09;和弦是将三和弦的三音替换成大二度或纯四度音形成的&#xff0c;包括挂留二和弦、挂留四和弦两种。 三音是一个…

【Android学习】简易计算器的实现

1.项目基础目录 新增dimens.xml 用于控制全部按钮的尺寸。图片资源放在drawable中。 另外 themes.xml中原来的 <style name"Theme.Learn" parent"Theme.MaterialComponents.DayNight.DarkActionBar">变为了&#xff0c;加上后可针对button中增加图片…

【nature review】用于非易失性射频开关技术的新兴存储电子器件

这篇文章是一篇关于非挥发性射频&#xff08;RF&#xff09;开关技术的综述文章&#xff0c;发表在《Nature Reviews Electrical Engineering》2024年1月的期刊上。文章详细介绍了新兴的基于记忆电子技术的RF开关技术&#xff0c;特别是在二维&#xff08;2D&#xff09;材料方…

Oracle23ai来了,23爱,全能、超级巨兽...

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

一毛钱不到的FH8208C单节锂离子和锂聚合物电池一体保护芯片

前言 目前市场上电池保护板&#xff0c;多为分体方案&#xff0c;多数场合使用没有问题&#xff0c;部分场合对空间有进一步要求&#xff0c;或者你不想用那么多器件&#xff0c;想精简一些&#xff0c;那么这个芯片就很合适&#xff0c;对于充电电池来说&#xff0c;应在使用…

gige工业相机突破(一)

gige相机能不能绕开相机生产商提供的sdk&#xff0c;而直接取到像&#xff1f; 两种办法&#xff0c;第一&#xff0c;gige vision2.0说明书&#xff0c;第二&#xff0c;genicam 首先你会去干什么事&#xff1f; 好几年&#xff0c;我都没有突破&#xff0c;老虎吃天&#x…

Jenkins流水线部署springboot项目

文章目录 Jenkins流水线任务介绍Jenkins流水线任务构建Jenkins流水线任务Groovy脚本Jenkinsfile实现 Jenkins流水线任务实现参数化构建拉取Git代码构建代码制作自定义镜像并发布 Jenkins流水线任务介绍 之前采用Jenkins的自由风格构建的项目&#xff0c;每个步骤流程都要通过不…

InfiniFlow 創始人兼CEO張穎峰確認出席“邊緣智能2024 - AI開發者峰會”

隨著AI技術的迅猛發展&#xff0c;全球正逐步進入邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同書寫著分布式智能創新應用的壯麗篇章。邊緣智能&#xff0c;作為融合邊緣計算和智能技術的新興領域&#xff0c;正逐漸成為推動AI發展的關鍵力量。借助分布式和去中心…

JavaScript 如何理解柯里化函数结构及调用

文章目录 柯里化函数是什么逐步理解柯里化函数 柯里化函数是什么 柯里化&#xff08;Currying&#xff09;函数&#xff0c;又称部分求值&#xff0c;是一种函数转换技术。这种技术将一个接受多个参数的函数转换为一系列接受单一参数的函数。具体来说&#xff0c;一个柯里化的…

AI大模型探索之路-训练篇11:大语言模型Transformer库-Model组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

C语言 | Leetcode C语言题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; void reserve(char* s) {int len strlen(s);for (int i 0; i < len / 2; i) {char t s[i];s[i] s[len - i - 1], s[len - i - 1] t;} }char* addBinary(char* a, char* b) {reserve(a);reserve(b);int len_a strlen(a), len_b st…

LeetCode 面试经典150题 28.找出字符串中第一个匹配项的下标

题目&#xff1a;给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 思路&#xff1a;暴力&#xff08;…