2048可谓是一款十分经典的小游戏,在智能手机刚刚起步时风靡全球,所要求的算法也不是很难。我花了两天时间复刻了2048,在此和大家分享一下。

首先,游戏要有一个4×4的界面。因此我选择定义了一个Game类,类的public访问权限里有int类型的4×4的二维数组,到时可以通过Game类操作这个数组。

class Game {
public:int board[4][4];
};

接着是几个功能需要满足。

1.判断4×4的数组是否装满。

2.判断游戏是否结束。

3.判断玩家是否获胜。

4.判断数组里面的元素可不可以移动。

5.移动数组里面的元素。

6.判断数组里面的相邻元素是否可以合并(也就是是否相等)。

7.合并相邻元素。

8.用函数把移动和合并元素封装成一次操作。

9.生成随机数。

10.输出数组里的每个元素。

11.判断是否获胜或结束。

接下来一个个实现这些功能。

1.判断4×4的数组是否装满。

运用嵌套循环访问数组里每个元素,如果有0(空元素)就返回false,都没有就返回true。

bool full(Game game) {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0) {return false;}}}return true;
}

2.判断游戏是否结束。

运用刚才写的判断满没满的函数,如果没满的话,就没输,返回false,满了就接着进行判断:如果相邻元素没有一样的,返回true,反之返回false。

也就是说,对于board[i][j],只要board[i + 1][j],board[i - 1][j],board[i][j + 1],board[i][j - 1]中的任意一个和它相等,游戏都可以继续下去。

问题是,i的取值范围是0  i  3,0  j  3,因此 i  1和 j  1可能超出数组的索引范围,也就会出现一些bug。

因此我们如果要解决这个问题,就是要找到两个函数。

其中一个是,当x = 0时,f(x) = x + 1;当x = 1或2或3时,f(x) = x - 1。

另一个是,当x = 3时,f(x) = x - 1;当x = 0或1或2时,f(x) = x + 1。

第一个好解决,瞬间想到 f(x) = | x - 1 |。

第二个稍微麻烦点,但经过我的不懈努力,我找到了它。f(x) = 3 - | x - 2 |

但是C++并没有内置的绝对值,因此要函数实现。

//int 的绝对值
int abs(int a) {return a >= 0 ? a : a * -1;
}

(三目运算符使代码更加简洁)

接下来的事就好办了,依次判断board[abs(i - 1)][j],board[3 - abs(i - 2)][j],board[i][abs(j - 1)],board[i][3 - abs(j - 2)]和board[i][j]是否相等,有一个相等就返回false,全不相等就移至下一个元素进行判断。

bool over(Game game) {if (!full(game)) {return false;}else {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (game.board[abs(i - 1)][j] == game.board[i][j]) {return false;}else if (game.board[3 - abs(i - 2)][j] == game.board[i][j]) {return false;}else if (game.board[i][abs(j - 1)] == game.board[i][j]) {return false;}else if (game.board[i][3 - abs(j - 2)] == game.board[i][j]) {return false;}}}return true;}
}

3.判断玩家是否获胜。

只要有一个元素是2048,玩家就获胜;全都不是2048,游戏就继续。

运用嵌套循环访问数组里每个元素,如果有2048就返回true,都没有就返回false。

bool win(Game game) {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 2048) {return true;}}}return false;
}

4.判断数组里面的元素可不可以移动。

就W(向上)而言,运用嵌套循环访问数组里每个元素,如果有是0的就从该元素开始,依次看它下面的每一个元素是否有不为0的数字。如果有,说明这些不为0的数字头顶上是空的,因此可以沿W(向上)移动,返回true;反之,如果没有,就访问下一个元素,直到找到符合条件的元素为止。

如果循环结束(全部访问完)都没有符合条件的元素,说明都移动不了,返回false。

if (input == 'W' || input == 'w') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0) {for (int k = i; k < 3; k++) {if (game.board[k + 1][j] != 0) {return true;}}}}}return false;}

事实上,元素只需要访问三排四列,因为第四排的元素即使是零,它下面(第五排)也不可能有数字可以移动,所以没有访问第四排的必要。

以此类推,A,S,D的代码也可以写出来。

else if (input == 'A' || input == 'a') {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j] == 0) {for (int k = j; k < 3; k++) {if (game.board[i][k + 1] != 0) {return true;}}}}}return false;}else if (input == 'S' || input == 's') {for (int i = 3; i > 0; i--) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0) {for (int k = i; k > 0; k--) {if (game.board[k - 1][j] != 0) {return true;}}}}}return false;}else {for (int i = 0; i < 4; i++) {for (int j = 3; j > 0; j--) {if (game.board[i][j] == 0) {for (int k = j; k > 0; k--) {if (game.board[i][k - 1] != 0) {return true;}}}}}return false;}

所以判断函数代码如下:

bool moveAble(Game game, char input) {if (input == 'W' || input == 'w') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0) {for (int k = i; k < 3; k++) {if (game.board[k + 1][j] != 0) {return true;}}}}}return false;}else if (input == 'A' || input == 'a') {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j] == 0) {for (int k = j; k < 3; k++) {if (game.board[i][k + 1] != 0) {return true;}}}}}return false;}else if (input == 'S' || input == 's') {for (int i = 3; i > 0; i--) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0) {for (int k = i; k > 0; k--) {if (game.board[k - 1][j] != 0) {return true;}}}}}return false;}else {for (int i = 0; i < 4; i++) {for (int j = 3; j > 0; j--) {if (game.board[i][j] == 0) {for (int k = j; k > 0; k--) {if (game.board[i][k - 1] != 0) {return true;}}}}}return false;}
}

5.移动数组里面的元素。

照之前的思路,只要找到符合条件的元素(本身为0,移动方向的反方向有不为0的数字),就要进行移动。

这里为了简便,函数调用时,从符合条件的元素开始到数组边缘,整体只需要移动一格,到调用时多调几次就可以一移到底。

if (game.board[i][j] == 0 && game.board[i + 1][j] != 0) {for (int k = i; k < 3; k++) {int temp = game.board[k][j];game.board[k][j] = game.board[k + 1][j];game.board[k + 1][j] = temp;}
}

函数如下:

Game move(Game game, char input) {if (input == 'W' || input == 'w') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0 && game.board[i + 1][j] != 0) {for (int k = i; k < 3; k++) {int temp = game.board[k][j];game.board[k][j] = game.board[k + 1][j];game.board[k + 1][j] = temp;}}}}}else if (input == 'A' || input == 'a') {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j] == 0 && game.board[i][j + 1] != 0) {for (int k = j; k < 3; k++) {int temp = game.board[i][k];game.board[i][k] = game.board[i][k + 1];game.board[i][k + 1] = temp;}}}}}else if (input == 'S' || input == 's') {for (int i = 3; i > 0; i--) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0 && game.board[i - 1][j] != 0) {for (int k = i; k > 0; k--) {int temp = game.board[k][j];game.board[k][j] = game.board[k - 1][j];game.board[k - 1][j] = temp;}}}}}else {for (int i = 0; i < 4; i++) {for (int j = 3; j > 0; j--) {if (game.board[i][j] == 0 && game.board[i][j - 1] != 0) {for (int k = j; k > 0; k--) {int temp = game.board[i][k];game.board[i][k] = game.board[i][k - 1];game.board[i][k - 1] = temp;}}}}}return game;
}

6.判断数组里面的相邻元素是否可以合并(也就是是否相等)。

如果输入是W或S的话,就上下判断;如果输入是A或D的话,就左右判断。

依然使用嵌套循环访问每一个元素。

代码如下:

bool combineAble(Game game, char input) {if (input == 'W' || input == 'w' || input == 'S' || input == 's') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i + 1][j] == game.board[i][j] && game.board[i][j] != 0) {return true;}}}return false;}else {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j + 1] == game.board[i][j] && game.board[i][j] != 0) {return true;}}}return false;}
}

7.合并相邻元素。

为了简便,函数还是设计只合并一次的,到时多调几次。

拿W举例,对于board[i][j],如果board[i][j] = board[i + 1][j],两个元素上下方向相等,就可以进行合并。

这里有个坑,我就掉进去过:一定要注意,game.board[i + 1][j] != 0也是个条件,因为刚开始时,全盘都是0,程序就会觉得:“天哪,这么多相等的0,我该合并到猴年马月!”就会一直合并下去。我花了很大劲儿才发现错出在哪里。

Game combine(Game game, char input) {if (input == 'W' || input == 'w') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i + 1][j] == game.board[i][j] && game.board[i][j] != 0) {game.board[i][j] += game.board[i + 1][j];game.board[i + 1][j] = 0;}}}}else if (input == 'A' || input == 'a') {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j + 1] == game.board[i][j] && game.board[i][j] != 0) {game.board[i][j] += game.board[i][j + 1];game.board[i][j + 1] = 0;}}}}else if (input == 'S' || input == 's') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i + 1][j] == game.board[i][j] && game.board[i][j] != 0) {game.board[i + 1][j] += game.board[i][j];game.board[i][j] = 0;}}}}else {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j + 1] == game.board[i][j] && game.board[i][j] != 0) {game.board[i][j + 1] += game.board[i][j];game.board[i][j] = 0;}}}}return game;
}

8.用函数把移动和合并元素封装成一次操作。

首先判断是不是既不能合并也不能移动。如果是的话,不处理直接返回;如果不是,先合并一次,避免出现意外情况。

接着在死循环里面套两个循环,第一个循环的条件是可不可以合并,循环体是合并(也就是能合并就一直合并);第一个循环的条件是可不可以移动,循环体是移动(也就是能移动就一直移动)。跳出死循环的条件是既不能合并也不能移动。

最后返回处理过的数据。

Game sort(Game game, char input) {if (!combineAble(game, input) && !moveAble(game, input)) {return game;}game = combine(game, input);while (true) {while (combineAble(game, input)) {game = combine(game, input);}while (moveAble(game, input)) {game = move(game, input);}if (!combineAble(game, input) && !moveAble(game, input)) {break;}}return game;
}

9.生成随机数。

首先判断4×4的数组是不是装满了数字。

如果是,就不用生成,直接原路返回;如果不是,随机找个位置放2或4,找的位置必须还是空的。

因此设计一个循环,如果找的位置不是空,就再随机找一个位置,直到找的位置为空为止。

2或4的随机生成方法:rand() % 2生成0或1,加一后rand() % 2 + 1生成1或2,乘二后2 * (rand() % 2 + 1)生成2或4。

Game random(Game game) {srand((unsigned int)time(NULL));if (!full(game)) {//如果没满//rand() % 4 :0 到 3 之间的随机数int i = rand() % 4;int j = rand() % 4;while (game.board[i][j] != 0) {i = rand() % 4;j = rand() % 4;}game.board[i][j] = 2 * (rand() % 2 + 1); //2*(0+1)~2*(1+1)return game;}else {//如果满了return game;}
}

10.输出数组里的每个元素。

我们肯定不能直接输出,那样太丑了。适当的美化是必要的。

每个元素高三排(不包含上下两根线)。

因此可以再来个嵌套循环,一排执行四次,一共执行四排。

第一排是"|-------|-------|-------|-------|",在循环外输出。

每个大循环下,第一排是五根竖着的线,第二排是五根竖着的线加不为0的元素,第三排又是五根竖着的线,第四排是"|-------|-------|-------|-------|"。

代码如下:

void printBoard(Game game) {cout << "|-------|-------|-------|-------|" << endl;for (int i = 0; i < 4; i++) {for (int i = 0; i < 4; i++) {cout << "|" << "\t";}cout << "|" << endl;for (int j = 0; j < 4; j++) {cout << "|";if (game.board[i][j] != 0) {cout << game.board[i][j];}cout << "\t";}cout << "|";cout << endl;for (int i = 0; i < 4; i++) {cout << "|" << "\t";}cout << "|" << endl;cout << "|-------|-------|-------|-------|";cout << endl;}cout << endl << endl;
}

11.判断是否获胜或结束。

该函数应该在main函数里。

同样的,设计一个死循环,跳出的条件是赢或输。

如果没有达成条件的话,循环重复执行 提示输入→输入→合并和移动→生成随机数→清屏→打印→判断。

代码如下:

while (1) {cout << "请输入你想要采取的操作:";cin >> input;game = sort(game, input);if (!full(game)) {game = random(game);}system("cls");printBoard(game);if (over(game) == true) {cout << "Game over!" << endl;break;}else if (win(game) == true) {cout << "You win!" << endl;break;}
}

至此,所有功能都已实现。所以……

源代码如下:

#include<iostream>
#include<ctime>
using namespace std;
class Game {
public:int board[4][4];
};
//int 的绝对值
int abs(int a) {return a >= 0 ? a : a * -1;
}
//满了
bool full(Game game) {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0) {return false;}}}return true;
}
//游戏结束
bool over(Game game) {if (!full(game)) {return false;}else {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (game.board[abs(i - 1)][j] == game.board[i][j]) {return false;}else if (game.board[3 - abs(i - 2)][j] == game.board[i][j]) {return false;}else if (game.board[i][abs(j - 1)] == game.board[i][j]) {return false;}else if (game.board[i][3 - abs(j - 2)] == game.board[i][j]) {return false;}}}return true;}
}
//玩家获胜
bool win(Game game) {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 2048) {return true;}}}return false;
}
//可不可以移动
bool moveAble(Game game, char input) {if (input == 'W' || input == 'w') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0) {for (int k = i; k < 3; k++) {if (game.board[k + 1][j] != 0) {return true;}}}}}return false;}else if (input == 'A' || input == 'a') {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j] == 0) {for (int k = j; k < 3; k++) {if (game.board[i][k + 1] != 0) {return true;}}}}}return false;}else if (input == 'S' || input == 's') {for (int i = 3; i > 0; i--) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0) {for (int k = i; k > 0; k--) {if (game.board[k - 1][j] != 0) {return true;}}}}}return false;}else {for (int i = 0; i < 4; i++) {for (int j = 3; j > 0; j--) {if (game.board[i][j] == 0) {for (int k = j; k > 0; k--) {if (game.board[i][k - 1] != 0) {return true;}}}}}return false;}
}
//移动一次
Game move(Game game, char input) {if (input == 'W' || input == 'w') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0 && game.board[i + 1][j] != 0) {for (int k = i; k < 3; k++) {int temp = game.board[k][j];game.board[k][j] = game.board[k + 1][j];game.board[k + 1][j] = temp;}}}}}else if (input == 'A' || input == 'a') {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j] == 0 && game.board[i][j + 1] != 0) {for (int k = j; k < 3; k++) {int temp = game.board[i][k];game.board[i][k] = game.board[i][k + 1];game.board[i][k + 1] = temp;}}}}}else if (input == 'S' || input == 's') {for (int i = 3; i > 0; i--) {for (int j = 0; j < 4; j++) {if (game.board[i][j] == 0 && game.board[i - 1][j] != 0) {for (int k = i; k > 0; k--) {int temp = game.board[k][j];game.board[k][j] = game.board[k - 1][j];game.board[k - 1][j] = temp;}}}}}else {for (int i = 0; i < 4; i++) {for (int j = 3; j > 0; j--) {if (game.board[i][j] == 0 && game.board[i][j - 1] != 0) {for (int k = j; k > 0; k--) {int temp = game.board[i][k];game.board[i][k] = game.board[i][k - 1];game.board[i][k - 1] = temp;}}}}}return game;
}
//可不可以合并(合并后是否是同一状态)
bool combineAble(Game game, char input) {if (input == 'W' || input == 'w' || input == 'S' || input == 's') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i + 1][j] == game.board[i][j] && game.board[i][j] != 0) {return true;}}}return false;}else {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j + 1] == game.board[i][j] && game.board[i][j] != 0) {return true;}}}return false;}
}
//合并一次
Game combine(Game game, char input) {if (input == 'W' || input == 'w') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i + 1][j] == game.board[i][j] && game.board[i][j] != 0) {game.board[i][j] += game.board[i + 1][j];game.board[i + 1][j] = 0;}}}}else if (input == 'A' || input == 'a') {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j + 1] == game.board[i][j] && game.board[i][j] != 0) {game.board[i][j] += game.board[i][j + 1];game.board[i][j + 1] = 0;}}}}else if (input == 'S' || input == 's') {for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (game.board[i + 1][j] == game.board[i][j] && game.board[i][j] != 0) {game.board[i + 1][j] += game.board[i][j];game.board[i][j] = 0;}}}}else {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (game.board[i][j + 1] == game.board[i][j] && game.board[i][j] != 0) {game.board[i][j + 1] += game.board[i][j];game.board[i][j] = 0;}}}}return game;
}
//生成随机数
Game random(Game game) {srand((unsigned int)time(NULL));if (!full(game)) {//如果没满//rand() % 4 :0 到 3 之间的随机数int i = rand() % 4;int j = rand() % 4;while (game.board[i][j] != 0) {i = rand() % 4;j = rand() % 4;}game.board[i][j] = 2 * (rand() % 2 + 1); //2*(0+1)~2*(1+1)return game;}else {//如果满了return game;}
}
//操作一次
Game sort(Game game, char input) {if (!combineAble(game, input) && !moveAble(game, input)) {return game;}game = combine(game, input);while (true) {while (combineAble(game, input)) {game = combine(game, input);}while (moveAble(game, input)) {game = move(game, input);}if (!combineAble(game, input) && !moveAble(game, input)) {break;}}return game;
}
//打印
void printBoard(Game game) {cout << "|-------|-------|-------|-------|" << endl;for (int i = 0; i < 4; i++) {for (int i = 0; i < 4; i++) {cout << "|" << "\t";}cout << "|" << endl;for (int j = 0; j < 4; j++) {cout << "|";if (game.board[i][j] != 0) {cout << game.board[i][j];}cout << "\t";}cout << "|";cout << endl;for (int i = 0; i < 4; i++) {cout << "|" << "\t";}cout << "|" << endl;cout << "|-------|-------|-------|-------|";cout << endl;}cout << endl << endl;
}int main() {Game game;for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {game.board[i][j] = 0;}}char input;//生成随机数game = random(game);printBoard(game);while (1) {cout << "请输入你想要采取的操作:";cin >> input;game = sort(game, input);if (!full(game)) {game = random(game);}system("cls");printBoard(game);if (over(game) == true) {cout << "Game over!" << endl;break;}else if (win(game) == true) {cout << "You win!" << endl;break;}}system("pause");return 0;
}

如有错误,请在评论区斧正。谢谢大家!

资源地址:https://pan.baidu.com/s/1M8AHq835B9tPEwxQLpLmIQ 
提取码:0861

C++复原2048小游戏(纯文字)相关推荐

  1. python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  2. python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  3. python里graphics的使用_使用graphics.py实现2048小游戏

    1.过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大.正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN ...

  4. ​.NET手撸2048小游戏

    前言 2048是一款益智小游戏,得益于其规则简单,又和 2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎" FlysEngine,从空白窗口 ...

  5. 2048小游戏编写思路

    有点难 关键知识点 下面请各位读者先学习一下该游戏中涉及到的几个关键知识点,有了这些必备条件,我们才好讲解 2048 游戏的设计思路. 1) 改变文本颜色 2048 游戏设置的格子边框颜色为湖蓝色,其 ...

  6. 用App Designer 制作2048小游戏

    用App Designer 制作2048小游戏 用App Designer制作的2048,MATLAB版本是2020b.记录下创作思路,以免日后忘记. APP界面设计 APP界面如下,为了好玩,还加入 ...

  7. C语言实现扫雷小游戏 纯小白 非黑窗口

    C语言实现一个普通的扫雷小游戏 纯小白所编(含代码非黑窗口!) 扫雷 主要功能 1.创建一个图形界面 2.了解扫雷游戏的原理 3.随机生成雷的位置 4.为整个数组加密,并在雷周围的位置加一 5.导入图 ...

  8. html+css+js适合前端小白的实战全解(超详细)——2048小游戏(三)

    续上一小节,我们回到newgame()这个函数,我们之前只做了init()内函数,相当于一个初始化操作 现在,我们需要再随机两个两个生成数字. 随机生成数字在这个游戏里会经常出现,用户移动一步,也会产 ...

  9. html+css+js适合前端小白的实战全解(超详细)——2048小游戏(二)

    续上一小节,我们可以发现每一个grid-cell上的数字初始时并不在格子里. 这些数字可以随着玩家的操作而移动 ​ 我们可以想象:初始时每一个格子上的数为0,他们并不显示 ↓ 只有当grid-cell ...

最新文章

  1. 微信小程序开通腾讯云开发实践流程附详细图解
  2. 百面机器学习之经典算法
  3. hadoop端口号列表
  4. c linux time微秒_学习linux,看这篇1.5w多字的linux命令详解(6小时讲明白Linux)
  5. Uncaught TypeError: Cannot redefine property: $router
  6. linux常用命令(精)
  7. 微信小程序 - 高级 - 深度实践 - wx:for-item 与 data-xxx 的联合应用 实现后台动态数据自动加载的正确方法概述
  8. 基于卷积神经网络的mnist手写体识别
  9. matlab进化树的下载,mega7.0进化树软件下载-mega 7.0 win 64位下载【附详细使用教程】 - 百当下载站...
  10. 论文格式修改之英文摘要
  11. 教育系统APP(四)
  12. 如何防御网站被攻击?
  13. 火山引擎虚拟数字人技术与应用
  14. C语言 输入今天的日期,显示明天的日期
  15. 三菱q系列plc 和电脑socket_三菱Q系列Socket通讯(套接字通讯)讲解
  16. 用Interl 5100AGN 无线网卡破解无线网络WEP密码
  17. mysql 按记录编号_告别硬编码,mysql 如何实现按某字段的不同取值进行统计
  18. 如何将excel表格导入word_PPT怎样导入Excel表格?PPT导入Excel表格方法
  19. 卡券、直充订单列表接口(post 表单提交)
  20. C++: 计算其元素受制于的矩阵的逆模算术(附完整源码)

热门文章

  1. 2023年中职网络安全竞赛——数字取证调查(新版)attack解析(详细)
  2. moses gcc link failed
  3. SIM7600使用TCP连接服务器
  4. AT32 EMAC MQTT Client
  5. win下激活python虚拟环境及激活失败解决方案
  6. 关于根号p是无理数的另类证明
  7. VMware虚拟机鼠标闪烁
  8. Excel实战小技巧——批量操作
  9. 虚拟机开启系统蓝屏报错:“终止代码:SYSTEM_SERVICE_ECXEPTION“
  10. tomcat两种启动方式