如果你还不熟悉A*寻路,请先看下这篇文章http://blog.csdn.net/dssdss123/article/details/11494065

一、先介绍几个函数和结构:

1、virtual void draw()

这个函数跟与MFC上单文档里的OnDraw函数很像,这里只是少了dc,这个函数会一直被调用,无需刷新,也就是说,你无需像在MFC上一样调用Invalidate或者InvalidateRect

2、virtual void ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)

这个函数是下响应触摸的,当你点击屏幕时,就会进到这个函数。要使这个函数有效,你需要在init中调用
setTouchEnabled(true);    // 允许该层响应触摸
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);    // 注册单点触摸

在这个例子中,我们不需要多点触摸

3、ccColor4F结构

这个结构在ccDrawSolidRect函数中将会使用到,ccDrawSolidRect是画某种颜色的矩形,对应在MFC中,我们使用的是FillSolidRect。ccColor4F是RGBA的结构,RGB是三颜色,红绿蓝,最后一个alpha值,他表示这个颜色的透明度。为1是完全不透明,0时则完全透明。

二、实现

1、去掉coco自带的乱七八糟的显示

1)去掉帧频显示

在函数bool AppDelegate::applicationDidFinishLaunching()中

// turn on display FPS
//pDirector->setDisplayStats(true);

将pDirector->setDisplayStats(true),注释掉

2)去掉menu,Hello World文字标签

在函数void HelloWorld::init()中

// Add the menu to HelloWorld layer as a child layer.
//this->addChild(pMenu, 1);

// Add the label to HelloWorld layer as a child layer.
//this->addChild(pLabel, 1);

将menu和label注释掉

3)替换背景图,并置于最底层

// 3. Add add a splash screen, show the cocos2d splash image.
CCSprite* pSprite = CCSprite::create("map.jpg");    // 将原先的HelloWorld.png,替换为自己的图片,这里我换成map.jpg
CC_BREAK_IF(! pSprite);

2、初始化地图

声明结构表示格子掩码等一些信息,我们的例子中,只需掩码,所以结构如下:

    struct ST_GRID{ST_GRID()  { gf = GRID_FLAG_DEFAULT; }GRID_FLAG gf;};typedef vector<ST_GRID*> VEC_GRID;VEC_GRID m_vecGrid;    // 保存地图产生的所有格子

初始化地图的格子掩码,如下:

void HelloWorld::InitMap()
{// 初始化格子掩码srand((unsigned int)time(NULL));for (int i = 0; i < GetRow() * GetCol(); i++){int nRandFlag = ((int)(CCRANDOM_0_1() * 10)) % 4 == 0 ? GRID_FLAG_OBSTACLE : GRID_FLAG_DEFAULT;    // 十分之四的概率产生障碍ST_GRID* pGrid = new ST_GRID;if (!pGrid){return ;}pGrid->gf = (GRID_FLAG)nRandFlag;m_vecGrid.push_back(pGrid);}
}

3、寻路

定义一个结构,用于寻路过程中,记录每个格子的信息

    struct NODE{NODE()  {nIndex = 0; nG = 0; pParent = NULL;}int nIndex;int nG;NODE* pParent;};vector<NODE*> m_vecPath;    // 寻路的路径

下面开始寻路

void HelloWorld::FindPath()
{vector<NODE*> vecClose;    // close表vector<NODE*> vecOpen;     // open表if (m_nStartIndex == -1 || m_nEndIndex == -1){return ;}m_vecPath.clear();    // 这里,我们并没有delete,但却不会内存泄漏,因为cocos2d-x使用了跟java一样的技术 -- 内存回收机制,自动处理垃圾// 先添加开始点NODE* pNode = new NODE;pNode->nIndex = m_nStartIndex;vecClose.push_back(pNode);int nStep = 0;while(true){if (nStep++ >= 200)    // 最多寻200格{break;}NODE* pNextNode = vecClose[vecClose.size() - 1];    // 取下一个路径if (!pNextNode){break;}if (pNextNode->nIndex == m_nEndIndex)    // 找到终点,就不再找了{break;}for (int i = 0; i < 8; i++){int nIndex = GetIndexByDir(pNextNode->nIndex, i);    // 根据方向取索引if (-1 == nIndex){continue;}if (m_vecGrid[nIndex]->gf == GRID_FLAG_OBSTACLE)    // 障碍{continue;}if (InTable(nIndex, vecClose) != NULL)      // 在close表里{continue;}NODE* pNode = InTable(nIndex, vecOpen);     // 在open表里,比较G值,取G值更小的为新路径if (pNode){int nNewG = pNextNode->nG + GetGByIndex(pNextNode->nIndex, pNode->nIndex);if (pNode->nG > nNewG){pNode->nG = nNewG;pNode->pParent = pNextNode;    // 改变节点的父节点}continue;}// 新搜索到的格子,添加到开放列表pNode = new NODE;pNode->nIndex = nIndex;pNode->nG = pNextNode->nG + GetGByIndex(pNextNode->nIndex, pNode->nIndex);pNode->pParent = pNextNode;vecOpen.push_back(pNode);}// 找下一个路径,open表里F值最小的就是了int nMinF = 0xFFFFFF;pNextNode = NULL;int nNextNodeIndex = 0;for (int i = 0; i < (int)vecOpen.size(); i++){NODE* pNode = vecOpen[i];if (!pNode){continue;}int nH = GetHByIndex(pNode->nIndex);    // 计算该点与终点的H值,即路径长度int nF = nH + pNode->nG;    // F = H + Gif (nF < nMinF){nMinF = nF;pNextNode = pNode;nNextNodeIndex = i;}}// 找到F值最小的,放入close表,并从open表里删除if (nNextNodeIndex >= 0 && nNextNodeIndex < (int)vecOpen.size()){vecClose.push_back(pNextNode);vecOpen.erase(vecOpen.begin() + nNextNodeIndex);}}// 寻路结束,找最优路径pNode = vecClose[vecClose.size() - 1];while (pNode){m_vecPath.push_back(pNode);pNode = pNode->pParent;}
}

4、展示到界面上

void HelloWorld::draw()
{// 画背景表格CCSize size = CCDirector::sharedDirector()->getWinSize();for (int i = 0; i < GetRow(); i++){ccDrawLine(ccp(0, i * GRID_SIDELEN), ccp(size.width, i * GRID_SIDELEN));}for (int i = 0; i < GetCol(); i++){ccDrawLine(ccp(i * GRID_SIDELEN, 0), ccp(i * GRID_SIDELEN, size.height));}// 画特殊格子颜色// 寻路得到的路径for (int i = 0; i < (int)m_vecPath.size(); i++){CCPoint ptObstacleLT;CCPoint ptObstacleRD;GetRectPointByIndex(m_vecPath[i]->nIndex, ptObstacleLT, ptObstacleRD);ccColor4F clrObstacle = {0, 1, 1, 0};ccDrawSolidRect(ptObstacleLT, ptObstacleRD, clrObstacle);}// 开始点CCPoint ptStartLT;CCPoint ptStartRD;GetRectPointByIndex(m_nStartIndex, ptStartLT, ptStartRD);ccColor4F clrStart = {1, 0, 0, 1};ccDrawSolidRect(ptStartLT, ptStartRD, clrStart);// 结束点CCPoint ptEndLT;CCPoint ptEndRD;GetRectPointByIndex(m_nEndIndex, ptEndLT, ptEndRD);ccColor4F clrEnd = {0, 1, 0, 1};ccDrawSolidRect(ptEndLT, ptEndRD, clrEnd);// 障碍for (int i = 0; i < (int)m_vecGrid.size(); i++){if (m_vecGrid[i]->gf == GRID_FLAG_OBSTACLE){CCPoint ptObstacleLT;CCPoint ptObstacleRD;GetRectPointByIndex(i, ptObstacleLT, ptObstacleRD);ccColor4F clrObstacle = {0, 0, 1, 1};ccDrawSolidRect(ptObstacleLT, ptObstacleRD, clrObstacle);}}
}

这里,我只介绍几个比较重要的函数,其他的就不赘述了,资源已上传到CSDN,但还没显示出来,等显示出来了,再把链接发到此处,有疑问的童鞋留言哈

。。。。。。。。

啊,我还是直接上源码吧

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"
#include "Box2D/Box2D.h"
#include "SimpleAudioEngine.h"
USING_NS_CC;enum STEP
{STEP_DEFAULT    = 0,STEP_STARTPOINT = 1,STEP_ENDPOINT   = 2,
};enum GRID_FLAG
{GRID_FLAG_DEFAULT   = 0,        // 默认可通过GRID_FLAG_OBSTACLE  = 1,        // 障碍
};
const int GRID_SIDELEN = 20;    // 不能为0
//
class HelloWorld : public cocos2d::CCLayer
{
public:// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphonevirtual bool init();  // there's no 'id' in cpp, so we recommand to return the exactly class pointerstatic cocos2d::CCScene* scene();// a selector callbackvoid menuCloseCallback(CCObject* pSender);// implement the "static node()" method manuallyCREATE_FUNC(HelloWorld);public:virtual void draw();virtual bool ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent);private:void InitMap();private:int GetRow();int GetCol();int GetIndexByPoint(CCPoint pt);void GetRectPointByIndex(int nIndex, CCPoint &ptLT, CCPoint &ptRD);private:int m_nStartIndex;int m_nEndIndex;struct ST_GRID{ST_GRID()  { gf = GRID_FLAG_DEFAULT; }GRID_FLAG gf;};typedef vector<ST_GRID*> VEC_GRID;VEC_GRID m_vecGrid;struct NODE{NODE()  {nIndex = 0; nG = 0; pParent = NULL;}int nIndex;int nG;NODE* pParent;};vector<NODE*> m_vecPath;    // 寻路的路径public:void FindPath();private:int GetIndexByDir(int nIndex, int nDir);int GetGByIndex(int nStartIndex, int nEndIndex);int GetHByIndex(int nIndex);NODE *InTable(int nIndex, vector<NODE*> &vecTbl);private:int m_nStep;
};#endif  // __HELLOWORLD_SCENE_H__
#include "HelloWorldScene.h"using namespace cocos2d;CCScene* HelloWorld::scene()
{CCScene * scene = NULL;do {// 'scene' is an autorelease objectscene = CCScene::create();CC_BREAK_IF(! scene);// 'layer' is an autorelease objectHelloWorld *layer = HelloWorld::create();CC_BREAK_IF(! layer);// add layer as a child to scenescene->addChild(layer);} while (0);// return the scenereturn scene;
}// on "init" you need to initialize your instance
bool HelloWorld::init()
{bool bRet = false;do {//// super init first//CC_BREAK_IF(! CCLayer::init());//// add your codes below...//// 1. Add a menu item with "X" image, which is clicked to quit the program.// Create a "close" menu item with close icon, it's an auto release object.CCMenuItemImage *pCloseItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png",this,menu_selector(HelloWorld::menuCloseCallback));CC_BREAK_IF(! pCloseItem);// Place the menu item bottom-right conner.pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));// Create a menu with the "close" menu item, it's an auto release object.CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);pMenu->setPosition(CCPointZero);CC_BREAK_IF(! pMenu);// Add the menu to HelloWorld layer as a child layer.//this->addChild(pMenu, 1);// 2. Add a label shows "Hello World".// Create a label and initialize with string "Hello World".CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);CC_BREAK_IF(! pLabel);// Get window size and place the label upper. CCSize size = CCDirector::sharedDirector()->getWinSize();pLabel->setPosition(ccp(size.width / 2, size.height - 50));// Add the label to HelloWorld layer as a child layer.//this->addChild(pLabel, 1);// 3. Add add a splash screen, show the cocos2d splash image.CCSprite* pSprite = CCSprite::create("map.jpg");CC_BREAK_IF(! pSprite);// Place the sprite on the center of the screenpSprite->setPosition(ccp(size.width/2, size.height/2));// Add the sprite to HelloWorld layer as a child layer.this->addChild(pSprite, -1);setTouchEnabled(true);CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);m_nStep = STEP_STARTPOINT;m_nStartIndex = -1;m_nEndIndex = -1;InitMap();bRet = true;} while (0);return bRet;
}void HelloWorld::menuCloseCallback(CCObject* pSender)
{// "close" menu item clickedCCDirector::sharedDirector()->end();
}//
void HelloWorld::InitMap()
{srand((unsigned int)time(NULL));for (int i = 0; i < GetRow() * GetCol(); i++){int nRandFlag = ((int)(CCRANDOM_0_1() * 10)) % 4 == 0 ? GRID_FLAG_OBSTACLE : GRID_FLAG_DEFAULT;ST_GRID* pGrid = new ST_GRID;if (!pGrid){return ;}pGrid->gf = (GRID_FLAG)nRandFlag;m_vecGrid.push_back(pGrid);}
}//
void HelloWorld::FindPath()
{vector<NODE*> vecClose;vector<NODE*> vecOpen;if (m_nStartIndex == -1 || m_nEndIndex == -1){return ;}m_vecPath.clear();// 先添加开始点NODE* pNode = new NODE;pNode->nIndex = m_nStartIndex;vecClose.push_back(pNode);int nStep = 0;while(true){if (nStep++ >= 200){break;}NODE* pNextNode = vecClose[vecClose.size() - 1];if (!pNextNode){break;}if (pNextNode->nIndex == m_nEndIndex){break;}for (int i = 0; i < 8; i++){int nIndex = GetIndexByDir(pNextNode->nIndex, i);if (-1 == nIndex){continue;}if (m_vecGrid[nIndex]->gf == GRID_FLAG_OBSTACLE)    // 障碍{continue;}if (InTable(nIndex, vecClose) != NULL)      // 在close表里{continue;}NODE* pNode = InTable(nIndex, vecOpen);     // 在open表里if (pNode){int nNewG = pNextNode->nG + GetGByIndex(pNextNode->nIndex, pNode->nIndex);if (pNode->nG > nNewG){pNode->nG = nNewG;pNode->pParent = pNextNode;}continue;}// 新搜索到的格子pNode = new NODE;pNode->nIndex = nIndex;pNode->nG = pNextNode->nG + GetGByIndex(pNextNode->nIndex, pNode->nIndex);pNode->pParent = pNextNode;vecOpen.push_back(pNode);}int nMinF = 0xFFFFFF;pNextNode = NULL;int nNextNodeIndex = 0;for (int i = 0; i < (int)vecOpen.size(); i++){NODE* pNode = vecOpen[i];if (!pNode){continue;}int nH = GetHByIndex(pNode->nIndex);int nF = nH + pNode->nG;if (nF < nMinF){nMinF = nF;pNextNode = pNode;nNextNodeIndex = i;}}if (nNextNodeIndex >= 0 && nNextNodeIndex < (int)vecOpen.size()){vecClose.push_back(pNextNode);vecOpen.erase(vecOpen.begin() + nNextNodeIndex);}}// 寻路结束,找最优路径pNode = vecClose[vecClose.size() - 1];while (pNode){m_vecPath.push_back(pNode);pNode = pNode->pParent;}
}//
int HelloWorld::GetIndexByDir(int nIndex, int nDir)
{if (nIndex < 0 || nIndex >= (int)m_vecGrid.size()){return -1;}int nRow = nIndex / GetCol();int nCol = nIndex % GetCol();switch(nDir){case 0:     // 上nRow += 1;break;case 1:     // 右上nRow += 1;nCol +=1;break;case 2:     // 右nCol += 1;break;case 3:     // 右下nRow -= 1;nCol += 1;break;case 4:     // 下nRow -= 1;break;case 5:     // 左下nRow -= 1;nCol -= 1;break;case 6:     // 左nCol -= 1;break;case 7:     // 左上nRow += 1;nCol -= 1;break;default:break;}if (nRow < 0 || nRow >= GetRow()|| nCol < 0 || nCol >= GetCol()){return -1;}return nRow * GetCol() + nCol;
}//
int HelloWorld::GetGByIndex(int nStartIndex, int nEndIndex)
{int nStartRow = nStartIndex / GetCol();int nStartCol = nStartIndex % GetCol();int nEndRow = nEndIndex / GetCol();int nEndCol = nEndIndex % GetCol();if (nStartRow == nEndRow || nStartCol == nEndCol){return 10;}return 14;
}//
int HelloWorld::GetHByIndex(int nIndex)
{int nRow = nIndex / GetCol();int nCol = nIndex % GetCol();int nEndRow = m_nEndIndex / GetCol();int nEndCol = m_nEndIndex % GetCol();return (abs(nEndRow - nRow) + abs(nEndCol - nCol))*10;
}//
HelloWorld::NODE *HelloWorld::InTable(int nIndex, vector<NODE*> &vecTbl)
{for (int i = 0; i < (int)vecTbl.size(); i++){if (nIndex == vecTbl[i]->nIndex){return vecTbl[i];}}return NULL;
}//
int HelloWorld::GetRow()
{CCSize size = CCDirector::sharedDirector()->getWinSize();return size.height / GRID_SIDELEN;
}//
int HelloWorld::GetCol()
{CCSize size = CCDirector::sharedDirector()->getWinSize();return size.width / GRID_SIDELEN;
}//
int HelloWorld::GetIndexByPoint(CCPoint pt)
{pt.x = pt.x > (int)pt.x ? pt.x + 1 : pt.x;pt.y = pt.y > (int)pt.y ? pt.y + 1 : pt.y;return (int)pt.y / GRID_SIDELEN * GetCol() + (int)pt.x / GRID_SIDELEN;
}//
void HelloWorld::draw()
{// 画背景表格CCSize size = CCDirector::sharedDirector()->getWinSize();for (int i = 0; i < GetRow(); i++){ccDrawLine(ccp(0, i * GRID_SIDELEN), ccp(size.width, i * GRID_SIDELEN));}for (int i = 0; i < GetCol(); i++){ccDrawLine(ccp(i * GRID_SIDELEN, 0), ccp(i * GRID_SIDELEN, size.height));}// 画特殊格子颜色// 寻路得到的路径for (int i = 0; i < (int)m_vecPath.size(); i++){CCPoint ptObstacleLT;CCPoint ptObstacleRD;GetRectPointByIndex(m_vecPath[i]->nIndex, ptObstacleLT, ptObstacleRD);ccColor4F clrObstacle = {0, 1, 1, 1};ccDrawSolidRect(ptObstacleLT, ptObstacleRD, clrObstacle);}// 开始点CCPoint ptStartLT;CCPoint ptStartRD;GetRectPointByIndex(m_nStartIndex, ptStartLT, ptStartRD);ccColor4F clrStart = {1, 0, 0, 1};ccDrawSolidRect(ptStartLT, ptStartRD, clrStart);// 结束点CCPoint ptEndLT;CCPoint ptEndRD;GetRectPointByIndex(m_nEndIndex, ptEndLT, ptEndRD);ccColor4F clrEnd = {0, 1, 0, 1};ccDrawSolidRect(ptEndLT, ptEndRD, clrEnd);// 障碍for (int i = 0; i < (int)m_vecGrid.size(); i++){if (m_vecGrid[i]->gf == GRID_FLAG_OBSTACLE){CCPoint ptObstacleLT;CCPoint ptObstacleRD;GetRectPointByIndex(i, ptObstacleLT, ptObstacleRD);ccColor4F clrObstacle = {0, 0, 1, 1};ccDrawSolidRect(ptObstacleLT, ptObstacleRD, clrObstacle);}}
}//
void HelloWorld::GetRectPointByIndex(int nIndex, CCPoint &ptLT, CCPoint &ptRD)
{ptLT.x = nIndex % GetCol() * GRID_SIDELEN;ptLT.y = nIndex / GetCol() * GRID_SIDELEN;ptRD.x = ptLT.x + GRID_SIDELEN;ptRD.y = ptLT.y + GRID_SIDELEN;
}//
bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{if (!pTouch){return false;}int nIndex = GetIndexByPoint(pTouch->getLocation());if (m_vecGrid[nIndex]->gf == GRID_FLAG_OBSTACLE){return false;}if (STEP_STARTPOINT == m_nStep){m_nStartIndex = nIndex;m_nStep = STEP_ENDPOINT;}else if (STEP_ENDPOINT == m_nStep){m_nEndIndex = nIndex;m_nStep = STEP_STARTPOINT;FindPath();}return true;
}

哎,想来想去,还是直接上源码比较直截了当。。。。。寻路效果如下,红色是起点,绿色是终点,蓝色是障碍物,浅蓝色是最终寻路路径:

cocos2d-x的A*寻路相关推荐

  1. 如何实现A星寻路算法 Cocos2d-x 3 0 beta2

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

  2. 如何实现A星寻路算法 Cocos2d-x 3.0 beta2

    本文实践自 Johann Fradj 的文章<How To Implement A* Pathfinding with Cocos2D Tutorial>,文中使用Cocos2D,我在这里 ...

  3. 如何在Cocos2D游戏中实现A*寻路算法(五)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  4. 如何在Cocos2D游戏中实现A*寻路算法(三)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  5. 如何在Cocos2D游戏中实现A*寻路算法(七)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  6. 如何在Cocos2D游戏中实现A*寻路算法(二)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  7. 寻路算法实例解析:贪吃蛇AI的实现

    本文是寻路算法的实际应用篇,以贪吃蛇的实现为例子. 1.首先看下这个在微博上很火的贪吃蛇gif 这次我们尝试用代码来模拟下,说不定上面这个图就是计算机搞的. 2.讲贪吃蛇snake AI之前,我们先看 ...

  8. 关于寻路算法的一些思考(3):A*算法的实现

    概述 剥除代码,A* 算法非常简单.算法维护两个集合:OPEN 集和 CLOSED 集.OPEN 集包含待检测节点.初始状态,OPEN集仅包含一个元素:开始位置.CLOSED集包含已检测节点.初始状态 ...

  9. Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(八)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 回到Xcode中,新建一个EndLayer类,继承于CCNode ...

最新文章

  1. 我花了10个小时,写出了这篇K8S架构解析
  2. 搭建elasticsearch+kibana+logstash+filebeat
  3. 如何确认与服务器偏差_货架如何正确验收
  4. 监控linux空间变化,Linux监控文件变化及主动上报实现
  5. 数据结构+算法面试100题~~~摘自CSDN,作者July
  6. .net类库学习(一)System.object
  7. 五款程序员专用辅助编程工具
  8. Scrapy 中的 Request 对象和 Respionse 对象
  9. linux系统数据库导出语句,数据库应用-SQL语句导入导出大全
  10. VS快捷键及调试方法(含VAssistX快捷键)
  11. win10固态硬盘分区 整数_固态硬盘怎么重装win10系统?Win10固态硬盘重装系统教程...
  12. Android中 Bitmap转JPG PNG
  13. 为什么Redis 单线程却能支撑高并发?
  14. iOS GitHub上常用第三方框架与一些参考文本总结
  15. ligerui联动清空控件值
  16. Address already in use: JVM_Bind:8080 关于XXX端口被占用问题的解决
  17. Beam Search与Prefix Beam Search的理解与python实现
  18. w7运行里的计算机怎么设置,W7系统怎么设置开机启动项
  19. 关于IDEL中的全局搜索不显示该有的类的解决办法之一
  20. 学了深度学习能干什么?飞桨内推岗位大曝光!

热门文章

  1. springboot整合mybatis分页插件
  2. kafka在zookeeper下的目录结构
  3. windows美化工具7+ Taskbar Tweaker
  4. Redis在windows实现将数据缓存起来定时更新读取
  5. ID3 Algorithm for Decision Trees
  6. ORACLE 培训 -相克军
  7. 301重定向的好处:
  8. Vue:echarts的柱状图怎样按照比例缩小?
  9. detime php_php试题及答案
  10. c语言编写atm取款功能_21行C语言代码编写一个具备加密功能的聊天程序!网友:666...