最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言制作掃雷游戲(圖形庫)

 更新時間:2022年06月07日 10:36:46   作者:fcg猿猴  
這篇文章主要為大家詳細(xì)介紹了C語言制作掃雷游戲,結(jié)合圖形庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C語言制作掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下

游戲預(yù)覽:

學(xué)習(xí)內(nèi)容:

1.圖形庫文件的使用
2.C++的使用,如類函數(shù)
3.了解掃雷的規(guī)則,嚴(yán)謹(jǐn)?shù)乃季S邏輯

掃雷的規(guī)則:

玩家點擊一個地方,如果該地方是雷,則游戲結(jié)束;如果是空格,則會顯示周圍空格和周圍8個格子的雷的數(shù)量,玩家依照提示逐步挖掘全部的雷,從而結(jié)束游戲。

制作步驟:

基本的庫函數(shù)和常量

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <graphics.h>
#include <conio.h>
#include <windows.h>

#define WIDTH 10//游戲?qū)挾?
#define NUM 12//雷的數(shù)量
#define SIZE 70///單張位置圖片的大小

1.生成游戲地圖

如果想生成一個M x N的掃雷地圖,是不是要定義一個map[M][N]的二維數(shù)組呢?
答案是否定的。
點擊一個位置,如果它是空格需要遍歷周圍8個位置,如果周圍8個位置有空格的話,那么那個空格也需遍歷周圍8個位置,如此反復(fù)。但問題來了,如果當(dāng)遍歷到了邊緣一層,邊緣周圍沒有8個位置,造成數(shù)組越界怎么辦?
所以,這里我們就要在地圖設(shè)2個區(qū),即保護(hù)區(qū)游戲區(qū)

假設(shè)我們像創(chuàng)作一個M x N大小的掃雷地圖,**那么就定義一個map[M+2][N+2]大小的數(shù)組。**即設(shè)計一層保護(hù)區(qū),其目的就是當(dāng)遍歷到邊緣一格時,防止數(shù)組越界報錯。

int map[WIDTH + 2][WIDTH + 2];

2.初始化游戲地圖

第一步:先假設(shè)每個位置都是空格,即0

for (int i = 1; i <= WIDTH; i++)
?? ?{
?? ??? ?for (int j = 1; j <= WIDTH; j++)
?? ??? ?{
?? ??? ??? ?map[i][j] = 0;
?? ??? ??? ?putimage(i*SIZE, j*SIZE, &img[0]);
?? ??? ?}
?? ?}

第二步:初始化雷的分布

int n = 0;
?? ?while (n < NUM)
?? ?{
?? ??? ?int r = rand() % WIDTH + 1;
?? ??? ?int c = rand() % WIDTH + 1;
?? ??? ?if (map[r][c] == 0)//當(dāng)該位置是空格時才產(chǎn)生雷
?? ??? ?{
?? ??? ??? ?map[r][c] = -1;//-1代表雷
?? ??? ??? ?n++;
?? ??? ?}
?? ?}

第三步:遍歷一個空格周圍8個位置的雷的數(shù)量,每有一個雷,該位置所對應(yīng)的數(shù)組值加1

for (int i = 1; i <= WIDTH; i++)//從游戲區(qū)的第1個坐標(biāo)開始
?? ?{
?? ??? ?for (int j = 1; j <= WIDTH; j++)
?? ??? ?{
?? ??? ??? ?if (map[i][j] == -1)//如果這個位置是雷
?? ??? ??? ?{
?? ??? ??? ??? ?for (int m = i - 1; m <= i + 1; m++)//遍歷周圍8八個
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?for (int n = j - 1; n <= j + 1; n++)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?if (map[m][n] != -1 && m != 0 && n != 0)
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ?map[m][n]++;
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ?}

第四步:給每個位置都加密,讓這些位置的在一個范圍內(nèi)顯示“■”

for (int i = 1; i <= WIDTH; i++)
?? ?{
?? ??? ?for (int j = 1; j <= WIDTH; j++)
?? ??? ?{
?? ??? ??? ?map[i][j] += 20;
?? ??? ??? ?if (map[i][j] > 11)
?? ??? ??? ?{
?? ??? ??? ??? ?printf_s("■ ");
?? ??? ??? ??? ?putimage((i-1)*SIZE, (j-1)*SIZE, &img[12]);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?printf_s("\n");
?? ?}

3.鼠標(biāo)點擊功能

定義鼠標(biāo)函數(shù),讓它可以點擊相應(yīng)的位置觸發(fā)函數(shù)

fflush(stdin);//清空緩沖區(qū)的字符
?? ?flushmessage(EM_MOUSE | EM_KEY);//清空緩沖區(qū)的鼠標(biāo)事件
?? ?int heng, zong;
?? ?ExMessage m;
?? ?m = getmessage(EM_MOUSE | EM_KEY);//獲取鼠標(biāo)或鍵盤事件
?? ?heng = m.x / SIZE+1;//獲取鼠標(biāo)點擊在控制臺上的橫坐標(biāo)
?? ?zong = m.y / SIZE+1;//獲取鼠標(biāo)點擊在控制臺上的縱坐標(biāo)
?? ?switch (m.message)
?? ?{
?? ?case WM_LBUTTONDOWN://按鼠標(biāo)左鍵掃雷
?? ??? ?s = DiTu.ReturnT(heng, zong);//點擊的位置是否能觸發(fā)函數(shù)
?? ??? ?if ((heng >= 1 && heng <= WIDTH&&zong >= 1 && zong <= WIDTH)&&s)//沒被標(biāo)記的才能被點擊
?? ??? ?{
?? ??? ??? ?updateNum(heng, zong);
?? ??? ??? ?DiTu.drawMap();//每點一下就畫一次圖
?? ??? ?}
?? ??? ?break;
?? ?case WM_RBUTTONDOWN://按鼠標(biāo)右鍵做標(biāo)記
?? ??? ?DiTu.BiaoJi(heng,zong);
?? ??? ?break;
?? ?case WM_MBUTTONDOWN://按鼠標(biāo)滑輪退出
?? ??? ?exit(0);
?? ??? ?break;
?? ?}

判斷函數(shù):判斷點擊的位置是否合理

bool ReturnT(int heng, int zong)
{
?? ?if (map[heng][zong]<50)
?? ?{
?? ??? ?return true;
?? ?}
? ? else
? ? {
?? ??? ?return false;
? ? }
}

標(biāo)記函數(shù):點擊鼠標(biāo)右邊標(biāo)記該點,使該點不能被點擊

void BiaoJi(int heng, int zong)
{
?? ?if (map[heng][zong]>10 && map[heng][zong] < 50)
?? ?{
?? ??? ?map[heng][zong] += 50;
?? ?}
?? ?else{
?? ??? ?map[heng][zong] -= 50;
?? ?}
}

4.掃出周圍數(shù)字的函數(shù),如果有周圍有空格則遍歷執(zhí)行

void UpdateNum(int heng, int zong)
{
?? ?if (map[heng][zong] - 20 == 0)//0才需要遍歷
?? ?{
?? ??? ?for (int i = heng - 1; i <= heng + 1; i++)
?? ??? ?{
?? ??? ??? ?for (int j = zong - 1; j <= zong + 1; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?UpdateNum(i, j);//遞歸
?? ??? ??? ??? ?if (map[heng][zong] > 10 && map[heng][zong]<50)//除去保護(hù)密碼
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?map[heng][zong] -= 20;
?? ??? ??? ??? ??? ?putimage(heng*SIZE, zong*SIZE, &img[map[heng][zong]]);
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?if (map[heng][zong] > 10 && map[heng][zong] < 50)//除去保護(hù)密碼
?? ?{
?? ??? ?map[heng][zong] -= 20;
?? ??? ?putimage(heng*SIZE, zong*SIZE, &img[map[heng][zong]]);
?? ?}
}

游戲效果瀏覽

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++超詳細(xì)梳理lambda和function的使用方法

    C++超詳細(xì)梳理lambda和function的使用方法

    C++在C11標(biāo)準(zhǔn)中引入了匿名函數(shù),即沒有名字的臨時函數(shù),又稱之為lambda表達(dá)式.lambda表達(dá)式 實質(zhì)上是創(chuàng)建一個匿名函數(shù)/對象,這篇文章主要介紹了lambda和function的使用方法
    2022-08-08
  • C語言基于graphics.h實現(xiàn)圣誕樹

    C語言基于graphics.h實現(xiàn)圣誕樹

    這篇文章主要介紹了圣誕樹代碼,c語言編程,基于graphics.h實現(xiàn),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C語言應(yīng)用領(lǐng)域分析

    C語言應(yīng)用領(lǐng)域分析

    在本篇文章里小編給各位分享的是關(guān)于C語言應(yīng)用領(lǐng)域分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • Matlab利用隨機(jī)森林(RF)算法實現(xiàn)回歸預(yù)測詳解

    Matlab利用隨機(jī)森林(RF)算法實現(xiàn)回歸預(yù)測詳解

    這篇文章主要為大家詳細(xì)介紹了Matlab如何利用隨機(jī)森林(RF)算法實現(xiàn)回歸預(yù)測,以及自變量重要性排序的操作,感興趣的小伙伴可以了解一下
    2023-02-02
  • C++?測試框架GoogleTest入門介紹

    C++?測試框架GoogleTest入門介紹

    這篇文章主要為大家介紹了C++測試框架GoogleTest入門基礎(chǔ),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • C++深入講解類與封裝的概念與使用

    C++深入講解類與封裝的概念與使用

    我們都知道C++有三大特性:封裝、繼承、多態(tài),現(xiàn)在我們來總結(jié)一下封裝的相關(guān)知識與類的概念,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-04-04
  • Qt?事件處理機(jī)制的深入理解

    Qt?事件處理機(jī)制的深入理解

    本文主要介紹了Qt?事件處理機(jī)制的深入理解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++中CString string char* char 之間的字符轉(zhuǎn)換(多種方法)

    C++中CString string char* char 之間的字符轉(zhuǎn)換(多種方法)

    在寫程序的時候,我們經(jīng)常遇到各種各樣的類型轉(zhuǎn)換,比如 char* CString string 之間的互相轉(zhuǎn)換,這里簡單為大家介紹一下,需要的朋友可以參考下
    2017-09-09
  • C語言?typedef的用法示例詳解

    C語言?typedef的用法示例詳解

    typedef是在C和C++編程語言中的一個關(guān)鍵字,作用是為現(xiàn)有的數(shù)據(jù)類型(int、float、char……)創(chuàng)建一個新的名字,目的是為了使代碼方便閱讀和理解,這篇文章主要介紹了C語言typedef的使用,需要的朋友可以參考下
    2023-06-06
  • 一文詳解C++11中auto的使用

    一文詳解C++11中auto的使用

    這篇文章主要為大家分享一下C++11中auto關(guān)鍵字的使用示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2023-07-07

最新評論

南投县| 芦溪县| 剑河县| 淳化县| 从化市| 谢通门县| 三门县| 碌曲县| 潢川县| 云林县| 潞西市| 梓潼县| 息烽县| 大理市| 九台市| 扎鲁特旗| 深水埗区| 衡阳县| 湖南省| 资中县| 关岭| 息烽县| 宁国市| 九寨沟县| 丹江口市| 天等县| 吉木萨尔县| 金乡县| 如东县| 卫辉市| 临湘市| 万荣县| 宁波市| 会理县| 盐山县| 靖边县| 莒南县| 黄石市| 平江县| 绥芬河市| 扎兰屯市|