『cocos2d-x』中华大仙寨版--西行记west travel

初学cocos2d-x,正好在网上发现一些素材,试着写了个小游戏,写得稀烂,后面再去优化吧,暂且做个记录。

屌丝七夕只能做个七夕游戏安慰自己了,悟空都有女朋友了 = =

先上图:





主场景代码:

#include "HelloWorldScene.h"
#include "Defines.h"
#include "GameOverScene.h"


USING_NS_CC;


CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();
    
    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();


    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}


// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }
    
//background init
    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();


_mapFront  = CCSprite::create("stage2mtgogya.png", CCRectMake(4, 0, 2690, 480));
_mapMiddle = CCSprite::create("stage2mtgogya.png", CCRectMake(4, 480, 2000, 400));
_mapBack   = CCSprite::create("stage2mtgogya.png", CCRectMake(19, 884, 2047, 500));

_mapFront->setAnchorPoint(ccp(0, 0));
_mapMiddle->setAnchorPoint(ccp(0, 0));
_mapBack->setAnchorPoint(ccp(0, 0));

CCMoveTo *frontAction = CCMoveTo::create(60.0f, ccp(-2050, 0));
CCMoveTo *midMoveTo   = CCMoveTo::create(60.0f, ccp(-1200, 0));
CCMoveTo *backMoveTo  = CCMoveTo::create(60.0f, ccp(-400, 0));


CCFiniteTimeAction *bossSeq = CCSequence::create(CCDelayTime::create(60.0f), 
CCCallFunc::create(this, callfunc_selector(HelloWorld::createBoss)), 
NULL);


CCFiniteTimeAction *bossSeq2 = CCSequence::create(CCDelayTime::create(50.0f), 
CCCallFunc::create(this, callfunc_selector(HelloWorld::stopSchedule)), 
NULL);


this->addChild(_mapFront, -8);
this->addChild(_mapMiddle, -9);
this->addChild(_mapBack, -10);;

this->runAction(bossSeq);
this->runAction(bossSeq2);
_mapFront->runAction(frontAction);
_mapMiddle->runAction(midMoveTo);
_mapBack->runAction(backMoveTo);


//menu init
menuUp = CCSprite::create("hud.png", CCRectMake(0, 0, 512, 66));
menuUp->setAnchorPoint(ccp(0,0));
menuUp->setPosition(ccp(0, visibleSize.height - 66));
this->addChild(menuUp, 10);
menuUp2 = CCSprite::create("hud.png", CCRectMake(0, 587, 128, 66));
menuUp2->setAnchorPoint(ccp(1, 1));
menuUp2->setPosition(ccp(640, 480));
this->addChild(menuUp2, 10);


menuDown = CCSprite::create("hud.png", CCRectMake(0, 384, 512, 48));
menuDown->setAnchorPoint(ccp(0,0));
menuDown->setScaleX(640.0f / 512.0f);
menuDown->setPosition(ccp(0, 0));
this->addChild(menuDown, 10);


//hero init
hero = CCSprite::create();
hero->setPosition(ccp(50, 240));
hero->runAction(CCRepeatForever::create(CCAnimate::create(wkIdleAnimation)));
this->addChild(hero);


cloud = CCSprite::create();
cloud->setPosition(ccp(54, 220));
cloud->runAction(CCRepeatForever::create(CCAnimate::create(cloudIdleAnimation)));
this->addChild(cloud, -1);


//init member
bBoss = false;
bGod = false;
bulletRank = 3;
bulletGap = 0.2f;
bulletSpeed = 1.0f;
hp = 48;
boss = CCSprite::create();
boss->retain();
bulletArr = CCArray::create();
bulletArr->retain();
enemybulletArr = CCArray::create();
enemybulletArr->retain();
enemyArr = CCArray::create();
enemyArr->retain();
colorBar = CCSprite::createWithSpriteFrame(CCSpriteFrame::create("hud.png", CCRectMake(128, 619, 5, 12)));
colorBar->setScaleX(hp);
colorBar->setAnchorPoint(ccp(0, 1));
colorBar->setPosition(ccp(96, 450));
this->addChild(colorBar, 5);
wks = WK_IDLE;


//init effect
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("songshu.mp3", true);
SimpleAudioEngine::sharedEngine()->preloadEffect("fireEffect.mp3");
SimpleAudioEngine::sharedEngine()->preloadEffect("explodeEffect.mp3");
SimpleAudioEngine::sharedEngine()->preloadEffect("boss.mp3");


//schedule
this->scheduleUpdate();
this->schedule(SEL_SCHEDULE(&HelloWorld::enemyUpdate), 1.5f);
this->schedule(SEL_SCHEDULE(&HelloWorld::keyboardUpdate), 0.1f);


    return true;
}


void HelloWorld::update(float dt)
{
if(hp <= 0)
{
SimpleAudioEngine::sharedEngine()->stopAllEffects();
CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.5f, GameOver::scene() ));
}


for(int i=0; i<bulletArr->count(); )
{
CCSprite *s = (CCSprite*)(bulletArr->objectAtIndex(i));
float x = s->getPositionX();
float y = s->getPositionY();
if(x<0 || x>640 || y<0 || y>480)
{
this->removeChild(s, true);
bulletArr->removeObjectAtIndex(i);
}
else
i++;
}


for(int i=0; i<enemybulletArr->count(); )
{
CCSprite *s = (CCSprite*)(enemybulletArr->objectAtIndex(i));
float x = s->getPositionX();
float y = s->getPositionY();
if(x<0 || x>640 || y<0 || y>480)
{
this->removeChild(s, true);
enemybulletArr->removeObjectAtIndex(i);
}
else
i++;
}


if((GetAsyncKeyState(0x41) & 0x8000) == 0x8000)
{
hero->setPositionX(hero->getPositionX() - 3);
}
if((GetAsyncKeyState(0x44) & 0x8000) == 0x8000)
{
hero->setPositionX(hero->getPositionX() + 3);
}
if((GetAsyncKeyState(0x57) & 0x8000) == 0x8000)
{
hero->setPositionY(hero->getPositionY() + 3);
}
if((GetAsyncKeyState(0x53) & 0x8000) == 0x8000)
{
hero->setPositionY(hero->getPositionY() - 3);
}
if(hero->getPositionX() < 24)
hero->setPositionX(24);
if(hero->getPositionX() > 620)
hero->setPositionX(620);
if(hero->getPositionY() < 76)
hero->setPositionY(76);
if(hero->getPositionY() > 388)
hero->setPositionY(388);
cloud->setPosition(ccp(hero->getPositionX() + 4, hero->getPositionY() - 20));

for(int i=0; i<enemyArr->count(); i++)
{
for(int j=0; j<bulletArr->count(); )
{
CCSprite *e = (CCSprite*)(enemyArr->objectAtIndex(i));
CCSprite *b = (CCSprite*)(bulletArr->objectAtIndex(j));
CCRect eRect = CCRectMake(e->getPositionX() - e->getContentSize().width / 2, e->getPositionY() - e->getContentSize().height /2, 
e->getContentSize().width, e->getContentSize().height);
CCRect bRect = CCRectMake(b->getPositionX() - b->getContentSize().width / 2, b->getPositionY() - b->getContentSize().height /2, 
b->getContentSize().width, b->getContentSize().height);
if(eRect.intersectsRect(bRect))
{
e->setTag(e->getTag() - 5);
this->removeChild(b, true);
bulletArr->removeObjectAtIndex(j);
} else
j++;
}
}


for(int i=0; i<enemyArr->count(); )
{
CCSprite *s = (CCSprite*)(enemyArr->objectAtIndex(i));
if(s->getTag() <= 0)
{
this->removeChild(s, true);
CCPoint p = s->getPosition();
enemyArr->removeObjectAtIndex(i);
CCSprite * s = CCSprite::create();
s->setPosition(p);
CCAnimate *animate = CCAnimate::create(explodeAnimation);
this->addChild(s);
CCFiniteTimeAction *seq = CCSequence::create(CCAnimate::create(explodeAnimation), 
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)), 
NULL);
s->runAction(seq);
SimpleAudioEngine::sharedEngine()->playEffect("explodeEffect.mp3");
}
else i++;
}


for(int i=0; i<enemybulletArr->count(); )
{
CCSprite* s = (CCSprite*)(enemybulletArr->objectAtIndex(i));
CCPoint bp = s->getPosition();
CCRect hRect = CCRectMake(hero->getPositionX() - hero->getContentSize().width * 0.4f, 
hero->getPositionY() - hero->getContentSize().height * 0.4f,
hero->getContentSize().width * 0.8f, 
hero->getContentSize().height * 0.8f);
CCRect bRect = CCRectMake(s->getPositionX() - s->getContentSize().width * 0.4f, 
s->getPositionY() - s->getContentSize().height * 0.4f, 
s->getContentSize().width * 0.8f, 
s->getContentSize().height * 0.8f);
if(hRect.intersectsRect(bRect))
{
CCBlink *heroBlink = CCBlink::create(0.3f, 3);
if(!hero->isVisible())
hero->setVisible(true);
hero->runAction(heroBlink);
hp -= 4;
this->removeChild(s, true);
colorBar->setScaleX(hp);
enemybulletArr->removeObjectAtIndex(i);
} else i++;
}


if(bBoss)
{
CCRect bRect = CCRectMake(boss->getPositionX() - boss->getContentSize().width * 0.4f,
boss->getPositionY() - boss->getContentSize().height * 0.4f,
boss->getContentSize().width * 0.8f,
boss->getContentSize().height * 0.8f);
CCRect hRect = CCRectMake(hero->getPositionX() - hero->getContentSize().width * 0.4f,
hero->getPositionY() - hero->getContentSize().height * 0.4f,
hero->getContentSize().width * 0.8f,
hero->getContentSize().height * 0.8f);
if(bRect.intersectsRect(hRect))
{
if(!bGod)
{
bGod = true;
hp -= 4;
colorBar->setScaleX(hp);
CCFiniteTimeAction *hSeq = CCSequence::create(CCBlink::create(0.4f, 2),
CCCallFunc::create(this, callfunc_selector(HelloWorld::godModeExit)),
NULL);
hero->runAction(hSeq);
}
}
}
}


void HelloWorld::keyboardUpdate(float dt)
{
if((GetAsyncKeyState(0x4A) & 0x8000) == 0x8000 && wks == WK_IDLE)
{
wks = WK_SHOOT;
SimpleAudioEngine::sharedEngine()->playEffect("fireEffect.mp3");
CCAnimate *animate = CCAnimate::create(wkShootAnimation);
CCFiniteTimeAction *seq = CCSequence::create(CCDelayTime::create(bulletGap), 
CCCallFunc::create(this, callfunc_selector(HelloWorld::resetHeroState)), NULL);
this->runAction(seq);
hero->runAction(animate);


switch(bulletRank)
{
case 0:{
for(int i=0; i<2; i++)
{
CCSprite *bullet = CCSprite::create();
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(20, -7 + i * 14)));
CCMoveBy *moveBy = CCMoveBy::create(bulletSpeed, ccp(640, 0));
CCFiniteTimeAction *repeat = CCRepeatForever::create(CCAnimate::create(bulletOneAnimation));
bullet->runAction(repeat);
bullet->runAction(moveBy);
this->addChild(bullet, 1);
bulletArr->addObject(bullet);
}
  }
  break;
case 1:
break;
case 2:
break;
case 3:
{
CCSprite *bullet = CCSprite::create();
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(20, 0)));
CCMoveBy *moveBy = CCMoveBy::create(bulletSpeed, ccp(640, 0));
CCFiniteTimeAction *repeat = CCRepeatForever::create(CCAnimate::create(bulletFourAnimation));
bullet->runAction(repeat);
bullet->runAction(moveBy);
this->addChild(bullet, 1);
bulletArr->addObject(bullet);
CCFiniteTimeAction *repeat2;
CCMoveBy *moveBy2;
for(int i=0; i<3; i++)
for(int j=0; j<2; j++)
{
CCSprite *bullet = CCSprite::create();
if(i==0)
{
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(15, -8 + 16 * j)));
moveBy2 = CCMoveBy::create(bulletSpeed, ccp(640, -100 + 200 * j));
repeat2 = CCRepeatForever::create(CCAnimate::create(bulletOneAnimation));
} else if(i==1) {
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(15, -4 + 8 * j)));
moveBy2 = CCMoveBy::create(bulletSpeed, ccp(640, -50 + 100 * j));
repeat2 = CCRepeatForever::create(CCAnimate::create(bulletOneAnimation));
} else {
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(15, -12 + 24 * j)));
moveBy2 = CCMoveBy::create(bulletSpeed, ccp(640, -150 + 300 * j));
repeat2 = CCRepeatForever::create(CCAnimate::create(bulletOneAnimation));
}
bullet->runAction(repeat2);
bullet->runAction(moveBy2);
this->addChild(bullet, 1);
bulletArr->addObject(bullet);
}
}
break;
}
}
}


void HelloWorld::enemyUpdate(float dt)
{
CCSprite *angleEnemy = CCSprite::create();
angleEnemy->setPosition(ccp(670, rand()%200 + 200));
CCRepeat *repeat1 = CCRepeat::create(CCAnimate::create(angleEnemyAnimation[0]), 7);


CCMoveBy *moveBy1 = CCMoveBy::create(3.2f, ccp(-400 - rand()%240, 0));
CCMoveBy *moveBy2 = CCMoveBy::create(1.6f, ccp(640, 0));


this->addChild(angleEnemy);
angleEnemy->runAction(repeat1);
CCFiniteTimeAction *seq = CCSequence::create(moveBy1,
CCAnimate::create(angleEnemyAnimation[1]),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::createBullet)), 
moveBy2,
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
angleEnemy->runAction(seq);
angleEnemy->setTag(100);
enemyArr->addObject(angleEnemy);


if(rand()%7 < 3)
{
CCSprite *pigEnemy = CCSprite::create();
pigEnemy->setPosition(ccp(660, 92));
pigEnemy->setScale(0.8f);
CCFiniteTimeAction *pigSeq = CCSequence::create(CCAnimate::create(pigEnemyAnimation[0]),
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)1),
CCDelayTime::create(1.0f),
CCAnimate::create(pigEnemyAnimation[1]), 
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)2),
CCDelayTime::create(1.0f),
CCAnimate::create(pigEnemyAnimation[2]),
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)3),
CCDelayTime::create(1.0f),
NULL);
CCRepeatForever *repeat = CCRepeatForever::create((CCActionInterval *)pigSeq);
this->addChild(pigEnemy);
enemyArr->addObject(pigEnemy);
pigEnemy->runAction(repeat);
pigEnemy->setTag(60);
CCFiniteTimeAction *moveSeq = CCSequence::create(CCMoveBy::create(20, ccp(-683.3333f, 0)), 
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
pigEnemy->runAction(moveSeq);
} 
}


void HelloWorld::spriteDelete(CCNode* node)
{
CCSprite *s = (CCSprite*)node;
s->removeFromParentAndCleanup(true);
}


void HelloWorld::resetHeroState()
{
wks = WK_IDLE;
}


void HelloWorld::createBullet(CCNode *node)
{
CCSprite *s = (CCSprite*)node;
CCPoint p = s->getPosition();
CCPoint hp = hero->getPosition();
CCPoint sp = ccpMult(ccpNormalize(ccpSub(hp, p)), 900);
CCRepeatForever *repeat = CCRepeatForever::create(CCAnimate::create(bulletTwoAnimation));
CCSprite *bullet = CCSprite::create();
bullet->setPosition(p);
this->addChild(bullet);
enemybulletArr->addObject(bullet);
bullet->runAction(repeat);
CCMoveTo *moveTo = CCMoveTo::create(6.0f, sp);
bullet->runAction(moveTo);
}


void HelloWorld::createBullet(CCNode *node, void *data)
{
CCSprite *s = (CCSprite*)node;
CCPoint p = s->getPosition();
int bKind = (int)data;
CCSprite *b = CCSprite::create();
this->addChild(b);
CCRepeatForever *repeat = CCRepeatForever::create(CCAnimate::create(bulletTwoAnimation));
switch(bKind)
{
case 1:
{
b->runAction(repeat);
b->setPosition(ccpAdd(p, ccp(-30, 0)));
CCFiniteTimeAction *bSeq = CCSequence::create(CCMoveBy::create(2.0f, ccp(-640, 0)),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
b->runAction(bSeq);
enemybulletArr->addObject(b);
}
break;
case 2:
{
b->runAction(repeat);
b->setPosition(ccpAdd(p, ccp(-20, 15)));
CCFiniteTimeAction *bSeq = CCSequence::create(CCMoveBy::create(2.0f, ccp(-640, 320)),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
b->runAction(bSeq);
enemybulletArr->addObject(b);
}
break;
case 3:
{
b->runAction(repeat);
b->setPosition(ccpAdd(p, ccp(-25, 25)));
CCFiniteTimeAction *bSeq = CCSequence::create(CCMoveBy::create(2.0f, ccp(-640, 640)),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
b->runAction(bSeq);
enemybulletArr->addObject(b);
}
break;
case 4:
{
b->setScaleX(1.5f);
b->setPosition(ccpAdd(p, ccp(- 430.0f / 2.0f - 120, rand()%200 - 50)));
CCFiniteTimeAction *bSeq = CCSequence::create(CCAnimate::create(bulletBossAnimation[0]),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
CCRect bRect = CCRectMake(b->getPositionX() - 215, b->getPositionY() - 25, 430, 50);
CCRect hRect = CCRectMake(hero->getPositionX() - hero->getContentSize().width / 2,
 hero->getPositionY() - hero->getContentSize().height / 2,
 hero->getContentSize().width,
 hero->getContentSize().height);
if(bRect.intersectsRect(hRect))
{
hp -= 10;
colorBar->setScaleX(hp);
CCBlink *heroBlink = CCBlink::create(0.3f, 3);
if(!hero->isVisible())
hero->setVisible(true);
hero->runAction(heroBlink);
}
b->runAction(bSeq);


}
break;
case 5:
{
b->setPosition(ccp(p.x - 150, 240));
float fp = rand()%60 + 210;
for(int i=0; i<3; i++)
{
for(int j=0; j<2; j++)
{
CCSprite *fb = CCSprite::create();
fb->setScale(0.7f);
fb->setPosition(ccp(p.x - 130, fp + (i+1) * 20 * (j==0 ? 1:(-1))));
this->addChild(fb);
CCAnimate* animate = CCAnimate::create(bulletBossAnimation[1]);
CCRotateBy *rotateBy = CCRotateBy::create(0.3f, 60 * (j==0 ? 1:(-1) ) );
CCMoveBy *moveBy = CCMoveBy::create(0.3f, ccp(-64, (i+1) * 6 * (j==0 ? 1:-1 )));
CCFiniteTimeAction *fSp = CCSpawn::create(animate, rotateBy, moveBy, NULL);
CCFiniteTimeAction *fSeq = CCSequence::create(CCRepeat::create(fSp, 10), 
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
fb->runAction(fSeq);
enemybulletArr->addObject(fb);
}
}
}
break;
}
}


void HelloWorld::createBoss()
{
SimpleAudioEngine::sharedEngine()->stopBackgroundMusic(true);
SimpleAudioEngine::sharedEngine()->playEffect("boss.mp3", true);


bBoss = true;
boss->setPosition(ccp(800, 300));
this->addChild(boss);
CCRepeat *repeat1 = CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 4);
CCMoveBy *moveBy1 = CCMoveBy::create(4.0f, ccp(-280, 0));
CCAnimate *attackOne = CCAnimate::create(bossOneAnimation[1]);
CCAnimate *attackTwo = CCAnimate::create(bossOneAnimation[2]);
CCMoveBy *moveByLeft = CCMoveBy::create(1.0f, ccp(-400, 0));
CCMoveBy *moveByDown = CCMoveBy::create(1.0f, ccp(0, -100));
CCMoveBy *moveByRight = CCMoveBy::create(1.0f, ccp(400, 0));
CCMoveBy *moveByUp = CCMoveBy::create(1.0f, ccp(0, 100));


CCFiniteTimeAction *oneSeq = CCSequence::create(attackOne,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)5),
CCDelayTime::create(rand()%10 / 10.0f),
repeat1,
attackOne,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)5),
CCDelayTime::create(rand()%10 / 10.0f),
repeat1,
CCSpawn::create(moveByLeft, CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 1), NULL),
CCSpawn::create(moveByDown, CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 1), NULL),
CCSpawn::create(moveByRight, CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 1), NULL),
repeat1,
attackTwo,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)4),
CCDelayTime::create(1.0f),
attackTwo,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)4),
CCDelayTime::create(1.0f),
attackTwo,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)4),
CCDelayTime::create(1.0f),
CCSpawn::create(moveByUp, CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 1), NULL),
repeat1,
NULL);


CCRepeat *totalRepeat = CCRepeat::create(oneSeq, 100);


CCFiniteTimeAction *enterSpawn = CCSpawn::create(repeat1, moveBy1, NULL);
CCFiniteTimeAction *totalSeq = CCSequence::create(enterSpawn, totalRepeat, NULL);
boss->runAction(totalSeq);
}


void HelloWorld::godModeExit()
{
bGod = false;
}


void HelloWorld::stopSchedule()
{
this->unschedule(schedule_selector(HelloWorld::enemyUpdate));
}


Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值