C语言实现游戏2048(超详细!!!超易懂!!!)

2048是众所周知的一款经典游戏,在曾经没有智能电脑和手机的年代,也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~

一、游戏2048的思路

2048游戏的玩法是在初始的时候,给玩家一个4*4格子的,其中内容全为空的棋盘。每过一回合,棋盘上就会在随机位置生成一个数字2,而2就是2048游戏中最小的数字。在每一回合中玩家需要输入W,S,A,D移动棋盘中现有的数字。(W代表上移,S代表下移,A代表左移,D代表右移)。而在数字的移动过程中,如果有两个数字大小相同,并且在移动过程中发生了碰撞,那么就会将两个数字合成为一个值为两数之和的数字当棋盘中所有格子都被装满时,则游戏结束

以上就是游戏2048的规则啦,那么让我们把这些规则一条条理清顺序,再对各个规则逐一击破吧~

1.打印游戏菜单

首先我们需要创造一个可以选择开始游戏和退出游戏的菜单。打印游戏菜单就没什么过多的要求,符合自己的审美,自己喜欢就好啦~

2.将4*4格内数据初始化

想要在每一个格子中填充数据,需要对每一个格子内的值进行初始化

3.在棋盘随机位置生成一个2

想要游戏正常运行,通过使用生成随机数的rand()函数,使棋盘每一回合生成一个2是不可或缺的条件。

4.打印游戏棋盘

我们需要创造一个能够容纳4*4格子内所有数值,并且又不失美观的棋盘。

5.实现WSAD移动数字功能

我们需要构建一个能够使输入WSAD时,使棋盘中的数字进行相应的移动

6.判断游戏是否结束

创造一个判断游戏结束的函数。

二、游戏2048的文件

实现游戏2048,需要分成头文件game.h源文件game.c源文件test.c三个文件。

他们的作用分别是:

  • game.h:作为头文件,它用来存放创造游戏所需要的各种类型的全局变量,并且也用来实现编写代码使所必需的函数说明
  • game.c: 存放各种实现游戏功能所需要的函数。
  • test.c:作为编译的主程序,存放主函数,编写实现游戏功能的主要思想。

三、实现游戏的各种函数

①打印游戏菜单

void GameInte()
{printf("**********************************\n");printf("--**--**- 游 戏  2 0 4 8 -**--**--\n");printf("**********************************\n");printf("***-*-*-*-*   1.play   *-*-*-*-***\n");printf("***-*-*-*-*   0.quit   *-*-*-*-***\n");printf("************----------************\n");printf("是否游玩?请输入>:");
}

我们需要将菜单函数GameInte在源文件game.c中进行创建和定义,然后再在头文件game.h中对函数进行声明。就像这个样子:

(给大家看一下game.h头文件中宏定义的数值和定义的全局变量,这样方便后期对数值修改,并且修改代码时也比较方便)

②棋盘的数据初始化

因为是4*4的数据,所以我们在上面定义了一个全局变量board[Row][Col]用来存放这4*4个的数值定义成int型方便后续接收整形数据也方便数值的打印。在这里我们将棋盘数据的初始值都设置成0

void BoardCreate(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = 0;}}
}

③打印游戏棋盘

因为在上面我们定义的,用于记录数据的二维数组中存放的数据为int型所以没办法像创造其他棋盘一样也用'  '来代表'空格子' ,所以在打印游戏棋盘的时候,我们可以使用一个if...else选择语句,使当格子中数值为0时,不打印格子中的数据。

void PrintBoard(int board[Row][Col], int row, int col)
{system("CLS");//清空上一回合的屏幕printf("\n");int i = 0;int j = 0;printf(" ----------2048 游戏----------\n");printf("-*-*-*-*-*- 0->exit -*-*-*-*-*- \n");printf("   +-----+-----+-----+-----+\n");for (i = 0; i < row; i++){printf("   |");for (j = 0; j < col; j++){if (board[i][j] == 0)printf("     |");elseprintf("%4d |", board[i][j]);}printf("\n   +-----+-----+-----+-----+\n");}printf("w->up s->down a->left d->right\n");printf(" ----------2048 游戏----------\n");
}

游戏棋盘可以按照自己的意愿随意更改,我这只是一个参考,打印出来是这个样子的:

④在棋盘随机位置生成一个2

在棋盘的随机位置生成2就需要用到生成随机数的函数rand(),和使rand()变成"真正随机数"的srand()了。我们需要在test.c文件的主函数中输入srand((unsigned int)time(NULL))其作用是使生成随机数的rand()随时间变化而时刻变化。然后我们再在生成随机数的函数中,使用int a = rand() % row; int b = rand() % col来创造两个随机的坐标,再将对应坐标中的值改变为2。(如果坐标已经有数字,则使用goto语句跳转回去,重新生成坐标)

void TwoFind(int board[Row][Col], int row, int col)
{again:int a = rand() % row;int b = rand() % col;if (board[a][b] == 0){board[a][b] = 2;}elsegoto again;
}

我们调试两次代码可以发现2生成的位置并不相同,这就代表功能的实现成功了。

⑤实现通过WSAD选择上下左右

我们通过使用for循环嵌套的方式,来遍历数组中的全部元素,通过W,S,A,D对应的上下左右移动,判断要移动的元素的上,下,左,右是否为0如果为0,则将元素向着对应的位置移动如果不为0则判断两元素是否相等,如果两元素相等,则将靠近此次移动方向的元素加倍,另一个元素则减少成0,如果两元素不相等则不对两元素进行移动处理

1.实现按W向上移动
void Wup(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = row - 1; i > 0; i--){for (j = col - 1; j >= 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动{while (board[i][j] != 0 && board[i - 1][j] == 0){board[i - 1][j] = board[i][j];board[i][j] = 0;}}}for (i = row - 1; i > 0; i--){for (j = col - 1; j >= 0; j--){while (board[i][j] == board[i - 1][j]&&board[i][j]!=0&&board[i-1][j]!=0){board[i - 1][j] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}

或许有人会问,为什么for循环的遍历要逆向遍历呢?其实我最开始也是按照从头到尾的顺序遍历的,但是写完代码却发现每一次只能够将元素移动一个格子,后来我才发现:

比如,此时我们想把第三行的元素挪到第一行,如果是从前往后依次遍历数组,当我们把第三行的挪到第二行之后,紧接着就去遍历第四行了,不能再找到已经上移的元素所以就只能够实现一次移动。但如果我逆向遍历的话,当我将第三行的元素挪到了第二行,紧接着我就会遍历第二行,然后找到这个元素,再把它挪到第一行,这样就实现了按W上移的功能了。

通过这两张图来进行解释,可能会更加的一目了然。

之后我们进行W,S,A,D四种方向的移动时,也需要对照遍历的四种方向来选取正序遍历和逆序遍历。看了这两张图你应该就能明白我的意思啦~那么接下来让我们看看是否成功实现了W向上移动的功能:看来成功实现了移动的功能~再让我们看看将元素数值合并,和不相同的元素堆叠的功能是否实现吧!:看来也成功实现啦~

2.实现按S向下移动

和上面Wup的代码其实大同小异,只是向上移动时是当前元素与头顶的元素进行判断是否为0和比较大小,而向下移动则是当前元素与下方的元素进行判断是否为0和比较大小。

通过刚才的两张图,想必大家应该知道实现按S向下移动是正序遍历还是逆序遍历了吧~没错!就是正序遍历:

void Sdown(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row - 1; i++)//必须设置成<row - 1,防止while循环中越界访问{for (j = 0; j < col; j++){while (board[i][j] != 0 && board[i + 1][j] == 0){board[i + 1][j] = board[i][j];board[i][j] = 0;}}}for (i = 0; i < row - 1; i++){for (j = 0; j < col; j++){while (board[i][j] == board[i + 1][j] && board[i][j] != 0 && board[i + 1][j] != 0){board[i + 1][j] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}

看来向下移动功能也实现啦~

3.实现按A向左移动

接下来的按A向左移动和按D向右移动跟上面的W向上移动和S向下移动,基本上是相同的东西,只要懂了上面两个代码,这两个自然也就懂了。那么我就不多废话,直接将代码奉上啦~

void Aleft(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = row - 1; i >= 0; i--){for (j = col - 1; j > 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动{while (board[i][j] != 0 && board[i][j - 1] == 0){board[i][j - 1] = board[i][j];board[i][j] = 0;}}}for (i = row - 1; i >= 0; i--){for (j = col - 1; j > 0; j--){while (board[i][j] == board[i][j - 1] && board[i][j] != 0 && board[i][j - 1] != 0){board[i][j - 1] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}
4.实现按D向右移动
void Dright(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){while (board[i][j] != 0 && board[i][j + 1] == 0){board[i][j + 1] = board[i][j];board[i][j] = 0;}}}for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){while (board[i][j] == board[i][j + 1] && board[i][j] != 0 && board[i][j + 1] != 0){board[i][j + 1] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}
5.选择上下左右

这个函数就是我们前四个函数的总和,我们需要利用switch语句来判断键盘上输入的W,S,A,D从而来通过case充当下一步函数的调用的过程。(在switch语句中可以添加一些其他的功能,比如说你想退出游戏,就加一个case 0的按键,然后写出对应功能的代码就可以啦,这里我只适配了退出游戏的case 0,其余的就交给小伙伴们自行探索啦~)

void ChooseMove(int board[Row][Col], int row, int col)
{again:char a = getch();switch(a){case 'W':case 'w':Wup(board, Row, Col);break;case 'S':case 's':Sdown(board, Row, Col);break;case 'A':case 'a':Aleft(board, Row, Col);break;case 'D':case 'd':Dright(board, Row, Col);break;case '0':{printf("你确定要退出游戏吗?\n");printf("如果退出请输入0,继续游戏请按任意键\n");int choose;scanf("%d", &choose);if (choose == 0){printf("退出游戏\n");exit(0);//程序正常结束执行}else{printf("返回游戏:\n");goto again;}break;}}
}

到了这里,我们的2048游戏基本上就能够进行游玩啦~

⑥判断游戏是否结束

判断游戏结束,我们只需要创造一个计数器,统计4*4棋盘中非零元素的数量,当非零元素的数量正好等于4*4时,那么游戏也就结束啦。

void over(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;int sum = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] != 0)sum++;}}if (sum == row * col){PrintBoard(board, Row, Col);printf("对不起,格子已满,游戏到此为止了!!!\n");exit(0);}
}

好啦~至此我们的C语言游戏2048就基本完成啦~这个也是比较初阶版,适合刚入门的小伙伴们来刷题用~那么废话不多说,这就将完整代码双手奉上!

四、游戏2048完整代码

1.game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include <windows.h>
#define Row 4
#define Col 4
int board[Row][Col];
//游戏菜单
void GameInte();//4*4格内数据初始化
void BoardCreate(char board[Row][Col], int row, int col);//在棋盘随机位置生成一个2
void TwoFind(char board[Row][Col], int row, int col);//打印游戏界面
void PrintBoard(char board[Row][Col], int row, int col);//实现按W键向上移动
void Wup(char board[Row][Col], int row, int col);//实现按S键向下移动
void Sdown(int board[Row][Col], int row, int col);//实现按A键向左移动
void Aleft(int board[Row][Col], int row, int col);//实现按D键向右移动
void Dright(int board[Row][Col], int row, int col);//实现通过WSAD选择上下左右
void ChooseMove(int board[Row][Col], int row, int col);//判断游戏是否结束
void over(int board[Row][Col], int row, int col);

2.game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void GameInte()
{printf("**********************************\n");printf("--**--**- 游 戏  2 0 4 8 -**--**--\n");printf("**********************************\n");printf("***-*-*-*-*   1.play   *-*-*-*-***\n");printf("***-*-*-*-*   0.quit   *-*-*-*-***\n");printf("************----------************\n");printf("是否游玩?请输入>:");
}
void BoardCreate(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = 0;}}
}void TwoFind(int board[Row][Col], int row, int col)
{again:int a = rand() % row;int b = rand() % col;if (board[a][b] == 0){board[a][b] = 2;}elsegoto again;
}void PrintBoard(int board[Row][Col], int row, int col)
{system("CLS");//清屏上一次的棋盘printf("\n");int i = 0;int j = 0;printf(" ----------2048 游戏----------\n");printf("-*-*-*-*-*- 0->exit -*-*-*-*-*- \n");printf("   +-----+-----+-----+-----+\n");for (i = 0; i < row; i++){printf("   |");for (j = 0; j < col; j++){if (board[i][j] == 0)printf("     |");elseprintf("%4d |", board[i][j]);}printf("\n   +-----+-----+-----+-----+\n");}printf("w->up s->down a->left d->right\n");printf(" ----------2048 游戏----------\n");
}void Wup(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = row - 1; i > 0; i--){for (j = col - 1; j >= 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动{while (board[i][j] != 0 && board[i - 1][j] == 0){board[i - 1][j] = board[i][j];board[i][j] = 0;}}}for (i = row - 1; i > 0; i--){for (j = col - 1; j >= 0; j--){while (board[i][j] == board[i - 1][j]&&board[i][j]!=0&&board[i-1][j]!=0){board[i - 1][j] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}void Sdown(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row - 1; i++)//必须设置成<row - 1,防止while循环中越界访问{for (j = 0; j < col; j++){while (board[i][j] != 0 && board[i + 1][j] == 0){board[i + 1][j] = board[i][j];board[i][j] = 0;}}}for (i = 0; i < row - 1; i++){for (j = 0; j < col; j++){while (board[i][j] == board[i + 1][j] && board[i][j] != 0 && board[i + 1][j] != 0){board[i + 1][j] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}void Aleft(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = row - 1; i >= 0; i--){for (j = col - 1; j > 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动{while (board[i][j] != 0 && board[i][j - 1] == 0){board[i][j - 1] = board[i][j];board[i][j] = 0;}}}for (i = row - 1; i >= 0; i--){for (j = col - 1; j > 0; j--){while (board[i][j] == board[i][j - 1] && board[i][j] != 0 && board[i][j - 1] != 0){board[i][j - 1] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}void Dright(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){while (board[i][j] != 0 && board[i][j + 1] == 0){board[i][j + 1] = board[i][j];board[i][j] = 0;}}}for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){while (board[i][j] == board[i][j + 1] && board[i][j] != 0 && board[i][j + 1] != 0){board[i][j + 1] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}void ChooseMove(int board[Row][Col], int row, int col)
{again:char a = getch();switch(a){case 'W':case 'w':Wup(board, Row, Col);break;case 'S':case 's':Sdown(board, Row, Col);break;case 'A':case 'a':Aleft(board, Row, Col);break;case 'D':case 'd':Dright(board, Row, Col);break;case '0':{printf("你确定要退出游戏吗?\n");printf("如果退出请输入0,继续游戏请按任意键\n");int choose;scanf("%d", &choose);if (choose == 0){printf("退出游戏\n");exit(0);}else{printf("返回游戏:\n");goto again;}break;}}
}void over(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;int sum = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] != 0)sum++;}}if (sum == row * col){PrintBoard(board, Row, Col);printf("对不起,格子已满,游戏到此为止了!!!\n");exit(0);}
}

3.test.c

#include"game.h"
void game()
{//初始化4*4格子内数据//BoardCreate(board, Row, Col);//打印游戏界面PrintBoard(board, Row, Col);//实现按W键向上移动//Wup(board, Row, Col);//实现按S键向下移动//Sdown(board,Row,Col);//实现按A键向左移动//Aleft(board, Row, Col);//实现按D键向右移动//Dright(board,Row,Col);//实现通过WSAD选择上下左右ChooseMove(board, Row, Col);//在棋盘随机位置生成一个2TwoFind(board, Row, Col);over(board, Row, Col);
}
int main()
{srand((unsigned int)time(NULL));GameInte();BoardCreate(board, Row, Col);int a = 0;do{scanf("%d", &a);if (a == 1){game();}else if (a == 0){printf("退出游戏\n");break;}else{printf("输入错误,重新输入:\n");}} while (a);return 0;
}

那么关于用C语言来实现游戏2048就讲解到这里啦~如果有说的不够充分或者有错误的地方,还希望各位能在评论区积极指出,我也会积极学习的!我们下期再见啦ヾ(•ω•`)o

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elementPlus中el-table的每列两行溢出隐藏怎么设置

el-table的每列两行溢出隐藏怎么设置 elementPlus中的el-table如何设置多行溢出隐藏table中的table属性中有show-overflow-tooltip属性&#xff0c;但是只支持单行溢出隐藏如何改成两行呢&#xff1f;在审查元素中我们发现.el-tooltip这个类名是溢出隐藏的样式&#xff0c;原本…

【Linux---08】Shell脚本

文章目录 1. 前置说明1.1 创建shell脚本1.2 执行shell脚本1.3 调试shell脚本1.4 字符冲突 2. 变量2.1 创建&使用变量2.2 位置变量2.3 引号规则 3. 数组3.1 创建数组3.2 使用数组 4. 运算符4.1 比较&数值运算4.1.1 方式一&#xff1a;[ ]4.1.3 方式二&#xff1a;(()) &…

【MongoDB】1.MongoDB下载与安装

目录 一、下载 二、安装 三、安装MongoDB Compass 四、连接 一、下载 官网地址&#xff1a; https://www.mongodb.com/download-center/community 二、安装 详细的安装教程可参考&#xff1a; MongoDB安装&#xff08;超详细&#xff09;_安装mongodb-CSDN博客 注意事项1&…

赛盈分销亮相AI科技大会暨亚马逊新增长大会,与企业共话跨境品牌发展新机遇!

八月开端&#xff0c;由知无不言与xmars和钱老师课堂联合主办的2024年AI科技大会暨亚马逊新增长大会在深圳宝安顺利开展&#xff0c;为期2天的跨境峰会吸引了上千位优秀的卖家朋友前来感受一场盛夏大狂欢。在本次跨境峰会里&#xff0c;邀请了多位不同领域的先锋人物&#xff0…

Android 文件上传与下载

在实际开发涉及文件上传不会自己写上传代码&#xff0c;一般 会集成第三网络库来做图片上传&#xff0c;比如android-async-http&#xff0c;okhttp等&#xff0c;另外还有七牛也提供 了下载和上传的API。 1.项目用到的图片上传的关键方法&#xff1a; 这里用到一个第三方的库…

新华三H3CNE网络工程师认证—路由基础

我们的一个个网络其实是由不同的广播域构成的&#xff0c;而路由器的作用就是用来连接不同的广播域。那么不同广播域之间是如何通信的呢&#xff1f;比如有三个网段&#xff0c;1.0、2.0和3.0。网段1.0和网段2.0通信需要构造数据包&#xff0c;源是1.1&#xff0c;目标去往2.1。…

Java程序的执行过程:从编译到垃圾回收,一文读懂Java程序的生命周期

你是否曾经好奇过当你编写一段Java代码并运行它时&#xff0c;背后究竟发生了什么&#xff1f;Java程序的执行过程似乎神秘而复杂&#xff0c;但实际上&#xff0c;它遵循着一系列精心设计的步骤。本文将为你揭开Java程序执行的神秘面纱&#xff0c;带你深入了解从源代码到最终…

SpringBoot企业人事管理系统-附源码与配套论文

1.1引言 随着计算机技术的飞速发展&#xff0c;计算机在各种单位机构管理中应用的普及﹐管理信息系统的开发在强调管理、强调信息的现代社会中也显得越来越重要。因此,利用计算机高效率地完成人事管理的日常事务&#xff0c;是适应现代各种单位机构制度要求、推动各种单位机构…

SpringBoot统一功能处理——拦截器

目录 一、什么是拦截器&#xff1f; 二、拦截器使用 2.1 定义拦截器 2.2 注册配置拦截器 三、拦截器详解 3.1 拦截器的拦截路径配置 3.2 拦截器执行流程 一、什么是拦截器&#xff1f; 拦截器是Spring框架提供的核心功能之一, 主要用来拦截用户的请求, 在指定方法前后,…

【2024年精选】分享7款国内大学ai写论文推荐网站工具

在2024年&#xff0c;AI技术的飞速发展为学术研究和论文写作带来了革命性的变化。众多AI论文写作工具应运而生&#xff0c;帮助学生和研究人员提高写作效率&#xff0c;提升论文质量。其中&#xff0c;AIPaperPass作为一款备受瞩目的国内AI写论文推荐网站工具&#xff0c;以其独…

CentOS7.6 HAproxy-7层负载均衡集群——实施方案

目录 1、前期环境准备 1.准备4台主机 1. 设置主机名 2. 设置IP地址然后重启网卡 3. 关闭防火墙和selinux 4. 全部的服务器完成时间统一 二、配置haproxy(192.168.200.11)服务器 1. 安装haproxy 2. haproxy 配置中分成五部分内容 3. 配置HAproxy&#xff08;192.168.2…

Animate软件基本概念:缓动、绘图纸外观及图层

FlashASer&#xff1a;AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer&#xff1a;实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&#xff1a;Animate教程及作品源文件https://zhuanlan.zhihu.co…

05_ Electron 自定义菜单、主进程与渲染进程通信

Electron 自定义菜单、主进程与渲染进程通信 一、定义顶部菜单二、Electron 自定义右键菜单1、使用 electron/remote 模块实现 三、 Electron 主进程和渲染进程通信场景1&#xff1a;渲染进程给主进程发送异步消息场景2&#xff1a;渲染进程给主进程发送异步消息&#xff0c;主…

数据结构--单链

#include "link.h" plink get_head() { plink pmalloc(sizeof(Link)); if(pNULL) { printf("申情节点失败\n"); return NULL; } p->len0; p->nextNULL; return p; } void head_insert(plink L,int a) {…

推荐一个uniapp选择文件上传的插件

插件地址&#xff1a;文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 支持 H5 / App / 微信小程序

K8s问题案例分析

1.worker节点宕机&#xff0c;请说明一下pod的驱逐流程&#xff1a; k8s有一个节点控制器&#xff0c;节点控制器在一段时间内无法和kubelet通信&#xff0c;那么就会给节点打上unknown 状态&#xff0c;并自动创建NoExecute污点,避免调度器调度新的pod到该节点。同时已经在这…

基于目标检测的目标跟踪(python)

文章目录 概要环境准备目标检测实现目标跟踪实现整合后的代码可能遇到的问题Could not load library libcudnn_ops_infer.so.8. Error: libcudnn_ops_infer.so.8: cannot open shared object file: No such file or directory参考概要 基于目标检测的目标跟踪过程通常包括以下…

Python新手错误集锦(PyCharm)

# 自学Python&#xff0c;用Pycharm作环境。我这个手新到这时我学习的第一个编程软件&#xff0c;且本人专业是化学&#xff0c;以前对电脑最高级的使用是玩扫雷游戏。所以这里集合的错误都是小透明错误&#xff0c;大部分人请绕道。不断更新中...... 缩进错误 记住“indent”…

力扣面试经典算法150题:买卖股票的最佳时机

买卖股票的最佳时机 今天的题目是力扣面试经典150题中的数组的简单题: 多数元素 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个数组 prices&#xf…

SX_错误声明定义了两个以上的数据类型BUG解决_14

具体报错&#xff1a; In file included from perfmon_priv.h:32,from perfmond.c:21: perfmon_api.h:7:18: 错误: 声明指定了两个以上的数据类型7 | #define uint8_t unsigned char perfmon_api.h:7:27: 错误: 声明指定了两个以上的数据类型7 | #define uint8_t unsigned cha…