最新c++经典项目控制台贪吃蛇小游戏详细教程_贪吃蛇小游戏c++,一个月成功收割腾讯、百度、美团、网易offer

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

    {
    case 72://UP上方向键
        if (key > 1)//当此时选中项为第一项时,UP上方向键无效
        {
            switch (key)
            {
            case 2:
                SetCursorPosition(27, 22);//给待选中项设置背景色
                SetBackColor();
                std::cout << "简单模式" ;

                SetCursorPosition(27, 24);//将已选中项取消我背景色
                SetColor(3);
                std::cout << "普通模式" ;

                --key;
                break;
            case 3:
                SetCursorPosition(27, 24);
                SetBackColor();
                std::cout << "普通模式" ;

                SetCursorPosition(27, 26);
                SetColor(3);
                std::cout << "困难模式" ;

                --key;
                break;
            case 4:
                SetCursorPosition(27, 26);
                SetBackColor();
                std::cout << "困难模式" ;

                SetCursorPosition(27, 28);
                SetColor(3);
                std::cout << "炼狱模式" ;

                --key;
                break;
            }
        }
        break;

    case 80://DOWN下方向键
        if (key < 4)
        {
            switch (key)
            {
            case 1:
                SetCursorPosition(27, 24);
                SetBackColor();
                std::cout << "普通模式" ;
                SetCursorPosition(27, 22);
                SetColor(3);
                std::cout << "简单模式" ;

                ++key;
                break;
            case 2:
                SetCursorPosition(27, 26);
                SetBackColor();
                std::cout << "困难模式" ;
                SetCursorPosition(27, 24);
                SetColor(3);
                std::cout << "普通模式" ;

                ++key;
                break;
            case 3:
                SetCursorPosition(27, 28);
                SetBackColor();
                std::cout << "炼狱模式" ;
                SetCursorPosition(27, 26);
                SetColor(3);
                std::cout << "困难模式" ;

                ++key;
                break;
            }
        }
        break;

    case 13://Enter回车键
        flag = true;
        break;
    default://无效按键
        break;
    }
    if (flag) break;//输入Enter回车键确认,退出检查输入循环

    SetCursorPosition(0, 31);//将光标置于左下角,避免关标闪烁影响游戏体验
}

switch (key)//根据所选选项设置蛇的移动速度,speed值越小,速度越快
{
case 1:
    speed = 135;
    break;
case 2:
    speed = 100;
    break;
case 3:
    speed = 60;
    break;
case 4:
    speed = 30;
    break;
default:
    break;
}

}

void Controller::DrawGame()//绘制游戏界面
{
system(“cls”);//清屏

/\*绘制地图\*/
SetColor(3);
Map *init_map = new Map();
init_map->PrintInitmap();
delete init_map;

/\*绘制侧边栏\*/
SetColor(3);
SetCursorPosition(33, 1);
std::cout << "Greedy Snake" ;
SetCursorPosition(34, 2);
std::cout << "贪吃蛇" ;
SetCursorPosition(31, 4);
std::cout << "难度:" ;
SetCursorPosition(36, 5);
switch (key)
{
case 1:
    std::cout << "简单模式" ;
    break;
case 2:
    std::cout << "普通模式" ;
    break;
case 3:
    std::cout << "困难模式" ;
    break;
case 4:
    std::cout << "炼狱模式" ;
    break;
default:
    break;
}
SetCursorPosition(31, 7);
std::cout << "得分:" ;
SetCursorPosition(37, 8);
std::cout << " 0" ;
SetCursorPosition(33, 13);
std::cout << " 方向键移动" ;
SetCursorPosition(33, 15);
std::cout << " ESC键暂停" ;

}

int Controller::PlayGame()//游戏二级循环
{
/*初始化蛇和食物*/
Snake *csnake = new Snake();
Food *cfood = new Food();
SetColor(6);
csnake->InitSnake();
srand((unsigned)time(NULL));//设置随机数种子,如果没有 食物的出现位置将会固定
cfood->DrawFood(*csnake);

/\*游戏循环\*/
while (csnake->OverEdge() && csnake->HitItself()) //判断是否撞墙或撞到自身,即是否还有生命
{
    /\*调出选择菜单\*/
    if (!csnake->ChangeDirection()) //按Esc键时
    {
        int tmp = Menu();//绘制菜单,并得到返回值
        switch (tmp)
        {
        case 1://继续游戏
            break;

        case 2://重新开始
            delete csnake;
            delete cfood;
            return 1;//将1作为PlayGame函数的返回值返回到Game函数中,表示重新开始

        case 3://退出游戏
            delete csnake;
            delete cfood;
            return 2;//将2作为PlayGame函数的返回值返回到Game函数中,表示退出游戏

        default:
            break;
        }
    }

    if (csnake->GetFood(*cfood)) //吃到食物
    {
        csnake->Move();//蛇增长
        UpdateScore(1);//更新分数,1为分数权重
        RewriteScore();//重新绘制分数
        cfood->DrawFood(*csnake);//绘制新食物
    }
    else
    {
        csnake->NormalMove();//蛇正常移动
    }

    if (csnake->GetBigFood(*cfood)) //吃到限时食物
    {
        csnake->Move();
        UpdateScore(cfood->GetProgressBar()/5);//分数根据限时食物进度条确定
        RewriteScore();
    }

    if (cfood->GetBigFlag()) //如果此时有限时食物,闪烁它
    {
        cfood->FlashBigFood();
    }

    Sleep(speed);//制造蛇的移动效果
}

/\*蛇死亡\*/
delete csnake;//释放分配的内存空间
delete cfood;
int tmp = GameOver();//绘制游戏结束界面,并返回所选项
switch (tmp)
{
case 1:
    return 1;//重新开始
case 2:
    return 2;//退出游戏
default:
    return 2;
}

}

void Controller::UpdateScore(const int& tmp)//更新分数
{
score += key * 10 * tmp;//所得分数根据游戏难度及传人的参数tmp确定
}

void Controller::RewriteScore()//重绘分数
{
/*为保持分数尾部对齐,将最大分数设置为6位,计算当前分数位数,将剩余位数用空格补全,再输出分数*/
SetCursorPosition(37, 8);
SetColor(11);
int bit = 0;
int tmp = score;
while (tmp != 0)
{
++bit;
tmp /= 10;
}
for (int i = 0; i < (6 - bit); ++i)
{
std::cout << " " ;
}
std::cout << score ;
}

int Controller::Menu()//选择菜单
{
/*绘制菜单*/
SetColor(11);
SetCursorPosition(32, 19);
std::cout << “菜单:” ;
Sleep(100);
SetCursorPosition(34, 21);
SetBackColor();
std::cout << “继续游戏” ;
Sleep(100);
SetCursorPosition(34, 23);
SetColor(11);
std::cout << “重新开始” ;
Sleep(100);
SetCursorPosition(34, 25);
std::cout << “退出游戏” ;
SetCursorPosition(0, 31);

/\*选择部分\*/
int ch;
int tmp_key = 1;
bool flag = false;
while ((ch = getch()))
{
    switch (ch)
    {
    case 72://UP
        if (tmp_key > 1)
        {
            switch (tmp_key)
            {
            case 2:
                SetCursorPosition(34, 21);
                SetBackColor();
                std::cout << "继续游戏" ;
                SetCursorPosition(34, 23);
                SetColor(11);
                std::cout << "重新开始" ;

                --tmp_key;
                break;
            case 3:
                SetCursorPosition(34, 23);
                SetBackColor();
                std::cout << "重新开始" ;
                SetCursorPosition(34, 25);
                SetColor(11);
                std::cout << "退出游戏" ;

                --tmp_key;
                break;
            }
        }
        break;

    case 80://DOWN
        if (tmp_key < 3)
        {
            switch (tmp_key)
            {
            case 1:
                SetCursorPosition(34, 23);
                SetBackColor();
                std::cout << "重新开始" ;
                SetCursorPosition(34, 21);
                SetColor(11);
                std::cout << "继续游戏" ;

                ++tmp_key;
                break;
            case 2:
                SetCursorPosition(34, 25);
                SetBackColor();
                std::cout << "退出游戏" ;
                SetCursorPosition(34, 23);
                SetColor(11);
                std::cout << "重新开始" ;

                ++tmp_key;
                break;
            }
        }
        break;

    case 13://Enter
        flag = true;
        break;

    default:
        break;
    }

    if (flag)
    {
        break;
    }
    SetCursorPosition(0, 31);
}

if (tmp_key == 1) //选择继续游戏,则将菜单擦除
{
    SetCursorPosition(32, 19);
    std::cout << " " ;
    SetCursorPosition(34, 21);
    std::cout << " ";
    SetCursorPosition(34, 23);
    std::cout << " ";
    SetCursorPosition(34, 25);
    std::cout << " ";
}
return tmp_key;

}

void Controller::Game()//游戏一级循环
{
Start();//开始界面
while (true)//游戏可视为一个死循环,直到退出游戏时循环结束
{
Select();//选择界面
DrawGame();//绘制游戏界面
int tmp = PlayGame();//开启游戏循环,当重新开始或退出游戏时,结束循环并返回值给tmp
if (tmp == 1) //返回值为1时重新开始游戏
{
system(“cls”);
continue;
}
else if (tmp == 2) //返回值为2时退出游戏
{
break;
}
else
{
break;
}
}
}

int Controller::GameOver()//游戏结束界面
{
/*绘制游戏结束界面*/
Sleep(500);
SetColor(11);
SetCursorPosition(10, 8);
std::cout << “━━━━━━━━━━━━━━━━━━━━━━” ;
Sleep(30);
SetCursorPosition(9, 9);
std::cout << " ┃ Game Over !!! ┃" ;
Sleep(30);
SetCursorPosition(9, 10);
std::cout << " ┃ ┃" ;
Sleep(30);
SetCursorPosition(9, 11);
std::cout << " ┃ 很遗憾!你挂了 ┃" ;
Sleep(30);
SetCursorPosition(9, 12);
std::cout << " ┃ ┃" ;
Sleep(30);
SetCursorPosition(9, 13);
std::cout << " ┃ 你的分数为: ┃" ;
SetCursorPosition(24, 13);
std::cout << score ;
Sleep(30);
SetCursorPosition(9, 14);
std::cout << " ┃ ┃" ;
Sleep(30);
SetCursorPosition(9, 15);
std::cout << " ┃ 是否再来一局? ┃" ;
Sleep(30);
SetCursorPosition(9, 16);
std::cout << " ┃ ┃" ;
Sleep(30);
SetCursorPosition(9, 17);
std::cout << " ┃ ┃" ;
Sleep(30);
SetCursorPosition(9, 18);
std::cout << " ┃ 嗯,好的 不了,还是学习有意思 ┃" ;
Sleep(30);
SetCursorPosition(9, 19);
std::cout << " ┃ ┃" ;
Sleep(30);
SetCursorPosition(9, 20);
std::cout << " ┃ ┃" ;
Sleep(30);
SetCursorPosition(10, 21);
std::cout << “━━━━━━━━━━━━━━━━━━━━━━” ;

Sleep(100);
SetCursorPosition(12, 18);
SetBackColor();
std::cout << "嗯,好的" ;
SetCursorPosition(0, 31);

/\*选择部分\*/
int ch;
int tmp_key = 1;
bool flag = false;
while ((ch = getch()))
{
    switch (ch)
    {
    case 75://LEFT
        if (tmp_key > 1)
        {
            SetCursorPosition(12, 18);
            SetBackColor();
            std::cout << "嗯,好的" ;
            SetCursorPosition(20, 18);
            SetColor(11);
            std::cout << "不了,还是学习有意思" ;
            --tmp_key;
        }
        break;

    case 77://RIGHT
        if (tmp_key < 2)
        {
            SetCursorPosition(20, 18);
            SetBackColor();
            std::cout << "不了,还是学习有意思" ;
            SetCursorPosition(12, 18);
            SetColor(11);
            std::cout << "嗯,好的" ;
            ++tmp_key;
        }
        break;

    case 13://Enter
        flag = true;
        break;

    default:
        break;
    }

    SetCursorPosition(0, 31);
    if (flag) {
        break;
    }
}

SetColor(11);
switch (tmp_key)
{
case 1:
    return 1;//重新开始
case 2:
    return 2;//退出游戏
default:
    return 1;
}

}


#### food.h



#ifndef FOOD_H
#define FOOD_H

#include “snake.h”
class Snake;
class Food
{
public:
Food() : cnt(0), flash_flag(false), big_flag(false), x(0), y(0), big_x(0), big_y(0), progress_bar(0) {}
void DrawFood(Snake&);
void DrawBigFood(Snake&);
int GetCnt();
void FlashBigFood();
bool GetBigFlag();
int GetProgressBar();
private:
int cnt;
bool flash_flag;//闪烁标记
bool big_flag;//是否有限时食物标记
int x, y;
int big_x, big_y;
int progress_bar;//限时食物进度条
friend class Snake;
};
#endif // FOOD_H


#### food.cpp



#include “food.h”
#include “tools.h”
#include
#include

void Food::DrawFood(Snake& csnake)//绘制食物
{
/*利用rand函数获得坐标,并将其范围限制在2-29内,即在地图内,如果获得的坐标与蛇身重叠,则重新获取。
同时每5颗食物就出现一颗限时食物*/
while (true)
{
int tmp_x = rand() % 30;
int tmp_y = rand() % 30;
if(tmp_x < 2) tmp_x += 2;
if(tmp_y < 2) tmp_y += 2;
bool flag = false;
for (auto& point : csnake.snake)
{
if ((point.GetX() == tmp_x && point.GetY() == tmp_y) || (tmp_x == big_x && tmp_y == big_y)) {
flag = true;
break;
}
}
if (flag)
continue;
x = tmp_x;
y = tmp_y;
SetCursorPosition(x, y);
SetColor(13);
std::cout << “★” ;
++cnt;
cnt %= 5;
if (cnt == 0)
{
DrawBigFood(csnake);
}
break;
}
}

void Food::DrawBigFood(Snake& csnake)//绘制限时食物
{
SetCursorPosition(5, 0);
SetColor(11);
std::cout << “------------------------------------------” ;//进度条
progress_bar = 42;
while (true)
{
int tmp_x = rand() % 30;
int tmp_y = rand() % 30;
if(tmp_x < 2) tmp_x += 2;
if(tmp_y < 2) tmp_y += 2;
bool flag = false;
for (auto& point : csnake.snake)
{
if ((point.GetX() == tmp_x && point.GetY() == tmp_y) || (tmp_x == x && tmp_y == y))
{
flag = true;
break;
}
}
if (flag)
continue;

    big_x = tmp_x;
    big_y = tmp_y;
    SetCursorPosition(big_x, big_y);
    SetColor(18);
    std::cout << "■" ;
    big_flag = true;
    flash_flag = true;
    break;
}

}

int Food::GetCnt()
{
return cnt;
}

void Food::FlashBigFood()//闪烁限时食物
{
SetCursorPosition(big_x, big_y);
SetColor(18);
if (flash_flag)
{
std::cout << " " ;
flash_flag = false;
}
else
{
std::cout << “■” ;
flash_flag = true;
}

SetCursorPosition(26, 0);
SetColor(11);
for (int i = 42; i >= progress_bar; --i)//进度条缩短
    std::cout << "\b \b" ;
--progress_bar;
if (progress_bar == 0) {
    SetCursorPosition(big_x, big_y);
    std::cout << " " ;
    big_flag = false;
    big_x = 0;
    big_y = 0;
}

}

bool Food::GetBigFlag()
{
return big_flag;
}

int Food::GetProgressBar()
{
return progress_bar;
}


#### map.h



#ifndef MAP_H
#define MAP_H

#include
#include “point.h”

class Map
{
public:
Map()//默认构造函数,将正方形各点压入initmap
{
initmap.emplace_back(Point(1, 1));
initmap.emplace_back(Point(2, 1));
initmap.emplace_back(Point(3, 1));
initmap.emplace_back(Point(4, 1));
initmap.emplace_back(Point(5, 1));
initmap.emplace_back(Point(6, 1));
initmap.emplace_back(Point(7, 1));
initmap.emplace_back(Point(8, 1));
initmap.emplace_back(Point(9, 1));
initmap.emplace_back(Point(10, 1));
initmap.emplace_back(Point(11, 1));
initmap.emplace_back(Point(12, 1));
initmap.emplace_back(Point(13, 1));
initmap.emplace_back(Point(14, 1));
initmap.emplace_back(Point(15, 1));
initmap.emplace_back(Point(16, 1));
initmap.emplace_back(Point(17, 1));
initmap.emplace_back(Point(18, 1));
initmap.emplace_back(Point(19, 1));
initmap.emplace_back(Point(20, 1));
initmap.emplace_back(Point(21, 1));
initmap.emplace_back(Point(22, 1));
initmap.emplace_back(Point(23, 1));
initmap.emplace_back(Point(24, 1));
initmap.emplace_back(Point(25, 1));
initmap.emplace_back(Point(26, 1));
initmap.emplace_back(Point(27, 1));
initmap.emplace_back(Point(28, 1));
initmap.emplace_back(Point(29, 1));
initmap.emplace_back(Point(30, 1));
initmap.emplace_back(Point(1, 2));
initmap.emplace_back(Point(30, 2));
initmap.emplace_back(Point(1, 3));
initmap.emplace_back(Point(30, 3));
initmap.emplace_back(Point(1, 4));
initmap.emplace_back(Point(30, 4));
initmap.emplace_back(Point(1, 5));
initmap.emplace_back(Point(30, 5));
initmap.emplace_back(Point(1, 6));
initmap.emplace_back(Point(30, 6));
initmap.emplace_back(Point(1, 7));
initmap.emplace_back(Point(30, 7));
initmap.emplace_back(Point(1, 8));
initmap.emplace_back(Point(30, 8));
initmap.emplace_back(Point(1, 9));
initmap.emplace_back(Point(30, 9));
initmap.emplace_back(Point(1, 10));
initmap.emplace_back(Point(30, 10));
initmap.emplace_back(Point(1, 11));
initmap.emplace_back(Point(30, 11));
initmap.emplace_back(Point(1, 12));
initmap.emplace_back(Point(30, 12));
initmap.emplace_back(Point(1, 13));
initmap.emplace_back(Point(30, 13));
initmap.emplace_back(Point(1, 14));
initmap.emplace_back(Point(30, 14));
initmap.emplace_back(Point(1, 15));
initmap.emplace_back(Point(30, 15));
initmap.emplace_back(Point(1, 16));
initmap.emplace_back(Point(30, 16));
initmap.emplace_back(Point(1, 17));
initmap.emplace_back(Point(30, 17));
initmap.emplace_back(Point(1, 18));
initmap.emplace_back(Point(30, 18));
initmap.emplace_back(Point(1, 19));
initmap.emplace_back(Point(30, 19));
initmap.emplace_back(Point(1, 20));
initmap.emplace_back(Point(30, 20));
initmap.emplace_back(Point(1, 21));
initmap.emplace_back(Point(30, 21));
initmap.emplace_back(Point(1, 22));
initmap.emplace_back(Point(30, 22));
initmap.emplace_back(Point(1, 23));
initmap.emplace_back(Point(30, 23));
initmap.emplace_back(Point(1, 24));
initmap.emplace_back(Point(30, 24));
initmap.emplace_back(Point(1, 25));
initmap.emplace_back(Point(30, 25));
initmap.emplace_back(Point(1, 26));
initmap.emplace_back(Point(30, 26));
initmap.emplace_back(Point(1, 27));
initmap.emplace_back(Point(30, 27));
initmap.emplace_back(Point(1, 28));
initmap.emplace_back(Point(30, 28));
initmap.emplace_back(Point(1, 29));
initmap.emplace_back(Point(30, 29));
initmap.emplace_back(Point(1, 30));
initmap.emplace_back(Point(2, 30));
initmap.emplace_back(Point(3, 30));
initmap.emplace_back(Point(4, 30));
initmap.emplace_back(Point(5, 30));
initmap.emplace_back(Point(6, 30));
initmap.emplace_back(Point(7, 30));
initmap.emplace_back(Point(8, 30));
initmap.emplace_back(Point(9, 30));
initmap.emplace_back(Point(10, 30));
initmap.emplace_back(Point(11, 30));
initmap.emplace_back(Point(12, 30));
initmap.emplace_back(Point(13, 30));
initmap.emplace_back(Point(14, 30));
initmap.emplace_back(Point(15, 30));
initmap.emplace_back(Point(16, 30));
initmap.emplace_back(Point(17, 30));
initmap.emplace_back(Point(18, 30));
initmap.emplace_back(Point(19, 30));
initmap.emplace_back(Point(20, 30));
initmap.emplace_back(Point(21, 30));
initmap.emplace_back(Point(22, 30));
initmap.emplace_back(Point(23, 30));
initmap.emplace_back(Point(24, 30));
initmap.emplace_back(Point(25, 30));
initmap.emplace_back(Point(26, 30));
initmap.emplace_back(Point(27, 30));
initmap.emplace_back(Point(28, 30));
initmap.emplace_back(Point(29, 30));
initmap.emplace_back(Point(30, 30));
}
void PrintInitmap();//绘制初始地图
private:
std::vector initmap;//保存初始地图
/*Map类可自定义多种地图,只需将表示地图的各个点保存在相应的map中,并在Snake类中增加相应判断撞墙函数即可
std::vector map1;
std::vector map2;
*/
};
#endif // MAP_H


#### map.cpp



#include “map.h”
#include <windows.h>

void Map::PrintInitmap()//绘制初始地图
{
for (auto& point : initmap)
{
point.Print();
Sleep(10);//调用Sleep函数可营造动画效果
}
}


#### point.h



#ifndef POINT_H
#define POINT_H

class Point
{
public:
Point(){}
Point(const int x, const int y) : x(x), y(y) {}
void Print();
void PrintCircular();
void Clear();
void ChangePosition(const int x, const int y);
bool operator== (const Point& point) { return (point.x == this->x) && (point.y == this->y); }
int GetX(){ return this->x; }
int GetY(){ return this->y; }
private:
int x, y;
};
#endif // POINT_H


#### point.cpp



#include “point.h”
#include “tools.h”
#include

void Point::Print()//输出方块
{
SetCursorPosition(x, y);
std::cout << “■” ;
}

void Point::PrintCircular()//输出圆形
{
SetCursorPosition(x, y);
std::cout << “●” ;
}

void Point::Clear()//清除输出
{
SetCursorPosition(x, y);
std::cout << " " ;
}

void Point::ChangePosition(const int x, const int y)//改变坐标
{
this->x = x;
this->y = y;
}


#### snake.h



#ifndef SNAKE_H
#define SNAKE_H

#include
#include “point.h”
#include “food.h”

class Food;
class Snake
{
public:
enum Direction {UP, DOWN, LEFT, RIGHT};

Snake() {
    snake.emplace_back(14, 8);
    snake.emplace_back(15, 8);
    snake.emplace_back(16, 8);
    direction = Direction::DOWN;
}
void InitSnake();

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

<< “●” ;
}

void Point::Clear()//清除输出
{
SetCursorPosition(x, y);
std::cout << " " ;
}

void Point::ChangePosition(const int x, const int y)//改变坐标
{
this->x = x;
this->y = y;
}


#### snake.h



#ifndef SNAKE_H
#define SNAKE_H

#include
#include “point.h”
#include “food.h”

class Food;
class Snake
{
public:
enum Direction {UP, DOWN, LEFT, RIGHT};

Snake() {
    snake.emplace_back(14, 8);
    snake.emplace_back(15, 8);
    snake.emplace_back(16, 8);
    direction = Direction::DOWN;
}
void InitSnake();

[外链图片转存中…(img-jJsZwkSv-1715567362817)]
[外链图片转存中…(img-uAxvHUWD-1715567362817)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值