参考

  1. 《C和C++游戏趣味编程》 童晶

推箱子游戏

玩家通过键盘控制游戏角色将所有黄色箱子推到白色方块处

用字符数组存储关卡数据

游戏一共有6种元素:
(1)空白区域:玩家可以穿过,箱子可以推上去;英文名称:empty;缩写:‘e’

(2)墙:玩家不能经过,箱子不能推过去;英文名称:wall;缩写:‘w’

(3)箱子:在前面没有障碍物的情况下,玩家可以推动;英文名称:box;缩写:‘b’

(4)空白目标:需要玩家将箱子推上去;英文名称:target;缩写:‘t’

(5)完成目标:一个箱子在目标上的叠加状态;英文名称:achieved;缩写:‘a’

(6)游戏角色:可以键盘控制移动,推动箱子到达目标;英文名称:player;缩写:‘p’

定义全局变量level存储地图数据,在show()函数中根据level[i][j]的值绘制图案:

#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#define B_SIZE 60       // 方块大小
#define B_NUM 8         // 方块个数,一共8*8个方块// 用字符型二维数组存储地图数据
char level[B_NUM][B_NUM + 1] = { "wwwwwwww", "wwwtbeew", "weeeeeew", "weeeeeew", "weeeeeew", "weepaeew", "weeewwww", "wwwwwwww" };void startup()
{initgraph(B_NUM * B_SIZE, B_NUM * B_SIZE);setbkcolor(RGB(150, 150, 150));             // 灰色背景BeginBatchDraw();                           // 开始批量绘制
}void show()
{int i, j;cleardevice();for (i = 0; i < B_NUM; i++){for (j = 0; j < B_NUM; j++){if (level[i][j] == 'e')              // 空白区域{setfillcolor(RGB(150, 150, 150));// 绘制灰色地面setlinecolor(RGB(150, 150, 150));fillrectangle(j * B_SIZE, i * B_SIZE, (j + 1) * B_SIZE, (i + 1) * B_SIZE);}else if (level[i][j] == 'w')         // 墙{setfillcolor(RGB(155, 0, 0));setlinecolor(RGB(150, 150, 150));// 淡红色、灰色线的方框fillrectangle(j * B_SIZE, i * B_SIZE, (j + 1) * B_SIZE, (i + 1) * B_SIZE);}else if (level[i][j] == 'b')         // 箱子{setfillcolor(RGB(255, 255, 0));  // 黄色方块setlinecolor(RGB(150, 150, 150));fillrectangle(j * B_SIZE, i * B_SIZE, (j + 1) * B_SIZE, (i + 1) * B_SIZE);}else if (level[i][j] == 't')         // 目标{setfillcolor(RGB(250, 250, 250));// 白色小方块fillrectangle((j + 0.3) * B_SIZE, (i + 0.3) * B_SIZE, (j + 0.7) * B_SIZE, (i + 0.7) * B_SIZE);}else if (level[i][j] == 'a')         // 已完成目标{setlinecolor(RGB(150, 150, 150));setfillcolor(RGB(255, 255, 0));  // 黄色小方块fillrectangle(j * B_SIZE, i * B_SIZE, (j + 1) * B_SIZE, (i + 1) * B_SIZE);setfillcolor(RGB(250, 250, 250));// 白色小方块fillrectangle((j + 0.3) * B_SIZE, (i + 0.3) * B_SIZE, (j + 0.7) * B_SIZE, (i + 0.7) * B_SIZE);}else if (level[i][j] == 'p')         // 玩家{setfillcolor(RGB(255, 0, 0));    // 红色圆脸fillcircle((j + 0.5) * B_SIZE, (i + 0.5) * B_SIZE, 0.4 * B_SIZE);setfillcolor(RGB(80, 80, 80));   // 黑色眼睛setlinecolor(RGB(80, 80, 80));fillcircle((j + 0.3) * B_SIZE, (i + 0.45) * B_SIZE, 0.08 * B_SIZE);fillcircle((j + 0.7) * B_SIZE, (i + 0.45) * B_SIZE, 0.08 * B_SIZE);setlinestyle(PS_SOLID, 3);line((j + 0.35) * B_SIZE, (i + 0.7) * B_SIZE, (j + 0.65) * B_SIZE, (i + 0.7) * B_SIZE);setlinestyle(PS_SOLID, 1);}}}FlushBatchDraw();
}void update()
{}int main()
{startup();while (1){show();update();}return 0;
}

键盘控制角色移动

定义结构体Player记录玩家位置:

struct Player
{int i;int j;
};
Player player;

遍历二维数组level,找到’p’的位置,即玩家位置,赋值给player,再把’p’变成’e’:

int i, j;
for (i = 0; i < B_NUM; i++)
{for (j = 0; j < B_NUM; j++){if (level[i][j] == 'p'){player.i = i;player.j = j;level[i][j] = 'e';}}
}

将show()中对玩家的绘制独立出来,根据player中存储的位置,绘制玩家:


```cpp
void show()
{i = player.i;j = player.j;setfillcolor(RGB(255, 0, 0));    // 红色圆脸fillcircle((j + 0.5) * B_SIZE, (i + 0.5) * B_SIZE, 0.4 * B_SIZE);setfillcolor(RGB(80, 80, 80));   // 黑色眼睛setlinecolor(RGB(80, 80, 80));fillcircle((j + 0.3) * B_SIZE, (i + 0.45) * B_SIZE, 0.08 * B_SIZE);fillcircle((j + 0.7) * B_SIZE, (i + 0.45) * B_SIZE, 0.08 * B_SIZE);setlinestyle(PS_SOLID, 3);line((j + 0.35) * B_SIZE, (i + 0.7) * B_SIZE, (j + 0.65) * B_SIZE, (i + 0.7) * B_SIZE);setlinestyle(PS_SOLID, 1);FlushBatchDraw();
}

在update()中,根据用户按键,控制角色移动:

if (input == 'A' || input == 'S' || input == 'D' || input == 'W')
{int goal_i = player.i;    // 定义变量存储目标位置int goal_j = player.j;int goalNext_i = goal_i;  // 存储目标位置再前一个位置int goalNext_j = goal_j;if (input == 'A')         // 向左{goal_j = player.j - 1;goalNext_j = goal_j - 1;}else if (input == 'D')    // 向右{goal_j = player.j + 1;goalNext_j = goal_j + 1;}else if (input == 'S')    // 向下{goal_i = player.i + 1;goalNext_i = goal_i + 1;}else if (input == 'W')    // 向上{goal_i = player.i - 1;goalNext_i = goal_i - 1;}

元素更新

假设角色向右移动,有以下13种情况:
(1)角色右边是empty。此时可以移动

(2)角色右边是target。此时可以移动

(3)角色右边是wall。此时不可以移动

(4)角色右边是box,再右边是empty。此时角色和box一起右移

(5)角色右边是box,再右边是target。此时角色和box一起右移

(6)角色右边是achieved,再右边是empty。此时角色和box一起右移

(7)角色右边是achieved,再右边是achieved。此时角色和box一起右移

(8)角色右边是box,再右边是wall。此时不可以移动

(9)角色右边是box,再右边是box。此时不可以移动

(10)角色右边是box,再右边是achieved。此时不可以移动

(11)角色右边是achieved,再右边是wall。此时不可以移动

(12)角色右边是achieved,再右边是box。此时不可以移动

(13)角色右边是achieved,再右边是achieved。此时不可以移动

根据用户的不同输入,变量goal_i、goal_j存储游戏角色移动的目标位置,goalNext_i、goalNext_j存储目标位置再向前的一个位置。共有6种情况会移动游戏角色及更新关卡元素,在update()中实现相应的处理:

void update()
{if (_kbhit()){char input = _getch();if (input == 'A' || input == 'S' || input == 'D' || input == 'W'){int goal_i = player.i;    // 定义变量存储目标位置int goal_j = player.j;int goalNext_i = goal_i;  // 存储目标位置再前一个位置int goalNext_j = goal_j;if (input == 'A')         // 向左{goal_j = player.j - 1;goalNext_j = goal_j - 1;}else if (input == 'D')    // 向右{goal_j = player.j + 1;goalNext_j = goal_j + 1;}else if (input == 'S')    // 向下{goal_i = player.i + 1;goalNext_i = goal_i + 1;}else if (input == 'W')    // 向上{goal_i = player.i - 1;goalNext_i = goal_i - 1;}// 根据不同情况,更新元素if (level[goal_i][goal_j] == 'e' || level[goal_i][goal_j] == 't') // 目标位置是empty或target{player.i = goal_i;player.j = goal_j;}else if (level[goal_i][goal_j] == 'b' && level[goalNext_i][goalNext_j] == 'e') // 目标位置是box,再前面是empty{player.i = goal_i;                                                         // 玩家移动到目标位置player.j = goal_j;level[goal_i][goal_j] = 'e';                                               // 目标位置变成emptylevel[goalNext_i][goalNext_j] = 'b';                                       // 再前面变成box}else if (level[goal_i][goal_j] == 'b' && level[goalNext_i][goalNext_j] == 't') // 目标是box,再前面是target{player.i = goal_i;                                                         // 玩家移动到目标位置player.j = goal_j;level[goal_i][goal_j] = 'e';                                               // 目标位置变成emptylevel[goalNext_i][goalNext_j] = 'a';                                       // 再前面变成achieved}else if (level[goal_i][goal_j] == 'a' && level[goalNext_i][goalNext_j] == 'e') // 目标位置是achieved,再前面是empty{player.i = goal_i;                                                         // 玩家移动到目标位置player.j = goal_j;level[goal_i][goal_j] = 't';                                               // 目标位置变成targetlevel[goalNext_i][goalNext_j] = 'b';                                       // 再前面变成box}else if (level[goal_i][goal_j] == 'a' && level[goalNext_i][goalNext_j] == 't') // 目标位置是achieved,再前面是target{player.i = goal_i;                                                         // 玩家移动到目标位置player.j = goal_j;level[goal_i][goal_j] = 't';                                               // 目标位置变成targetlevel[goalNext_i][goalNext_j] = 'a';                                       // 再前面变成achieved}else{return;}}}
}

游戏胜利判断

定义全局变量存储target个数、和achieved个数:

int targetNum, achievedNum;

在startup()中遍历二维数组时,如果地图元素为target或achieved,则将targetNum加1:

for (i = 0; i < B_NUM; i++)
{for (j = 0; j < B_NUM; j++){if (level[i][j] == 'p'){player.i = i;player.j = j;level[i][j] = 'e';}else if (level[i][j] == 't' || level[i][j] == 'a'){targetNum++;}}
}

在update()函数中统计元素更新后的achieved个数:

achievedNum = 0;
int i, j;
for (i = 0; i < B_NUM; i++)
{for (j = 0; j < B_NUM; j++){if (level[i][j] == 'a'){achievedNum++;}}
}

如果完成目标,在show()中显示游戏胜利信息:

if (achievedNum == targetNum)    // 如果完成目标
{setbkmode(TRANSPARENT);      // 透明显示文字settextcolor(RGB(0, 255, 255));settextstyle(80, 0, _T("宋体"));outtextxy(80, 200, _T("游戏胜利"));
}
FlushBatchDraw();

多关卡实现

定义三维数组levels存储所有关卡地图数据,定义currentLevelNum表示当前玩到第几关,二维数组level存储正在玩的这一关的地图数据:

// 获取当前管的地图数据
for (i = 0; i < B_NUM; i++)
{for (j = 0; j < B_NUM; j++){level[i][j] = levels[currentLevelNum][i][j];}
}

在update()中,如果当前关卡完成,就将currentLevelNum加1,并调用startup()开始下一关的初始化:

if (achievedNum == targetNum)
{show();                                                                           // 调用显示游戏胜利画面if (currentLevelNum < LEVEL_TOTALNUM - 1){currentLevelNum++;startup();                                                                 // 开始下一关的初始化}
}

在show()中,如果还有未完成的关卡,显示将要开始第几关游戏;如果所有关卡都完成了,提示游戏胜利:

if (achievedNum == targetNum)    // 如果完成目标
{setbkmode(TRANSPARENT);      // 透明显示文字settextcolor(RGB(0, 255, 100));TCHAR str[20];if (currentLevelNum < LEVEL_TOTALNUM - 1) // 还有未完成的关卡{settextstyle(50, 0, _T("宋体"));swprintf_s(str, _T("开始第%d关", currentLevelNum + 2));  // 提示开始第几关outtextxy(120, 160, str);outtextxy(10, 250, _T("按空格键重玩当前关"));}else{settextstyle(80, 0, _T("宋体"));outtextxy(80, 200, _T("游戏胜利"));}FlushBatchDraw();Sleep(2500);
}

完整代码

#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#define B_SIZE 60       // 方块大小
#define B_NUM 8         // 方块个数,一共8*8个方块
#define LEVEL_TOTALNUM 5 // 一共多少关卡struct Player
{int i;int j;
};
Player player;char levels[LEVEL_TOTALNUM][B_NUM][B_NUM + 1] =
{{"wwwwwwww", "wwwtbeew", "weeeeeew", "weeeeeew", "weeeeeew", "wepbteew", "weeewwww", "wwwwwwww"},{"wwwwwwww", "wwweewww", "wpetbwww", "weeebeww", "wewteeww", "weeeeeww", "weepwwww", "wwwwwwww"},{"wwwwwwww", "wwpeewww", "weeweeww", "webabeww", "weeteeww", "wwetewww", "wwwwwwww", "wwwwwwww"},{"wwwwwwww", "wwwwwwww", "weeeewww", "weeettew", "webbbpew", "weewetww", "wwwwwwww", "wwwwwwww"},{"wwwwwwww", "wwwwwwww", "wwteewww", "weewebpw", "weewewew", "weaeebtw", "weeeewww", "wwwwwwww"}
};
int currentLevelNum = 0;
char level[B_NUM][B_NUM + 1];
int targetNum, achievedNum;void startup()
{initgraph(B_NUM * B_SIZE, B_NUM * B_SIZE);setbkcolor(RGB(150, 150, 150));             // 灰色背景BeginBatchDraw();                           // 开始批量绘制int i, j;// 获取当前管的地图数据for (i = 0; i < B_NUM; i++){for (j = 0; j < B_NUM; j++){level[i][j] = levels[currentLevelNum][i][j];}}targetNum = 0;achievedNum = 0;for (i = 0; i < B_NUM; i++){for (j = 0; j < B_NUM; j++){if (level[i][j] == 'p'){player.i = i;player.j = j;level[i][j] = 'e';}else if (level[i][j] == 't' || level[i][j] == 'a'){targetNum++;}}}
}void show()
{int i, j;cleardevice();for (i = 0; i < B_NUM; i++){for (j = 0; j < B_NUM; j++){if (level[i][j] == 'e')              // 空白区域{setfillcolor(RGB(150, 150, 150));// 绘制灰色地面setlinecolor(RGB(150, 150, 150));fillrectangle(j * B_SIZE, i * B_SIZE, (j + 1) * B_SIZE, (i + 1) * B_SIZE);}else if (level[i][j] == 'w')         // 墙{setfillcolor(RGB(155, 0, 0));setlinecolor(RGB(150, 150, 150));// 淡红色、灰色线的方框fillrectangle(j * B_SIZE, i * B_SIZE, (j + 1) * B_SIZE, (i + 1) * B_SIZE);}else if (level[i][j] == 'b')         // 箱子{setfillcolor(RGB(255, 255, 0));  // 黄色方块setlinecolor(RGB(150, 150, 150));fillrectangle(j * B_SIZE, i * B_SIZE, (j + 1) * B_SIZE, (i + 1) * B_SIZE);}else if (level[i][j] == 't')         // 目标{setfillcolor(RGB(250, 250, 250));// 白色小方块fillrectangle((j + 0.3) * B_SIZE, (i + 0.3) * B_SIZE, (j + 0.7) * B_SIZE, (i + 0.7) * B_SIZE);}else if (level[i][j] == 'a')         // 已完成目标{setlinecolor(RGB(150, 150, 150));setfillcolor(RGB(255, 255, 0));  // 黄色小方块fillrectangle(j * B_SIZE, i * B_SIZE, (j + 1) * B_SIZE, (i + 1) * B_SIZE);setfillcolor(RGB(250, 250, 250));// 白色小方块fillrectangle((j + 0.3) * B_SIZE, (i + 0.3) * B_SIZE, (j + 0.7) * B_SIZE, (i + 0.7) * B_SIZE);}}}// 绘制玩家i = player.i;j = player.j;setfillcolor(RGB(255, 0, 0));    // 红色圆脸fillcircle((j + 0.5) * B_SIZE, (i + 0.5) * B_SIZE, 0.4 * B_SIZE);setfillcolor(RGB(80, 80, 80));   // 黑色眼睛setlinecolor(RGB(80, 80, 80));fillcircle((j + 0.3) * B_SIZE, (i + 0.45) * B_SIZE, 0.08 * B_SIZE);fillcircle((j + 0.7) * B_SIZE, (i + 0.45) * B_SIZE, 0.08 * B_SIZE);setlinestyle(PS_SOLID, 3);line((j + 0.35) * B_SIZE, (i + 0.7) * B_SIZE, (j + 0.65) * B_SIZE, (i + 0.7) * B_SIZE);setlinestyle(PS_SOLID, 1);if (achievedNum == targetNum)    // 如果完成目标{setbkmode(TRANSPARENT);      // 透明显示文字settextcolor(RGB(0, 255, 100));TCHAR str[20];if (currentLevelNum < LEVEL_TOTALNUM - 1) // 还有未完成的关卡{settextstyle(50, 0, _T("宋体"));swprintf_s(str, _T("开始第%d关"), currentLevelNum + 2);  // 提示开始第几关outtextxy(120, 160, str);outtextxy(10, 250, _T("按空格键重玩当前关"));}else{settextstyle(80, 0, _T("宋体"));outtextxy(80, 200, _T("游戏胜利"));}FlushBatchDraw();Sleep(2500);}FlushBatchDraw();
}void update()
{if (_kbhit() && (achievedNum < targetNum)){char input = _getch();if (input == ' '){startup();}if (input == 'A' || input == 'S' || input == 'D' || input == 'W'){int goal_i = player.i;    // 定义变量存储目标位置int goal_j = player.j;int goalNext_i = goal_i;  // 存储目标位置再前一个位置int goalNext_j = goal_j;if (input == 'A')         // 向左{goal_j = player.j - 1;goalNext_j = goal_j - 1;}else if (input == 'D')    // 向右{goal_j = player.j + 1;goalNext_j = goal_j + 1;}else if (input == 'S')    // 向下{goal_i = player.i + 1;goalNext_i = goal_i + 1;}else if (input == 'W')    // 向上{goal_i = player.i - 1;goalNext_i = goal_i - 1;}// 根据不同情况,更新元素if (level[goal_i][goal_j] == 'e' || level[goal_i][goal_j] == 't') // 目标位置是empty或target{player.i = goal_i;player.j = goal_j;}else if (level[goal_i][goal_j] == 'b' && level[goalNext_i][goalNext_j] == 'e') // 目标位置是box,再前面是empty{player.i = goal_i;                                                         // 玩家移动到目标位置player.j = goal_j;level[goal_i][goal_j] = 'e';                                               // 目标位置变成emptylevel[goalNext_i][goalNext_j] = 'b';                                       // 再前面变成box}else if (level[goal_i][goal_j] == 'b' && level[goalNext_i][goalNext_j] == 't') // 目标是box,再前面是target{player.i = goal_i;                                                         // 玩家移动到目标位置player.j = goal_j;level[goal_i][goal_j] = 'e';                                               // 目标位置变成emptylevel[goalNext_i][goalNext_j] = 'a';                                       // 再前面变成achieved}else if (level[goal_i][goal_j] == 'a' && level[goalNext_i][goalNext_j] == 'e') // 目标位置是achieved,再前面是empty{player.i = goal_i;                                                         // 玩家移动到目标位置player.j = goal_j;level[goal_i][goal_j] = 't';                                               // 目标位置变成targetlevel[goalNext_i][goalNext_j] = 'b';                                       // 再前面变成box}else if (level[goal_i][goal_j] == 'a' && level[goalNext_i][goalNext_j] == 't') // 目标位置是achieved,再前面是target{player.i = goal_i;                                                         // 玩家移动到目标位置player.j = goal_j;level[goal_i][goal_j] = 't';                                               // 目标位置变成targetlevel[goalNext_i][goalNext_j] = 'a';                                       // 再前面变成achieved}else{return;}}achievedNum = 0;int i, j;for (i = 0; i < B_NUM; i++){for (j = 0; j < B_NUM; j++){if (level[i][j] == 'a'){achievedNum++;}}}if (achievedNum == targetNum){show();                                                                         // 调用显示游戏胜利画面if (currentLevelNum < LEVEL_TOTALNUM - 1){currentLevelNum++;startup();                                                                 // 开始下一关的初始化}}}
}int main()
{startup();while (1){show();update();}return 0;
}

C++入门——实现推箱子游戏相关推荐

  1. Android开发入门——推箱子游戏开发实战(十二)

    绘制游戏局面 本文是推箱子游戏程序开发的第七步.系列文章前五篇描述准备工作,故本文编号是(十二).本文讲解如何绘制游戏局面. 本文目标 本文讲解如何绘制游戏局面.游戏局面的示例如图1,图2所示.这两幅 ...

  2. python推箱子游戏代码_用python入门知识做推箱子游戏,若能打过第三关,则可以学会编程...

    不得不说,Python小游戏是最适合入门编程的项目,因为太简单! 无论懂或完全不懂python,这样的小游戏,你都可以直接开发出来,原因很简单: 在详细教程里,会有从零基础开始,一步一步的教你完成这个 ...

  3. 啊哈c的推箱子游戏(C语言)

    啊哈c的推箱子游戏(更新附带失败判断!) 以下是原文,2020.6.28更新了推箱子失败判断,以及优化方向代码,还新加了博主的无情嘲讽 . 因为啊哈c后面推箱子游戏未附代码,而且说实话考虑很多种状况和 ...

  4. 教你一小时做出推箱子游戏【附源码】

    经典的推箱子是一个古老游戏,目的是在训练你的逻辑思考能力. 在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排 ...

  5. EasyX实现推箱子游戏

    文章目录 1 项目需求 2 模块划分 3 项目实现 3.1 地图初始化 3.2 热键控制 3.3 推箱子控制 3.4 游戏结束 1 项目需求 实现一款推箱子游戏,效果如下图所示,具体规则: 箱子只能推 ...

  6. 项目: 推箱子游戏【c/c++】

    很早之前写的一个推箱子的游戏 目录 最终效果 代码 最终效果 代码 #include<stdio.h> #include<stdlib.h> #include<graph ...

  7. c语言多关卡推箱子程序,多关卡地图推箱子游戏

    多关卡地图推箱子游戏 # include # include # include //调出地图 void file(int map[14][16],int n,int flag) //n表示关卡数 , ...

  8. 推箱子java下载_Java实现简单推箱子游戏

    本文实例为大家分享了Java实现简单推箱子游戏的具体代码,供大家参考,具体内容如下 *编写一个简易的推箱子游戏,使用10*8的二维字符数据表示游戏画面,H表示墙壁; &表示玩家角色: o表示箱 ...

  9. 一文教你使用java开发一款推箱子游戏

    导读:社会在进步,人们生活质量也在日益提高.高强度的压力也接踵而来.社会中急需出现新的有效方式来缓解人们的压力.此次设计符合了社会需求,Java推箱子游戏可以让人们在闲暇之余,体验游戏的乐趣.具有操作 ...

最新文章

  1. 那篇《中国AI觉醒》的文章,让西方的吃瓜群众们对中国展开了疯狂膜拜…不信你看
  2. 研发效能改进的实践方法
  3. CSP认证201809-2 买菜[C++题解]:区间覆盖、pair、交集长度、右端点的min-左端点的max
  4. VMware虚拟机提示“以独占方式锁定此配置文件失败”解决方案
  5. sql2008安装时提示参数不能为空_Java Validation API,实现参数的合法性校验
  6. 限制RICHTEXTBOX的输入的范围
  7. Kubernetes在上汽集团云平台及AI方面的应用
  8. arcgis api for js入门开发系列十八风向流动图
  9. Redis中数据结构和编码详细图解(应用场景及优缺点)
  10. Can not find the tag library descriptor for /struts-tags问题
  11. web 3d 资源库大全
  12. Kraker:分布式密码爆破系统
  13. 从零开始的异世界生活(前缀和)
  14. NOJ-1148-石子合并
  15. 【转】几个期货基本面因子的研究
  16. Linux电源管理(2)_Generic PM之基本概念和软件架构(蜗窝科技,www.wowotech.net)
  17. 华为Mate40 Pro 66w充电器冒火花怎么回事?
  18. 数据仓库概念以及选型
  19. java文件打包jar文件_如何把JAVA文件打包成jar文件
  20. 【爬虫进阶】常见的反爬手段和解决方法(建议收藏)

热门文章

  1. springboot福佳生活超市进销存管理系统毕业设计源码261620
  2. webgl着色器初学习-顶点着色器和片元着色器
  3. SQL Server存储机制
  4. 寒江独钓Windows内核安全编程__一个简单的Windows串口过滤驱动程序的开发
  5. python微课视频教程_微课_微课教程_微课视频教程 _课课家
  6. JavaScript基本语法:JS运算符
  7. docker启动sqlserver_使用docker部署SqlServer
  8. vue的v-model双向数据绑定原理
  9. ADAU1452_DSP pop音问题的解决方法
  10. 如何使用 Arduino 制作一个绘图仪