《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于Qt4的掃雷游戲的設計與實現
基于Qt4的掃雷游戲的設計與實現
來源:微型機與應用2012年第16期
柯 勝1, 孫 進1, 鄧志良2
(1.江蘇科技大學,江蘇 鎮江 2120031; 2.常州信息職業技術學院,江蘇 常州 213164
摘要: 在簡要介紹掃雷游戲主界面設計的基礎上,給出了一種基于Qt的掃雷游戲的設計與實現方法,并在Qt4.3.2和Red Hat Enterprise Linux 4操作系統下成功實現。經過實驗測試,結果正確,各項功能達到游戲要求。該實現方法對其他基于Qt的游戲開發起到拋磚引玉的作用,同時對各專業人員借助Qt快速開發具備強大計算功能的專業應用軟件具有重要的意義。
Abstract:
Key words :

摘  要: 在簡要介紹掃雷游戲主界面設計的基礎上,給出了一種基于Qt的掃雷游戲的設計與實現方法,并在Qt4.3.2和Red Hat Enterprise Linux 4操作系統下成功實現。經過實驗測試,結果正確,各項功能達到游戲要求。該實現方法對其他基于Qt的游戲開發起到拋磚引玉的作用,同時對各專業人員借助Qt快速開發具備強大計算功能的專業應用軟件具有重要的意義。
關鍵詞: Qt;掃雷游戲;事件;信號與槽

    最初以訓練鼠標操作為目的而設計的掃雷游戲是一款經久不衰的Windows平臺休閑游戲。盡管Windows操作系統經歷數次換代,變得越來越龐大、復雜,但這個可愛的小游戲在任何版本的Windows操作系統里卻依然保持著原貌,幾乎每個電腦使用者都接觸過[1]。
    Qt是諾基亞開發的一個跨平臺的C++圖形用戶界面應用程序框架。它為應用程序開發者提供建立藝術級的圖形用戶界面所需的所有功能。Qt是完全面向對象的,很容易擴展,并且允許真正地組件編程。自1996年,Qt進入商業領域,它已經成為全世界范圍內數千種成功的應用程序的基礎。Qt也是流行的Linux桌面環境KDE 的基礎?;旧希琎t與X Window上的Motif、Openwin、GTK等圖形界面庫和Windows平臺上的MFC、OWL、VCL、ATL屬同類型,但Qt具有優良的跨平臺特性、面向對象、豐富的API、大量的開發文檔等優點[2]。
    本課題是在Linux系統下設計并開發的,設計了一款基于Qt環境的掃雷游戲,使用了C++語言程序。
1 掃雷游戲主界面的設計
  游戲主界面由菜單、游戲區、按鈕區、信息顯示區等幾部分構成,如圖1所示。Qt提供了一套完整的GUI模塊,能夠完成基本的Windows窗體應用程序,因此可以簡單地為掃雷程序制作出界面[3]。圖1主要通過子類化QmainWindow創建掃雷游戲應用程序用戶界面。Qt還提供了定時器,能夠完成游戲的計時。

2 鼠標事件的處理
    當點擊鼠標左鍵時,設置ok_flag_為true,說明此方塊進行了翻開操作。如果方塊是地雷,發出一個explode()信號;如果不是地雷,發出一個safe()信號,同時顯示數字。這動作應當在ok_flag_無效且mark_flag_也無效的前提下進行,因為如果ok_flag_有效,則說明此方塊已經翻開了,沒有必要重做;如果mark_flag_有效,則說明玩家標志此方塊有雷,不應該去翻開,否則即為自取滅亡。
    點擊鼠標右鍵進行旗幟安插或者移除操作應該在ok_flag_無效的前提下進行,因為對于一個已經翻開的方塊,安插毫無意義。
 類的定義如下:
 class BlockArea:public Qwidget
  {
  Q_OBJECT
  public:
   BlockArea(QWidget* parent=0);
   private slots:
     void slotSafe();
     void slotExplode();
  private:
     int calculateMines(int x,int y)const; //計算以(x,y)為中心的九宮格內的雷數
     private:
        QGridLayout* mainLayout;
             int row_;
             int column_;
             int total_block_number_;
             int total_mine_number_;
             int ok_block_number_;
     };
     下面是代碼實現部分:
  void
Block::mousePressEvent(QMouseEvent* event)
     {
       if(event->button()==Qt::LeftButton)
     {
       if(ok_flag_==false&&mark_flag_==false)
     {
       ok_flag_=true;
       if(mine_flag_==true)
          {
      setPixmap(QPixmap(":/images/mine.png"));
             update();
             emit explode();
          }else{
            setPixmap(QPixmap(":/images/mine_"+QString("%1").
             arg
        (number_)+".png"));
                 update();
                 emit safe();
          }
          }
         }else
    if(event->button()==Qt::RightButton){
       if(ok_flag_==false){
       if(mark_flag_==false){
       mark_flag_=true;
      setPixmap(QPixmap(":/images/flag.png"));
          }else{
             mark_flag_=false;
      setPixmap(QPixmap(":/images/normal.png"));
         }
                 update();
          }
          }
         }
    設計的實現比較簡單,需要說明的是本文模擬的鼠標事件并不是單擊而是按下,這對于掃雷已經足夠了。同時,會發現兩個信號函數沒有實現,這個工作會由moc自動完成,因此不必在.cpp中實現,并且它們永遠不會有返回值(即void)。
3 初始化
3.1 雷區/非雷區的產生

     下面是BlockArea的構造函數:
  BlockArea::BlockArea(QWidget* parent)
      :QWidget(parent)
      {
      //下面5行來初始化BlockArea的信息,自定義行數為10、列數為10、總格數為100、雷數為10。
      row_=10;
      column_=10;
      total_block_number_=row_*column_;
      total_mine_number_=10;
      ok_block_number_=0;

  //下面6行生成一個具有 total_block_number_個元素的bool類型的隨機序列,用來布雷(即確定哪些方塊放雷,哪些不放),因為QtAlgorithms中沒有包含打亂序列的算法,故采用C++的STL里的random_shuffle。
     bool mine_flag[total_block_number_];
      for(int i=0;i<total_mine_number_;i++)
      mine_flag[i]=true;
      for(int i=total_mine_number_;i<total_block_number_;i++)
      mine_flag[i]=false;
    std::random_shuffle(mine_flag,mine_flag+total_block_number_);
  
    //下面4行將方塊放進布局
     mainLayout=new QGridLayout(this);
     for(int i=0;i<row_;i++)
     for(int j=0;j<column_;j++)
     mainLayout->addWidget(new Block(mine_flag[i*column_+j]),i,j);

     //下面6行設置每個方塊的周圍雷數,并且將信號safe()與槽slotSafe()相聯,信號explode()與槽slotExplode()相聯。Block* current_block=static_cast<Block*>(mainLayout->itemAtPosition(i,j)->widget());這句話是獲取布局中位于(i,j)位置處的widget*,將其轉換為Block*,static_cast是C++關鍵字,這里執行一個下行轉換動作。
      for(int i=0;i<row_;i++){
      for(int j=0;j<column_;j++){
     Block* current_block=static_cast<Block*>(mainLayout->
        itemAtPosition(i,j)->widget());
     current_block->setNumber(calculateMines(i,j));
     connect(current_block,SIGNAL(safe()),this,SLOT(slotSafe
        ()));
     connect(current_block,SIGNAL(explode()),this,SLOT(slot
        Explode()));
     }
     }
3.2 周邊雷數的計算

 


     要計算(x,y)位置周邊地雷的個數,首先需計算出一個點,然后判斷此點是否落在BlockArea中,如果落在BlockArea中,再判斷是否是雷,如果是,則計數器加1。
    int BlockArea::calculateMines(int x,int y)const
     {
        int number=0;
        for(int i=0;i<3;i++)
             for(int j=0;j<3;j++)
             if( (x-1+i>=0) && (x-1+i<row_) && (y-1+j>=0)            && (y-1+j<column_) )
             if(static_cast<Block*>(mainLayout->itemAtPosition(x-
            1+i,y-1+j)->widget())->isMine())
             ++number;
            return number;
  }
    該掃雷游戲在Qt4和Red Hat Enterprise Linux 4操作系統上成功實現,能在Windows和Linux平臺下運行。除能實現基本的左鍵打開、右鍵標記的掃雷功能以外,還能實現計時、自定義游戲難度、作弊、語音提示等擴展功能。經過試驗測試,界面美觀,結果正確,各項功能達到游戲要求。該實現方法對其他基于Qt的游戲開發起到了拋磚引玉的作用,其中的鍵盤、鼠標等功能的實現方法可用于其他Qt編程,同時對各專業人員借助Qt快速開發具備強大計算機功能的專業應用軟件具有重要的意義。
參考文獻
[1] 陳子為.基于Matlab GUI掃雷游戲的設計與實現[J]. 現代電子技術,2008(24):85-88.
[2] BLANCHETTE J,SUMMERFIELD M.C++ GUI QT4編程(第二版)[M].北京:電子工業出版社,2008.
[3] 張建強,張秀梅.掃雷游戲策略初探[J]. 數學教學,2004(6):32-33.
[4] 成潔, 盧紫毅. Linux窗口程序設計——Qt精彩實例分析[M].北京:清華大學出版社,2008.
[5] 趙大偉,肖周芳,張艷.從掃雷游戲淺談一些算法問題[J]. 科技信息,2008(29):69.
[6] 錢會敏,于守秋.自動掃雷算法淺談[J].科技創新導報,2009(31):250.
[7] 劉艷青,蘇桂蓮.基于Qt4的圖形用戶界面程序的設計與實現[J].現代計算機(專業版),2009(3):170-172.

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲国产另类久久久精品极度| 亚洲香蕉视频| 亚洲国产精品一区制服丝袜| 在线视频国内自拍亚洲视频| 国产精品天天看| 欧美日韩国产91| 欧美日韩裸体免费视频| 亚洲在线观看视频| 欧美一级视频免费在线观看| 亚洲影视综合| 榴莲视频成人在线观看| 欧美日本在线| 狠狠色香婷婷久久亚洲精品| 国产精品国产馆在线真实露脸| 欧美日韩在线免费| 亚洲最新在线视频| 亚洲一区二区三区在线视频| 国产一区二区在线观看免费播放| 欧美激情中文字幕一区二区| 欧美一区二区三区四区在线观看地址| 黄色工厂这里只有精品| 久久精品在这里| 美女免费视频一区| 欧美午夜大胆人体| 亚洲美女淫视频| 亚洲香蕉网站| 免费成人在线视频网站| 久久久精品免费视频| 久久漫画官网| 欧美一区二区三区免费在线看| 国产精品一区免费视频| 国产精品午夜久久| 91久久精品日日躁夜夜躁欧美| 亚洲欧美国内爽妇网| 亚洲第一综合天堂另类专| 久久综合给合久久狠狠狠97色69| 国产精品男人爽免费视频1| 亚洲欧美变态国产另类| 国产精品国产三级欧美二区| 国产日韩在线一区| 亚洲裸体俱乐部裸体舞表演av| 国产精品三级久久久久久电影| 亚洲国产精品久久人人爱蜜臀| 在线观看91精品国产入口| 国产一区二区精品在线观看| 在线日韩电影| 亚洲大片精品永久免费| 亚洲综合色在线| 国产一区二区三区不卡在线观看| 国产午夜久久久久| 欧美日韩亚洲一区三区| 欧美伊人久久| 欧美成va人片在线观看| 性久久久久久| 激情欧美一区二区三区在线观看| 亚洲激情一区二区三区| 欧美黄免费看| 好吊一区二区三区| 国产一区二区三区在线观看免费| 亚洲电影免费观看高清| 久久久亚洲国产天美传媒修理工| 欧美本精品男人aⅴ天堂| 亚洲视频在线观看一区| 韩日精品视频一区| 国产精品v片在线观看不卡| 六月丁香综合| 在线观看91精品国产麻豆| 亚洲欧美日韩中文在线制服| 欧美波霸影院| 国产精品大片| 国产精品理论片在线观看| 模特精品在线| 亚洲一区二区三区视频| 国产精品美女诱惑| 亚洲精品欧美激情| 在线激情影院一区| 久久九九精品99国产精品| 精品999成人| 久久美女性网| 性色av一区二区怡红| 亚洲乱码久久| 一色屋精品视频在线看| 怡红院精品视频| 午夜精品久久久久久99热软件| 久久精品一区| 欧美精品一区二区三区蜜臀| 久久久久久黄| 狠狠色狠色综合曰曰| 亚洲综合国产精品| 一区二区三区在线视频观看| 国内精品久久久久久久影视蜜臀| 国产欧美精品xxxx另类| 亚洲盗摄视频| 亚洲中字在线| 日韩亚洲欧美一区| 亚洲丁香婷深爱综合| 欧美激情一区二区久久久| 久久国产精品99国产精| 亚洲七七久久综合桃花剧情介绍| 一区二区三区高清不卡| 欧美一区二区三区视频在线观看| 一区二区电影免费观看| 欧美性大战xxxxx久久久| 亚洲精品国偷自产在线99热| 欧美日韩在线电影| 午夜视频在线观看一区| 国产亚洲精品综合一区91| 欧美在线网址| 午夜精品福利视频| 久久都是精品| 欧美顶级大胆免费视频| 在线国产精品一区| 欧美日韩国产va另类| 狠狠久久亚洲欧美| 欧美一区二区三区电影在线观看| 久久精品综合网| 国产噜噜噜噜噜久久久久久久久| 久久精品国产视频| 久久国产精品久久精品国产| 亚洲国产精品视频一区| 欧美日韩www| 亚洲精品激情| 国产日韩精品一区| 欧美日韩国产一区二区| 亚洲精品久久嫩草网站秘色| 亚洲高清资源综合久久精品| 欧美精选午夜久久久乱码6080| 国内精品久久久久国产盗摄免费观看完整版| 久久精品一级爱片| 国产欧美视频一区二区三区| 亚洲在线视频一区| 欧美国产欧美亚州国产日韩mv天天看完整| 久久一区二区三区超碰国产精品| 亚洲网站在线观看| 亚洲图片欧洲图片av| 亚洲国产一区二区a毛片| 国产精品av久久久久久麻豆网| 欧美日韩在线一区二区| 一区二区三区精品| 黄网站免费久久| 欧美va日韩va| 久久综合九色综合欧美就去吻| 蜜桃av一区| 久久精品一区蜜桃臀影院| 久久精品国产一区二区三| 欧美屁股在线| 亚洲一区二区在线免费观看视频| 欧美日韩一区免费| 欧美日韩一区二区三区高清| 国产精品美女www爽爽爽视频| 国产日韩在线看片| 午夜精品久久| 精品69视频一区二区三区| 国产欧美一区二区三区在线看蜜臀| 亚洲精品视频一区二区三区| 亚洲日本中文字幕| 久久精品伊人| 欧美国产一区二区在线观看| 国产精品综合网站| 国内精品久久久久久久影视蜜臀| 在线综合欧美| 亚洲欧美日韩国产精品| 国产美女搞久久| 久久精品日韩一区二区三区| 午夜免费久久久久| 欧美高清在线一区| 在线看无码的免费网站| 亚洲精品乱码久久久久久按摩观| 韩日精品视频一区| 国产精品国产三级国产普通话99| 亚洲精品免费电影| 久久久久久9999| 影音欧美亚洲| 国产精品亚洲综合一区在线观看| 欧美日韩午夜| 性欧美暴力猛交69hd| 欧美一区二区三区婷婷月色| 亚洲欧美精品suv| 欧美另类高清视频在线| 亚洲精品中文字幕有码专区| 久久精品卡一| 樱桃成人精品视频在线播放| 欲香欲色天天天综合和网| 在线电影欧美日韩一区二区私密| 永久域名在线精品| 韩国精品主播一区二区在线观看| 国产亚洲欧美日韩美女| 99热这里只有精品8| 亚洲国产一区二区三区a毛片| 久久精品亚洲热| 久久精品一区四区| 国产精品成人观看视频免费| 国产日韩欧美一区| 午夜一级久久| 亚洲第一区色| 国产精品入口66mio| 欧美了一区在线观看| 狠狠色狠狠色综合| 国产精品都在这里| 国产精品xvideos88| 欧美日韩中文字幕日韩欧美| 欧美视频1区| 欧美日韩免费观看一区| 国产欧美一区二区三区另类精品| 国产日韩精品一区二区浪潮av| 久久av一区二区三区漫画| 国产亚洲永久域名| 日韩午夜高潮| 午夜精品一区二区三区电影天堂| 狠狠色香婷婷久久亚洲精品| 亚洲国产激情| 国产日韩一区二区| 亚洲日本欧美在线| 久久亚洲捆绑美女| 国产精品国产精品国产专区不蜜| 国产精品久久久久久久午夜片| 亚洲午夜久久久| 亚洲视频在线一区观看| 欧美亚洲一区二区在线| 欧美日韩免费在线| 欧美日韩亚洲系列| 巨乳诱惑日韩免费av| 国产亚洲成av人在线观看导航| 欧美精品亚洲一区二区在线播放| 欧美日韩视频在线观看一区二区三区| 国产在线拍偷自揄拍精品| 亚洲天堂av在线免费观看| 亚洲欧美一区二区视频| 亚洲国产成人高清精品| 米奇777超碰欧美日韩亚洲| 欧美a级片一区| 在线观看中文字幕亚洲| 欧美日韩中文字幕在线| 欧美成人a∨高清免费观看| 国模大胆一区二区三区| 亚洲另类在线视频| 欧美精品一区二区三区高清aⅴ| 一区二区三区久久网| 亚洲一区国产精品| 久久天堂成人| 欧美极品aⅴ影院| 国产精品jizz在线观看美国| 亚洲高清三级视频| 91久久精品国产91久久性色| 久久久久久网| 久久蜜桃香蕉精品一区二区三区| 美女被久久久| 亚洲一区美女视频在线观看免费| 亚洲欧美日韩国产成人精品影院| 国产美女在线精品免费观看| 亚洲资源在线观看| 亚洲精品日韩在线| 久久国产精品亚洲va麻豆| 国产精品一区久久| 欧美制服第一页| 国产一区二区精品在线观看| 亚洲男女自偷自拍图片另类| 怡红院av一区二区三区| 欧美一区二区三区在线免费观看| 极品中文字幕一区| 欧美日韩国产一区二区三区地区| 亚洲人成在线影院| 亚洲午夜未删减在线观看| 欧美xart系列在线观看| 亚洲一区免费| 亚洲制服欧美中文字幕中文字幕| 欧美片第一页| 欧美午夜一区二区福利视频| 久久精品最新地址| 欧美+日本+国产+在线a∨观看| 欧美伦理一区二区| 欧美有码在线观看视频| 亚洲一区中文字幕在线观看| 亚洲精品一二三区| 欧美黄色aaaa| 久久精品国产久精国产一老狼| 欧美日韩国产综合视频在线| 亚洲一区不卡| 亚洲欧洲精品一区二区三区| 久久久久久久一区二区| 亚洲精品久久久久久久久久久久久| 国产精品国产自产拍高清av| 久久久久久亚洲综合影院红桃| 又紧又大又爽精品一区二区| 亚洲国产婷婷香蕉久久久久久| 美日韩免费视频| 久久国产乱子精品免费女| 午夜在线播放视频欧美| 亚洲国产午夜| 日韩视频不卡中文| 欧美激情综合在线| 欧美区在线观看| 亚洲欧洲日韩综合二区| 亚洲第一伊人| 一区二区三区高清视频在线观看| 欧美一区影院| 国产拍揄自揄精品视频麻豆| 欧美高清不卡在线| 奶水喷射视频一区| 亚洲无线观看| 欧美日本韩国在线| 久久精品99国产精品日本| 亚洲欧美日韩精品一区二区| 欧美美女bbbb| 久久综合伊人77777蜜臀| 亚洲美女性视频| 久久成人综合视频| 国产精品mv在线观看| 国产精品黄页免费高清在线观看| 亚洲韩国一区二区三区| 日韩视频在线观看国产| 91久久嫩草影院一区二区| 久久综合一区二区三区| 欧美激情亚洲国产| 欧美1区2区视频| 国内精品美女av在线播放| 亚洲视频久久| 欧美日韩中文字幕日韩欧美| 99riav1国产精品视频| 久久九九国产精品怡红院| 正在播放亚洲| 亚洲欧美日韩专区| 欧美精品18+| 亚洲国产一成人久久精品| 欧美国产视频一区二区| 亚洲深夜福利在线| 在线视频欧美一区| 欧美精品一区二区三区很污很色的|