數(shù)據(jù)結構課程設計報告-老鼠走迷宮_第1頁
數(shù)據(jù)結構課程設計報告-老鼠走迷宮_第2頁
數(shù)據(jù)結構課程設計報告-老鼠走迷宮_第3頁
數(shù)據(jù)結構課程設計報告-老鼠走迷宮_第4頁
數(shù)據(jù)結構課程設計報告-老鼠走迷宮_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

PAGE32課程設計說明書課程名稱:數(shù)據(jù)結構與算法專業(yè):軟件工程班級:15-2姓名:xx學號:2xxxxxx2指導教師:xx完成日期:2017年1月3日任務書題目:老鼠走迷宮設計內(nèi)容及要求:課程設計任務內(nèi)容程序開始運行時顯示一個迷宮地圖,迷宮中央有一只老鼠,迷宮的右下方有一個糧倉。游戲的任務是使用鍵盤上的方向鍵操縱老鼠在規(guī)定的時間內(nèi)走到糧倉處。2.課程設計要求1)老鼠形象可辨認,可用鍵盤操縱老鼠上下左右移動;2)迷宮的墻足夠結實,老鼠不能穿墻而過;3)正確檢測結果,若老鼠在規(guī)定時間內(nèi)走到糧倉處,提示成功,否則提示失??;4)添加編輯迷宮功能,可修改當前迷宮,修改內(nèi)容:墻變路、路變墻;5)找出走出迷宮的所有路徑,以及最短路徑;6)利用序列化功能實現(xiàn)迷宮地圖文件的存盤和讀出等功能。開發(fā)環(huán)境:QTCreator、QT5.6目錄TOC\o"1-3"\h\u1.引言 22.課題分析 33.具體設計過程 43.1設計思路 43.2程序設計流程圖 53.3.函數(shù)實現(xiàn)說明 64.程序運行結果 75.軟件使用說明 116.結論 11參考文獻 131.引言課程設計是對學生的一種全面綜合訓練,是與課堂聽講、自學和練習相輔相成的、必不可少的一個教學環(huán)節(jié)。通常,課程設計中的問題比平時的習題復雜的多,也更接近實際。課程設計著眼于原理與應用的結合點,使學生學會如何把書上學到的知識用于解決實際問題,培養(yǎng)軟件工作所需要的動手能力;另一方面,能使書上的知識變“活”,起到深化理解和靈活掌握教學內(nèi)容的目的。平時的習題較偏重于如何編寫功能單一的“小”算法,局限于一個或兩個知識點,而課程設計題是軟件設計的綜合訓練,包括問題分析,總體結構設計,用戶界面設計、程序設計基本技能和技巧,多人合作,以至一整套軟件工作規(guī)范的訓練和科學作風的培養(yǎng)。此外,還有很重要的一點是:計算機是比任何教師更嚴厲的檢查者。為達到上述目的,使學生更好地掌握程序設計的基本方法和C++語言的應用,本課程安排了課程設計環(huán)節(jié),提供了各類題目供學生選擇。每個設計題采取了統(tǒng)一的格式,由問題描述、基本要求、測試數(shù)據(jù)、實現(xiàn)提示和選做內(nèi)容等五個部分組成。問題描述旨在為學生建立問題提出的背景,指明問題“是什么”。基本要求則對問題進一步求精,劃出問題的邊界,指出具體的參量或前提條件,并規(guī)定該題的最低限度要求。測試數(shù)據(jù)部分旨在為檢查學生上機作業(yè)提供方便。在實現(xiàn)提示部分,對實現(xiàn)中的難點及其解法思路等問題作了簡要提示,提示的實現(xiàn)方法未必是最好的,學生不應拘泥與此,而應努力設計和開發(fā)更好的方法和結構。選做部分向那些尚有余力的讀者提出了更高的要求,同時也能開拓其它讀者的思路,在完成基本要求時就力求避免就事論事的不良思想方法,盡可能尋求具有普遍意義的解法,使得程序結構合理,容易修改、擴充和重用。2.課題分析編寫一個《老鼠走迷宮》的C++程序,包括以下功能:初始狀態(tài):迷宮處為空白,輸入長寬設定迷宮大小,時間剩余為300s。具體要求如下:1.點擊生成迷宮,窗口左上方生成一個指定大小的迷宮,老鼠位于迷宮中央,糧倉位于迷宮右下角,開始計時。2.可以通過鍵盤上的方向鍵控制老鼠移動。3.點擊顯示路徑按鈕時,顯示一條綠色的通道通向糧倉。4.點擊最短路徑按鈕時,顯示一條綠色的通道(最短)通向糧倉。5.點擊拆墻/補墻時,老鼠可在迷宮內(nèi)自由移動,老鼠所走過的墻將變成路/路將變成墻。6.點擊取消作弊,恢復原始狀態(tài)。即老鼠只能通過路。7.當剩余時間為0時,彈出對話框,游戲失敗,游戲結束。8.當老鼠走到糧倉處時,彈出對話框,找到出口,游戲結束。9.點擊儲存地圖時,將當前地圖以矩陣形勢存于文件中;點擊讀取地圖時,將文件中的數(shù)據(jù)賦予迷宮矩陣,創(chuàng)建迷宮。3.具體設計過程3.1設計思路定義迷宮節(jié)點,包含x,y(坐標)與state(0為墻,1為通路),使用迷宮節(jié)點矩陣表示迷宮,使用回溯法創(chuàng)建迷宮節(jié)點矩陣。利用深度優(yōu)先遍歷尋找出老鼠到糧倉的所有路徑,利用廣度優(yōu)先遍歷尋找老鼠到糧倉的最短路徑,將路徑中的節(jié)點的state置為2,在普通模式下,老鼠僅可通過state為1的節(jié)點,當作弊模式開啟時,老鼠可通過任意state的節(jié)點并且通過的節(jié)點的state值會相應的改變。打印迷宮時,state為0的節(jié)點使用黑色矩形填充,state為1的節(jié)點不填充,state為2的使用綠色矩形填充。3.2程序設計流程圖_maze//迷宮節(jié)點box//路徑節(jié)點box1//最短路徑節(jié)點inti;intj;intstate;inti;intj;intdirection;inti;intj;intpre;intnum;classmazepublic:voidpaintEvent(QPaintEvent*);voidkeyPressEvent(QKeyEvent*);boolisOdd();//判斷l(xiāng)ineedit輸入是否為奇數(shù)voidcreatMaze();//創(chuàng)建迷宮voidfindWay();//尋求路徑(深度遍歷)voidfindShortWay();//尋求最短路徑(廣度遍歷)private:QTime_time;_maze**matrix;//定義一個迷宮節(jié)點數(shù)組stack<_maze>*MazeStack;//定義一個棧用于存放迷宮節(jié)點vector<_maze>*FinalPath;//定義一個向量用于存放迷宮路徑stack<box>*BoxStack;//定義一個棧用于存放尋路節(jié)點queue<box1>*Box1Queue;//定義一個隊列用于存放尋最短路節(jié)點stack<box1>*Box1Stack;//定義一個棧用于存放尋最短路節(jié)點intM;//迷宮矩陣的行intN;//迷宮矩陣的列boolfirst;boolremove_wall;//判斷是否進行拆墻boolrepair_wall;//判斷是否補墻//老鼠的坐標intX;intY;privateslots:voidon_way_clicked();voidon_shortway_clicked();voidon_removewall_clicked();voidon_cancelremove_clicked();voidon_makemaze_clicked();voidtimerUpdate();voidon_repairwall_clicked();voidon_savemaze_clicked();voidon_readmaze_clicked();3.3.函數(shù)實現(xiàn)說明(1)voidkeyPressEvent(QKeyEvent*e)

功能:實現(xiàn)使用鍵盤完成對老鼠的控制。(2)voidpaintEvent(QPaintEvent*)功能:打印迷宮、路徑、老鼠和糧倉。(3)voidcreatMaze();功能:生成迷宮使用算法:回溯法、棧(4)voidfindWay();功能:尋找從老鼠到糧倉的路徑。使用算法:深度優(yōu)先遍歷(5)voidfindShortWay();功能:尋找從老鼠到糧倉的最短路徑。使用算法:廣度優(yōu)先遍歷、隊列(6)voidtimerUpdate();功能:更新剩余時間,當剩余時間為0時游戲結束。4.程序運行結果1.初始狀態(tài)2.點擊生成迷宮,生成一個默認大小為25*25的迷宮3.點擊尋找路徑4.點擊最短路徑5.點擊作弊拆墻(補墻)6.存儲迷宮7.讀取迷宮7.時間耗盡時5.軟件使用說明1.輸入的長寬只能是奇數(shù)2.點擊生成迷宮即可開始新的游戲3.該程序有一個局限性:只能存儲一個迷宮,相應的,讀取迷宮也只能讀取上次存儲的而不能選擇。6.結論課程設計是培養(yǎng)學生綜合運用所學知識,發(fā)現(xiàn),提出,分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對我們的實際工作能力的具體訓練和考察過程.隨著科學技術發(fā)展的日新月異,當今計算機應用在生活中可以說得是無處不在。因此作為二十一世紀的大學來說掌握程序開發(fā)技術是十分重要的,而C++語言又是最常見,功能最強大的一種高級語言,因此做好C++語言課程設計是十分必要的?;仡櫰鸫舜握n程設計,至今我們?nèi)愿锌H多,的確,自從拿到題目到完成整個編程,從理論到實踐,在整整半個月的日子里,可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我們懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發(fā)現(xiàn)了自己的不足之處,對一些前面學過的知識理解得不夠深刻,掌握得不夠牢固,比如說結構體,指針,鏈表……通過這次課程設計之后,我們把前面所學過的知識又重新溫故了一遍。參考文獻C++程序設計(第三版) C++PrimerPlus(第6版) QT從入門到精通 數(shù)據(jù)結構與算法附錄(源代碼)maze.h#ifndefMAZE_H#defineMAZE_H#include<QLCDNumber>#include<QTimer>#include<QTime>#include<QWidget>#include<iostream>#include<stack>#include<vector>#include<queue>#include<QTime>#include<QLineEdit>#include<QPushButton>#include<QPainter>#include<QLabel>#include<QMessageBox>#include<QDebug>#include<QKeyEvent>#include<QPixmap>usingnamespacestd;struct_maze//定義迷宮節(jié)點,x、y代表坐標,state代表是否為墻{inti;intj;intstate;//0代表為墻,1代表通路};structbox//定義尋求路徑節(jié)點{inti;intj;intdirection;//方向,0上1右2下3左};structbox1//定義尋求最短路徑節(jié)點{inti;intj;intpre;intnum;};namespaceUi{classmaze;}classmaze:publicQWidget{Q_OBJECTpublic:explicitmaze(QWidget*parent=0);~maze();voidpaintEvent(QPaintEvent*);voidkeyPressEvent(QKeyEvent*);boolisOdd();//判斷l(xiāng)ineedit輸入是否為奇數(shù)voidcreatMaze();//創(chuàng)建迷宮voidfindWay();//尋求路徑(深度遍歷)voidfindShortWay();//尋求最短路徑(廣度遍歷)privateslots:voidon_way_clicked();voidon_shortway_clicked();voidon_removewall_clicked();voidon_cancelremove_clicked();voidon_makemaze_clicked();voidtimerUpdate();voidon_repairwall_clicked();private:Ui::maze*ui;QTime_time;_maze**matrix;//定義一個迷宮節(jié)點數(shù)組stack<_maze>*MazeStack;//定義一個棧用于存放迷宮節(jié)點vector<_maze>*FinalPath;//定義一個向量用于存放迷宮路徑stack<box>*BoxStack;//定義一個棧用于存放尋路節(jié)點queue<box1>*Box1Queue;//定義一個隊列用于存放尋最短路節(jié)點stack<box1>*Box1Stack;//定義一個棧用于存放尋最短路節(jié)點intM;//迷宮矩陣的行intN;//迷宮矩陣的列boolfirst;boolremove_wall;//判斷是否進行拆墻boolrepair_wall;//判斷是否補墻//老鼠的坐標intX;intY;};#endif//MAZE_Hmaze.cpp#include"maze.h"#include"ui_maze.h"maze::maze(QWidget*parent):QWidget(parent),ui(newUi::maze){ui->setupUi(this);QTimer*time0=newQTimer(this);connect(time0,SIGNAL(timeout()),this,SLOT(timerUpdate()));time0->start(1000);first=true;M=11;N=11;matrix=new_maze*[M];for(inti=0;i<M;i++){matrix[i]=new_maze[N];}for(inti=0;i<M;i++)for(intj=0;j<N;j++){matrix[i][j].state=0;//初始化迷宮矩陣,將所有節(jié)點設置為墻matrix[i][j].i=i;matrix[i][j].j=j;}//隨機生成種子數(shù)QTimetime=QTime::currentTime();qsrand(time.msec()+time.second()*1000);MazeStack=newstack<_maze>;FinalPath=newvector<_maze>;BoxStack=newstack<box>;Box1Stack=newstack<box1>;Box1Queue=newqueue<box1>;X=1;Y=1;remove_wall=false;repair_wall=false;}maze::~maze(){deleteui;}voidmaze::keyPressEvent(QKeyEvent*e){if(remove_wall)//如果拆墻{if(e->key()==87||e->key()==16777235)//上{if(X>1){matrix[X][Y].state=1;X=X-1;}}elseif(e->key()==83||e->key()==16777237)//下{if(X<M-2){matrix[X][Y].state=1;X=X+1;}}elseif(e->key()==65||e->key()==16777234)//左{if(Y>1){matrix[X][Y].state=1;Y=Y-1;}}elseif(e->key()==68||e->key()==16777236)//右{if(Y<N-2){matrix[X][Y].state=1;Y=Y+1;}}//當老鼠到達糧倉時,重新構建迷宮地圖,使得存放路勁的容器置為空if(X==M-2&&Y==N-2){QMessageBox::information(this,"Reminder","Findtheexit!",QMessageBox::Yes);for(inti=0;i<M;i++)for(intj=0;j<N;j++)matrix[i][j].state=0;this->creatMaze();remove_wall=false;repair_wall=false;ui->cancelremove->setEnabled(false);ui->removewall->setEnabled(true);ui->repairwall->setEnabled(true);ui->way->setEnabled(true);ui->shortway->setEnabled(true);ui->makemaze->setEnabled(true);FinalPath->clear();X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)Y+=1;_time.restart();}}elseif(repair_wall)//如果拆墻{if(e->key()==87||e->key()==16777235)//上{if(X>1){matrix[X][Y].state=0;X=X-1;}}elseif(e->key()==83||e->key()==16777237)//下{if(X<M-2){matrix[X][Y].state=0;X=X+1;}}elseif(e->key()==65||e->key()==16777234)//左{if(Y>1){matrix[X][Y].state=0;Y=Y-1;}}elseif(e->key()==68||e->key()==16777236)//右{if(Y<N-2){matrix[X][Y].state=0;Y=Y+1;}}//當老鼠到達糧倉時,重新構建迷宮地圖,使得存放路勁的容器置為空if(X==M-2&&Y==N-2){QMessageBox::information(this,"Reminder","Findtheexit!",QMessageBox::Yes);for(inti=0;i<M;i++)for(intj=0;j<N;j++)matrix[i][j].state=0;this->creatMaze();remove_wall=false;repair_wall=false;ui->cancelremove->setEnabled(false);ui->repairwall->setEnabled(true);ui->removewall->setEnabled(true);ui->way->setEnabled(true);ui->shortway->setEnabled(true);ui->makemaze->setEnabled(true);FinalPath->clear();X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)Y+=1;_time.restart();}}else{intk;if(e->key()==87||e->key()==16777235)//上{k=X-1;if(k>0&&matrix[k][Y].state!=0)X=k;}elseif(e->key()==83||e->key()==16777237)//下{k=X+1;if(k<M-1&&matrix[k][Y].state!=0)X=k;}elseif(e->key()==65||e->key()==16777234)//左{k=Y-1;if(k>0&&matrix[X][k].state!=0)Y=k;}elseif(e->key()==68||e->key()==16777236)//右{k=Y+1;if(k<N-1&&matrix[X][k].state!=0)Y=k;}if(X==M-2&&Y==N-2){QMessageBox::information(this,"Reminder","Findtheexit!",QMessageBox::Yes);for(inti=0;i<M;i++)for(intj=0;j<N;j++)matrix[i][j].state=0;this->creatMaze();FinalPath->clear();X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)Y+=1;_time.restart();}}update();}voidmaze::paintEvent(QPaintEvent*)//畫出迷宮{QPainterpainter(this);painter.setPen(Qt::black);for(inti=FinalPath->size()-1;i>=0;i--){matrix[FinalPath->at(i).i][FinalPath->at(i).j].state=2;if(FinalPath->at(i).i==X&&FinalPath->at(i).j==Y)//當老鼠經(jīng)過尋找迷宮路徑時,使得state=1{matrix[FinalPath->at(i).i][FinalPath->at(i).j].state=1;FinalPath->pop_back();}}if(!first){for(inti=0;i<M;i++)for(intj=0;j<N;j++){if(i==X&&j==Y)//畫老鼠{painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/img/img/mouse").scaled(20,20));}elseif(i==M-2&&j==N-2)//畫糧倉{painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/img/img/door").scaled(20,20));}else{switch(matrix[i][j].state){case0://畫墻壁painter.setBrush(QBrush(Qt::black,Qt::SolidPattern));painter.drawRect(QRect(j*20,i*20,20,20));break;case1://畫通路//painter.setBrush(QBrush(Qt::white,Qt::SolidPattern));//painter.drawRect(QRect(j*20,i*20,20,20));break;case2://畫迷宮尋找路徑painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));painter.drawRect(QRect(j*20,i*20,20,20));break;}}}}}boolmaze::isOdd(){if(ui->xline->text().toInt()%2==0||ui->yline->text().toInt()%2==0)returnfalse;returntrue;}voidmaze::timerUpdate()//更新時間,時間為0時游戲結束{inttime1=300;if((time1-((_time.elapsed())/1000))<0){QMessageBox::information(this,"TimeOut!","Gameover!",QMessageBox::Yes);for(inti=0;i<M;i++)for(intj=0;j<N;j++)matrix[i][j].state=0;this->creatMaze();FinalPath->clear();X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)Y+=1;_time.restart();}QStringrunTime=QString::number(time1-((_time.elapsed())/1000));ui->timer->setText(runTime);}//創(chuàng)建迷宮節(jié)點矩陣(回溯法)voidmaze::creatMaze(){//先設置初始點為(3,3)inti=3,j=3;//設置隨機數(shù)intrandNum=0;//設置迷宮節(jié)點矩陣初始點位置為通路matrix[i][j].state=1;//定義一個臨時節(jié)點_mazetemp;temp.i=i;temp.j=j;temp.state=1;//false表示訪問的方向,boolUp=false;boolDown=false;boolRight=false;boolLeft=false;//進入循環(huán),不斷生成迷宮矩陣,直至棧為空while(1){temp.i=i;temp.j=j;randNum=qrand()%4;switch(randNum){case0://上if(!Up&&i>2&&matrix[i-2][j].state==0){MazeStack->push(temp);matrix[i-2][j].state=1;matrix[i-1][j].state=1;i=i-2;Up=false;Down=false;Right=false;Left=false;}elseUp=true;break;case1://下if(!Down&&i<M-3&&matrix[i+2][j].state==0){MazeStack->push(temp);matrix[i+2][j].state=1;matrix[i+1][j].state=1;i=i+2;Up=false;Down=false;Right=false;Left=false;}elseDown=true;break;case2://左if(!Left&&j>2&&matrix[i][j-2].state==0){MazeStack->push(temp);matrix[i][j-2].state=1;matrix[i][j-1].state=1;j=j-2;Up=false;Down=false;Right=false;Left=false;}elseLeft=true;break;case3://右if(!Right&&j<N-3&&matrix[i][j+2].state==0){MazeStack->push(temp);matrix[i][j+2].state=1;matrix[i][j+1].state=1;j=j+2;Up=false;Down=false;Right=false;Left=false;}elseRight=true;break;}if(Up&&Down&&Right&&Left)//如果當前訪問節(jié)點四個方向都沒有可拆的節(jié)點,回溯{if(!MazeStack->empty()){i=MazeStack->top().i;j=MazeStack->top().j;MazeStack->pop();Up=false;Down=false;Right=false;Left=false;}else//如果棧為空的話就返回,此時迷宮矩陣已經(jīng)創(chuàng)建完畢return;}}}//用深度優(yōu)先遍歷的方法尋找路徑,將路徑數(shù)據(jù)保存在FinalPath容器中voidmaze::findWay(){FinalPath->clear();inti,j,di,find;boxbox;box.i=X;box.j=Y;box.direction=-1;BoxStack->push(box);matrix[X][Y].state=-1;while(1){i=BoxStack->top().i;j=BoxStack->top().j;di=BoxStack->top().direction;if(i==M-2&&j==N-2)//如果當前棧頂為糧倉節(jié)點,將路徑存放入FinalPath{while(!BoxStack->empty()){_mazetemp;temp.i=BoxStack->top().i;temp.j=BoxStack->top().j;temp.state=1;FinalPath->push_back(temp);BoxStack->pop();}return;}find=0;while(find==0&&di<4){di++;switch(di){case0:i=BoxStack->top().i-1;j=BoxStack->top().j;break;//向上尋路case1:i=BoxStack->top().i;j=BoxStack->top().j+1;break;//向右尋路case2:i=BoxStack->top().i+1;j=BoxStack->top().j;break;//向下尋路case3:i=BoxStack->top().i;j=BoxStack->top().j-1;break;//向左尋路}if(matrix[i][j].state==1){find=1;}}if(find==1){matrix[i][j].state=-1;BoxStack->top().direction=di;box.i=i;box.j=j;box.direction=-1;BoxStack->push(box);}else{BoxStack->pop();}}}//用廣度優(yōu)先遍歷的方法尋找迷宮路徑,尋找的路徑是最短路徑voidmaze::findShortWay(){FinalPath->clear();while(!Box1Queue->empty())Box1Queue->pop();inti,j,find=0,di,k=0,count=0;box1box1;_mazetemp;box1.i=X;box1.j=Y;box1.pre=-1;box1.num=k;Box1Queue->push(box1);matrix[X][Y].state=-1;while(!Box1Queue->empty()&&!find){i=Box1Queue->front().i;j=Box1Queue->front().j;box1.i=i;box1.j=j;box1.num=Box1Queue->front().num;box1.pre=Box1Queue->front().pre;Box1Stack->push(box1);if(i==M-2&&j==N-2){find=1;while(!Box1Stack->empty()){temp.i=Box1Stack->top().i;temp.j=Box1Stack->top().j;temp.state=1;FinalPath->push_back(temp);count=Box1Stack->top().pre;//記錄當前的路徑節(jié)點的上一個坐標的下表while(!Box1Stack->empty()&&count!=Box1Stack->top().num){Box1Stack->pop();}}}for(di=0;di<4;di++){switch(di)//0上1右2下3左{case0:i=Box1Queue->front().i-1;j=Box1Queue->front().j;break;case1:i=Box1Queue->front().i;j=Box1Queue->front().j+1;break;case2:i=Box1Queue->front().i+1;j=Box1Queue->front().j;break;case3:i=Box1Queue->front().i;j=Box1Queue->front().j-1;break;}if(matrix[i][j].state==1){k++;box1.i=i;box1.j=j;box1.num=k;box1.pre=Box1Queue->front().num;Box1Queue->push(box1);matrix[i][j].state=-1;}}Box1Queue->pop();}}voidmaze::on_way_clicked(){//使得迷宮矩陣的state為2的值變?yōu)?for(inti=0;i<M;i++)for(intj=0;j<N;j++){if(matrix[i][j].state==2){matrix[i][j].state=1;}}this->findWay();this->setFocus(Qt::MouseFocusReason);update();}voidmaze::on_shortway_clicked(){//使得迷宮矩陣的state為2的值變?yōu)?for(inti=0;i<M;i++)for(intj=0;j<N;j++){if(matrix[i][j].state==2){matrix[i][j].state=1;}}this->findShortWay();this->setFocus(Qt::MouseFocusReason);update();}voidmaze::on_removewall_clicked(){FinalPath->clear();//使得迷宮矩陣的state為2的值變?yōu)?for(inti=0;i<M;i++)for(intj=0;j<N;j++){if(matrix[i][j].state==2){matrix[i][j].state=1;}}update();remove_wall=true;ui->way->setEnabled(false);this->setFocus(Qt::MouseFocusReason);ui->cancelremove->setEnabled(true);ui->removewall->setEnabled(false);ui->makemaze->setEnabled(false);ui->shortway->setEnabled(false);ui->repairwall->setEnabled(true);QMessageBox::information(this,"Reminder","Youcanremovewallnow!",QMessageBox::Yes);}voidmaze::on_repairwall_clicked(){FinalPath->clear();//使得迷宮矩陣的state為2的值變?yōu)?for(inti=0;i<M;i++)for(intj=0;j<N;j++){if(matrix[i][j].state==2){matrix[i][j].state=1;}}update();repair_wall=true;ui->way->setEnabled(false);this->setFocus(Qt::MouseFocusReason);ui->cancelremove->setEnabled(true);ui->removewall->setEnabled(true);ui->repairwall->setEnabled(false);ui->makemaze->setEnabled(false);ui->shortway->setEnabled(false);QMessageBox::information(this,"Reminder","Youcanrepairwallnow!",QMessageBox::Yes);}voidmaze::on_cancelremove_clicked(){remove_wall=false;repair_wall=false;this->setFocus(Qt::MouseFocusReason);ui->makemaze->setEnabled(true);ui->cancelremove->setEnabled(false);ui->shortway->setEnabled(true);ui->way->setEnabled(true);ui->repairwall->setEnabled(true);ui->removewall->setEnabled(true);}voidmaze::on_makemaze_clicked(){if(isOdd()){if(ui->xline->text().toInt()>5&&ui->yline->text().toInt()>5){_time.start();//刪除原先matrix數(shù)組for(inti=0;i<M;i++)delete[]matrix[i];delete[]matrix;M=ui->xline->text().toInt();N=ui->yline->text().toInt();ui->label_2->setGeometry(170,(M+1)*20,110,30);ui->label_3->setGeometry(10,(M+1)*20,110,30);ui->xline->setGeometry(50,(M+1)*20,110,30);ui->yline->setGeometry(210,(M+1)*20,110,30);ui->makemaze->setGeometry((N+1)*20,370,100,30);ui->shortway->setGeometry((N+1)*20,170,100,30);ui->removewall->setGeometry((N+1)*20,220,100,30);ui->repairwall->setGeometry((N+1)*20,270,100,30);ui->cancelremove->setGeometry((N+1)*20,320,100,30);ui->way->setGeometry((N+1)*20,120,100,30);ui->label->setGeometry(340,(M+1)*20,130,40);ui->label_4->setGeometry((N+1)*20+2,20,75,30);ui->timer->setGeometry((N+1)*20,50,100,40);FinalPath->clear();ui->way->setEnabled(true);ui->removewall->setEnabled(true);ui->shortway->setEnabled(true);ui->repairwall->setEnabled(true);remove_wall=false;this->resize((N+7)*20,(M+3)*20);this->setFocus(Qt::MouseFocusReason);//初始老鼠的位置,在迷宮的中央X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)Y+=1;//重新創(chuàng)建新matrix數(shù)組,因為M和N發(fā)生了改變matrix=new_maze*[M];for(inti=0;i<M;i++){matrix[i]=new_maze[N];}for(inti=0;i<M;i++)for(intj=0;j<N;j++){matrix[i][j].state=0;//初始化迷宮矩陣,將所有節(jié)點設置為墻matrix[i][j].i=i;matrix[i][j].j=j;}this->creatMaze();first=false;update();}else{QMessageBox::information(this,"Warning","Theinputcannotbelessthan5!",QMessageBox::Yes);ui->xline->clear();ui->yline->clear();}}else{QMessageBox::information(this,"Warning","Theinputcanonlybeodd!",QMessageBox::Yes);ui->xline->clear();ui->yline->clear();}}main.cpp#include"maze.h"#include<QApplication>intmain(intargc,char*argv[]){QApplicationa(argc,argv);mazew;w.show();a.setWindowIcon(QIcon("s.ico"));returna.exec();}基于C8051F單片機直流電動機反饋控制系統(tǒng)的設計與研究基于單片機的嵌入式Web服務器的研究MOTOROLA單片機MC68HC(8)05PV8/A內(nèi)嵌EEPROM的工藝和制程方法及對良率的影響研究基于模糊控制的電阻釬焊單片機溫度控制系統(tǒng)的研制基于MCS-51系列單片機的通用控制模塊的研究基于單片機實現(xiàn)的供暖系統(tǒng)最佳啟停自校正(STR)調(diào)節(jié)器單片機控制的二級倒立擺系統(tǒng)的研究基于增強型51系列單片機的TCP/IP協(xié)議棧的實現(xiàn)基于單片機的蓄電池自動監(jiān)測系統(tǒng)基于32位嵌入式單片機系統(tǒng)的圖像采集與處理技術的研究基于單片機的作物營養(yǎng)診斷專家系統(tǒng)的研究基于單片機的交流伺服電機運動控制系統(tǒng)研究與開發(fā)基于單片機的泵管內(nèi)壁硬度測試儀的研制基于單片機的自動找平控制系統(tǒng)研究基于C8051F040單片機的嵌入式系統(tǒng)開發(fā)基于單片機的液壓動力系統(tǒng)狀態(tài)監(jiān)測儀開發(fā)模糊Smith智能控制方法的研究及其單片機實現(xiàn)一種基于單片機的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機沖床數(shù)控系統(tǒng)的研究基于CYGNAL單片機的在線間歇式濁度儀的研制基于單片機的噴油泵試驗臺控制器的研制基于單片機的軟起動器的研究和設計基于單片機控制的高速快走絲電火花線切割機床短循環(huán)走絲方式研究基于單片機的機電產(chǎn)品控制系統(tǒng)開發(fā)基于PIC單片機的智能手機充電器基于單片機的實時內(nèi)核設計及其應用研究基于單片機的遠程抄表系統(tǒng)的設計與研究基于單片機的煙氣二氧化硫濃度檢測儀的研制基于微型光譜儀的單片機系統(tǒng)單片機系統(tǒng)軟件構件開發(fā)的技術研究基于單片機的液體點滴速度自動檢測儀的研制基于單片機系統(tǒng)的多功能溫度測量儀的研制基于PIC單片機的電能采集終端的設計和應用基于單片機的光纖光柵解調(diào)儀的研制氣壓式線性摩擦焊機單片機控制系統(tǒng)的研制基于單片機的數(shù)字磁通門傳感器基于單片機的旋轉變壓器-數(shù)字轉換器的研究基于單片機的光纖Bragg光柵解調(diào)系統(tǒng)的研究單片機控制的便攜式多功能乳腺治療儀的研制基于C8051F020單片機的多生理信號檢測儀基于單片機的電機運動控制系統(tǒng)設計Pico專用單片機

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論