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

2021-08-21 05:14:18 字數 2946 閱讀 9373

之前寫了乙個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;

coord pos = ;

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 的控制台掃雷小遊戲,但由於過度使用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.周邊無雷位置通過遞迴實現片顯 ...