C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷小游戲
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷的具體代碼,供大家參考,具體內(nèi)容如下
聲明
本次掃雷小游戲用多文件來(lái)編寫(xiě)。首先,要自定義的一個(gè)頭文件 mine.h,里面有掃雷程序里面所需要的頭文件、常量和所有函數(shù)的聲明。其次,創(chuàng)建主函數(shù) test.c,用自己喜歡的方式構(gòu)建一個(gè)游戲的框架,最后,創(chuàng)建自定義函數(shù) mine.c,編寫(xiě)各項(xiàng)功能。
設(shè)計(jì)思路
1、先寫(xiě)主函數(shù),理清整個(gè)游戲流程。
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、根據(jù)主函數(shù)的需要,先寫(xiě)菜單函數(shù) Menu(),這個(gè)函數(shù)很簡(jiǎn)單,只需要 printf 就好,菜單的樣子也是自主設(shè)計(jì)。
static void Menu() { printf("===========================\n"); printf("| 掃雷 |\n"); printf("| 1.Play |\n"); printf("| 2.Exit |\n"); printf("===========================\n"); printf(" Please Select:"); }
3、編寫(xiě)Game()函數(shù),在這個(gè)函數(shù)里我們將要實(shí)現(xiàn)掃雷游戲的全部?jī)?nèi)容。也是一樣的,在這個(gè)函數(shù)里先寫(xiě)一個(gè)大的框架,構(gòu)建需要的函數(shù),然后再根據(jù)我們的需求在 mine.c 里設(shè)計(jì)所有我們需要的自定義函數(shù)。
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("請(qǐng)輸入你要掃的位置-> "); scanf("%d %d", &x, &y); if (x < 1 || x > 10 || y < 1 || y > 10){//[1,10] printf("你輸入的位置是錯(cuò)誤的,請(qǐng)重新輸入...\n"); Sleep(1000); continue; } if (board[x][y] != ' '){ printf("你輸入的位置已經(jīng)被掃過(guò),請(qǐng)重新輸入...\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 = "** 掃雷結(jié)束, 你被炸死了! **\n"; } else{ result = "**掃雷結(jié)束,恭喜你,成功啦! **\n"; } printf("-------------------------------\n"); printf("%s", result); printf("-------------------------------\n"); ShowBoard(mine, ROW, COL); }
4、創(chuàng)建雷盤(pán),還需要記錄掃描雷盤(pán)。掃雷的面板是通過(guò)定義的宏來(lái)自定義大小。需要注意的是在算某個(gè)坐標(biāo)的周?chē)卸嗌賯€(gè)地雷的時(shí)候需要掃描他周?chē)?個(gè)格子,所以給二維數(shù)組多定義一圈,讓它們初始化跟內(nèi)圈一樣為‘0',這樣掃描的時(shí)候就不算那些格子了。
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、最后我們要一個(gè)函數(shù)來(lái)隨機(jī)擺放地雷的位置,那么就有了SetMine函數(shù)。
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--; } }
這里說(shuō)一下,因?yàn)殡S機(jī)所以需要 rand()庫(kù)函數(shù),但是調(diào)用rand之前,要在 Game()中寫(xiě)一句
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("請(qǐng)輸入你要掃的位置-> "); scanf("%d %d", &x, &y); if (x < 1 || x > 10 || y < 1 || y > 10){//[1,10] printf("你輸入的位置是錯(cuò)誤的,請(qǐng)重新輸入...\n"); Sleep(1000); continue; } if (board[x][y] != ' '){ printf("你輸入的位置已經(jīng)被掃過(guò),請(qǐng)重新輸入...\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 = "** 掃雷結(jié)束, 你被炸死了! **\n"; } else{ result = "**掃雷結(jié)束,恭喜你,成功啦! **\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; }
總結(jié)
總的來(lái)說(shuō),在編寫(xiě)代碼的時(shí)候還是得有一個(gè)清晰的思路,搭建框架,再細(xì)分其中細(xì)節(jié),需要什么就去編寫(xiě)什么。代碼很簡(jiǎn)單,但很經(jīng)典,希望對(duì)你有所幫助。
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專(zhuān)題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲
- C語(yǔ)言掃雷游戲的實(shí)現(xiàn)代碼
- C語(yǔ)言代碼實(shí)現(xiàn)掃雷游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲
- C語(yǔ)言代碼實(shí)現(xiàn)掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)掃雷游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小程序
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
- C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Windows系統(tǒng)下使用C語(yǔ)言編寫(xiě)單線程的文件備份程序
這篇文章主要介紹了Windows系統(tǒng)下使用C語(yǔ)言編寫(xiě)單線程的文件備份程序,文中給出了實(shí)現(xiàn)的幾個(gè)關(guān)鍵代碼片段,剩下的只要套上main和線程調(diào)用的相關(guān)函數(shù)即可,非常詳細(xì),需要的朋友可以參考下2016-02-02C/C++實(shí)現(xiàn)string和int相互轉(zhuǎn)換的常用方法總結(jié)
在C++編程中,經(jīng)常需要在字符串(string)和整型(int)之間進(jìn)行轉(zhuǎn)換,本文將詳細(xì)介紹幾種在C和C++中實(shí)現(xiàn)這兩種類(lèi)型轉(zhuǎn)換的常用方法,有需要的可以參考下2024-01-01介紹C語(yǔ)言中tolower函數(shù)的實(shí)例
這篇文章主要介紹了介紹C語(yǔ)言中tolower函數(shù)的實(shí)例,本文列出了該函數(shù)的頭文件,功能說(shuō)明等,以及如何使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07