用C語言實現(xiàn)掃雷小游戲
本文實例為大家分享了C語言實現(xiàn)掃雷小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1. 規(guī)則
隨便點一個格子,會有一塊,上面的數(shù)字就代表數(shù)字周圍八個格子會有幾個雷,是1他周圍就只有1個雷,2就有兩個雷······;
最終任務就是點開所有沒有雷的格子,則取得更好的分數(shù),如果點開的格子是雷,則游戲結束。
2. 編寫思路
2.1 編寫選擇界面
同上個小游戲一樣,首先編寫選擇界面,輸入1為開始游戲,輸入2則退出游戲。
void Menu() { printf("##########################\n"); printf("## 1:Play 2:Exit ##\n"); printf("##########################\n"); printf("請輸入# "); }
2.2 編寫執(zhí)行程序
執(zhí)行程序需要檢測點開的格子(這里輸入的方式為輸入坐標)周圍的八個格子有多少個雷,并在該格子上顯示雷的個數(shù)。
int GetMines(char mine[][COL], int row, int col, 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'; }
2.3 編寫設置雷的個數(shù)
宏定義雷的個數(shù)為NUMS(NUMS 20);然后隨機排布雷的位置。
void SetMines(char mine_board[][COL], int row, int col) { int count = NUMS; //設置雷 while (count){ int x = rand() % 10 + 1; int y = rand() % 10 + 1; if (mine_board[x][y] == '0'){ mine_board[x][y] = '1'; count--; } } }
2.4 游戲界面的設置
以二維數(shù)組的方式設置游戲界面,這里實際設置的界面為12x12的格子界面,在前面宏定義行為12(ROW 12)列為12(COL 12);但是顯示為10x10的界面,為方便用戶輸入坐標,在行和列的前面分布標上數(shù)字。
static void ShowLine(int nums) { printf("---"); for (int i = 0; i < nums; i++){ printf("-"); } printf("\n"); } void ShowBoard(char show_board[][COL], int row, int col) { printf(" "); for (int i = 1; i < row - 1; i++){ //行的數(shù)字 printf(" %2d", i); } printf("\n"); ShowLine(2 * col + col + 4);//這里傳入的參數(shù)是由于‘-'占位原因,可以根據(jù)自己實際界面調(diào)整; for (int i = 1; i < row - 1; i++){ //列的數(shù)組 printf("%2d|", i); for (int j = 1; j < col - 1; j++){ printf(" %c |", show_board[i][j]); } printf("\n"); ShowLine(2 * col + col + 4); } }
2.5 游戲邏輯的編寫
在編寫游戲邏輯的時候,首先傳入我們設置的游戲棋盤;由于棋盤以二維數(shù)組方式設置,所以在使用前需要初始化,所以我們用memset來快速設置。
將展示前的棋盤空位都設置為 *,然后將游戲使用的棋盤空位設置為 0;
生成隨機雷的個數(shù),將其傳入棋盤,設置雷;剩余空格的個數(shù)用count來表示;
開始游戲邏輯,輸入棋盤,傳入用戶輸入的坐標,然后檢測用戶輸入的坐標是否越界;越界則提示用戶輸入越界,需要重新輸入;如果沒越界則游戲繼續(xù)進行,檢測用戶輸入的坐標是否已經(jīng)點開,如果點開則提示用戶重新輸入;然后判斷點開的是不是雷,如果是游戲結束,如果不是游戲繼續(xù),直到所有空格都點開count=0結束循環(huán);
如果剩余空格count不為0游戲結束,則說明踩到雷;否則說明雷全被排完,然后向用戶展示所有雷的分布范圍。
void Game() { char show_board[ROW][COL]; char mine_board[ROW][COL]; memset(show_board, '*', sizeof(show_board)); memset(mine_board, '0', sizeof(mine_board)); srand((unsigned long)time(NULL)); SetMines(mine_board, ROW, COL); int count = (ROW - 2)*(COL - 2) - NUMS; int x = 0; int y = 0; do{ ShowBoard(show_board, ROW, COL); printf("請輸入位置# "); scanf("%d %d", &x, &y); if (x<1 || x>10 || y<1 || y>10){ printf("輸入越界,請重新輸入!\n"); continue; } if (show_board[x][y] != '*'){//證明位置被排過了 printf("該位置已被排除,請重新輸入!\n"); continue; } if (mine_board[x][y] == '1'){//沒點到雷 break; } int num = GetMines(mine_board, ROW, COL, x, y); show_board[x][y] = num + '0'; count--; } while (count > 0); if (count > 0){ printf("you loss!\n"); } else{ printf("you win!\n"); } printf("你輸了,下面是雷區(qū)的分布\n"); ShowBoard(mine_board, ROW, COL); printf("play again? \n"); }
2.6 設定游戲開始or退出
這里設定如果用戶輸入的為1,則開始游戲;輸入2 則直接退出,如果輸入其他數(shù)字則提升用戶輸入錯誤。
int main() { int quit = 0; int select = 0; while (!quit){ Menu(); scanf("%d", &select); switch (select){ case 1: Game(); break; case 2: quit = 1; break; default: printf("輸入有誤,請重新輸入\n"); } } system("pause"); return 0; }
3. 匯總代碼
然后將上述代碼整合起來,匯總如下:
#include<stdio.h> #include<string.h> #include<time.h> #include<windows.h> #pragma warning(disable:4996) #define ROW 12 #define COL 12 #define NUMS 20 void Menu() { printf("##########################\n"); printf("## 1:Play 2:Exit ##\n"); printf("##########################\n"); printf("請輸入# "); } void SetMines(char mine_board[][COL], int row, int col) { int count = NUMS; //設置雷 while (count){ int x = rand() % 10 + 1; int y = rand() % 10 + 1; if (mine_board[x][y] == '0'){ mine_board[x][y] = '1'; count--; } } } int GetMines(char mine[][COL], int row, int col, 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'; } static void ShowLine(int nums) { printf("---"); for (int i = 0; i < nums; i++){ printf("-"); } printf("\n"); } void ShowBoard(char show_board[][COL], int row, int col) { printf(" "); for (int i = 1; i < row - 1; i++){ //行的數(shù)字 printf(" %2d", i); } printf("\n"); ShowLine(2 * col + col + 4); for (int i = 1; i < row - 1; i++){ //列的數(shù)組 printf("%2d|", i); for (int j = 1; j < col - 1; j++){ printf(" %c |", show_board[i][j]); } printf("\n"); ShowLine(2 * col + col + 4); } } void Game() { char show_board[ROW][COL]; char mine_board[ROW][COL]; memset(show_board, '*', sizeof(show_board)); memset(mine_board, '0', sizeof(mine_board)); srand((unsigned long)time(NULL)); SetMines(mine_board, ROW, COL); int count = (ROW - 2)*(COL - 2) - NUMS; int x = 0; int y = 0; do{ ShowBoard(show_board, ROW, COL); printf("請輸入位置# "); scanf("%d %d", &x, &y); if (x<1 || x>10 || y<1 || y>10){ printf("輸入越界,請重新輸入!\n"); continue; } if (show_board[x][y] != '*'){//證明位置被排過了 printf("該位置已被排除,請重新輸入!\n"); continue; } if (mine_board[x][y] == '1'){//沒點到雷 break; } int num = GetMines(mine_board, ROW, COL, x, y); show_board[x][y] = num + '0'; count--; } while (count > 0); if (count > 0){ printf("you loss!\n"); } else{ printf("you win!\n"); } printf("你輸了,下面是雷區(qū)的分布\n"); ShowBoard(mine_board, ROW, COL); printf("play again? \n"); } int main() { int quit = 0; int select = 0; while (!quit){ Menu(); scanf("%d", &select); switch (select){ case 1: Game(); break; case 2: quit = 1; break; default: printf("輸入有誤,請重新輸入\n"); } } system("pause"); return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C語言報錯Use of Uninitialized Variable的原因及解決方案
Use of Uninitialized Variable是C語言中常見且危險的錯誤之一,它通常在程序試圖使用一個未初始化的變量時發(fā)生,本文將詳細介紹Use of Uninitialized Variable的產(chǎn)生原因,提供多種解決方案,并通過實例代碼演示如何有效避免和解決此類錯誤,需要的朋友可以參考下2024-06-06VC++實現(xiàn)的OpenGL線性漸變色繪制操作示例
這篇文章主要介紹了VC++實現(xiàn)的OpenGL線性漸變色繪制操作,結合實例形式分析了VC++基于OpenGL進行圖形繪制的相關操作技巧,需要的朋友可以參考下2017-07-07