之前寫了乙個c++ 的控制台掃雷小遊戲,但由於過度使用system("cls")刷屏,導致閃屏,因此重寫了乙個改善的不閃屏版本,並把邏輯重新捋了一遍。
map.h
#ifndef map_h_
#define map_h_
#define max_wid 18
#define max_len 32
#define up_edge 1 //上邊界
#define left_edge 1 //左邊界
#define right_edge _len //右邊界
#define down_edge _wid //下邊界
struct position ;
struct mapinfo ;
void gotoxy(short, short); //游標移動函式
class map ;
#endif
map類的實現
map.cpp
#include "map.h"
#include
#include
#include //提供隨機函式,rand(), srand()
#include //提供time()函式
#include //提供不回顯的輸入函式getch()
#include //提供system()內命令
#define gotoxy( pos ) gotoxy( 2 * (pos).x - 1, (pos).y - 1 )
#define position_pos _wid+1 //遊戲資訊的位置,這裡是位置資訊
#define position_blanks _wid+2 //空格數字置
#define position_times _wid+3 //時間顯示位置
#define position_situation _wid+4 //輸贏狀態位置
using std::cin;
using std::cout;
void gotoxy(short x, short y) ;
handle hout = getstdhandle(std_output_handle);
setconsolecursorposition(hout, pos);}
void map::choosemode()
switch (mode)
_blanks = _len * _wid - _mines; //更新空格數}
void map::draw()
gotoxy(0, position_pos);
printf("position: ( %2d, %2d )\n", pos.x, pos.y);
printf("blanks: %2d", _blanks);
gotoxy(pos); //檢視 map.h 內說明}
void map::initmap()
pos.x = pos.y = 1;}
void map::setmine()
}}
void map::setnum()
} openblock(); //與setmine()配套,這時才正好開啟使用者要開啟的第乙個空,避免第一步就觸雷}
void map::move()
gotoxy(12, position_pos); //12,可以不用重新輸入覆蓋已經存在的 "position: ",而是接著輸入
printf("%2d, %2d", pos.x, pos.y);
gotoxy(pos); //回到使用者所指的位置
}}
#define if_in_edge(p) ((p.x >= left_edge && p.x <= right_edge) && (p.y >= up_edge && p.y <= down_edge)) //判斷是否越界
#define if_pushin_stack(p) (data[p.y][p.x].flag == false && if_in_edge(p)) //判斷是否入棧,條件是:不越界且格仔未被開啟
#define pushin_stack(p) //入棧,並設定為已開啟,並減少空格數,用於定是否獲勝
void map::openblock()
else
} gotoxy(8, position_blanks); //更新空格數
printf("%2d", _blanks);
gotoxy(pos); //回到使用者所指的位置}
void map::openall()
} printf("|\n");
} gotoxy(pos);
printf("x");}
void map::play() //如果觸雷則跳出,並開啟全圖
openblock(); //開格仔
} end = clock(); //計時用
gotoxy(0, position_times);
printf("times: %.2f s\n\n", (end-start)/clk_tck);}
bool map::ifwin()
bool map::iflose()
主函式mineweeper.cpp
#include
#include
#include
#include "map.h"
int main()
if (ch == 'q') break;
} system("cls");
printf("~bye~\n\n");
system("pause");
return 0;
遊戲截圖
本文標題: c++實現掃雷遊戲(控制台不閃屏版)
本文位址:
C 掃雷小遊戲(控制台不閃屏版)
之前寫了乙個c 的控制台掃雷小遊戲,但由於過度使用system cls 刷屏,導致閃屏,因此重寫了乙個改善的不閃屏版本,並把邏輯重新捋了一遍。map.h ifndef map h define map h define max wid 18 define max len 32 define up e...
C 實現掃雷小遊戲(控制台版)
程式功能 提供三種模式 初級 中級 高階 操作模式 wsad控制游標移動,空格鍵開啟方塊 提供掃雷地圖的類 map.h ifndef map h define map h define max length 32 可以提供的地圖最大長度 define max width 18 可以提供的地圖最大寬度...
Linux控制台版掃雷遊戲
基於標c基礎上完成的小遊戲 設計思路 1.列印輸出面板。通過二維陣列實現 2.隨機布雷。統計非雷位置周邊雷的個數,賦值到當前位置。記錄在真實面板陣列中 3.使用者通過座標排雷,通過列印面板顯示出來。並判斷是否踩雷或排雷完畢 難點 1.統計非雷位置8個方位中雷的個數 2.周邊無雷位置通過遞迴實現片顯 ...