基于easyX实现俄罗斯方块
一:效果展示
二:环境准备
1,安装VS,目前最新版本是VS2022,安装方法可以参考我的博客
手把手教你安装VS2022_ftzchina的博客-CSDN博客一:官网下载地址Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器Visual Studio 开发工具和服务让任何开发人员在任何平台和语言的应用开发都更加轻松。 随时随地免费使用代码编辑器或 IDE 进行开发。https://visualstudio.microsoft.com/zh-hans/?rr=https://www.microsoft.com/zh-cn/二:下载VS下载选择的时候需要注意有三个选项,Professional是个人试用版,Ente..https://blog.csdn.net/qq_27071221/article/details/123387110?spm=1001.2014.3001.55022,安装easyX图形库
2.1 官网下载安装程序
EasyX Graphics Library for C++EasyX Graphics Library 是针对 Visual C++ 的绘图库,支持 VC6.0 ~ VC2019,简单易用,学习成本极低,应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中。https://easyx.cn/
2.2 安装easyX
我本地已经提前安装好了VS2022,这时候安装就非常简单了,直接点击安装即可
我原来用的是vscode搞了很长时间,easyX根本不能识别,当然网上也有很多资料怎么手动去安装,我也尝试了尽力了,还是不行,最后还是选择安装vs2022,图省事的用easyX可以先安装vs,然后安装easyX就可以直接用了,当然有大神怎么把vscode和easyX结合起来的,也可以教教我
三:俄罗斯方块游戏代码
下面的代码来自,里面也有代码的详细解释C语言实现俄罗斯方块_霸道小明的博客-CSDN博客_c语言设计俄罗斯方块代码使用C语言完成俄罗斯方块。《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。顾名思义,俄罗斯方块自然是俄罗斯人发明的。https://blog.csdn.net/qq_54169998/article/details/122800521
不过在我本地还是微调了一把,刚运行有错误
outtextxy和setfont没有参数匹配的重载函数
修正方法:字符集需要改成使用多字节字符,在工程点右键,最下面的属性
点高级, 字符集改成使用多字节字符
另外方向键也不好使,可能是平台的原因,我的是win10,需要调整方向键的宏值
假如你也遇到了方向键不好使的问题,可以将方向键的值打出来,然后做出调整
可直接运行的代码
#include<graphics.h>
#include<stdio.h>
#include<time.h>
#include<conio.h> //kbhit()int score = 0; //总分
int rank = 0; //等级#define BLOCK_COUNT 5
#define BLOCK_WIDTH 5
#define BLOCK_HEIGHT 5#define UNIT_SIZE 20 //小方块宽度#define START_X 130 //方块降落框,方块降落起始位置
#define START_Y 30#define KEY_UP 72//用户操作
#define KEY_LEFT 75
#define KEY_RIGHT 77
#define KEY_DOWN 80
#define KEY_SPACE 32#define MinX 30 //游戏左上角位置
#define MinY 30
int speed = 500; //方块降落速度int NextIndex = -1; //下一个方块
int BlockIndex = -1; //当前方块typedef enum { //方块朝向BLOCK_UP,BLOCK_RIGHT,BLOCK_LEFT,BLOCK_DOWN
}block_dir_t;typedef enum { //方块移动方向MOVE_DOWN,MOVE_LEFT,MOVE_RIGHT
}move_dir_t;//方块颜色
int color[BLOCK_COUNT] = {GREEN,CYAN,MAGENTA,YELLOW,BROWN
};
int visit[30][15]; //访问数组visit[i][j] = 1表示该位置有方块
int markColor[30][15]; //对应位置颜色
int block[BLOCK_COUNT * 4][BLOCK_WIDTH][BLOCK_HEIGHT] = {// | 形方块{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },// L 形方块{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },// 田 形方块{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },// T 形方块{ 0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },// Z 形方块{ 0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },
};/**************************** 功能:欢迎页面* 输入:* 无* 返回:* 无**************************/
void welcome() {//1.初始化画布initgraph(550, 660);//2.设置窗口标题HWND window = GetHWnd();//获得窗口,获得当前窗口SetWindowText(window, _T("俄罗斯方块")); //设置标题//3.设置游戏初始页面setfont(40, 0, _T("微软雅黑")); //设置文本的字体样式(高,宽(0表示自适应),字体)setcolor(WHITE); // 设置颜色outtextxy(205, 200, _T("俄罗斯方块"));setfont(20, 0, _T("楷体"));setcolor(WHITE); // 设置颜色outtextxy(150, 300, _T("支援俄罗斯,从俄罗斯方块开始"));Sleep(3000);
}/**************************** 功能:初始化游戏场景* 输入:* 无* 返回:* 无**************************/
void initGameSceen() {char str[16]; //存放分数//1.清屏cleardevice();//2.画场景rectangle(27, 27, 336, 635); //方块降落框外框rectangle(29, 29, 334, 633); //方块降落框内框rectangle(370, 50, 515, 195); //方块提示框setfont(24, 0, _T("楷体")); //写“下一个”setcolor(LIGHTGRAY); //灰色outtextxy(405, 215, _T("下一个:"));setcolor(RED); //写分数outtextxy(405, 280, _T("分数:"));//按指定格式,将score写入strsprintf_s(str, 16, "%d", score);//这里设置字符集为多字符,保证outtextxy可以写出变量strouttextxy(415, 310, str);outtextxy(405, 375, _T("等级:")); //等级//按指定格式,将rank写入strsprintf_s(str, 16, "%d", rank);//这里设置字符集为多字符,保证outtextxy可以写出变量strouttextxy(415, 405, str);setcolor(LIGHTBLUE); //操作说明outtextxy(390, 475, "操作说明:");outtextxy(390, 500, "↑: 旋转");outtextxy(390, 525, "↓: 下降");outtextxy(390, 550, "←: 左移");outtextxy(390, 575, "→: 右移");outtextxy(390, 600, "空格: 暂停");
}/****************************************** 功能:清空方块提示框里的方块* 输入:* 无* 返回:* 无****************************************/
void clearBlock() {setcolor(BLACK);setfont(23, 0, "楷体");for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {int x = 391 + j * UNIT_SIZE;int y = 71 + i * UNIT_SIZE;outtextxy(x, y, "■");}}
}/****************************************** 功能:清除降落过程中的方块* 输入:* x,y - 方块的坐标(二维数组左上角位置)* block_dir_t - 方块方向* 返回:* 无****************************************/
void clearBlock(int x, int y, block_dir_t blockDir) {setcolor(BLACK);// setfont(23, 0, "楷体");int id = BlockIndex * 4 + blockDir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {int x2 = x + j * UNIT_SIZE;int y2 = y + i * UNIT_SIZE;outtextxy(x2, y2, "■");}}}
}/****************************************** 功能:在提示框 与 降落框的起始位置画方块* 输入:* x,y - 方块的坐标(二维数组左上角位置)* 返回:* 无****************************************/
void drawBlock(int x, int y) {setcolor(color[NextIndex]);setfont(23, 0, "楷体");for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[NextIndex * 4][i][j] == 1) {int x2 = x + j * UNIT_SIZE;int y2 = y + i * UNIT_SIZE;outtextxy(x2, y2, "■");}}}
}/******************************************功能:绘制下降过程中的方块*输入:* x,y - 方块的坐标(二维数组左上角位置)* block_dir_t - 方块方向* 返回:* 无****************************************/
void drawBlock(int x, int y, block_dir_t dir) {setcolor(color[BlockIndex]);setfont(23, 0, "楷体");int id = BlockIndex * 4 + dir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {//擦除该方块的第i行第j列outtextxy(x + j * UNIT_SIZE, y + i * UNIT_SIZE, "■");}}}
}/******************************************功能:方块提示框中产生新方块*输入:* 无*返回:* 无****************************************/
void nextblock() {clearBlock();//产生随机数,随机选择方块srand((unsigned)time(NULL)); //使用时间函数的返回值,来作为随机种子NextIndex = rand() % BLOCK_COUNT; //产生0~5的随机数drawBlock(391, 71);
}/******************************************功能:判断在指定位置向指定方向是否可以移动*输入:* x,y - 方块位置* moveDir - 下一步想要移动的方向* blockDir - 当前方块的方向* 返回:* true - 可以移动* false - 不可以移动****************************************/
bool moveable(int x0, int y0, move_dir_t moveDir, block_dir_t blockDir) {//计算方块左上角在30×15的游戏区位置(第多少行, 第多少列)int x = (y0 - MinY) / UNIT_SIZE;int y = (x0 - MinX) / UNIT_SIZE;int ret = 1;int id = BlockIndex * 4 + blockDir;if (moveDir == MOVE_DOWN) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向下不能运动的条件:实心方块已经达到底部(x+i+1==30),或者底部已有方块 if (block[id][i][j] == 1 &&(x + i + 1 == 30 || visit[x + i + 1][y + j] == 1)) {ret = 0;}}}}else if (moveDir == MOVE_LEFT) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向左不能运动的条件:实心方块已经达到左边界(y+j==0),或者左边已有方块if (block[id][i][j] == 1 &&(y + j <= 0 || visit[x + i][y + j - 1] == 1)) {ret = 0;}}}}else if (moveDir == MOVE_RIGHT) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向下不能运动的条件:实心方块已经达到右边界(y+j+1>=15),或者右边已有方块if (block[id][i][j] == 1 &&(y + j + 1 >= 15 || visit[x + i][y + j + 1] == 1)) {ret = 0;}}}}return ret;
}/******************************功能:检测游戏是否结束*输入:* 无* 返回:* 无*****************************/
void failCheck() {//游戏结束条件是顶部新被绘制出的方块就要“固化”,顶部新绘制的方块方向朝上,运动方向朝下if (!moveable(START_X, START_Y, MOVE_DOWN, (block_dir_t)BLOCK_UP)) {setcolor(WHITE);setfont(45, 0, "隶体");outtextxy(75, 300, "Game Over!");Sleep(1000);system("pause");closegraph();exit(0);}
}/*************************** 功能:延时等待* 输入:** 返回:* 无*************************/
void wait(int interval) {int count = interval / 10;for (int i = 0; i < count; ++i) {Sleep(10);//如果休眠期间用户有按键,则结束休眠if (_kbhit()) {return;}}
}/****************************************** 功能:判断当前方块是否可以向指定方向旋转* 输入:* x,y - 方块位置(二维数组坐标)* dir - 方块旋转方向* 返回:* true - 可以旋转* false - 不可以旋转****************************************/
bool rotatable(int x, int y, block_dir_t dir) {//首先判断是否可以继续向下移动if (!moveable(x, y, MOVE_DOWN, dir)) {return false;}int x2 = (y - MinY) / UNIT_SIZE;int y2 = (x - MinX) / UNIT_SIZE;int id = BlockIndex * 4 + dir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//不能旋转条件:左右边界越界或者已有方块“阻挡”if (block[id][i][j] == 1 && (y2 + j < 0 || y2 + j >= 15 || visit[x2 + i][y2 + j] == 1)) {return false;}}}return true;
}/****************************************** 功能:* 输入:** 返回:* 无****************************************/
void mark(int x, int y, block_dir_t dir) {int id = BlockIndex * 4 + dir;int x2 = (y - MinY) / UNIT_SIZE;int y2 = (x - MinX) / UNIT_SIZE;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {visit[x2 + i][y2 + j] = 1;markColor[x2 + i][y2 + j] = color[BlockIndex];}}}
}/****************************************** 功能:读取用户操作,时时更新降落的方块* 输入:* 无* 返回:* 无****************************************/
void move() {int x = START_X; //方块起始位置int y = START_Y;int k = 0;block_dir_t blockDir = (block_dir_t)BLOCK_UP;int curSpeed = speed; //定义当前方块降落速度//读取用户操作前判断游戏是否结束failCheck();//持续向下降落while (1) {int curSpeed = speed; //定义当前方块降落速度//清除方块clearBlock(x, k + y, blockDir);//判断选择的方向if (_kbhit()) {int key = _getch();//printf("%d\n", key);if (key == KEY_SPACE) {system("pause");}else if (key == KEY_UP) {block_dir_t nextDir = (block_dir_t)((blockDir + 1) % 4);if (rotatable(x, y + k, nextDir)) {blockDir = nextDir;}}else if (key == KEY_LEFT) {if (moveable(x, y + k + 20, MOVE_LEFT, blockDir)) {x -= UNIT_SIZE;}}else if (key == KEY_RIGHT) {if (moveable(x, y + k + 20, MOVE_RIGHT, blockDir)) {x += UNIT_SIZE;}}else if (key == KEY_DOWN) {curSpeed = 50;}}k += 20;//绘制方块drawBlock(x, y + k, blockDir);//休眠wait(curSpeed);//方块的固化处理,方块固定后结束循环,当前一个方块的move执行完毕if (!moveable(x, y + k, MOVE_DOWN, blockDir)) {mark(x, y + k, blockDir);break;}}
}/******************************************功能:绘制刚从顶部降落的方块,更新提示框内的方块,调用方块降落函数move()*输入:* 无* 返回:* 无****************************************/
void newblock() {BlockIndex = NextIndex;//绘制刚从顶部下降的方块drawBlock(START_X, START_Y);//让新出现方块暂停一会Sleep(200);//右上角区域绘制下一个方块nextblock();//方块降落move();
}/****************************************** 功能:消除第i行,并把上面的行都往下移* 输入:* 无* 返回:* 无****************************************/
void down(int x) {for (int i = x; i > 0; --i) {for (int j = 0; j < 15; ++j) {if (visit[i - 1][j] == 1) {visit[i][j] = 1;markColor[i][j] = markColor[i - 1][j];setcolor(markColor[i][j]);outtextxy(20 * j + MinX, 20 * i + MinY, "■");}else {visit[i][j] = 0;setcolor(BLACK);outtextxy(20 * j + MinX, 20 * i + MinY, "■");}}}//清除最顶层方格setcolor(BLACK);for (int j = 0; j < 15; ++j) {visit[0][j] = 0;outtextxy(20 * j + MinX, MinY, "■");}
}/****************************************** 功能:更新分数* 输入:* 无* 返回:* 无****************************************/
void addScore(int lines) {char str[32];score += lines * 10;sprintf_s(str, 32, "%d", score);setcolor(RED);outtextxy(415, 310, str);}/************************** 功能:更新等级* 输入:* 无* 返回:* 无*************************/
void updateGrade() {//更新等级//假设50分一级rank = score / 50;char str[32];sprintf_s(str, 32, "%d", rank);setcolor(RED);outtextxy(415, 405, str);//更新速度if (speed <= 100) {speed = 100;}else {speed = 500 - rank * 20;}
}/************************** 功能:检查是否有满行方块* 输入:* 无* 返回:* 无*************************/
void check() {int i, j;int clearLines = 0;for (i = 29; i >= 0; i--) {// 检查第i行有没有满for (j = 0; j < 15 && visit[i][j]; j++);//执行到此处时,有两种情况:// 1. 第i行没有满,即表示有空位 此时 j<15// 2. 第i行已满了,此时 j>=15if (j >= 15) {// 此时,第i行已经满了,就需要消除第i行down(i); //消除第i行,并把上面的行都下移i++; // 因为最外层的循环中有 i--, 所以我们先i++, 使得下次循环时,再把这一行检查一下clearLines++;}}// 更新分数addScore(clearLines);// 更新等级(更新等级提示,更新速度)updateGrade();
}int main() {welcome();initGameSceen();//产生新方块nextblock();// system("pause");Sleep(800);//初始化访问数组memset(visit, 0, sizeof(visit));while (1) {newblock();//消除满行,并更新分数和速度check();}system("pause");closegraph();return 0;
}
基于easyX实现俄罗斯方块相关推荐
- 基于java的俄罗斯方块游戏系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
基于Java的俄罗斯方块游戏的设计与实现 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑.手机.掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛 ...
- 【精选】基于EasyX的贪吃蛇小游戏
文章目录 前言 一.项目环境 1.Visual Studio 2019 2.EasyX 20200902 二.运行效果展示 0.加载游戏 1.主菜单 2.游戏设置 3.游戏说明 4.生存模式 5.无尽 ...
- C++的学习心得和知识总结(十八)|基于EasyX实现 2048游戏 项目(C/C++版)
目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.网络热门游戏 2048,点击前往 2.EasyX官方链接,点击前往 3.中国色谱 颜色代码对照表(RGB多用于easyX ...
- arm linux 俄罗斯方块,基于ARM的俄罗斯方块游戏的开发教材.doc
学号: 常 州 大 学 毕业设计(论文) (2012届) 题 目 学 生 学 院 专业班级 校内指导教师 专业技术职务 校外指导老师 专业技术职务 二○ 基于ARM的俄罗斯方块游戏的开发 摘 要:随着 ...
- 俄罗斯android课程设计,基于Android的俄罗斯方块的设计与实现毕业设计报告.docx...
PAGE \* MERGEFORMAT 24湖南商学院 <移动互联网应用开发> 课程设计报告 题 目 基于Android的俄罗斯方块的设计与实现 姓 名:学 号:专 业:班 级:指导教师: ...
- python 基于pygame实现俄罗斯方块
一.简单说明 80.90后的小伙伴都玩过"俄罗斯方块",那种"叱咤风云"场景 偶尔闪现在脑海 真的是太爽了:如果没有来得及玩过的同学,这次可以真正的自己做一个了 ...
- C++的学习心得和知识总结(十六)|基于EasyX实现小甲鱼Python飞机大战项目(C++版)
目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.小甲鱼Python项目 – 飞机大战 2.本文使用的掩码图生成工具 自动生成遮罩图的程序,点击前往 3.EasyX官方链 ...
- 【C++】基于Easyx的UI库(2022-8-21 V1)
系列文章目录 [C++]基于Easyx的UI库(2022-8-14 V1) [C++]基于Easyx的UI库(2022-8-14 V2) 简介 实现语言:C++ 项目名称:UI.h 项目类型:控制台应 ...
- 基于easyX和vs使用c++绘制坐标系以及实时显示
由于现在在windows下用c语言写一些算法,c语言并没有自己的图形界面库,所以在调试的时候很不方便.相信很多使用c语言开发的朋友都会为此而苦恼.所以最近我基于easyX写了一个实时绘制数据的程序,希 ...
- 基于EasyX的五子棋游戏
基于EasyX的五子棋游戏 一.预备知识 二.游戏逻辑 1.五子棋元素 2.五子棋规则 三.游戏设计 1.地图设计 2.点击设计 3.结束设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道 ...
最新文章
- asp.net 后台事件掉用前台js
- wpsppt如何虚化图片_PPT模仿之路——图片以及笔画的虚化
- mac更新java失败解决办法
- Google电子地图基础及应用
- Linux x8664汇编,Linux Udis86 反汇编引擎使用
- Oracle 11.2.0.3 [INS-41112] Specified network interface doesnt maintain connectivity across cluster
- MySQL级联复制(A-B-C) —log-slave-updates = 1
- HDFS Federation机制
- 走好达叔!每年“癌症”新增400万例,数据分析揭示“癌症”到底有多可怕
- kubernetes kubeadm init kube-apiserver.yaml already exists
- 电信私有云 oracle,行业观察:Oracle私有云升级
- 等保2.0.第十章.等保2.0三级解决方案(上)
- 【机器学习】解释机器学习模型
- 使用lgtm发现开源项目安全漏洞
- Activity高级学习
- IDEA 设置终端管理员权限
- python3爬取网易云歌曲的相关信息
- NVIDIA Jetson AGX Xavier
- ThinkPHP3.0主入口配置,注册、登录案例
- 移动支付线上线下支付应用场景
热门文章
- Gmail打不开登录不了邮箱最新解决方法
- 2015年全国大学生电子设计大赛综合测评题
- 游戏《我的世界》马怎么繁殖?如何驯化?
- “DOU出晋采”山西旅游数据发布会在太原举行,山西文旅牵手巨量引擎!
- CPU飙高原因及解决方案
- 计算机纸牌游戏攻略,Windows纸牌游戏怎么玩 玩法技巧攻略详解
- 【LeetCode】括号匹配问题(C语言)| 动图演示,超详细哦~
- u盘作为重要的计算机存储介质,U盘是采用FLASH MEMORY作为存储介质的移动存储设备...
- face_recognition常用方法
- Php实现Facebook app端web网页登陆功能