2024年最新c++经典项目控制台贪吃蛇小游戏详细教程_贪吃蛇小游戏c++(2),建议收藏

img
img

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

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

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

    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();
void Move();
void NormalMove();
bool OverEdge();
bool HitItself();
bool ChangeDirection();
bool GetFood(const Food&);
bool GetBigFood(Food&);

private:
std::deque snake;
Direction direction;
friend class Food;//将Food类置为友元,以便访问其私有元素
};
#endif // SNAKE_H


#### snake.cpp



#include “snake.h”
#include <conio.h>
#include “tools.h”
#include

void Snake::InitSnake()//初始化蛇
{
for (auto& point : snake)
{
point.PrintCircular();
}
}

void Snake::Move()//蛇增长
{
switch (direction)
{
case Direction::UP:
snake.emplace_back(Point(snake.back().GetX(), snake.back().GetY() - 1 ));
break;
case Direction::DOWN:
snake.emplace_back(Point(snake.back().GetX(), snake.back().GetY() + 1 ));
break;
case Direction::LEFT:
snake.emplace_back(Point(snake.back().GetX() - 1, snake.back().GetY() ));
break;
case Direction::RIGHT:
snake.emplace_back(Point(snake.back().GetX() + 1, snake.back().GetY() ));
break;
default:
break;
}
SetColor(14);
snake.back().PrintCircular();
}

void Snake::NormalMove()//蛇正常移动,头增长,尾缩短
{
Move();
snake.front().Clear();
snake.pop_front();
}

bool Snake::OverEdge()//超出边界
{
return snake.back().GetX() < 30 &&
snake.back().GetY() < 30 &&
snake.back().GetX() > 1 &&
snake.back().GetY() > 1;
}

bool Snake::HitItself()//撞到自身
{
std::deque::size_type cnt = 1;
Point *head = new Point(snake.back().GetX(), snake.back().GetY());//获得头部坐标
for (auto& point : snake) //如果整条蛇中与蛇头不相同的坐标不等于蛇长,则意味着蛇头碰撞到自身
{
if ( !(point == *head) )
++cnt;
else
break;
}
delete head;
if(cnt == snake.size())
return true;
else
return false;
}

bool Snake::ChangeDirection()//改变方向
{
char ch;
if (kbhit())//kbhit函数返回值为两个,需注意
{
ch = getch();
switch (ch)
{
case -32:
ch = getch();
switch (ch)
{
case 72:
if (direction != Direction::DOWN)//如果方向与当前运动方向相反,无效
direction = Direction::UP;
break;
case 80:
if (direction != Direction::UP)
direction = Direction::DOWN;
break;
case 75:
if (direction != Direction::RIGHT)
direction = Direction::LEFT;
break;
case 77:
if (direction != Direction::LEFT)
direction = Direction::RIGHT;
break;
default:
break;
}
return true;

    case 27://ESC
        return false;

    default:
        return true;

    }
}
return true;

}

bool Snake::GetFood(const Food& cfood)
{
if (snake.back().GetX() == cfood.x && snake.back().GetY() == cfood.y)
return true;
else
return false;
}

bool Snake::GetBigFood(Food& cfood)
{

img
img

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

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

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

      break;
        case 77:
            if (direction != Direction::LEFT)
                direction = Direction::RIGHT;
            break;
        default:
            break;
        }
        return true;

    case 27://ESC
        return false;

    default:
        return true;

    }
}
return true;

}

bool Snake::GetFood(const Food& cfood)
{
if (snake.back().GetX() == cfood.x && snake.back().GetY() == cfood.y)
return true;
else
return false;
}

bool Snake::GetBigFood(Food& cfood)
{

[外链图片转存中…(img-V5bqh0Mz-1715482672375)]
[外链图片转存中…(img-nRiw11Ut-1715482672375)]

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值