2021-05-12 14:32:11
C語言實現簡單掃雷原始碼
2021-04-19 22:00:48
掃雷是一款大家都熟知的小遊戲,今天我們將使用c語言實現一個簡易版本的掃雷
需要的功能
1.保證第一次下子時,不被炸死
2.輸入的座標周圍沒雷,可以直接展開周圍的座標
3.輸入的座標周圍有雷時,應該顯示周圍有多少個雷
注意事項
1.應該定義兩個陣列,一個用來向玩家展示排雷的情況,一個來存放雷
2.定義的陣列的大小,應該大於掃雷遊戲的棋盤的真實大小,防止陣列越界
(如:在掃雷的棋盤為99時,我們應該定義1111的陣列,防止陣列越界)
3.可以將程式碼分檔案實現
程式碼的實現
分檔案
將程式碼分別寫入game.c,game.h,test.c檔案裡,可以讓程式碼更加有條理
test.c主要寫遊戲主要框架
game.c實現需要的函數
game.h定義需要的函數
對兩個陣列初始化
//board-需要初始化的陣列 //set-初始化的元素(這裡我將'1'設定為雷,'0'代表沒有雷;將玩家看到的棋盤初始化為'*') void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) { int i; int j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } }
列印功能
//列印 void DisplayBoard(char board[ROWS][COLS], int row, int col) { int i; int j=1; printf("-----------------------------n");//分割每次列印的棋盤,防止混淆 for (i = 0; i <= row; i++) {//列印列號 printf("%d ", i); } printf("n"); for (i = 1; i <= row; i++) { printf("%d ", i);//列印行號 for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("n"); } printf("-----------------------------n"); }
佈置雷
//佈置雷 //count-佈置的雷的數量 void SetMineBoard(char board[ROWS][COLS], int row, int col, int count) { while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (board[x][y] == '0') { board[x][y] = '1'; count--; } } }
排查雷
//排查雷 //num-雷的數量 void FineMine(int row, int col, int num) { int flag = 1; int a = 1; while (flag) { printf("請輸入一個座標:"); int x; int y; scanf("%d%d", &x, &y); if (a == 1)//第一次輸入座標需要進行判斷,防止第一次就踩到了雷 { a--; safe(x, y,ROW,COL);//安全函數,保證第一次不會踩到雷 } if (x >= 1 && x <= row&&y >= 1 && y <= col)//座標合法 { if (mine[x][y] != '1')//如果該位置不是雷,應該搜尋周圍有多少雷 { int count = GetMineCount(x, y);//查詢周圍雷的數量 show[x][y] = count + '0'; if (show[x][y] == '0') {//該位置沒有雷時,應該繼續展開搜尋周圍的座標 open_mine(x, y);//展開周圍座標功能 int z = count_show_mine(row, col); if (z == num) { printf("你已經找出全部的雷,遊戲勝利n"); DisplayBoard(show, ROW, COL);//列印 break; } } DisplayBoard(show, ROW, COL);//列印 } else { printf("你踩到雷,遊戲結束n"); DisplayBoard(mine, ROW, COL);//列印 flag = 0; } } else { printf("座標有誤,請重新輸入"); } } }
保證第一次下子時,不被炸死
//保證不會在第一次時踩到雷 void safe(int x, int y, int row, int col) { int q = 1; if (mine[x][y] == '1') {//如果此處是雷,將雷換到其他地方 mine[x][y] = '0'; while (q) { int a = rand() % row + 1; int b = rand() % col + 1; if (mine[a][b] == '0'&&a!=x&&b!=y) { q--; mine[a][b] = '1'; } } } }
統計周圍有幾個雷;
//統計座標(x,y)周圍有幾個雷; int GetMineCount(int x, int y) { return (mine[x - 1][y - 1]) + (mine[x - 1][y]) + (mine[x - 1][y + 1]) + (mine[x][y - 1]) + (mine[x][y + 1]) + (mine[x + 1][y - 1]) + (mine[x + 1][y]) + (mine[x + 1][y + 1]) - 8 * '0'; }
展開周圍座標
//展開排查周圍座標的情況 void open_mine(int x, int y)//座標周圍展開函數 { if (mine[x - 1][y - 1] == '0') { show[x - 1][y - 1] = GetMineCount(x - 1, y - 1) + '0';//顯示該座標周圍雷數 } if (mine[x - 1][y] == '0') { show[x - 1][y] = GetMineCount(x - 1, y) + '0';//顯示該座標周圍雷數 } if (mine[x - 1][y + 1] == '0') { show[x - 1][y + 1] = GetMineCount(x - 1, y + 1) + '0';//顯示該座標周圍雷數 } if (mine[x][y - 1] == '0') { show[x][y - 1] = GetMineCount(x, y - 1) + '0';//顯示該座標周圍雷數 } if (mine[x][y + 1] == '0') { show[x][y + 1] = GetMineCount(x, y + 1) + '0';//顯示該座標周圍雷數 } if (mine[x + 1][y - 1] == '0') { show[x + 1][y - 1] = GetMineCount(x + 1, y - 1) + '0';//顯示該座標周圍雷數 } if (mine[x + 1][y] == '0') { show[x + 1][y] = GetMineCount(x + 1, y) + '0';//顯示該座標周圍雷數 } if (mine[x + 1][y + 1] == '0') { show[x + 1][y + 1] = GetMineCount(x + 1, y + 1) + '0';//顯示該座標周圍雷數 } }
判斷勝利
//判斷剩餘未知區域的個數,個數為雷數時玩家贏 int count_show_mine(int row,int col) { int count = 0; int i = 0; int j = 0; for (i = 1; i <= row - 2; i++) { for (j = 1; j <= col - 2; j++) { if (show[i][j] == '*') { count++; } } } return count; }
效果展示
1.列印和佈置
第一個陣列是玩家在遊戲看到的陣列,第二個陣列是存放雷的陣列,在遊戲中第二個陣列不會被列印
2.safe函數的檢查
第一個陣列為本來存放雷的陣列,可以看到此時(1,7)位置是有雷的,但是,我們在輸入(1,7)座標時,因為safe函數的功能,使得(1,7)位置的雷轉移到其他地方
3.由上圖可知(2,8)存放的有雷,這時我們輸入(2,8)(不是第一次輸入),遊戲結束
4.展開功能
第一個陣列仍然為佈置雷後列印出的陣列,我們可以看到(3,3)位置及周圍都沒有雷,所以我們輸入(3,3)看到其周圍8個位置也被搜尋
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章