您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了C語言如何實現掃雷小游戲,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
本文實例為大家分享了C語言實現簡易版掃雷的具體代碼,供大家參考,具體內容如下
聲明
本次掃雷小游戲用多文件來編寫。首先,要自定義的一個頭文件 mine.h,里面有掃雷程序里面所需要的頭文件、常量和所有函數的聲明。其次,創建主函數 test.c,用自己喜歡的方式構建一個游戲的框架,最后,創建自定義函數 mine.c,編寫各項功能。
設計思路
1、先寫主函數,理清整個游戲流程。
int main() { int quit = 0; do{ int select = 0; Menu(); scanf("%d", &select); switch (select){ case 1: Game(); printf("Game Over ... Again?\n"); break; case 2: quit = 1; printf("Bye ... \n"); break; default: printf("Error ... Please Select Again!\n"); break; } } while (!quit); system("pause"); return 0; }
2、根據主函數的需要,先寫菜單函數 Menu(),這個函數很簡單,只需要 printf 就好,菜單的樣子也是自主設計。
static void Menu() { printf("===========================\n"); printf("| 掃雷 |\n"); printf("| 1.Play |\n"); printf("| 2.Exit |\n"); printf("===========================\n"); printf(" Please Select:"); }
3、編寫Game()函數,在這個函數里我們將要實現掃雷游戲的全部內容。也是一樣的,在這個函數里先寫一個大的框架,構建需要的函數,然后再根據我們的需求在 mine.c 里設計所有我們需要的自定義函數。
void Game() { srand((unsigned long)time(NULL)); char board[ROW][COL]; char mine[ROW][COL]; InitBoard(board, ROW, COL, ' '); //' ' InitBoard(mine, ROW, COL, '0'); //'0' SetMine(mine, ROW, COL); //ShowBoard(board, ROW, COL); //ShowBoard(mine, ROW, COL); int count = (ROW - 2)*(COL - 2) - NUM; do{ system("cls"); int x = 0; int y = 0; ShowBoard(board, ROW, COL); printf("請輸入你要掃的位置-> "); scanf("%d %d", &x, &y); if (x < 1 || x > 10 || y < 1 || y > 10){//[1,10] printf("你輸入的位置是錯誤的,請重新輸入...\n"); Sleep(1000); continue; } if (board[x][y] != ' '){ printf("你輸入的位置已經被掃過,請重新輸入...\n"); Sleep(1000); continue; } if (mine[x][y] == '0'){ count--; char num = GetNum(mine, x, y); board[x][y] = num; } else{ printf("你輸入的位置(%d, %d),有雷!\n", x, y); break; } } while (count > 0); char *result = NULL; if (count > 0){ result = "** 掃雷結束, 你被炸死了! **\n"; } else{ result = "**掃雷結束,恭喜你,成功啦! **\n"; } printf("-------------------------------\n"); printf("%s", result); printf("-------------------------------\n"); ShowBoard(mine, ROW, COL); }
4、創建雷盤,還需要記錄掃描雷盤。掃雷的面板是通過定義的宏來自定義大小。需要注意的是在算某個坐標的周圍有多少個地雷的時候需要掃描他周圍8個格子,所以給二維數組多定義一圈,讓它們初始化跟內圈一樣為‘0',這樣掃描的時候就不算那些格子了。
void InitBoard(char board[][COL], int row, int col, char elem) { int i = 0; for (; i < row; i++){ int j = 0; for (; j < col; j++){ board[i][j] = elem; } } } void ShowBoard(char board[][COL], int row, int col) { int i = 1; printf(" "); for (; i <= col - 2; i++){ printf(" %-2d|", i); } printf("\n"); for (i = 1; i <= col - 2; i++){ printf("%3s", "----"); } printf("---\n"); for (i = 1; i <= row - 2; i++){ printf("%2d|", i); int j = 1; for (; j <= col - 2; j++){ printf(" %-2c|", board[i][j]); } printf("\n"); for (j = 1; j <= col - 2; j++){ printf("%3s", "----"); } printf("---\n"); } } char GetNum(char mine[][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] - 7 * '0'; }
5、最后我們要一個函數來隨機擺放地雷的位置,那么就有了SetMine函數。
void SetMine(char mine[][COL], int row, int col) { int n = NUM; while (n){ int x = rand() % (row - 2) + 1; int y = rand() % (col - 2) + 1; if (mine[x][y] == '1'){ continue; } mine[x][y] = '1'; n--; } }
這里說一下,因為隨機所以需要 rand()庫函數,但是調用rand之前,要在 Game()中寫一句
srand((unsigned long)time(NULL));
源代碼
mine.h
#ifndef _MINE_H_ #define _MINE_H_ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #pragma warning(disable:4996) #define ROW 10 #define COL 10 #define NUM 10 void Game(); void InitBoard(char board[][COL], int row, int col, char elem); void SetMine(char mine[][COL], int row, int col); void ShowBoard(char board[][COL], int row, int col); char GetNum(char mine[][COL], int x, int y); #endif
mine.c
#include "mine.h" void InitBoard(char board[][COL], int row, int col, char elem) { int i = 0; for (; i < row; i++){ int j = 0; for (; j < col; j++){ board[i][j] = elem; } } } void SetMine(char mine[][COL], int row, int col) { int n = NUM; while (n){ int x = rand() % (row - 2) + 1; int y = rand() % (col - 2) + 1; if (mine[x][y] == '1'){ continue; } mine[x][y] = '1'; n--; } } void ShowBoard(char board[][COL], int row, int col) { int i = 1; printf(" "); for (; i <= col - 2; i++){ printf(" %-2d|", i); } printf("\n"); for (i = 1; i <= col - 2; i++){ printf("%3s", "----"); } printf("---\n"); for (i = 1; i <= row - 2; i++){ printf("%2d|", i); int j = 1; for (; j <= col - 2; j++){ printf(" %-2c|", board[i][j]); } printf("\n"); for (j = 1; j <= col - 2; j++){ printf("%3s", "----"); } printf("---\n"); } } char GetNum(char mine[][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] - 7 * '0'; } void Game() { srand((unsigned long)time(NULL)); char board[ROW][COL]; char mine[ROW][COL]; InitBoard(board, ROW, COL, ' '); //' ' InitBoard(mine, ROW, COL, '0'); //'0' SetMine(mine, ROW, COL); //ShowBoard(board, ROW, COL); //ShowBoard(mine, ROW, COL); int count = (ROW - 2)*(COL - 2) - NUM; do{ system("cls"); int x = 0; int y = 0; ShowBoard(board, ROW, COL); printf("請輸入你要掃的位置-> "); scanf("%d %d", &x, &y); if (x < 1 || x > 10 || y < 1 || y > 10){//[1,10] printf("你輸入的位置是錯誤的,請重新輸入...\n"); Sleep(1000); continue; } if (board[x][y] != ' '){ printf("你輸入的位置已經被掃過,請重新輸入...\n"); Sleep(1000); continue; } if (mine[x][y] == '0'){ count--; char num = GetNum(mine, x, y); board[x][y] = num; } else{ printf("你輸入的位置(%d, %d),有雷!\n", x, y); break; } } while (count > 0); char *result = NULL; if (count > 0){ result = "** 掃雷結束, 你被炸死了! **\n"; } else{ result = "**掃雷結束,恭喜你,成功啦! **\n"; } printf("-------------------------------\n"); printf("%s", result); printf("-------------------------------\n"); ShowBoard(mine, ROW, COL); }
test.c
#include "mine.h" static void Menu() { printf("===========================\n"); printf("| 掃雷 |\n"); printf("| 1.Play |\n"); printf("| 2.Exit |\n"); printf("===========================\n"); printf(" Please Select:"); } int main() { int quit = 0; do{ int select = 0; Menu(); scanf("%d", &select); switch (select){ case 1: Game(); printf("Game Over ... Again?\n"); break; case 2: quit = 1; printf("Bye ... \n"); break; default: printf("Error ... Please Select Again!\n"); break; } } while (!quit); system("pause"); return 0; }
以上就是關于C語言如何實現掃雷小游戲的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。