版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> Qt課程設計說明書</b></p><p> 題 目: 貪吃蛇游戲設計</p><p><b> 目錄</b></p><p><b> 功能需求3</b></p><p><b> 界面要求4</b><
2、;/p><p><b> 其他要求4</b></p><p><b> 設計分析5</b></p><p> 操作方法及運行結果5</p><p><b> 設計體會7</b></p><p><b> 參考文獻7</b&
3、gt;</p><p><b> 功能需求</b></p><p> 利用Qt creator制作一個貪吃蛇的小游戲,要求:</p><p> 在窗口上顯示菜單欄,幫助欄 和工具欄</p><p> 游戲含有正常模式、死亡模式、情侶模式三種</p><p> 能夠記錄游戲時間,游戲成績,
4、游戲排行</p><p><b> 能夠顯示英雄榜</b></p><p><b> 能夠顯示幫助提示</b></p><p><b> 界面要求</b></p><p> 貪吃蛇游戲的游戲界面包括背景圖片、工具欄圖片、蛇移動范圍的繪制等等。其中貪吃蛇的身體用什么方法繪
5、制,才可以使得其在游戲過程中可以實現(xiàn)“吃”的功能是很重要的。因此在游戲界面的初始繪制時就必須考慮到游戲時可能遇到的問題。</p><p> 導入位圖以及菜單工具條后,游戲未開始前(win7系統(tǒng)下)的界面顯示如圖2-1所示</p><p><b> 其他要求</b></p><p> 能夠注意各種異常處理,注重提高程序運行效率</p&
6、gt;<p><b> 設計分析</b></p><p> 根據(jù)分析,貪吃蛇這個程序一共要實現(xiàn)如下幾個功能,包括游戲方面正常模式、死亡模式以及情侶模式,游戲幫助提示與英雄榜的顯示等等。具體的程序結構如下</p><p><b> 操作方法及運行結果</b></p><p> 根據(jù)分析后的貪吃蛇結構設計
7、出相應的貪吃蛇流程。貪吃蛇的內容主要包括: </p><p> 普通模式用上下左右控制方向,隨機出現(xiàn)食物,但是如果碰到邊框,障礙物和自己都會掛掉;</p><p> 死亡模式用上下左右控制方向,小蛇獲得了穿越邊框的能力,但是得了惡性長胖病,可以通過吃減肥藥來偏強控制,但是不要碰到自己排除的廢物;</p><p> 情侶模式玩家1用上下左右控制方向,用P、O、I
8、(或者是1、2、0)來發(fā)射子彈,可以后退,不能穿越邊框玩家2用W,A,S,D來控制方向,空格鍵釋放陷阱子彈和陷阱都需要food才能補充;</p><p> 英雄榜能夠記錄正常模式和死亡模式游戲時間,游戲成績,游戲排行,玩家姓名; </p><p> 按下幫助鍵可獲得游戲幫助說明。</p><p><b> 設計體會</b><
9、;/p><p> 我學會了用Qt編寫貪吃蛇游戲,能熟練地掌握Qt語言,通過每章每節(jié)的學習讓我知道了Qt的重要性,學習Qt能讓我們深刻的知道在以后的工作中能用到,還有讓我知道學習的重要意義,通過 對Qt的學習能讓我們解決很多的實際東西,QT能讓我們鍛煉自己的編程能力,還能處理許多別的語言處理不了的東西,我知道了學習Qt不僅能提高自己的認識 ,還鞏固了對原來學過的其他語言的學習。</p><p>
10、;<b> 參考文獻</b></p><p> Qt 4開發(fā)實踐(電子工業(yè)出版社)</p><p><b> 部分源代碼:</b></p><p> #include "games.h"</p><p> Games::Games(QWidget *parent)<
11、;/p><p> : QMainWindow(parent)</p><p><b> {</b></p><p> setWindowTitle(tr("MainWindow"));</p><p> showWidget =new ShowWidget(this);</p>&l
12、t;p> setCentralWidget(showWidget);</p><p> createActions();</p><p> createMenus();</p><p> createToolBars();</p><p> if(img.load("4.jpg"))</p>
13、<p><b> {</b></p><p> showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));</p><p><b> }</b></p><p><b> }</b></p><
14、;p> Games::~Games()</p><p><b> {}</b></p><p><b> //動作的實現(xiàn)</b></p><p> void Games::createActions()</p><p><b> {</b></p>
15、<p> //"普通模式"動作</p><p> normalAction =new QAction(QIcon("12R009143A0-30P46_lit.png"),tr("普通模式"),this);</p><p> normalAction->setStatusTip(tr("進入普通模
16、式"));</p><p> connect(normalAction,SIGNAL(triggered()),this,SLOT(shownsnake()));</p><p> //"死亡模式"動作</p><p> deathAction =new QAction(QIcon("12R00Z110F-Q055_li
17、t.png"),tr("死亡模式"),this);</p><p> deathAction->setStatusTip(tr("進入死亡模式"));</p><p> connect(deathAction,SIGNAL(triggered()),this,SLOT(showdsnake()));</p><
18、p> //"情侶模式"動作</p><p> loversAction =new QAction(QIcon("12N3M01I10-212R6_lit.png"),tr("情侶模式"),this);</p><p> loversAction->setStatusTip(tr("進入情侶模式"
19、;));</p><p> connect(loversAction,SIGNAL(triggered()),this,SLOT(showlsnake()));</p><p><b> //"英雄榜"動作</b></p><p> heroAction =new QAction(QIcon("12S2162
20、53R0-101527_lit.png"),tr("英雄榜"),this);</p><p> heroAction->setStatusTip(tr("英雄榜"));</p><p> connect(heroAction,SIGNAL(triggered()),this,SLOT(showHerolist()));</p
21、><p><b> //"退出"動作</b></p><p> exitAction =new QAction(QIcon("12N3M224630-2HE4_lit.png"),tr("退出"),this);</p><p> exitAction->setStatusTip
22、(tr("退出"));</p><p> connect(exitAction,SIGNAL(triggered()),this,SLOT(close()));</p><p><b> //"幫助"動作</b></p><p> helpAction =new QAction(tr("h
23、ow to paly"),this);</p><p> connect(helpAction,SIGNAL(triggered()),this,SLOT(showHelp()));</p><p><b> }</b></p><p> //菜單(Menus)的實現(xiàn)</p><p> void Gam
24、es::createMenus()</p><p><b> {</b></p><p><b> //菜單</b></p><p> fileMenu =menuBar()->addMenu(tr("菜單"));</p><p> fileMenu->add
25、Action(normalAction);</p><p> fileMenu->addAction(deathAction);</p><p> fileMenu->addAction(loversAction);</p><p> fileMenu->addAction(heroAction);</p><p>
26、 fileMenu->addSeparator();</p><p> fileMenu->addAction(exitAction);</p><p><b> //幫助</b></p><p> helpMenu =menuBar()->addMenu(tr("幫助"));</p>
27、<p> helpMenu ->addAction(helpAction);</p><p><b> }</b></p><p><b> //工具欄的實現(xiàn)</b></p><p> void Games::createToolBars()</p><p><b>
28、; {</b></p><p><b> //文件工具欄</b></p><p> fileTool =addToolBar("File");</p><p> fileTool->addAction(normalAction);</p><p> fileTool->
29、;addAction(deathAction);</p><p> fileTool->addAction(loversAction);</p><p> fileTool->addAction(heroAction);</p><p> fileTool->addAction(exitAction);</p><p>
30、;<b> }</b></p><p> void Games::showHelp()</p><p><b> {</b></p><p> newhelp =new help();</p><p> newhelp->show();</p><p><
31、;b> }</b></p><p> void Games::showHerolist()</p><p><b> {</b></p><p> newherolist =new herolist();</p><p> newherolist->show();</p>
32、<p><b> }</b></p><p> void Games::shownsnake()</p><p><b> {</b></p><p> nsnake newnsnake;</p><p> newnsnake.show();</p><p&g
33、t; newnsnake.exec();</p><p><b> }</b></p><p> void Games::showdsnake()</p><p><b> {</b></p><p> dsnake newdsnake;</p><p> new
34、dsnake.show();</p><p> newdsnake.exec();</p><p><b> }</b></p><p> void Games::showlsnake()</p><p><b> {</b></p><p> lsnake new
35、lsnake;</p><p> newlsnake.show();</p><p> newlsnake.exec();</p><p><b> }</b></p><p><b> //死亡模式</b></p><p> #include "deat
36、hsnake.h"</p><p> #include <QPalette></p><p> #include <QColor></p><p> #include <QTime></p><p> #include <QMessageBox></p><
37、p> #include <QPainter></p><p> #include <QFrame></p><p> #include <QString></p><p> #include <QPainter></p><p> #include <QPixmap>
38、</p><p> #include "dialog.h"</p><p> #include <QFile></p><p> #include <QTextStream></p><p> #include <QTextCodec></p><p>
39、 deathsnake::deathsnake()</p><p><b> {</b></p><p> setWindowTitle(tr("死亡模式"));</p><p> this->resize(800,480);</p><p> QTextCodec::setCodecF
40、orTr(QTextCodec::codecForName("GBK"));</p><p> dire=d_right;</p><p><b> time=300;</b></p><p><b> sec=0;</b></p><p><b> min=0
41、;</b></p><p><b> hou=0;</b></p><p> clear=false;</p><p><b> //計時器</b></p><p> jsq=new QLabel(this);</p><p> jsq->resi
42、ze(128,128);</p><p> jsq->move(336,176);</p><p> jsq->setPixmap(QString::number(sec)+".png");</p><p> jsq2=new QLabel(this);</p><p> jsq3=new QLabel
43、(this);</p><p> food=getFood();</p><p> data.push_back(initSnake());</p><p> qsrand(QTime().currentTime().msec());</p><p><b> //蛇move</b></p><
44、;p> timer=new QTimer();</p><p> timer->setInterval(time);</p><p> timer->start();</p><p> Ttimer=this->startTimer(1000);</p><p> connect(timer,SIGNAL(t
45、imeout()),this,SLOT(smove()));</p><p><b> }</b></p><p> deathsnake::~deathsnake()</p><p><b> {}</b></p><p><b> //蛇吃食物</b></p&
46、gt;<p> QLabel* deathsnake::getFood()</p><p><b> {</b></p><p> int gwidth=800;</p><p> int gheight=480;</p><p> //規(guī)定食物大小20,生成的位置是20的倍數(shù)</p>
47、<p> //位置隨機,并且在界面范圍之內</p><p> QLabel *food=new QLabel(this);</p><p> food->resize(20,20);</p><p> food->setAutoFillBackground(true);</p><p> food->
48、setPalette(QPalette(QColor(qrand()%155+100,qrand()%155+100,qrand()%155+100)));</p><p> food->setFrameStyle(QFrame::Box | QFrame::Sunken);</p><p> food->setLineWidth(3);</p><p&
49、gt; food->setMidLineWidth(1);</p><p> int fx=(qrand()%(gwidth/20))*20;</p><p> int fy=(qrand()%(gheight/20))*20;</p><p><b> int n;</b></p><p><b&g
50、t; //食物不在蛇身上</b></p><p> int s=data.size();</p><p> for(n=0;n<s;n++)</p><p><b> {</b></p><p> int bhx=data[n]->x();</p><p> i
51、nt bhy=data[n]->y();</p><p> while(fx==bhx&&fy==bhy)</p><p><b> {</b></p><p> fx=(qrand()%(gwidth/20))*20;</p><p> fy=(qrand()%(gheight/20))*
52、20;</p><p><b> }</b></p><p><b> }</b></p><p><b> //食物不能在墻上</b></p><p> int ws=wdata.size();</p><p> for(n=0;n<w
53、s;n++)</p><p><b> {</b></p><p> int wx=wdata[n]->x();</p><p> int wy=wdata[n]->y();</p><p> while(fx==wx&&fy==wy)</p><p><
54、b> {</b></p><p> fx=(qrand()%(gwidth/20))*20;</p><p> fy=(qrand()%(gheight/20))*20;</p><p><b> }</b></p><p><b> }</b></p>&
55、lt;p> food->move(fx,fy);</p><p> food->show();</p><p> return food;</p><p><b> }</b></p><p><b> //蛇生長</b></p><p> QL
56、abel* deathsnake::snakeGrow()</p><p><b> {</b></p><p> QLabel *food=new QLabel(this);</p><p> food->resize(20,20);</p><p> food->setAutoFillBackgr
57、ound(true);</p><p> food->setPalette(QPalette(QColor(qrand()%155+100,qrand()%155+100,qrand()%155+100)));</p><p> food->setFrameStyle(QFrame::Box | QFrame::Sunken);</p><p>
58、food->setLineWidth(3);</p><p> food->setMidLineWidth(1);</p><p> food->move(1280,769);</p><p> food->show();</p><p> return food;</p><p>&l
59、t;b> }</b></p><p><b> //初始化蛇頭位置</b></p><p> QLabel* deathsnake::initSnake()</p><p><b> {</b></p><p> QLabel *food=new QLabel(this)
60、;</p><p> food->resize(20,20);</p><p> food->setAutoFillBackground(true);</p><p> food->setPalette(QPalette(QColor(qrand()%155+100,qrand()%155+100,qrand()%155+100)));<
61、;/p><p> food->setFrameStyle(QFrame::Box | QFrame::Sunken);</p><p> food->setLineWidth(3);</p><p> food->setMidLineWidth(3);</p><p> food->move(100,200);&l
62、t;/p><p> food->show();</p><p> QMessageBox msg;</p><p><b> //level 1</b></p><p> msg.setWindowTitle(tr("正在進入死亡模式:"));</p><p> m
63、sg.setText("How many secs can you hold on?");</p><p> msg.setStandardButtons(QMessageBox::Ok);</p><p> msg.show();</p><p> msg.exec();</p><p> return food
64、;</p><p><b> }</b></p><p><b> //舍身移動</b></p><p> void deathsnake::smove()</p><p><b> {</b></p><p> int nhx=data[0]
65、->x();</p><p> int nhy=data[0]->y();</p><p> int s=data.size();</p><p> int ws=wdata.size();</p><p><b> int n;</b></p><p> //蛇頭不能與蛇身
66、重合</p><p> for(n=1;n<s;n++)</p><p><b> {</b></p><p> int bhx=data[n]->x();</p><p> int bhy=data[n]->y();</p><p> if(nhx==bhx&
67、&nhy==bhy)</p><p><b> {</b></p><p> QString word="Game Over!\nEat yourself!So you die!";</p><p> GameOver(word);</p><p><b> }</b&
68、gt;</p><p><b> }</b></p><p><b> //蛇頭不能撞墻</b></p><p> for(n=1;n<ws;n++)</p><p><b> {</b></p><p> int wx=wdata[n]
69、->x();</p><p> int wy=wdata[n]->y();</p><p> if(nhx==wx&&nhy==wy)</p><p><b> {</b></p><p> QString word="Game Over!\nEat yourshit!So
70、you die!";</p><p> GameOver(word);</p><p><b> }</b></p><p><b> }</b></p><p><b> //蛇頭與食物重合</b></p><p> if(nhx=
71、=food->x()&&nhy==food->y())</p><p><b> {</b></p><p> if(data.size()>6)</p><p><b> {</b></p><p> for(int cc=0;cc<5;cc++)&
72、lt;/p><p><b> {</b></p><p> data[data.size()-1]->setPalette(QPalette(QColor(130,130,130)));</p><p> wdata.push_back(data[data.size()-1]);</p><p> data.p
73、op_back();</p><p><b> }</b></p><p><b> }</b></p><p> food->hide();</p><p> food=getFood();</p><p><b> }</b><
74、/p><p> //蛇頭位置超過邊界</p><p><b> if(nhx<0)</b></p><p><b> {</b></p><p><b> nhx=800;</b></p><p><b> }</b>&
75、lt;/p><p> if(nhx>800)</p><p><b> {</b></p><p><b> nhx=-20;</b></p><p><b> }</b></p><p><b> if(nhy<0)<
76、/b></p><p><b> {</b></p><p><b> nhy=480;</b></p><p><b> }</b></p><p> if(nhy>480)</p><p><b> {</b&g
77、t;</p><p><b> nhy=-20;</b></p><p><b> }</b></p><p><b> //移動</b></p><p> s=data.size();</p><p> switch(dire)</p&
78、gt;<p><b> {</b></p><p> case d_up:nhy-=20;break;</p><p> case d_down:nhy+=20;break;</p><p> case d_left:nhx-=20;break;</p><p> case d_right:nhx
79、+=20;break;</p><p> default:break;</p><p><b> }</b></p><p> //后一個向前一個移動</p><p> for(int i=s-1;i>0;i--)</p><p><b> {</b><
80、/p><p> data[i]->move(data[i-1]->x(),data[i-1]->y());</p><p><b> }</b></p><p> data[0]->move(nhx,nhy);</p><p><b> }</b></p>
81、<p><b> //鍵盤操作</b></p><p> void deathsnake::keyPressEvent(QKeyEvent *e)</p><p><b> {</b></p><p> if(e->key()==Qt::Key_Up)</p><p><
82、;b> {</b></p><p> if(dire==d_down);</p><p> else dire=d_up;</p><p><b> }</b></p><p> else if(e->key()==Qt::Key_Down)</p><p>&l
83、t;b> {</b></p><p> if(dire==d_up);</p><p> else dire=d_down;</p><p><b> }</b></p><p> else if(e->key()==Qt::Key_Left)</p><p>&
84、lt;b> {</b></p><p> if(dire==d_right);</p><p> else dire=d_left;</p><p><b> }</b></p><p> else if(e->key()==Qt::Key_Right)</p><p
85、><b> {</b></p><p> if(dire==d_left);</p><p> else dire=d_right;</p><p><b> }</b></p><p><b> else ;</b></p><p>&
86、lt;b> }</b></p><p><b> //計時器</b></p><p> void deathsnake::timerEvent(QTimerEvent *e)</p><p><b> {</b></p><p><b> sec++;</
87、b></p><p> if(sec>9&&hou==0)</p><p><b> {</b></p><p><b> min++;</b></p><p> jsq2->resize(128,128);</p><p> js
88、q2->move(282,176);</p><p> jsq->move(390,176);</p><p><b> sec=0;</b></p><p> clear=true;</p><p><b> }</b></p><p> if(sec
89、>9&&hou!=0)</p><p><b> {</b></p><p><b> min++;</b></p><p><b> sec=0;</b></p><p><b> }</b></p><
90、p><b> if(min>9)</b></p><p><b> {</b></p><p><b> hou++;</b></p><p> jsq3->resize(128,128);</p><p> jsq3->move(228,17
91、6);</p><p> jsq2->move(336,176);</p><p> jsq->move(444,176);</p><p><b> min=0;</b></p><p><b> sec=0;</b></p><p><b>
92、 }</b></p><p> jsq->setPixmap(QString::number(sec)+".png");</p><p> jsq2->setPixmap(QString::number(min)+".png");</p><p> jsq3->setPixmap(QStr
93、ing::number(hou)+".png");</p><p> if(time==20)</p><p><b> {</b></p><p> QString word="Unbelivablebleble!!!You win!";</p><p> GameOve
94、r(word);</p><p><b> }</b></p><p><b> time-=2;</b></p><p> timer->setInterval(time);</p><p> data.push_back(snakeGrow());</p><p
95、> if(clear==true&&wdata.size()>0)</p><p><b> {</b></p><p> wdata[0]->hide();</p><p> wdata.pop_front();</p><p><b> }</b>&l
96、t;/p><p><b> }</b></p><p><b> //游戲結束</b></p><p> void deathsnake::GameOver(QString go)</p><p><b> {</b></p><p> QMess
97、ageBox msg;</p><p> msg.setText(go);</p><p> msg.show();</p><p> this->killTimer(Ttimer);</p><p> if(msg.exec()==QMessageBox::Ok)</p><p><b>
98、{</b></p><p> QFile file("dinformation.txt");</p><p> file.open(QIODevice::ReadOnly|QIODevice::Text);</p><p> QTextStream s(&file);</p><p> whil
99、e(!s.atEnd())</p><p><b> {</b></p><p> rec.name=s.readLine();</p><p> rec.score=s.readLine().toInt();</p><p> rec.time=QDateTime::fromString(s.readLine(
100、),"yyyy-MM-dd hh:mm:ss");</p><p> myinfo.push_back(rec);</p><p><b> }</b></p><p> if(myinfo.size()==0)</p><p><b> {</b></p>
101、<p><b> dialog d;</b></p><p> d.text(1);</p><p><b> d.show();</b></p><p><b> d.exec();</b></p><p> d.deathwrite(hou*100+m
102、in*10+sec,1);</p><p> this->close();</p><p><b> }</b></p><p> else if(myinfo.size()<10)</p><p><b> {</b></p><p><b>
103、 int w;</b></p><p> for(w=0;w<myinfo.size();w++)</p><p><b> {</b></p><p> if(myinfo[w].score<(hou*100+min*10+sec))</p><p><b> {</b
104、></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> dialog d;</b></p><p> d.text(w
105、+1);</p><p><b> d.show();</b></p><p><b> d.exec();</b></p><p> d.deathwrite(hou*100+min*10+sec,w);</p><p> this->close();</p><
106、p><b> }</b></p><p> else if(myinfo[myinfo.size()-1].score>=(hou*100+min*10+sec))</p><p><b> {</b></p><p> this->close();</p><p><
107、;b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> for(int w=0;w<myinfo.size();w++)</p><p><b> {</b></p>
108、<p> if(myinfo[w].score<(hou*100+min*10+sec))</p><p><b> {</b></p><p><b> dialog d;</b></p><p> d.text(w+1);</p><p><b> d.sh
109、ow();</b></p><p><b> d.exec();</b></p><p> d.deathwrite(hou*100+min*10+sec,w);</p><p><b> break;</b></p><p><b> }</b></
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論