版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
QT版连连看制作的试验报告 第第1页共23页一.玩耍概述一.玩耍概述玩耍“连连看”顾名思义就是找出相关联的东西,这个连连看在网上根本是用在小玩耍中,就是找出一样的两样东西,在肯定的规章之内可以做为“连连看”的进展经受了从桌面玩耍、在线玩耍、社交玩耍三个过程。玩耍“连连看”是源自台湾的桌面小玩耍,自从流入大陆以来风行一时,也吸引众多程序员开发出多种版本的 “连连看”。这其中,顾方编写的“阿达连连看”以其精良的制作广受好评,这也成为顾方 “阿达系列软件”的核心产品。并于2004年,取得了国家版权局的计算机软件著作权登记证书。Flash应用的流行,网上消灭了多种在线Flash版本“连连看”。如“”,“”“”以华美界面吸引了一大批的女性玩家。2008年,随着社交网络的普及和开放平台的兴起, “连连看”被引入了1.2社交网络。“连连看”与个人空间相结合,被快速的传播,成为一款热门的社交玩耍,其中以开发者JoneveyManyou开放平台上推出的“宠物连连看”1.2如下所述:玩耍运行界面简洁美观,操作简洁,运行稳定;键、消行时的声音,音量由玩家操作掌握;设计不同的玩耍难度,当玩家到达肯定的积分,可以进入相关难度的等级;功能。二.需求分析二.需求分析2.1.1C++C/C++的哲学就不一样了,同一份程序代码,只要在该平台重Compile成该平台的执行档,就能在该平台执行,假设文字模式下的程序,GUIGUI的GUICompile,由于各平台都有专属的LibraryC/C++优势就是执行速度快,假设能GUILibrary的问题,则跨平台即可解决。MicrosoftVisualC++,MFC用的是完整的ANSIC++MFCMFCVisual搭配.NETANSI.NETC++/CLI,信任这点很多人就有意见了,不过.NET除了GUILibraryLibrary设计的好不好才行,LinuxGUIWindows平台,Borland的C++BuilderDelphiVCLLibrary,MicrosoftVisualC++可以用MFC和.NETFrameworkBorland的C++Builder,它使用ANSIC++VCLC++Builder当时为了缩短上市时间,并没有设LibraryDelphiLibraryC++Builder在CompileDelphiCompiler将VCLcompile成objectfileLinkerobjectfilelink起来,由于这都是IDE在做,对程序MicrosoftVisualC++,MFC用的是完整的ANSIC++MFCMFCVisual搭配.NETANSI.NETC++/CLI,信任这点很多人就有意见了,不过.NETFrameworkFramework由于设计的不错,所以写出来的程序相当精简秀丽,感觉和C++Builder差不多,不过无论是C++Builder或VisualC++开发的2.1.2QT〔1〕QTQt是一个多平台的C++图形用户界面应用程序框架。它供给应应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt扩展,并且允许真正地组件编程。1996Qt种成功的应用程序的根底。Qt也是流行的LinuxKDE的根底,KDE是全部主要的Linux发行版的一个标准组件。Qt的特点有:可移植性、易用性、执行速度快等特点。QTQTXML支持。大量的开发文档支持2D/3D图形渲染,支持OpenGL优良的跨平台特性,QtMicrosoftWindowsSCO,AIX,OS390,QNX等等。面对对象,QtQtQtsignals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得格外简洁。丰富的API,Qt250个以上的C++collections,serialization,file,I/Odevice,directorymanagementdate/time2.2玩耍功能需求本次设计是在传统的连连看上设计实现对战的连连看,玩家通过到达肯定的玩性。QTQT版连连看制作的试验报告423页最终玩耍效果如下:最终玩耍效果如下:功能如下:性,玩耍的背景取自网上中的图片,表达了玩耍的挑战性。的时候,玩耍会进入下一关,并有障碍了。完毕。 QT版连连看制作的试验报告 第第1023页三.玩耍总体设计三.玩耍总体设计3.1总体设计主菜单开头玩耍挑战模式练习模式主菜单开头玩耍挑战模式练习模式极速英雄榜关于连连看退出玩耍相应时间内过关1〔芝麻开门〕相应时间内过关查看英雄者名单关于连连看的介绍2〔四分五裂〕相应时间内过关3〔心连你我〕相应时间内过关4〔审判十字〕相应时间内过关5〔返璞归真〕相应时间内过关通关玩耍核心模块的设计连连看所要求的是:两个目标之间连接线的折点不超过两个〔xy〕〔1〕〔2〕〔3〕两个折点。〔x是和其中一个目标点是一样的,也就是说,折点必定在两个目标点所在的xy所以设计思路就是:假设目标点p1,p2,假设有两个折点分别为z1,z2 要进展的是:p1,p2直线连线,则连接成立p1,p2x,y方向四条直线〔可能某两条直线会重合〕上z1,z2,p1到z1/z1z2/z2p2是否都能直线相连,是则连接成立。连连看消去算法实现在检验两张图片能否消掉的时候,我们要让两张图片同时满足两个条我们可以知道,需要三个检测,这三个检测分别检测一条直路经。这样就会有三条路经。假设这三条路经上都是空按钮,那么就刚好是三种直线〔两个转弯点〕把两个按钮连接起来了)相邻假设不相邻的先在第一个按钮的同行找一个空按钮。1).找到后看其次个按钮横向到这个空按钮所在的列是否有按钮。2).没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮。3).没有的话,再从与第一个按钮同行的那个空按钮竖向到与其次个按钮的同行看是否有按钮。没有的话路经就通了,可以消了.2失败后,再在第一个按钮的同列找一个空按钮。1).找到后看其次个按钮竖向到这个空按钮所在的行是否有按钮2).没有的话,再看没有的话路经就通了,可以消了。假设以上三步都失败,说明这两个按钮不行以消去。四.具体方案四.具体方案图形的产生DrawArea::loadPixmap来实现。函数如下设计:voidDrawArea::loadPixmap{background.load(“:/background/background.png“);background=background.scaled(size);QPixmappix(“:/pattern/pattern.png“);intnum=pix.height/PIX_SIZE;for(inti=1;i<num;++i){qrealy=PIX_SIZE*i;QPixmapp=pix.copy(0,y,PIX_SIZE,PIX_SIZE);pixmap.push_back(p);}}判段消掉图片假设两个图片一样,我们进展消块,并进展加分操作。消块操作如下:if(hitTimer)killTimer(hitTimer);hitTimer=startTimer(INTERVAL_HIT_TIMER);++multiHit;emithit(multiHit);lineTimer=startTimer(INTERVAL_LINE_TIMER);僵局考虑推断是否已经进入死局,死局条件:hintAhintB,hint函数利用。设计代码如下:boolDrawArea::isDead{inti,j,x,y;if(!pairLeft)returntrue;for(i=0;i<xMax;++i){for(j=0;j<yMax;++j){if(board[i][j]){for(x=i;x<xMax;++x){if(x==i) elsey=0;for(;y<yMax;++y){if(board[x][y]==board[i][j]){0hintA.x=i;hintA.y=j;hintB.x=x;hintB.y=y;returnfalse;}}}}}}}returntrue;} 键盘大事响应GameWindow::keyPressEvent(QKeyEvent*event)来响应相应的键盘按键大事。五.玩耍的测试五.玩耍的测试选项按钮的功能测试按键大事的功能测试两次点击一样图片,假设满足算法,图片消逝,则结果正常;挡的状况下可变色,结果正常;图片消逝测试当点击两张一样图片:两站图片同时消逝,结果正常;10分。声音和显示测试进入玩耍时:背景音乐正常播放,图片消逝时,有背景音乐播放;区域越来越大,结果正常;细节方面可能需要改进,玩耍在很多方面还需要进一步完善。细节方面可能需要改进,玩耍在很多方面还需要进一步完善。六.小结六.小结翻阅书籍和在网上查阅资料,渐渐找到了一些感觉。Qt类库中封装的东西太多,有些函数它底层的具体实现可能还没有真正的理解,所以,这或许就是本次玩耍设计的缺乏之处。选题、构思、设计步骤等。并实现一些可演示的玩耍软件,其中有很多应用了学的收获有:1、学到了很多学问,并且对老学问进展了回忆。经过长时间的学Qt编程、通过不断上机试验,调试程序,总结阅历,从对Qt类库中封装的东西太多,有些函数它底层的具体实现可能还没有真正的理解,所以,这或许就是本次玩耍设计的缺乏之处。七.七.源码〔局部代码:/*drawarea.cpp*/#include“drawarea.h“#include<iostream>#include<QMouseEvent>#include<QTimerEvent>#include<QPainter>#include<QLabel>#include<QDir>#include<QFileInfo>#include<stdio.h>#include<assert.h>constintINTERVAL_LINE_TIMER=200;constintINTERVAL_HIT_TIMER=2000;constintPIX_SIZE =46;constintAREA_WIDTH=Y_MAX*PIX_SIZE;constintAREA_HEIGHT=X_MAX*PIX_SIZE;DrawArea::DrawArea(QWidget*parent):QWidget(parent){loadPixmap;drawArea=newQLabel(this);drawArea->setGeometry(0,0,AREA_WIDTH,AREA_HEIGHT);drawArea->setPixmap(background);isHintUsed=false;}QSizeDrawArea::sizeconst{returnQSize(AREA_WIDTH,AREA_HEIGHT);}QSizeDrawArea::sizeHintconst{returnsize;}/**/voidDrawArea::initLevel(constMap&mapData){lastX=mapData.xMax;lastY=mapData.yMax;lineTimer=0;hitTimer=0;multiHit=0;pairLeft=0;xMax=mapData.xMax;yMax=mapData.yMax;for(inti=0;i<xMax;++i)for(intj=0;j<yMax;++j){board[i][j]=mapData.map[i][j];if(board[i][j])++pairLeft;}if(pairLeft%2!=0){emiterrorNotify(tr(“地图数据错误,地图存在不成对的块数“));return;}if(pairLeft==0){emiterrorNotify(tr(“地图数据为空“));return;}pairLeft=pairLeft/2;disorder(mapData.disorderCount);//刚开局就推断死局,一个是初始化上帝之手,//再一个最主要缘由是为hintif(isDead){godTouch=true;emitgodTouchOn;}elsegodTouch=false;isLevelOver=false;drawBoard;}//[Test]从文件加载地图及相关配置信息。voidDrawArea::loadMapFromFile(stringfileName){intnDisorder;FILE*mapFile;mapFile=fopen(fileName.c_str,“r“);if(!mapFile)exit(-1);if(fscanf(mapFile,“%d%d“,&nDisorder,&pairLeft)==EOF){emiterrorNotify(tr(“Test:地图数据加载失败“));return;}for(inti=0;i<xMax;++i)for(intj=0;j<yMax;++j){if(fscanf(mapFile,“%d“,&board[i][j])==EOF){emiterrorNotify(tr(“Test:地图数据无法成功加载“));return;}}fclose(mapFile);disorder(nDisorder);}//nDisordervoidDrawArea::disorder(intnDisorder){srand(clock);//根本实现:将非零数据参加到一个足够长的数组中,随机产生两个//坐标进展交换intpos[xMax*yMax][2];intnBlock=0;for(inti=0;i<xMax;++i)for(intj=0;j<yMax;++j){if(board[i][j]){pos[nBlock][0]=i;pos[nBlock][1]=j;++nBlock;}}for(inti=nDisorder;i;--i){intpos1=rand%nBlock;generatePos2:intpos2=rand%nBlock;if(pos1==pos2)gotogeneratePos2;intx1=pos[pos1][0];inty1=pos[pos1][1];intx2=pos[pos2][0];inty2=pos[pos2][1];std::swap(board[x1][y1],board[x2][y2]);}drawBoard;}/*加载图块图片资源*/voidDrawArea::loadPixmap{background.load(“:/background/background.png“);background=background.scaled(size);QPixmappix(“:/pattern/pattern.png“);intnum=pix.height/PIX_SIZE;for(inti=1;i<num;++i){qrealy=PIX_SIZE*i;QPixmapp=pix.copy(0,y,PIX_SIZE,PIX_SIZE);pixmap.push_back(p);}}//给玩家生成一对提示,并将其高亮显示voidDrawArea::hint{isHintUsed=true;lastX=hintA.x;lastY=hintB.y;drawBoard;}/*Timerevents.*/voidDrawArea::timerEvent(QTimerEvent*event){if(event->timerId==lineTimer){killTimer(lineTimer);lineTimer=0;drawBoard;}if(event->timerId==hitTimer){multiHit=0;killTimer(hitTimer);hitTimer=0;drawBoard;}}/*承受鼠标按下的消息并将其发生的相对屏幕坐标转换成数组坐标*传入clickPos*/voidDrawArea::mousePressEvent(QMouseEvent*event){inty=(event->x-drawArea->x)/PIX_SIZE;intx=(event->y-drawArea->y)/PIX_SIZE;if(!isBlank(x,y)){emitselect;isHintUsed=false;drawEmbrace(x,y);clickPos(x,y);}}/*绘制面板,当回合未完毕时,绘制面板上全部图块的内容。*假设连击数不少于两次,则在屏幕正中心显示“xNHit“的字样*/voidDrawArea::drawBoard{store=background;QPainterpainter(&store);if(!isLevelOver){painter.setCompositionMode(QPainter::CompositionMode_SourceOver);for(inti=0;i<xMax;++i)for(intj=0;j<yMax;++j){painter.save;painter.translate(j*PIX_SIZE,i*PIX_SIZE);if(!isBlank(i,j)&&board[i][j]<pixmap.size)painter.drawPixmap(0,0,PIX_SIZE,PIX_SIZE,pixmap[board[i][j]-1]);painter.restore;}if(multiHit>1){QFontfont;QPenpen(Qt::SolidLine);pen.setColor(QColor(255,255,255,220));font.setFamily(“ComicSansMS“);font.setPixelSize(30);font.setBold(true);painter.setPen(pen);painter.setFont(font);painter.drawText(QPointF(0,AREA_HEIGHT-15),tr(“x%1 连击!“).arg(multiHit));}}painter.end;drawArea->setPixmap(store);if(isHintUsed){drawEmbrace(hintA.x,hintA.y);drawEmbrace(hintB.x,hintB.y);}elsedrawEmbrace(lastX,lastY);}/**/voidDrawArea::drawEmbrace(constint&x,constint&y){if(isValid(x,y)&&board[x][y]){QPainterpainter(&store);painter.setCompositionMode(QPainter::RasterOp_SourceAndDestination);QPenpen;pen.setWidth(5);pen.setColor(Qt::blue);painter.setPen(pen);painter.translate(y*PIX_SIZE,x*PIX_SIZE);painter.drawRect(0,0,PIX_SIZE,PIX_SIZE);painter.end;drawArea->setPixmap(store);}}/**/voidDrawArea::drawRedMark(constint&x,constint&y){QPainterpainter(&store);QPenpen(Qt::white);pen.setWidth(5);painter.setPen(pen);painter.translate(y*PIX_SIZE,x*PIX_SIZE);painter.drawLine(0,0,PIX_SIZE,PIX_SIZE);painter.drawLine(0,PIX_SIZE,PIX_SIZE,0);painter.end;drawArea->setPixmap(store);}/**/voidDrawArea::drawLine(constint&aX,constint&aY,constint&bX,constint&bY){QPainterpainter(&store);intx1=aY*PIX_SIZE+PIX_SIZE/2;inty1=aX*PIX_SIZE+PIX_SIZE/2;intx2=bY*PIX_SIZE+PIX_SIZE/2;inty2=bX*PIX_SIZE+PIX_SIZE/2;QPenpen(Qt::blue);pen.setStyle(Qt::SolidLine);pen.setWidth(5);painter.setPen(pen);painter.drawLine(x1,y1,x2,y2);painter.end;drawArea->setPixmap(store);}voidDrawArea::autoDestroy{lastX=hintA.x;lastY=hintA.y;clickPos(hintB.x,hintB.y);}/*****************************************连连看规律实现相关函数****************************************//*推断是否已经进入死局,死局条件:在回合尚未完毕的状况下遍历面板,无法找到一对可销图块则判定为死局。假设找到一对可销图块,则将其记录为hintAhintB,hint函数利用。*/boolDrawArea::isDead{inti,j,x,y;if(!pairLeft)returntrue;for(i=0;i<xMax;++i){for(j=0;j<yMax;++j){if(board[i][j]){for(x=i;x<xMax;++x){if(x==i) elsey=0;for(;y<yMax;++y){if(board[x][y]==board[i][j]){0hintA.x=i;hintA.y=j;hintB.x=x;hintB.y=y;returnfalse;}}}}}}}returntrue;}/*在(x,y)位置发生了点击,假设上次点击的点花色与之一样且位置不同,对于上帝模式,直接销块。否则,尝试推断是否可连接,假设可连接则进展连线,并随后进展死局推断,如进入死局则开启上帝模式否则将这个点记为上次点击的点。每次成功销块之后,马上增加连击计数并启动一个连击定时器,假设连击定时器过期,则连击计数清零。*/voidDrawArea::clickPos(intx,inty){assert(isValid(x,y));assert(!isBlank(x,y));vector<Pos>posVec;intnPos=0;Pospos1,pos2;if(lastX==x&&lastY==y)return;if(!isValid(lastX,lastY)||!isSame(x,y,lastX,lastY)||//isSamemustbeplacedafter“isValid“isBlank(lastX,lastY)){lastX=x;lastY=y;drawBoard;return;}if(godTouch){drawRedMark(x,y);drawRedMark(lastX,lastY);gotoDestroy_Blocks;}if(isPosLinkable(x,y,lastX,lastY,&nPos,&pos1,&pos2)){Posa(x,y);Posb(lastX,lastY);posVec.push_back(a);if(nPos>=1){posVec.push_back(pos1);if(nPos==2)posVec.push_back(pos2);}posVec.push_back(b);for(unsignedinti=0;i<posVec.size-1;++i){drawLine(posVec[i].x,posVec[i].y,posVec[i+1].x,posVec[i+1].y);}gotoDestroy_Blocks;}else{lastX=x;lastY=y;drawBoard;emitsameYetUnlinkable;return;}Destroy_Blocks://销块操作if(hitTimer)killTimer(hitTimer);hitTimer=startTimer(INTERVAL_HIT_TIMER);++multiHit;emithit(multiHit);lineTimer=startTimer(INTERVAL_LINE_TIMER);//连线操作board[x][y]=0;board[lastX][lastY]=0;--pairLeft;if(!pairLeft){isLevelOver=true;emitlevelClear;puts(“GameOver“);//GameOver}else{if(isDead){godTouch=true;emitgodTouchOn;}elsegodTouch=false;}}/**/inlineboolDrawArea::isBlank(constint&x,constint&y){assert(isValid(x,y));returnboard[x][y]==0;}/*Checkwhetherthepositionisvalid*/inlineboolDrawArea::isValid(constint&x,constint&y){if(x>=xMax||y>=yMax)returnfalse;returntrue;}/*Checkwhetherthetwopointsarethesame*/inlineboolDrawArea::isSame(constint&x1,constint&y1,constint&x2,constint&y2){assert(isValid(x1,y1));assert(isValid(x2,y2));returnboard[x1][y1]==board[x2][y2];}/**/boolDrawArea::isPosLinkable(intx1_,inty1_,intx2_,inty2_,int*nPos,Pos*pos1,Pos*pos2){assert(isValid(x1_,y1_));assert(isValid(x2_,y2_));boolposFlag=false;//传入参数中是否有折点if(nPos){posFlag=true;if(!(pos1&&pos2))returnfalse;}intx1=x1_;intx2=x2_;inty1=y1_;inty2=y2_;if(!isSame(x1,y1,x2,y2))returnfalse;//First,checkwhethertheycanbedirectlylinkedif(isLineLinkable(x1,y1,x2,y2)){if(posFlag)*nPos=0;returntrue;}//Second,checkwhethertheycanbelinkedwithoneturningif(findinteractPoint(x1,y1,x2,y2)){if(posFlag){*nPos=1;pos1->x=x2;pos1->y=y2;}returntrue;}//Third,checkx-directpointthatcanbelinkedwithoneturningfor(inti=0;i<xMax;++i){if(isBlank(i,y1)&&i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水泵设备隔振施工技术方案
- 小学学生综合素质评价方案
- 旅居康养服务项目竣工验收报告
- 流域水质自动监测运维手册
- 物联网应用技术专业人才培养方案
- 水陆复合生境建设设计方案
- 物理治疗临床应用能力培训
- 言语语言康复人员培训手册
- 铍矿地质勘查报告
- 农村沟渠生态化建设设计方案
- 机械装备装配工KPI考核表
- 2026-2030中国锥束计算机断层扫描仪行业市场发展趋势与前景展望战略分析研究报告
- 公职人员行为规范细则
- (2026年版)成人白内障手术操作规范培训课件
- 2026年有关幼儿园智慧家长讲座
- 国核电力规划设计研究院有限公司招聘4人笔试历年难易错考点试卷带答案解析
- 《电子竞技场馆运营服务规范》
- 危化品装卸作业安全交底
- 以“麦”相传-麦秆画
- 穿越机基础课件
- 《小学科学课程标准》(修订稿)
评论
0/150
提交评论