C++课程设计-基于cocos2d-x开发的俄罗斯方块_第1页
C++课程设计-基于cocos2d-x开发的俄罗斯方块_第2页
C++课程设计-基于cocos2d-x开发的俄罗斯方块_第3页
C++课程设计-基于cocos2d-x开发的俄罗斯方块_第4页
C++课程设计-基于cocos2d-x开发的俄罗斯方块_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告课程名称:面向对象程序设计C++设计题目:基于cocos2d-x开发俄罗斯方块专业:计算机科学与技术姓名:学号:指导教师:李晓虹2016年1月10日第一章需求分析1.1游戏介绍俄罗斯方块是一个精典的小游戏,从最早的家庭游戏机、掌上游戏机上都能看到它的身影,正是由于它的简单有趣,在全球得到广泛的传播,男女老少皆宜。而且俄罗斯方块的设计工作复杂且富有挑战性,可以锻炼人的空间想象能力,反映能力等等。在设计这款游戏的过程中,也用到了很多各方面的知识,这对于C++的学习者来说是个很好的练习机会。1.2游戏玩法 游戏区域会从顶部不断落下7种下坠物的一种,游戏区域的右侧有一方框可以提示用户下一个下坠物的形状,玩家可以移动、旋转、加速下落和一键到底自己窗口内落下的下坠物,通过用户的操作,下坠物在游戏区域以“摆积木”的形式出现。下坠物在一行或多行堆满后就可以自动消掉,消行后会得到相应的分数,如果当前下坠物堆积至窗口顶端,即游戏结束。1.3开发平台介绍cocos2d是一个基于MIT协议的开源框架,用于构建游戏、应用程序和其他图形界面交互应用。可以让你在创建自己多平台游戏时节省很多的时间。Cocos是由触控科技推出的游戏开发一站式解决方案,包含了从新建立项、游戏制作、到打包上线的全套流程。开发者可以通过cocos快速生成代码、编辑资源和动画,最终输出适合于多个平台的游戏产品。2012年发布的CocoStudio工具集是开源游戏引擎Cocos2d-x开发团队官方推出的游戏开发工具,目前已经进入稳定版。cocoStudio吸取了他们自己在游戏制作中的经验,为移动游戏开发者团队量身定做,旨在降低游戏开发门槛,提高开发效率,同时也为Cocos2D-X的进一步开发打下基础。在中国的2D手机游戏开发中,Cocos2d-x引擎份额超过了70%。第二章总体设计2.1游戏总体图2-12.2系统功能设计方块下落、旋转功能:在整个游戏中,方块是核心,系统每次随机产生一个方块。一共七种不同的方块,方块可以根据玩家的操作进行左移、右移、加速下落、顺时针进行旋转等游戏胜利:当分数累计到一定大小时,游戏将达到胜利,并结束游戏游戏失败:当累积的方块溢出游戏区域时,游戏以失败告终游戏音乐:游戏开始时游戏背景音乐自动播放,暂停时与结束时音乐也同时结束分数及下一块方块提示:在游戏区域的侧边栏显示分数及下一块方块的形状进行提示。第三章详细设计3.1功能模块3.1.1速度模块速度模块是制定游戏的速度,根据提升的关卡可以提升速度,难度越大掉落的方块速度越快。3.1.2难度模块采取积分的方式闯关,每到到一定积分,增加相应的难度。3.1.3积分模块积分模块是玩家对游戏消掉行的统计累加。计算方法为:sum=100*(2N-1)sum是积分,N是一次消掉的行数。例如:当消掉一行时,积分为100*(21-1)=100,消掉两行时,积分为100*(22-1)=300.记分遵循一次消去一行加100,两行加300,三行加700,4行1500的模式,10000分升一级。3.2游戏层设计3.2.1方块形状一共设计几种方块形状,用于4个小方块组成的方块组合,不考虑自身旋转变化的话,总共有7种,分别为L型,T型,I型,N型,田型,J型以及倒N型。方块这几种不同的形状,将会采用产生随机数的方法随机抽取一种。3.2.2游戏面板游戏面板有12*20的大小,进游戏或者每个关卡初始化,清空原有方块,根据模版填充方块。3.3游戏界面设计游戏界面是玩家直接接触到的最直观的东西,本游戏采用了简单明了的设计界面,所有的功能都一目了然。根据玩家的需求分析,采用单窗体设计,设计了游戏区,展示区、控制区三个设计区域。如图3-3所示,其中游戏区是方块下落显示区,预览区是下一个要出现的方块显示区,控制区是对游戏控制的操作区,包括速度、难度、积分显示、暂停游戏、开始游戏等等。图3-3对于方向键的使用,设计时使用上、下、左、右键来控制方块的移动,用上键来控制方块的旋转。该游戏共有3个等级:低、中、高,级数为游戏当前等级,当分数达到当前等级的最高值,等级会提升、速度会加快。图3-4第四章系统调试开发环境OSXEICapitan版本10.11.2,X-code,X-code自带调试,4s平台下测试。第五章结果分析部分源代码////GameCtrlLayer.cpp//AITetris////Createdbyhansiron16/1/10.////#include"GameCtrlLayer.h"boolGameCtrlLayer::init(){if(!Layer::init()){returnfalse;}m_AIOn=false;SizevisibleSize=Director::getInstance()->getVisibleSize();//开始游戏Label*labelStartGame=Label::createWithSystemFont("开始游戏","",24);labelStartGame->setWidth(36*3);labelStartGame->setAlignment(TextHAlignment::CENTER);MenuItemLabel*menuItemStartGame=MenuItemLabel::create(labelStartGame,CC_CALLBACK_0(GameCtrlLayer::clickStartGameButton,this));Menu*menuStartGame=Menu::createWithItem(menuItemStartGame);menuStartGame->setPosition(36+36/2,visibleSize.height/2-10);this->addChild(menuStartGame);//开启智能m_labelAISwitch=Label::createWithSystemFont("开启智能","",24);m_labelAISwitch->setWidth(36*3);m_labelAISwitch->setAlignment(TextHAlignment::CENTER);MenuItemLabel*menuItemAISwitch=MenuItemLabel::create(m_labelAISwitch,CC_CALLBACK_0(GameCtrlLayer::clickAISwitchButton,this));Menu*menuAISwitch=Menu::createWithItem(menuItemAISwitch);menuAISwitch->setPosition(36+36/2,visibleSize.height/2-60);this->addChild(menuAISwitch);//智能速度m_labelAISpeed=Label::createWithSystemFont("","",24);m_labelAISpeed->setWidth(36*3);m_labelAISpeed->setAlignment(TextHAlignment::CENTER);m_labelAISpeed->setPosition(36+36/2,visibleSize.height/2-4*36);this->addChild(m_labelAISpeed);//左MenuItemImage*menuItemLeft=MenuItemImage::create("images/btn_left.png","images/btn_left.png",CC_CALLBACK_0(GameCtrlLayer::clickLeftButton,this));m_menuLeft=Menu::createWithItem(menuItemLeft);m_menuLeft->setPosition(36/2,visibleSize.height/2-4*36);this->addChild(m_menuLeft);//下MenuItemImage*menuItemDown=MenuItemImage::create("images/btn_down.png","images/btn_down.png",CC_CALLBACK_0(GameCtrlLayer::clickDownButton,this));Menu*menuDown=Menu::createWithItem(menuItemDown);menuDown->setPosition(36+36/2,visibleSize.height/2-5*36);this->addChild(menuDown);//右MenuItemImage*menuItemRight=MenuItemImage::create("images/btn_right.png","images/btn_right.png",CC_CALLBACK_0(GameCtrlLayer::clickRightButton,this));m_menuRight=Menu::createWithItem(menuItemRight);m_menuRight->setPosition(2*36+36/2,visibleSize.height/2-4*36);this->addChild(m_menuRight);returntrue;}voidGameCtrlLayer::clickStartGameButton(){m_delegate->gameCtrlLayerClickStartGame();}voidGameCtrlLayer::clickAISwitchButton(){m_AIOn=!m_AIOn;if(m_AIOn){m_labelAISwitch->setString("关闭智能");floatspeed=m_delegate->gameCtrlLayerGetAISpeed();m_labelAISpeed->setVisible(true);m_labelAISpeed->setString(StringUtils::format("%.1f个/秒",speed));m_menuLeft->setVisible(false);m_menuRight->setVisible(false);}else{m_labelAISwitch->setString("开启智能");m_labelAISpeed->setVisible(false);m_menuLeft->setVisible(true);m_menuRight->setVisible(true);}m_delegate->gameCtrlLayerStartAI(m_AIOn);}voidGameCtrlLayer::clickLeftButton(){m_delegate->gameCtrlLayerClickLeft();}voidGameCtrlLayer::clickRightButton(){m_delegate->gameCtrlLayerClickRight();}voidGameCtrlLayer::clickUpButton(){if(m_AIOn){m_delegate->gameCtrlLayerClickAccelerate();floatspeed=m_delegate->gameCtrlLayerGetAISpeed();m_labelAISpeed->setString(StringUtils::format("%.1f个/秒",speed));}else{m_delegate->gameCtrlLayerClickRotate();}}voidGameCtrlLayer::clickDownButton(){if(m_AIOn){m_delegate->gameCtrlLayerClickDecelerate();floatspeed=m_delegate->gameCtrlLayerGetAISpeed();m_labelAISpeed->setString(StringUtils::format("%.1f个/秒",speed));}else{m_delegate->gameCtrlLayerClickThrowDown();}}游戏区逻辑代码////GameLayer.cpp//AITetris////Createdbyhansiron16/1/10.////#include"GameLayer.h"#include"SimpleAudioEngine.h"boolGameLayer::init(){if(!Layer::init()){returnfalse;}m_gameRun=false;m_actionAI=NULL;m_speedAI=0.2f;SizevisibleSize=Director::getInstance()->getVisibleSize();//游戏区floatleftBrickMatrix=120;m_spriteBrick=newSprite*[Row_Tetris*Column_Tetris];for(intr=0;r<Row_Tetris;r++){for(intc=0;c<Column_Tetris;c++){m_spriteBrick[r*Column_Tetris+c]=Sprite::createWithTexture(Director::getInstance()->getTextureCache()->getTextureForKey("images/tetris_0.png"));m_spriteBrick[r*Column_Tetris+c]->setPosition(leftBrickMatrix+c*16+8,visibleSize.height/2+153-r*16+8);this->addChild(m_spriteBrick[r*Column_Tetris+c]);}}//Tetris逻辑m_tetris=newTetris(Row_Tetris,Column_Tetris);returntrue;}voidGameLayer::startGame(){m_gameRun=true;//清空方块矩阵m_tetris->clearBrickMatrix();//设置新方块BrickTypebrickType=(BrickType)(rand()%BrickType_Count);m_tetris->setNewBrick(brickType,(BrickCellValue)(brickType+1));//刷新方块矩阵this->updateTetrisBrickMatrix();this->startAI(false);this->stopAllActions();CallFunc*callFunc=CallFunc::create([=]{if(m_gameRun){this->fallBrick();}else{SizevisibleSize=Director::getInstance()->getVisibleSize();Label*labelGameOver=Label::createWithSystemFont("GameOver","",40);labelGameOver->setColor(Color3B::RED);labelGameOver->setPosition(visibleSize.width/2,visibleSize.height/2);this->addChild(labelGameOver);labelGameOver->runAction(Sequence::create(DelayTime::create(2),CallFuncN::create([=](Node*node){node->removeFromParent();this->stopAllActions();}),NULL));}});this->runAction(RepeatForever::create(Sequence::create(DelayTime::create(1),callFunc,NULL)));}voidGameLayer::startAI(boolAIOn){if(!m_gameRun){return;}if(AIOn){//求解if(TetrisAI::seekSolution(m_tetris->getBrickMatrix(),m_tetris->getRow(),m_tetris->getColumn(),m_tetris->getCurrentBrick(),m_tetris->getCurrentBrickType(),m_tetris->getPosRowOfCurrentBrick(),m_tetris->getPosColOfCurrentBrick(),m_operationList)){this->commitOperationList(0);}}else{if(NULL!=m_actionAI){this->stopAction(m_actionAI);m_actionAI=NULL;}}}voidGameLayer::accelerateAI(){m_speedAI-=0.05f;if(m_speedAI<0.05f){m_speedAI=0.05f;}}voidGameLayer::decelerateAI(){m_speedAI+=0.05f;if(m_speedAI>1){m_speedAI=1;}}//方块操作voidGameLayer::moveLeftBrick(){if(m_tetris->moveLeftBrick()){//刷新方块矩阵this->updateTetrisBrickMatrix();}}voidGameLayer::moveRightBrick(){if(m_tetris->moveRightBrick()){//刷新方块矩阵this->updateTetrisBrickMatrix();}}voidGameLayer::rotateBrick(){if(m_tetris->rotateBrick()){CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sounds/rotate.wav");//刷新方块矩阵this->updateTetrisBrickMatrix();}}voidGameLayer::fallBrick(){if(!m_tetris->fallBrick()){intlineIndex=0;while(m_tetris->clearOneLine(lineIndex)){printf("消行:%d\n",lineIndex);}//下一个方块BrickTypebrickType=(BrickType)(rand()%BrickType_Count);if(!m_tetris->setNewBrick(brickType,(BrickCellValue)(brickType+1))){m_gameRun=false;printf("结束---\n");}}//刷新方块矩阵this->updateTetrisBrickMatrix();}voidGameLayer::throwDownBrick(){m_tetris->throwDownBrick();CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sounds/throwdown.wav");intlineIndex=0;while(m_tetris->clearOneLine(lineIndex)){printf("消行:%d\n",lineIndex);}//下一个方块BrickTypebrickType=(BrickType)(rand()%BrickType_Count);if(!m_tetris->setNewBrick(brickType,(BrickCellValue)(brickType+1))){m_gameRun=false;printf("结束---\n");}//刷新方块矩阵this->updateTetrisBrickMatrix();}//刷新方块矩阵voidGameLayer::updateTetrisBrickMatrix(){for(intr=0;r<Row_Tetris;r++){for(intc=0;c<Column_Tetris;c++){std::stringfilePath=StringUtils::format("images/tetris_%i.png",m_tetris->getBrickValue(r,c));m_spriteBrick[r*Column_Tetris+c]->setTexture(Director::getInstance()->getTextureCache()->getTextureForKey(filePath));}}//在log中显示游戏this->showTetrisInLog();}//在log中显示游戏voidGameLayer::showTetrisInLog(){for(intr=0;r<m_tetris->getColumn()+2;r++){printf("_");}printf("\n");for(intr=0;r<m_tetris->getRow();r++){printf("|");for(intc=0;c<m_tetris->getColumn();c++){printf("%s",m_tetris->getBrickValue(r,c)>0?"1":"");}printf("|\n");}for(intr=0;r<m_tetris->getColumn()+2;r++){printf("T");}printf("\n");}//执行AI系统返回的操作列表voidGameLayer::commitOperationList(intindex){if(OperationType_ThrowDown!=m_operationList[index]){switch(m_operationList[index]){caseOperationType_Rotate:{this->rotateBrick();}break;caseOperationType_Left:{this->moveLeftBrick();}break;caseOperationType_Right:{this->moveRightBrick();}break;default:break;}if(m_gameRun){m_actionAI=Sequence::create(DelayTime::create(m_speedAI),CallFunc::create([=]{this->commitOperationList(index+1);}),NULL);this->runAction(m_actionAI);}}else{this->throwDownBrick();if(m_gameRun){TetrisAI::seekSolution(m_tetris->getBrickMatrix(),m_tetris->getRow(),m_tetris->getColumn(),m_tetris->getCurrentBrick(),m_tetris->getCurrentBrickType(),m_tetris->getPosRowOfCurrentBrick(),m_tetris->getPosColOfCurrentBrick(),m_operationList);m_actionAI=Sequence::create(DelayTime::create(m_speedAI),CallFunc::create([=]{this->commitOperationList(0);}),NULL);this->runAction(m_actionAI);}}}游戏层逻辑代码////Tetris.cpp//AITetris////Createdbyhansiron16/1/10.////#include"Tetris.h"//方块模板初始化unsignedcharTetris::m_BrickMode[7]={0x66,0xe4,0xe2,0xe8,0x6c,0xc6,0xf0};Tetris::Tetris(introw,intcolumn){//行列数if(row<MinRow){row=MinRow;}if(column<MinColumn){column=MinColumn;}m_row=row;m_column=column;//根据行数和列数申请内存longsize=m_row*m_column;m_brickMatrix=newBrickCellValue[size];for(inti=0;i<size;i++){m_brickMatrix[i]=BrickCellValue_NULL;}}Tetris::~Tetris(){delete[]m_brickMatrix;}//指定行号和列号的方块单元值BrickCellValueTetris::getBrickValue(intr,intc){if((r>=0&&r<m_row)&&(c>=0&&c<m_column)){//方块矩阵的该位置有方块则返回该值if(BrickCellValue_NULL!=m_brickMatrix[r*m_column+c]){returnm_brickMatrix[r*m_column+c];}//否则,如果(r,c)为当前方块上的值,则返回当前方块相应位置的值elseif((r>=m_posRow&&r<m_posRow+4)&&(c>=m_posCol&&c<m_posCol+4)){returnm_currentBrick[r-m_posRow][c-m_posCol];}}returnBrickCellValue_NULL;}//清空方块矩阵voidTetris::clearBrickMatrix(){for(inti=0;i<m_row*m_column;i++){m_brickMatrix[i]=BrickCellValue_NULL;}}//设置新方块boolTetris::setNewBrick(BrickTypebrickType,BrickCellValuebrickCellValue){m_currentBrickType=brickType;returnTetris::setNewBrick(m_brickMatrix,m_row,m_column,m_currentBrick,brickType,brickCellValue,m_posRow,m_posCol);}//方块操作boolTetris::moveLeftBrick(){returnTetris::moveLeftBrick(m_brickMatrix,m_row,m_column,m_currentBrick,m_posRow,m_posCol);}boolTetris::moveRightBrick(){returnTetris::moveRightBrick(m_brickMatrix,m_row,m_column,m_currentBrick,m_posRow,m_posCol);}boolTetris::rotateBrick(){returnTetris::rotateBrick(m_brickMatrix,m_row,m_column,m_currentBrick,m_currentBrickType,m_posRow,m_posCol);}boolTetris::fallBrick(){returnTetris::fallBrick(m_brickMatrix,m_row,m_column,m_currentBrick,m_posRow,m_posCol);}voidTetris::throwDownBrick(){Tetris::throwDownBrick(m_brickMatrix,m_row,m_column,m_currentBrick,m_posRow,m_posCol);}boolTetris::clearOneLine(int&lineIndex){returnTetris::clearOneLine(m_brickMatrix,m_row,m_column,m_posRow,lineIndex);}//方块操作boolTetris::setNewBrick(BrickCellValue*brickMatrix,introw,intcolumn,BrickCellValuecurrentBrick[4][4],BrickTypebrickType,BrickCellValuebrickCellValue,int&posRow,int&posCol){if(brickType<=BrickType_NULL||brickType>=BrickType_Count){returnfalse;}//当前方块位置重置posRow=-1;posCol=(column-4)/2;//清空原有方块for(intr=0;r<4;r++){for(intc=0;c<4;c++){currentBrick[r][c]=BrickCellValue_NULL;}}//根据模板填充方块for(intr=0;r<2;r++){for(intc=0;c<4;c++){if(((Tetris::m_BrickMode[brickType]<<(r*4+c))&0x80)>0){currentBrick[1+r][c]=brickCellValue;//方块矩阵的这个位置有效,且方块矩阵的这个位置也有值,则游戏结束intoffset=(posRow+(1+r))*column+(posCol+c);if(posRow+(1+r)>=0&&BrickCellValue_NULL!=brickMatrix[offset]){returnfalse;}}}}returntrue;}boolTetris::rotateBrick(BrickCellValue*brickMatrix,introw,intcolumn,BrickCellValuecurrentBrick[4][4],BrickTypecurrentBrickType,intposRow,intposCol){//正方形不旋转if(BrickType_o==currentBrickType){returnfalse;}//用临时方块试着旋转一下BrickCellValuetempBrick[4][4];for(intr=0;r<4;r++){for(intc=0;c<4;c++){tempBrick[r][c]=BrickCellValue_NULL;}}//条形方块旋转if(BrickType_1==currentBrickType){//竖形if(BrickCellValue_NULL!=currentBrick[0][1]){for(inti=0;i<4;i++){tempBrick[1][i]=currentBrick[i][1];}}//横形else{for(inti=0;i<4;i++){tempBrick[i][1]=currentBrick[1][i];}}}//s形方块旋转elseif(BrickType_s==currentBrickType){//竖形if(BrickCellValue_NULL!=currentBrick[0][0]){tempBrick[1][1]=currentBrick[1][1];tempBrick[1][2]=currentBrick[1][1];tempBrick[2][0]=currentBrick[1][1];tempBrick[2][1]=currentBrick[1][1];}//横形else{tempBrick[0][0]=currentBrick[1][1];tempBrick[1][0]=currentBrick[1][1];tempBrick[1][1]=currentBrick[1][1];tempBrick[2][1]=currentBrick[1][1];}}//z形方块旋转elseif(BrickType_z==currentBrickType){//竖形if(BrickCellValue_NULL!=currentBrick[0][1]){tempBrick[1][0]=currentBrick[1][1];tempBrick[1][1]=currentBrick[1][1];tempBrick[2][1]=currentBrick[1][1];tempBrick[2][2]=currentBrick[1][1];}//横形else{tempBrick[0][1]=currentBrick[1][1];tempBrick[1][0]=currentBrick[1][1];tempBrick[1][1]=currentBrick[1][1];tempBrick[2][0]=currentBrick[1][1];}}//其他方块旋转else{for(intr=0;r<3;r++){for(intc=0;c<3;c++){tempBrick[r][c]=currentBrick[2-c][r];}}}//查看旋转后与方块矩阵是否冲突for(intr=0;r<4;r++){for(intc=0;c<4;c++){//当前方块的这个位置有值if(BrickCellValue_NULL!=tempBrick[r][c]){//左边,或者右边,或者下边超出边界,旋转失败if(posCol+c<0||posCol+c>=column||posRow+r>=row){returnfalse;}//方块矩阵的这个位置有效,且方块矩阵的这个位置也有值,则旋转失败intoffset=(posRow+r)*column+(posCol+c);if(offset>=0&&offset<row*column&&BrickCellValue_NULL!=brickMatrix[offset]){returnfalse;}}}}//不冲突则旋转for(intr=0;r<4;r++){for(intc=0;c<4;c++){currentBrick[r][c]=tempBrick[r][c];}}returntrue;}boolTetris::moveLeftBrick(BrickCellValue*brickMatrix,introw,intcolumn,BrickCellValuecurrentBrick[4][4],intposRow,int&posCol){//试着左移一下inttempPosCol=posCol-1;for(intr=0;r<4;r++){for(intc=0;c<4;c++){//当前方块的这个位置有值if(BrickCellValue_NULL!=currentBrick[r][c]){//超出左边界,左移失败if(tempPosCol+c<0){returnfalse;}//方块矩阵的这个位置有效,且方块矩阵的这个位置也有值,则左移失败intoffset=(posRow+r)*column+(tempPosCol+c);if(posRow+r>=0&&posRow+r<row&&BrickCellValue_NULL!=brickMatrix[offset]){returnfalse;}}}}//可以左移posCol-=1;returntrue;}boolTetris::moveRightBrick(BrickCellValue*brickMatrix,introw,intcolumn,BrickCellValuecurrentBrick[4][4],intposRow,int&posCol){//试着右移一下inttempPosCol=posCol+1;for(intr=0;r<4;r++){for(intc=3;c>=0;c--){//从右往左判断可能会快些//当前方块的这个位置有值if(BrickCellValue_NULL!=currentBrick[r][c]){//超出右边界,右移失败if(tempPosCol+c>=column){returnfalse;}//方块矩阵的这个位置有效,且方块矩阵的这个位置也有值,则右移失败intoffset=(posRow+r)*column+(tempPosCol+c);if(posRow+r>=0&&posRow+r<row&&BrickCellValue_NULL!=brickMatrix[offset]){returnfalse;}}}}//可以右移posCol+=1;returntrue;}boolTetris::fallBrick(BrickCellValue*brickMatrix,introw,intcolumn,BrickCellValuecurrentBrick[4][4],int&posRow,intposCol){//试着下移一下inttempPosRow=posRow+1;for(intr=3;r>=0;r--){//从下往上判断可能会快些for(intc=0;c<4;c++){//当前方块的这个位置有值if(BrickCellValue_NULL!=currentBrick[r][c]){//超出下边界,下落失败if(tempPosRow+r>=row){//将当前方块固定到方块矩阵中Tetris::fixBrick(brickMatrix,row,column,currentBrick,posRow,posCol);returnfalse;}//未超出下边界,且这个位置在方块矩阵内,且方块矩阵的这个位置也有值,则下落失败elseif(tempPosRow+r>=0&&BrickCellValue_NULL!=brickMatrix[(tempPosRow+r)*column+(posCol+c)]){//将当前方块固定到方块矩阵中Tetris::fixBrick(brickMatrix,row,column,currentBrick,posRow,posCol);returnfalse;}}}}//可以下移posRow+=1;returntrue;}voidTetris::throwDownBrick(BrickCellValue*brickMatrix,introw,intcolumn,BrickCellValuecurrentBrick[4][4],int&posRow,intposCol){while(Tetris::fallBrick(brickMatrix,row,column,currentBrick,posRow,posCol));}voidTetris::fixBrick(BrickCellValue*brickMatrix,introw,intcolumn,BrickCellValuecurrentBrick[4][4],intposRow,intposCol){for(intr=0;r<4;r++){for(intc=0;c<4;c++){if(BrickCellValue_NULL!=currentBrick[r][c]){brickMatrix[(posRow+r)*column+(posCol+c)]=currentBrick[r][c];}}}}boolTetris::clearOneLine(BrickCellValue*brickMatrix,introw,intcolumn,intposRowCurrentBrick,int&lineIndex){intrStart=MIN(row-1,posRowCurrentBrick+4);intrEnd=MAX(0,posRowCurrentBrick);for(intr=rStart;r>=rEnd;r--){//先查看该行是否可以消行boolcanClearLine=true;for(intc=0;c<column;c++){if(BrickCellValue_NULL==brickMatrix[r*column+c]){canClearLine=false;break;}}//如果能消行,则继续看上一行if(canClearLine){lineIndex=r;//从上往下赋值,内存移位处理即可memmove(brickMatrix+column,brickMatrix,r*column*sizeof(BrickCellValue));//第0行清空for(intc=0;c<column;c++){brickMatrix[c]=BrickCellValue_NULL;}returntrue;}}returnfalse;}第六章总结通过这次制作俄罗斯方块,我接触了现在主流的游戏开发引擎cocos2d-x,本来预期做一个分数统计排名的,但是由于时间限制未能完成,在电脑上测试仍有卡顿,在手机上应该会存在占用内存过大的情况,所以该游戏还有很多不足之处应该改进。基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造HYPERLINK"/deta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论