1. 程式人生 > 程式設計 >C語言實現簡易版掃雷小遊戲

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,'0'); //'0'

 SetMine(mine,COL);
 //ShowBoard(board,COL);
 //ShowBoard(mine,COL);

 int count = (ROW - 2)*(COL - 2) - NUM;
 do{
 system("cls");
 int x = 0;
 int y = 0;
 ShowBoard(board,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",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,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 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 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],char elem);
void SetMine(char mine[][COL],int col);
void ShowBoard(char board[][COL],int col);
char GetNum(char mine[][COL],int y); 

#endif

mine.c

#include "mine.h"

void InitBoard(char board[][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 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],"----");
 }
 printf("---\n");
 }
}
char GetNum(char mine[][COL],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,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++經典小遊戲彙總

python經典小遊戲彙總

python俄羅斯方塊遊戲集合

JavaScript經典遊戲 玩不停

java經典小遊戲彙總

javascript經典小遊戲彙總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。