0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用C語言實(shí)現(xiàn)掃雷游戲項(xiàng)目

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:C語言編程學(xué)習(xí)基地 ? 2021-11-11 14:12 ? 次閱讀

這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)——《掃雷游戲項(xiàng)目》,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下!

游戲介紹:

游戲區(qū)包括雷區(qū)、地雷計(jì)數(shù)器(位于左上角,記錄剩余地雷數(shù))和計(jì)時(shí)器(位于右上角,記錄游戲時(shí)間),確定大小的矩形雷區(qū)中隨機(jī)布置一定數(shù)量的地雷(初級為9*9個(gè)方塊10個(gè)雷,中級為16*16個(gè)方塊40個(gè)雷,高級為16*30個(gè)方塊99個(gè)雷,自定義級別可以自己設(shè)定雷區(qū)大小和雷數(shù),但是雷區(qū)大小不能超過24*30),玩家需要盡快找出雷區(qū)中的所有不是地雷的方塊,而不許踩到地雷。

游戲的基本操作包括左鍵單擊(Left Click)、右鍵單擊(Right Click)、雙擊(Chording)三種。其中左鍵用于打開安全的格子,推進(jìn)游戲進(jìn)度;右鍵用于標(biāo)記地雷,以輔助判斷,或?yàn)榻酉聛淼碾p擊做準(zhǔn)備;雙擊在一個(gè)數(shù)字周圍的地雷標(biāo)記完時(shí),相當(dāng)于對數(shù)字周圍未打開的方塊均進(jìn)行一次左鍵單擊操作。

項(xiàng)目步驟:

1,繪制地圖,二維數(shù)組 雷,數(shù)字。。。

2,貼圖,把數(shù)字轉(zhuǎn)化成圖片,加密,標(biāo)記

3,鼠標(biāo)操作,點(diǎn)擊打開格子(把鼠標(biāo)坐標(biāo),轉(zhuǎn)化成數(shù)組下標(biāo))

4,點(diǎn)到空格之后,打開周圍的格子(遞歸)

5,判斷游戲的輸贏

6,分?jǐn)?shù),音樂....

本項(xiàng)目主要用到了C語言基礎(chǔ)知識以及圖形庫知識,并且對邏輯也是有一定的要求,但是這些在我們項(xiàng)目源碼里面都會有注釋,大家到時(shí)候?qū)W習(xí)的時(shí)候千萬不要忽略注釋,注釋可以更好地幫你理解代碼,尤其是C語言初學(xué)者。

本項(xiàng)目編譯環(huán)境:VS2019/VS2013;

插件:圖形庫插件easyX,涉及圖片素材可以自行百度找也可以關(guān)注文末領(lǐng)??;

效果圖展示

配套講解教程:掃雷游戲教程——嗶哩嗶哩

源代碼示例:

#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#pragma comment(lib,"winmm.lib")
#define ROW 10 //行、列#define COL 10#define MINE 10 //雷的數(shù)量#define SIZE 50 //圖片寬度int map[ROW][COL];//全局變量自動(dòng)初始化為0//定義圖片數(shù)組,保存圖片IMAGE img[12];//游戲勝利與否int flag;//游戲數(shù)據(jù)初始化void GameInit(){  mciSendString("open ./image/start.mp3 alias BGM", 0, 0, 0);  mciSendString("play BGM", 0, 0, 0);  //設(shè)置隨機(jī)數(shù)種子  srand((unsigned)time(NULL));  //初始化數(shù)組  for (int i = 0; i < ROW; i++)  {    for (int j = 0; j < COL; j++)    {      map[i][j] = 0;    }  }  //埋雷,-1表示雷 10個(gè)雷  for (int i = 0; i < MINE;)  {    int r = rand() % 10;//0 1 2...9    int c = rand() % 10;    if (map[r][c] == 0)//還沒有設(shè)置為雷    {      map[r][c] = -1;      i++; //每埋雷一次,就加1    }      }  //把以雷為中心的九宮格數(shù)據(jù)加1,雷除外  for (int i = 0; i < ROW; i++)  {    for (int j = 0; j < COL; j++)    {      //判斷是不是雷 -1      if (map[i][j] == -1)      {        //遍歷雷所在的九宮格        for (int m = i - 1; m <= i + 1; m++)        {          for (int n = j - 1; n <= j + 1; n++)          {            if ((m >= 0 && m = 0 && n < COL) && map[m][n] != -1)            {              map[m][n] += 1;            }          }        }      }    }  }  //加載圖片  for (int i = 0; i < 12; i++)  {    char file[50] = "";    sprintf(file, "./image/%d.jpg", i);    loadimage(&img[i], file,SIZE,SIZE);  }  //加密格子  for (int i = 0; i < ROW; i++)  {    for (int j = 0; j < COL; j++)    {      //map[i][j] += 20;    }  }}//繪制界面void GameDraw(){  cleardevice();  for (int i = 0; i < ROW; i++)  {    for (int j = 0; j < COL; j++)    {      if (map[i][j] == -1)      {        putimage(j * SIZE, i * SIZE, &img[9]);//繪制雷      }      else if (map[i][j]>=0 && map[i][j]<=8)//把其他數(shù)字一并處理0 1 2 3 4 5 6 7 8      {        putimage(j * SIZE, i * SIZE, &img[map[i][j]]);      }      else if (map[i][j] >= 19 && map[i][j] <= 28)      {        putimage(j * SIZE, i * SIZE, &img[10]);      }      else if (map[i][j] > 30)//標(biāo)記       {        putimage(j * SIZE, i * SIZE, &img[11]);      }        }  }}void openNull(int row, int col);//鼠標(biāo)操作int  MouseControl(){  if (MouseHit())//判斷有沒有鼠標(biāo)消息   {    MOUSEMSG msg = GetMouseMsg();//鼠標(biāo)所在的 x,y      int row = msg.y / SIZE;//把鼠標(biāo)坐標(biāo)轉(zhuǎn)換成,數(shù)組下標(biāo)    int col = msg.x / SIZE;    //對鼠標(biāo)消息進(jìn)行分發(fā)    switch (msg.uMsg)    {    case WM_LBUTTONDOWN://鼠標(biāo)左鍵點(diǎn)擊      if (map[row][col] > 8)//如果沒有打開就打開      {        mciSendString("close click", 0, 0, 0);        mciSendString("open ./image/click.wav alias click", 0, 0, 0);        mciSendString("play click", 0, 0, 0);        map[row][col] -= 20;        flag++;        openNull(row, col);            }      break;    case WM_RBUTTONDOWN://鼠標(biāo)右鍵點(diǎn)擊       if (map[row][col] > 8 && map[row][col] <= 28)//如果沒打開,且未被標(biāo)記      {        map[row][col] += 20;      }      else if(map[row][col]>28) //只有沒打開的才可以取消標(biāo)記和標(biāo)記      {        map[row][col] -= 20;      }      break;    }    return map[row][col];  }}//打開所有以空白為中心的九宮格void openNull(int row,int col){  if (map[row][col] == 0)//點(diǎn)擊的是空白  {    for (int m = row - 1; m <= row + 1; m++)    {      for (int n = col - 1; n <= col + 1; n++)      {        if ((m >= 0 && m < ROW && n >= 0 && n < COL) &&           (map[m][n]==20 || map[m][n]!=19) &&          map[m][n]>8)//如果沒有月結(jié),并且為空或者數(shù)字,并且沒有被打開        {          map[m][n] -= 20;          flag++;          openNull(m, n);        }      }    }  }}void Jude(){  if (MouseControl() == -1)  {    //結(jié)束    int isok=MessageBox(GetHWnd(), "你輸了,是否再玩一次", "提示", MB_OKCANCEL);    if (IDOK == isok)    {      GameInit();      flag=0;    }    else    {      exit(666);    }    mciSendString("close BGM", 0, 0, 0);  }  if (flag == ROW * COL - MINE)  {    int isok = MessageBox(GetHWnd(), "你贏了,是否再玩一次", "提示", MB_OKCANCEL);    if (IDOK == isok)    {      GameInit();      flag = 0;    }    else    {      exit(666);    }    mciSendString("close BGM", 0, 0, 0);  }  }void show(){  for (int i= 0; i < ROW; i++)  {    for (int j = 0; j < COL; j++)    {      printf("%2d  ", map[i][j]);    }    putchar('
');  }  putchar('
');  putchar('
');  //system("cls");//清屏}
int main(){  initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);  GameInit();  show();  BeginBatchDraw();  while (1)  {    //show();    GameDraw();    FlushBatchDraw();    Jude();  }  EndBatchDraw();
  getchar();  return 0;}

寫在最后:對于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!

責(zé)任編輯:haq


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7595

    瀏覽量

    135882
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4723

    瀏覽量

    68238

原文標(biāo)題:C語言項(xiàng)目實(shí)戰(zhàn):《掃雷游戲》零基礎(chǔ)項(xiàng)目!230 行源碼注釋示例

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    使用C語言實(shí)現(xiàn)函數(shù)模板

      用C語言能不能實(shí)現(xiàn)一個(gè)通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?105次閱讀

    何用C語言實(shí)現(xiàn)高效查找(二分法)

    今天給分享一下使用C語言實(shí)現(xiàn)二分算法,主要包含以下幾部分內(nèi)容:二分查找算法介紹二分查找算法使用場景二分查找算法代碼實(shí)現(xiàn)二分查找算法實(shí)現(xiàn)過程用C
    的頭像 發(fā)表于 06-04 08:04 ?908次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>C</b><b class='flag-5'>語言實(shí)現(xiàn)</b>高效查找(二分法)

    使用C語言實(shí)現(xiàn)的CRC計(jì)算單元的例子

    使用C語言實(shí)現(xiàn)的CRC計(jì)算單元的例子
    的頭像 發(fā)表于 05-16 16:16 ?822次閱讀

    嵌入式編程,如何用 C 語言實(shí)現(xiàn)狀態(tài)機(jī)設(shè)計(jì)?

    狀態(tài)機(jī)模式是一種行為模式,通過多態(tài)實(shí)現(xiàn)不同狀態(tài)的調(diào)轉(zhuǎn)行為的確是一種很好的方法,只可惜在嵌入式環(huán)境下,有時(shí)只能寫純C代碼,并且還需要考慮代碼的重入和多任務(wù)請求跳轉(zhuǎn)等情形,因此實(shí)現(xiàn)起來著實(shí)需要一番考慮
    發(fā)表于 04-23 11:00

    C語言實(shí)現(xiàn)Web參數(shù)傳遞

    電子發(fā)燒友網(wǎng)站提供《C語言實(shí)現(xiàn)Web參數(shù)傳遞.docx》資料免費(fèi)下載
    發(fā)表于 03-24 09:14 ?2次下載

    ADUC7061如何使用C語言實(shí)現(xiàn)EEPROM功能?

    我使用ADUC7061做的信號采集,現(xiàn)在客戶需要實(shí)現(xiàn)EEPROM功能來保存3-5個(gè)數(shù)據(jù),請問如何使用C語言實(shí)現(xiàn)?不使用外部EEPROM 專用IC。
    發(fā)表于 01-12 06:56

    單軸PSO視覺飛拍與精準(zhǔn)輸出:EtherCAT超高速實(shí)時(shí)運(yùn)動(dòng)控制卡XPCIE1032H上位機(jī)C#開發(fā)(七)

    正運(yùn)動(dòng)技術(shù)EtherCAT控制卡在VS平臺采用C#語言實(shí)現(xiàn)的各種PSO功能。
    的頭像 發(fā)表于 01-03 09:50 ?989次閱讀
    單軸PSO視覺飛拍與精準(zhǔn)輸出:EtherCAT超高速實(shí)時(shí)運(yùn)動(dòng)控制卡XPCIE1032H上位機(jī)<b class='flag-5'>C</b>#開發(fā)(七)

    C語言構(gòu)建高效的嵌入式程序

    嵌入式工程師在編寫C語言程序時(shí),需要注重效率和清晰的思路。本文將通過解析經(jīng)典問題“猴子選大王”來展示如何用C語言思維方式構(gòu)建高效、清晰的程序
    的頭像 發(fā)表于 12-21 09:27 ?584次閱讀

    何用Verilog分模塊編寫1A2B猜數(shù)字游戲并且在野火FPGA開發(fā)板上實(shí)現(xiàn)效果?

    何用Verilog分模塊編寫1A2B猜數(shù)字游戲并且在野火FPGA開發(fā)板上實(shí)現(xiàn)效果?
    發(fā)表于 12-01 12:59

    visualc++怎么新建c語言文件

    Visual C++ 是一個(gè)集成開發(fā)環(huán)境(IDE),用于開發(fā) CC++ 程序。在 Visual C++ 中,新建一個(gè) C
    的頭像 發(fā)表于 11-27 15:57 ?3469次閱讀

    C語言游戲源碼大放送

    電子發(fā)燒友網(wǎng)站提供《C語言游戲源碼大放送.rar》資料免費(fèi)下載
    發(fā)表于 11-21 10:36 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>小<b class='flag-5'>游戲</b>源碼大放送

    C語言實(shí)用程序150例

    電子發(fā)燒友網(wǎng)站提供《C語言實(shí)用程序150例.rar》資料免費(fèi)下載
    發(fā)表于 11-20 11:37 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言實(shí)</b>用程序150例

    C語言何用/* */ 注釋?

    有些早期的C編譯器對這種注釋是不支持的。代碼要做到全平臺兼容,這點(diǎn)是必須要考慮的。 因此,老外定義的C語言軟件規(guī)范,無論是MISRA還是CMMI,一般都要求所有代碼注釋必須使用/**/。
    的頭像 發(fā)表于 11-13 12:33 ?589次閱讀

    blue-ethernet高性能FPGA網(wǎng)絡(luò)數(shù)據(jù)包處理項(xiàng)目簡介

    blue-ethernet項(xiàng)目使用Bluespec SystemVerilog(BSV)硬件描述語言實(shí)現(xiàn)了一系列在FPGA上加速網(wǎng)絡(luò)數(shù)據(jù)包處理的硬件模塊。
    的頭像 發(fā)表于 11-13 10:44 ?1160次閱讀
    blue-ethernet高性能FPGA網(wǎng)絡(luò)數(shù)據(jù)包處理<b class='flag-5'>項(xiàng)目</b>簡介

    何用C語言實(shí)現(xiàn)線程池

    線程池是一種多線程處理形式,大多用于高并發(fā)服務(wù)器上,它能合理有效的利用高并發(fā)服務(wù)器上的線程資源;線程與進(jìn)程用于處理各項(xiàng)分支子功能,我們通常的操作是:接收消息 ==> 消息分類 ==> 線程創(chuàng)建 ==> 傳遞消息到子線程 ==> 線程分離 ==> 在子線程中執(zhí)行任務(wù) ==> 任務(wù)結(jié)束退出; 對大多數(shù)小型局域網(wǎng)的通信來說,上述方法足夠滿足需求;但當(dāng)我們的通信范圍擴(kuò)大到廣域網(wǎng)或大型局域網(wǎng)通信中時(shí),我們將面臨大量消息頻繁請求服務(wù)器;在這種情況下,創(chuàng)
    的頭像 發(fā)表于 11-13 10:41 ?980次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>C</b><b class='flag-5'>語言實(shí)現(xiàn)</b>線程池