版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告</b></p><p> 課程設(shè)計題目: GUI小游戲的設(shè)計與實(shí)現(xiàn) </p><p> 學(xué) 院: 計算機(jī)學(xué)院 </p><p> 專業(yè)班級: 網(wǎng)絡(luò)2班 </p>
2、<p> 年 級: </p><p> 姓 名: </p><p> 學(xué) 號 </p><p> 完成時間: 2013 年 12
3、 月 26 日</p><p> 成 績: </p><p> 指導(dǎo)教師: </p><p><b> 課程設(shè)計任務(wù)書</b></p><p> 說明:學(xué)院、專業(yè)、年級均填全稱,如:計
4、算機(jī)學(xué)院、計算機(jī)科學(xué)與技術(shù)、2010。</p><p><b> 課程設(shè)計正文</b></p><p><b> 主要內(nèi)容包括:</b></p><p><b> 需求分析:</b></p><p> 隨著人們生活水平的提高,人們更加注重休閑娛樂,休閑小游戲更是大多數(shù)人
5、的不二選擇。本次課程設(shè)計,本小組設(shè)計了一個考驗反應(yīng)能力的小游戲,意在休閑娛樂的同時鍛煉玩家的反應(yīng)能力,界面休閑簡單,適合消遣。</p><p> 本次課程設(shè)計通過Qt,以及C++的編程語言,編寫一個“喜羊羊與灰太狼”游戲,即在界面的畫布中,用鼠標(biāo)操作控制喜羊羊,躲避不斷隨機(jī)移動的灰太狼并尋找隨機(jī)出現(xiàn)的食物(青草),并同時計時和記分,分?jǐn)?shù)由時間分?jǐn)?shù)與食物分?jǐn)?shù)合成,當(dāng)喜羊羊撞上灰太狼或者碰到邊界時,游戲結(jié)束,如果分
6、數(shù)高,可以進(jìn)入排行榜。界面清晰簡單,易于上手。</p><p> 系統(tǒng)設(shè)計(類圖、模塊圖等)</p><p><b> 設(shè)計模塊圖:</b></p><p><b> 游戲截圖:</b></p><p><b> 關(guān)鍵代碼描述</b></p><p&
7、gt;<b> 主函數(shù):</b></p><p> #include <QtGui/QApplication></p><p> #include "mainwindow.h"</p><p> #include "Help.h"</p><p> //#in
8、clude <QSound></p><p> int main(int argc, char *argv[])</p><p><b> {</b></p><p> QApplication a(argc, argv);</p><p> ReactionGame w;</p>&l
9、t;p> w.LoadResources();</p><p> w.showFullScreen();</p><p><b> w.show();</b></p><p> Help help;</p><p> help.exec();</p><p> return a.
10、exec();</p><p><b> }</b></p><p><b> 主窗口函數(shù)</b></p><p><b> #include </b></p><p> “mainwindow.h"</p><p> #includ
11、e <QDebug></p><p> #include <QResizeEvent></p><p> #include <QFont></p><p> ReactionGame::ReactionGame(QWidget *parent) :</p><p> QWidget(parent)&
12、lt;/p><p><b> {</b></p><p> QTextCodec::setCodecForTr(QTextCodec::codecForLocale());</p><p> timer=new QTimer(this);</p><p> //DrawEngine();</p><
13、;p> connect(timer,SIGNAL(timeout()),SLOT(DrawEngine()));</p><p> lcd = new QLCDNumber(this);</p><p> ranking = new QPushButton(tr("排行榜"),this);</p><p> //Quitgame =
14、 new QPushButton(tr("退出"),this);</p><p> //connect(Quitgame,SIGNAL(clicked()),this,SLOT(quit()));</p><p> connect(ranking,SIGNAL(clicked()),this,SLOT(CreatRankingList()));</p>
15、<p> //t= QTime::currentTime();</p><p> // order = new QAction(tr("&Order"),this);</p><p> // QToolBar *toolbar = addToolBar(tr("&order"));</p><p&
16、gt; // toolbar ->addAction(order);</p><p> /*QPalette palette;</p><p> QPixmap pixmap(":/1.png");</p><p> palette.setBrush(backgroundRole(),QBrush(pixmap));</p&g
17、t;<p> setPalette(palette);*/</p><p> //lcd1 = new QLCDNumber(this);</p><p><b> }</b></p><p> ReactionGame::~ReactionGame()</p><p><b> {&l
18、t;/b></p><p><b> }</b></p><p> void ReactionGame::LoadResources()//載入資源</p><p><b> {</b></p><p> block1=new BlockAttr(QPixmap(":/1.p
19、ng"));</p><p> block2=new BlockAttr(QPixmap(":2.png"));</p><p> block3=new BlockAttr(QPixmap(":/3.png"));</p><p> dropBlock=new BlockAttr(QPixmap(":
20、/drop"));</p><p> block4=new BlockAttr(QPixmap(":/4.png"));</p><p> food = new BlockAttr(QPixmap(":/food.png"));</p><p> this->inilizetionGame();</
21、p><p><b> }</b></p><p> void ReactionGame::ReleaseResources()//釋放資源</p><p><b> {</b></p><p> delete block1;</p><p> delete block2
22、;</p><p> delete block3;</p><p> delete block4;</p><p> delete food;</p><p> delete dropBlock;</p><p><b> }</b></p><p> void
23、 ReactionGame::inilizetionGame()//初始化游戲</p><p><b> {</b></p><p> QSound backMusic("backmusic.wav");</p><p> backMusic.play();</p><p> setCurso
24、r(Qt::ArrowCursor);</p><p> ranking->setGeometry(rect().x()+150,rect().y(),100,30);</p><p> //Quitgame ->setGeometry(rect().x()+1300,rect().y(),100,30);</p><p> qsrand(t.ms
25、ec()+t.second()*1000);</p><p> foodWidth = qrand()%5;</p><p> if(foodWidth == 0)</p><p> foodWidth = 1;</p><p> qsrand(t.msec()+t.second()*500);</p><p>
26、; foodHeight = qrand()%5;</p><p> if(foodHeight == 0)</p><p> foodHeight = 1;</p><p> food ->point.setX(1000/foodWidth);</p><p> food ->point.setY(600/foodHe
27、ight);</p><p> block1 ->point.setX(this->width()/2);</p><p> block1 ->point.setY(0);</p><p> block2 ->point.setX(0);</p><p> block2 ->point.setY(this
28、->height()/2);</p><p> block3 ->point.setX(this->width()/2);</p><p> block3 ->point.setY(this->height()-block3->pixmap.height());</p><p> block4 ->point.setX
29、(this->width()-block4->pixmap.width());</p><p> block4 ->point.setY(this->height()/2);</p><p> dropBlock ->point.setX(this->width()/2);</p><p> dropBlock ->p
30、oint.setY(this->height()/2);</p><p> validRect.setX(100);</p><p> validRect.setY(100);</p><p> validRect.setWidth(this->width()-200);</p><p> validRect.setHei
31、ght(this->height()-200);</p><p> counter=1;</p><p><b> factor=1;</b></p><p><b> speed=2;</b></p><p><b> score=0;</b></p>
32、;<p><b> }</b></p><p> void ReactionGame::paintEvent(QPaintEvent *)</p><p><b> {</b></p><p> t= QTime::currentTime();</p><p> painte
33、r=new QPainter(this);</p><p> painter->setRenderHint(QPainter::Antialiasing);</p><p> //painter->setPen(Qt::white);</p><p> //painter->setBrush(Qt::white);</p>&l
34、t;p> QPalette palette;</p><p> QPixmap pixmap(":/back.jpg");</p><p> palette.setBrush(backgroundRole(),QBrush(pixmap));</p><p> setPalette(palette);</p><
35、p> painter->drawRect(this->rect());</p><p> painter->setPen(Qt::yellow);</p><p> painter ->setBrush(Qt::white);</p><p> //painter->setBrush(QColor(0xff,0x9d-sp
36、eed*5,0x6f));</p><p> painter->drawRect(this->validRect);</p><p> painter->setPen(Qt::yellow);</p><p> painter->setFont(QFont("Helvetica",12,QFont::Bold));&
37、lt;/p><p> painter->drawText(this->width()/4,20,tr("Your score:")+QString::number(score));</p><p> painter->drawPixmap(block1->point,block1->pixmap);</p><p>
38、 painter->drawPixmap(block2->point,block2->pixmap);</p><p> painter->drawPixmap(block3->point,block3->pixmap);</p><p> painter->drawPixmap(block4->point,block4->pix
39、map);</p><p> painter->drawPixmap(food->point,food->pixmap);</p><p> painter->drawPixmap(dropBlock->point,dropBlock->pixmap);</p><p> delete painter;</p>
40、<p> this->update();</p><p><b> }</b></p><p> void ReactionGame::mouseMoveEvent(QMouseEvent *e)</p><p><b> {</b></p><p> dropBlock
41、->point.setX(e->pos().x()-dropBlock->pixmap.width()/2);</p><p> dropBlock->point.setY(e->pos().y()-dropBlock->pixmap.height()/2);</p><p><b> }</b></p><
42、p> void ReactionGame::mousePressEvent(QMouseEvent *e)</p><p><b> {</b></p><p> if(e->type()==QMouseEvent::MouseButtonPress){</p><p> setCursor(Qt::ClosedHandCu
43、rsor);</p><p> QPoint begin=dropBlock->point;</p><p> QPoint end(dropBlock->point.x()+dropBlock->pixmap.size().width(),dropBlock->point.y()+dropBlock->pixmap.size().height());&l
44、t;/p><p> if(begin.x()<=e->pos().x()&&begin.y()<=e->pos().y()&&end.x()>=e->pos().x()&&end.y()>=e->pos().y()){</p><p> timer->start(1);</p>
45、<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void ReactionGame::mouseReleaseEvent(QMouseEvent *e)</p><p><b
46、> {</b></p><p> if(e->type()==QMouseEvent::MouseButtonRelease)</p><p><b> {</b></p><p> this->ResetGame();</p><p><b> }</b>&
47、lt;/p><p><b> }</b></p><p> void ReactionGame::DrawEngine()//繪制引擎</p><p><b> {</b></p><p> score += 1;</p><p> //score=float(spee
48、d*counter)/350;//顯示分?jǐn)?shù)</p><p> for(int i=0;i<speed;++i)</p><p><b> {</b></p><p> CalculatePos(block1);</p><p> CalculatePos(block2);</p><p&
49、gt; CalculatePos(block3);</p><p> CalculatePos(block4);</p><p> //CalculatePos(food);</p><p> if(HasCollide(dropBlock,block1)||HasCollide(dropBlock,block2)||</p><p>
50、; HasCollide(dropBlock,block3)||HasCollide(dropBlock,block4)||!this->CheckValidBound(dropBlock))//如果產(chǎn)生碰撞</p><p><b> {</b></p><p> QMessageBox::about(NULL,"Game Over",
51、GetIQHint(score));</p><p> //GameOver over;</p><p> //over.exec();</p><p> this->changeFile(score);</p><p> this->ResetGame();</p><p><b>
52、}</b></p><p> if(HasCollide(dropBlock,food)) //加入食物</p><p><b> {</b></p><p> score += 150;</p><p> delete food;</p><p>
53、; food = new BlockAttr(QPixmap(":/food.png"));</p><p> qsrand(t.msec()+t.second()*1000);</p><p> foodWidth = qrand()%5;</p><p> if(foodWidth == 0)</p><p>
54、 foodWidth = 1;</p><p> qsrand(t.msec()+t.second()*500);</p><p> foodHeight = qrand()%5;</p><p> if(foodHeight == 0)</p><p> foodHeight = 1;</p><p>
55、food ->point.setX(800/foodWidth);</p><p> food ->point.setY(600/foodHeight);</p><p><b> }</b></p><p><b> }</b></p><p> counter++;</
56、p><p> lcd ->display((double)counter/100);</p><p> //lcd1 ->display(score);</p><p> if(counter%500==0)//每五秒提升一次速度</p><p><b> {</b></p><p&g
57、t;<b> speed+=1;</b></p><p><b> }</b></p><p> if(counter%1000==0)//每十秒縮小有效范圍</p><p><b> {</b></p><p> NarrowValidRect(&this-
58、>validRect);</p><p><b> }</b></p><p><b> }</b></p><p> void ReactionGame::ResetGame()//重置游戲</p><p><b> {</b></p><p
59、> QSound backMusic("backmusic.wav");</p><p> backMusic.play();</p><p> timer->stop();</p><p> this->inilizetionGame();</p><p> this->rank.rea
60、dfile("RankingList.txt");</p><p> this->update();</p><p><b> }</b></p><p> void ReactionGame::CalculatePos(BlockAttr *block)//計算位置</p><p>&l
61、t;b> {</b></p><p> int x=block->point.x();</p><p> int y=block->point.y();</p><p><b> if(x==0)</b></p><p><b> {</b></p>
62、;<p> block->xDecrease=false;</p><p> }else if(x+block->pixmap.width()==this->width())</p><p><b> {</b></p><p> block->xDecrease=true;</p>
63、<p><b> }</b></p><p><b> if(y==0)</b></p><p><b> {</b></p><p> block->yDecrease=false;</p><p> }else if(y+block->pix
64、map.width()==this->height())</p><p><b> {</b></p><p> block->yDecrease=true;</p><p><b> }</b></p><p> if(block->xDecrease)</p>
65、;<p><b> {</b></p><p> block->point.setX(x-factor);</p><p><b> }else</b></p><p><b> {</b></p><p> block->point.set
66、X(x+factor);</p><p><b> }</b></p><p> if(block->yDecrease)</p><p><b> {</b></p><p> block->point.setY(y-factor);</p><p>&
67、lt;b> }else</b></p><p><b> {</b></p><p> block->point.setY(y+factor);</p><p><b> }</b></p><p><b> }</b></p>
68、<p> const QString ReactionGame::GetIQHint(const float score)</p><p><b> {</b></p><p> // QTextCodec::setCodecForTr(QTextCodec::codecForLocale());</p><p> if(sc
69、ore<3000)</p><p> return tr("呵呵, 你太年輕了");</p><p> else if(score>3000&&score<=4000)</p><p> return tr("你的反應(yīng)是硬傷");</p><p> else i
70、f(score>4000&&score<=5000)</p><p> return tr("我開始承認(rèn)你的智商了");</p><p> else if(score>5000&&score<=6000)</p><p> return tr("你一定看過牛奶可樂經(jīng)濟(jì)學(xué),不然
71、你不可能這么牛逼");</p><p> else if(score>6000)</p><p> return tr("老師,你都玩到6000分了,說明游戲不錯,請給好評");</p><p><b> }</b></p><p> bool ReactionGame::Ha
72、sCollide(const BlockAttr *staticBlock, const BlockAttr *dynamicBlock)//是否產(chǎn)生碰撞</p><p><b> {</b></p><p> QPoint staticCenter(staticBlock->point.x()+staticBlock->pixmap.width()/
73、2,staticBlock->point.y()+staticBlock->pixmap.height()/2);//計算中心點(diǎn)</p><p> QPoint dynamicCenter(dynamicBlock->point.x()+dynamicBlock->pixmap.width()/2,dynamicBlock->point.y()+dynamicBlock->p
74、ixmap.height()/2);</p><p> int staticWidth=staticBlock->pixmap.width();//計算矩形寬度和高度</p><p> int staticHeiget=staticBlock->pixmap.height();</p><p> int dynamicWidth=dynamicBl
75、ock->pixmap.width();</p><p> int dynamicHeight=dynamicBlock->pixmap.height();</p><p> int xDistance=abs(staticCenter.x()-dynamicCenter.x());//計算。兩個矩形中心點(diǎn)的距離</p><p> int yDis
76、tance=abs(staticCenter.y()-dynamicCenter.y());</p><p> if((staticWidth+dynamicWidth)/2>=xDistance&&(staticHeiget+dynamicHeight)/2>=yDistance)//計算是否產(chǎn)生碰撞</p><p><b> {</b&g
77、t;</p><p> return true;</p><p><b> }</b></p><p> return false;</p><p><b> }</b></p><p> bool ReactionGame::CheckValidBound(con
78、st BlockAttr *block)//驗證是否在有效范圍</p><p><b> {</b></p><p> QPoint blockCenter(block->point.x()+block->pixmap.width()/2,block->point.y()+block->pixmap.height()/2);//計算中心點(diǎn)&
79、lt;/p><p> QPoint rectCenter(validRect.x()+validRect.width()/2,validRect.y()+validRect.height()/2);</p><p> int xDistance=validRect.width()/2;//計算中心到無效區(qū)域的距離</p><p> int yDistance=va
80、lidRect.height()/2;</p><p> if(abs(blockCenter.x()-rectCenter.x())+block->pixmap.width()/2-2>=xDistance||abs(blockCenter.y()-rectCenter.y())+block->pixmap.height()/2-2>=yDistance)</p><
81、;p><b> {</b></p><p> return false;</p><p><b> }</b></p><p> return true;</p><p><b> }</b></p><p> void Reactio
82、nGame::NarrowValidRect(QRect *rect)//縮小矩形</p><p><b> {</b></p><p> int narrowFactor=10;</p><p> rect->setX(rect->x()+narrowFactor);</p><p> rect-&
83、gt;setY(rect->y()+narrowFactor);</p><p> rect->setWidth(rect->width()-narrowFactor);</p><p> rect->setHeight(rect->height()-narrowFactor);</p><p><b> }</b
84、></p><p> void ReactionGame::CreatRankingList(){</p><p> rank.exec();</p><p><b> }</b></p><p> void ReactionGame::changeFile(const float score){</
85、p><p> for(unsigned int a = 1;a < 10;a += 2){</p><p> QString temp = this->rank.name[a];</p><p> float temp1 = temp.toFloat();</p><p> if(score > temp1){</
86、p><p> Dialog edit;</p><p> edit.exec();</p><p> QString text = edit.getString();</p><p> for(unsigned int b = 9,num = 0;num < (9 - a) / 2;b -= 2,num++){</p>
87、<p> this->rank.name[b-1] = this->rank.name[b-3];</p><p> this->rank.name[b] = this->rank.name[b-2];</p><p><b> }</b></p><p> this->rank.name[a-
88、1] = text;</p><p> this->rank.name[a] = QString("%1").arg(score);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }<
89、/b></p><p> QFile f("RankingList.txt");</p><p> if(!f.open(QIODevice::WriteOnly | QIODevice::Text)){</p><p> qDebug()<<"error"<<endl;</p>
90、<p><b> return;</b></p><p><b> }</b></p><p> QTextStream s(&f);</p><p> for(unsigned int c = 0;c < 10;c++)</p><p> s<<t
91、his->rank.name[c]<<"\r\n";</p><p> f.close();</p><p><b> }</b></p><p><b> 系統(tǒng)測試報告</b></p><p> 本項目經(jīng)多次測試,除程序啟動時以及排行榜處存在一些對程序
92、無大影響的小bug,其余部分基本完全無誤,程序運(yùn)行良好。本小組成員也會在之后的空余時間對本程序進(jìn)行完善修改。</p><p><b> 運(yùn)行效果</b></p><p> 游戲性高,畫面體驗較好,整體設(shè)計相對完善,能在電腦里良好的運(yùn)行,具有較好的兼容性,背景音樂和圖片的加入使游戲更加人性化,具體效果圖見附帶PPt。</p><p><
93、b> 總結(jié)</b></p><p> 通過本次游戲項目的編寫,更加熟練的掌握了Qt的使用方法以及C++編程的技術(shù),提高了團(tuán)隊合作的能力,過程雖然艱苦,但是結(jié)果也讓我們十分滿意。當(dāng)然,由于時間,技術(shù)有限,難免有不足之處,我們會在今后的學(xué)習(xí)中不斷總結(jié)經(jīng)驗,不斷提高自己,提高項目質(zhì)量。</p><p><b> 備注:</b></p>
94、<p> 學(xué)生:提交的課程設(shè)計報告電子文檔命名為:“組號(2位數(shù)字)年級(兩位數(shù)字不要“級”字)專業(yè)(縮寫:計算機(jī)科學(xué)與技術(shù)專業(yè)(計科)、網(wǎng)絡(luò)工程專業(yè)(網(wǎng)絡(luò))、信息安全專業(yè)(信息)、物聯(lián)網(wǎng)工程(物聯(lián)網(wǎng)))項目組成員(學(xué)號(八位數(shù)字)姓名).doc。如第1組,專業(yè)為“計算機(jī)科學(xué)與技術(shù)”專業(yè),項目組成員有:張三(學(xué)號20115676),李四(學(xué)號20115676),王五(學(xué)號20115676),完成的課程設(shè)計報告命名為:01_1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c語言小游戲課程設(shè)計
- c++課程設(shè)計-教學(xué)游戲
- c++課程設(shè)計拼圖游戲
- c++課程設(shè)計報告--坦克游戲
- c++課程設(shè)計報告--猜數(shù)游戲
- c++剪刀石頭布游戲課程設(shè)計
- c++剪刀石頭布游戲課程設(shè)計
- 掃雷小游戲課程設(shè)計
- 猜單詞游戲c++課程設(shè)計報告
- c++課程設(shè)計---吃豆子游戲程序
- c++課程設(shè)計--同學(xué)錄的設(shè)計與實(shí)現(xiàn)
- c++猜單詞課程設(shè)計--——猜單詞游戲
- 《猜拳小游戲》課程設(shè)計報告
- vb課程設(shè)計--制作小游戲
- c++課程設(shè)計--字符串類的設(shè)計與實(shí)現(xiàn)
- c++語言實(shí)現(xiàn)俄羅斯方塊經(jīng)典游戲課程設(shè)計
- 掃雷小游戲代碼c++版
- c++高射炮打飛機(jī)游戲課程設(shè)計
- c++課程設(shè)計--五子棋游戲
- c++課程設(shè)計報告---計算器的設(shè)計與實(shí)現(xiàn)
評論
0/150
提交評論