C 實現掃雷小遊戲(控制台版)

2022-10-03 23:21:24 字數 3909 閱讀 7972

程式功能:

提供三種模式:初級、中級、高階

操作模式:wsad控制游標移動,空格鍵開啟方塊

提供掃雷地圖的類

map.h

#ifndef map_h_

#define map_h_

#define max_length 32 //可以提供的地圖最大長度

#define max_width 18 //可以提供的地圖最大寬度

#define up_edge 1 //上邊界

#define down_edge _wid //下邊界

#define left_edge 1 //左邊界

#define right_edge _lng //右邊界

void gotoxy(int, int); //移動游標的介面函式

struct position;

struct info;

class map; //游標位置

info data[max_width][max_length]; //包含地圖資訊的矩陣

public:

void acceptcond(); //選擇模式

void initmap(); //初始化地圖

void setmine(); //布置地雷

void setnumber(); //計算數字

void setposition(); //移動游標至指示區域

void resetposition(); //重置初始座標

void showmap(); //顯示地圖

void showall(); //顯示全部地圖,遊戲失敗時候呼叫

void openblock(); //開啟方塊,即將 flag 值設定為 true,在 showmap() 中將開啟方塊

void firststep(); //預先處理遊戲,防止第一步就觸雷導致失敗,這是無意義的

bool playgame(); //提供的遊戲操作介面

bool move(char); //移動游標,同時改變 _pos 的值用於指代目前要訪問(開啟)的方塊

bool iflose(); //遊戲失敗,則返回真

bool ifwin(); //遊戲成功,則返回真};

#endif

實現思路:

1.接收遊戲模式引數,確定地圖規模

2.初始化地圖,值全部設定為 0,flag 全部設定為 false,表示未曾開啟

3.根據使用者操作,確定要開啟的第乙個空格的,然後再開始布雷,避免開局觸雷結束,這樣沒什麼意義。

4.布雷採用生成隨機數的方法

5.根據地雷分布計算其他空格所對應的數字

6.通過playgame() 介面進行遊戲操作

map類的實現

#include

#include

#include //提供時間函式

#incluwww.cppcns.comde //提供getch()

#include

#include

#include "map.h"

#define goto(pos) gotoxy(2 * (pos.x) - 1, (pos.y) - 1) //定義用於移動游標的 巨集

//由於乙個方塊佔 2 個格仔,所以 pos.x 每加 1,則游標要移動 2 格

using std::cout;

using std::cin;

using std::endl;

void gotoxy(int x, int y) ;

handle hout = getstdhandle(std_output_handle);

setconsolecursorposition(hout, pos);}

void map::acceptcond()

switch (mode)

_blanks = _lng * _wid - _mines; //計算空格數,用於判斷是否贏,_blanks = 0 時判定贏}

void map::initmap() }}

void map::setmine() }}

void map::setnumber() }}

void map::setposition()

void map::resetposition()

void map::showmap()

}else printf("%c", 219);

} cout << '|' << endl; //右邊界

} gotoxy(0, _wid+2); //在地圖下方輸出座標資訊和空格數

printf("position : (%d, %d)\n blanks : %d", _pos.x, _pos.y, _blanks);

goto(_pos); //歸位到原先地圖座標對應的位置}

void map::showall()

} cout << '|' << endl; }}

#define solve_it(t)

#define false_flag(t) !data[(t).y][(t).x].flag

void map::openblock()

t.y++; t.x--;//判斷左右兩個格仔, 此時 t.y 復原

if (t.x >= left_edge && false_flag(t)) solve_it(t)

t.x += 2;

if (t.x <= right_edge && false_flag(t)) solve_it(t)

t.y++; //下方三個格仔, 此時 t.x 是最右邊的格仔

if (t.y <= down_edge)

} }}

void map::firststep() while (move(op));}

bool map::move(char op)

gotoxy(0, _wid + 2);

printf("position : (%d, %d)\n blanks : %d", _pos.x, _pos.y, _blanks);

goto(_pos);

return true;}

bool map::iflose()

bool map::ifwin()

bool map::playgame() while (move(op));

if (iflose())

else

} gotoxy(0, _wid + 3);

return true;

}主程式

mineweeper.cpp

#include

#include

#include

#include

#include "map.h"

using namespace std;

int main()

else

end = clock();

printf("\ntime : %.2f\n", (end - start) / clk_tck); //輸出遊戲所用時間

cout << endl << "please enter 'q' to quit, or any other keys to continue" << endl;

game.setposition(); //用於觸雷失敗時,將游標返回到觸雷的位置,提示哪一步失敗,同時觸碰的雷也將顯示為 『x'

ch = getch();

if ('q' == ch)

else

} system("pause");

return 0;

}遊戲截圖

遊戲小**,《遊戲專題》閱讀

本文標題: c++實現掃雷小遊戲(控制台版)

本文位址:

C語言實現控制台「掃雷」小遊戲

根據以往的遊戲經驗,我們能首先可以確定掃雷遊戲勝利的規則是 翻開所有不是雷的區域才能算是勝利。接下來我們需要確定整個程式的設計思路 1.首先,我們定義兩個9 9的二維數還是未翻開的狀態組。第乙個陣列用來表示雷區地圖的展開情況,即每個素組元素的位置的狀態是處於展開狀態還是未展開狀態,我們命名為show...

C 掃雷小遊戲(控制台不閃屏版)

之前寫了乙個c 的控制台掃雷小遊戲,但由於過度使用system cls 刷屏,導致閃屏,因此重寫了乙個改善的不閃屏版本,並把邏輯重新捋了一遍。map.h ifndef map h define map h define max wid 18 define max len 32 define up e...

Linux控制台版掃雷遊戲

基於標c基礎上完成的小遊戲 設計思路 1.列印輸出面板。通過二維陣列實現 2.隨機布雷。統計非雷位置周邊雷的個數,賦值到當前位置。記錄在真實面板陣列中 3.使用者通過座標排雷,通過列印面板顯示出來。並判斷是否踩雷或排雷完畢 難點 1.統計非雷位置8個方位中雷的個數 2.周邊無雷位置通過遞迴實現片顯 ...