C++ 掃雷小遊戲(380行代碼)

難點:

點擊一次清理出一大片區域的功能,我採用的是先把點擊的那一塊的座標存到一個隊列裡,然後取出裡面的一個元素,再把這個元素周圍的8塊放進隊列裡,重複的不放,就可以對規定的區域做大面積清理了,另外為了右滑界面也加了不少代碼比如一些顏色屬性時鐘移動效果還有光標之類的,實際上要想做一個簡單的出來200行綽綽有餘了,只要將程序模塊化,一個函數解決一個問題,思路還是很清晰的。

此外,在寫這個東西的幾天裡也學到了很多經驗,終於明白了命名的重要性,不然在幾天之後再重新看自己的代碼恐怕自己都不知道原來寫的ABC是啥意思了,只要邏輯結構層次清晰了之後找bug也容易了很多,省了不少時間,再在原來的基礎上添加別的功能和優化的時候也會少走很多彎路,簡而言之就是一句話:良好的代碼習慣非常重要!

運行效果圖:

C++ 掃雷小遊戲(380行代碼)

(小編推薦一個學C語言/C++的學習群:788649720,入群即送C/C++全套學習資料,滿滿的乾貨!)

代碼:

#include<stdio.h>

#include<windows.h>

#include<stdlib.h>

#include<time.h>

#include<conio.h>

#include<queue>

#include<ctype.h>

#define A 17//地圖的高

#define B 17//地圖的寬

#define C 30//雷的總數

using namespace std;

//全局變量

DWORD a,b;

char map[A][B],news,spare;

int BoomTotalNum,floatx,floaty,flag[A][B],flagnum,mode,slect[A][B],game;

//顏色屬性

const WORD FORE_BLUE = FOREGROUND_BLUE;//藍色文本屬性

const WORD FORE_GREEN = FOREGROUND_GREEN;//綠色文本屬性

const WORD FORE_RED = FOREGROUND_RED;//紅色文本屬性

//開墾地圖結構體

struct node {

int x;

int y;

};

queue <node> dui;/<node>

//打印位置

void position(int x,int y) {

COORD pos={x,y};

HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorPosition(Out,pos);

}

//隱藏光標

void Hide() {

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_CURSOR_INFO CursorInfo;

GetConsoleCursorInfo(handle, &CursorInfo);//獲取控制檯光標信息

CursorInfo.bVisible = false; //隱藏控制檯光標

SetConsoleCursorInfo(handle, &CursorInfo);//設置控制檯光標狀態

}

//初始化

void Beginning() {

while(!dui.empty()) {

dui.pop();

}

game=1;

//BoomTotalNum=C;

floatx=A/2;

floaty=B/2;

flagnum=0;

BoomTotalNum=C;

mode=0;

HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //獲得標準輸出設備句柄

CONSOLE_SCREEN_BUFFER_INFO csbi; //定義窗口緩衝區信息結構體

GetConsoleScreenBufferInfo(handle_out, &csbi); //獲得窗口緩衝區信息

int x,y;

srand((unsigned)time(0));

for(int i=0;i


分享到:


相關文章: