程式功能:
提供三種模式:初級、中級、高階
操作模式: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.周邊無雷位置通過遞迴實現片顯 ...