C語言「黑框框」下簡易掃雷實現

2021-07-23 15:35:03 字數 4012 閱讀 8610

初步了解陣列、指標後,實現了乙個win32控制台下(黑框框)簡易版掃雷程式.

程式中 行數列數雷數可自行定義。

程式用*代表位置未知,空格代表此位置周圍無雷,數字代表周圍雷個數。

分三個**共同編譯實現,saolei.h包含程式所需標頭檔案,巨集定義及所用函式宣告。saolei.c為遊戲邏輯**。function.c 為自定義函式實現**。

程式用兩個char陣列分別表示兩塊地圖,一副地圖呈現給玩家,一幅地圖用於實現布雷及雷數更新等。兩個陣列在程式中會時時互動。

程式擁有座標合法性檢查函式,保證輸入不合法座標及重複座標時程式可以正常執行。

遊戲簡易思路: 建立兩個char陣列分別代表兩個地圖, 乙個地圖為遊戲地圖呈現給玩家,乙個地圖用來布雷(用rand()函式初始化雷座標)。考慮到需要檢測邊界處周圍雷個數,因此布雷陣列比遊戲陣列多兩行兩列。 限於win32 平台下 ,因此用輸入座標形式進行互動(輸入座標與陣列座標不同,在程式中有注釋)。 玩家每輸入乙個座標, 不同函式中兩個陣列進行傳參互動,判斷輸贏,座標是否合法,顯示座標周圍雷個數, 更新陣列, 重新列印地圖等。 

程式實現後並未進行優化,所以可能存在下許問題:**或許會有些冗雜,函式或許未很好的封裝導致重複,或本為乙個函式模組卻分多個函式實現等。盡請見諒。

程式中有詳盡注釋。

原始碼如下:

saolei.h:

/*

此自定義標頭檔案包含saolei.c與function.c所需標頭檔案及函式原型宣告

*/#ifndef __saolei_h__

#define __saolei_h__

//程式用到標準輸入輸出函式

#include /*

程式隨機產生雷座標

*/#include #include #define rows 11 //定義陣列行數(注意! 實際顯示給使用者的地圖行數為rows - 2)

#define cols 11 //定義陣列列數(注意! 實際顯示給使用者的地圖列數為cols - 2)

#define num 10 //定義雷個數

//列印遊戲選擇選單

void menu(void);

//初始化兩塊地圖

void init_map(char gamemap[cols - 2], char map[cols], int rows); //此處傳來的引數rows為map的行數,gamemap的行數應為rows - 2

//列印最新遊戲地圖

void print_gamemap(char gamemap[cols - 2], int rows); //此處傳來的引數rows為gamemap的行數rows - 2

//進行遊戲

void playgame(char gamemap[cols - 2], char map[cols], int rows); //此處傳來的引數rows為map的行數,gamemap的行數應為rows - 2

//檢測玩家輸入座標是否合法

int check(char gamemap[cols - 2], int rows, int x, int y); //此處傳來的引數rows為gamemap的行數rows - 2 x y 為玩家輸入座標

//判斷雷是否已排完

int count(char gamemap[cols - 2], int rows, int num); //此處傳來的引數rows為gamemap的行數rows - 2 num為已定義的雷個數

//判斷輸入座標身邊雷情況

int pailei(char map[cols], int x, int y); //返回-1則此座標為雷,返回0-8代表此座標身邊雷個數

//引數x y 為玩家輸入座標

//更新gamemap

void gxgamemap(char gamemap[cols - 2], int x, int y, int ret); //x, y為輸入座標, ret為輸入座標身邊雷個數

//列印map地圖(供測試用)

void print_map(char map[cols], int rows); //此處傳來的引數rows為map的行數rows

#endif

saolei.c:

/*

掃雷遊戲邏輯

*/#include "saolei.h"

int main(void)

//遊戲結束

printf("\nbye!\n");

return 0; //程式結束

}

function.c:

/*

saolei.c中函式實現

*/#include "saolei.h"

//列印遊戲選單

void menu(void)

//初始化兩塊地圖

void init_map(char gamemap[cols - 2], char map[cols], int rows) //此處傳來的引數rows為map的行數,gamemap的行數應為rows - 2

}//退出for迴圈

}//init_map函式結束

//列印最新遊戲地圖

void print_gamemap(char gamemap[cols - 2], int rows) //此處傳來的引數rows為gamemap的行數,rows - 2

}//列印map地圖(供測試用)

void print_map(char map[cols], int rows) //此處傳來的引數rows為map的行數rows

}//檢測玩家輸入座標是否合法

int check(char gamemap[cols - 2], int rows, int x, int y) //此處傳來的引數rows為gamemap的行數rows - 2. x y 為玩家輸入行列座標

//判斷雷是否已排完

int count(char gamemap[cols - 2], int rows, int num) //此處傳來的引數rows為gamemap的行數rows - 2 num為已定義的雷個數

/*判斷輸入座標身邊雷情況

返回-1則此座標為雷,返回0-8代表此座標身邊雷個數

引數 x y 為玩家輸入座標

'1'代表雷

*/int pailei(char map[cols], int x, int y)

//更新gamemap

void gxgamemap(char gamemap[cols - 2], int x, int y, int ret) //ret為輸入座標身邊雷個數, x y為輸入座標

gamemap[x - 1][y - 1] = '0' + ret;

break; }}

//進行遊戲

void playgame(char gamemap[cols - 2], char map[cols], int rows) //此處傳來的引數rows為map的行數,gamemap的行數應為rows - 2

ret = pailei(map, x, y); //返回-1則此座標為雷,返回0-8代表此座標身邊雷個數

if( ret == -1 ) //遊戲失敗

gxgamemap(gamemap, x, y, ret); //根據返回值更新gamemap, x y 為輸入的座標

print_gamemap(gamemap, rows - 2); //列印最新遊戲地圖

//print_map(map, rows); //列印map地圖(用於測試)

}//退出最外層while迴圈

if( (count(gamemap, rows - 2, num)) == 0 ) //判斷是勝利後跳出while迴圈還是失敗後跳出,若是勝利,函式返回值為0

printf("你贏了!\n");

}//退出playgame函式

C語言 黑框框 下不忍直視的三子棋實現

今天發乙個介面醜到爆,無比low的三子棋程式 同樣,win32 無圖形介面 輸入座標進行互動,x代表玩家下子,0代表電腦下子 rand 函式隨機產生合法座標落子 率先連成三子則勝利。棋盤滿未連成三子則平局。程式比較簡單直接發原始碼.三個塊,game.h代表程式所需標頭檔案 巨集定義 函式宣告,tes...

C語言實現簡易掃雷

define crt secure no warnings 1 include include include include define row 9 顯示棋盤的大小 define col 9 define rows row 2 整個棋盤的大小 define cols col 2 define c...

c語言實現簡易掃雷遊戲

掃雷遊戲很多人都玩過吧,今天就為大家介紹我用c語言製作的簡單掃雷程式。這個遊戲的主要功能就是game 函式的實現,用乙個型別為char 的show map二維陣列進行標記一定數量的地雷,不列印給玩家和另乙個同型別的名為mine map的二維陣列,用於記錄座標周圍的地雷數。玩遊戲的功能都是圍繞這兩個函...