1. 程式人生 > >掃雷遊戲的C語言實現

掃雷遊戲的C語言實現

在學習C語言初期,我們可以找一些平常玩的遊戲進行簡單的C語言實現。今天就和大家分享一下關於windows中掃雷遊戲的實現。

在正式寫程式碼前,簡單說一下對這個遊戲的分析:
1.先提示的應該是一個簡單的menu,其中包括“play”和“exit”;
2.在main函式中應該是一個test的函式,主要測試整個遊戲;
3.在test中應該是可以讓遊戲進行迴圈玩的,所以需要包括一個while語句,while語句的主要部分是每次提示玩遊戲;
4.關於掃雷的整個實現是用play_game實現的,在這個部分我們需要考慮怎樣去實現這個功能;
5.根據上面分析,我們只需要在play_ game中實現初始化掃雷(init_game)和掃雷(sweep)即可;
6.在初始化掃雷(init_game)中,我們需要對介面中雷的位置進行處理,需要一個set _mine;
7.在掃雷(sweep)中,按照整個遊戲的邏輯,需要對座標進行一個判斷,有無雷,沒有雷的話,周圍有多少顆雷。

整個遊戲的邏輯就是這些,每一個函式的實現中嵌套了一個函式。
main->test->play_game->init _game和sweep

Mine_sweeper.h(標頭檔案)

#ifndef __MINE_H__
#define __MINE_H__

enum op
{
    EXIT,
    PLAY
};

#define ROWS 11
#define COLS 11
#define COUNT 30

void init_game(char mine[ROWS][COLS],char show[ROWS][COLS]);   //初始化掃雷介面
void set_mine(char mine[ROWS
][COLS]); //設定雷區 void get_num(int x, int y); //隨機產生雷的位置 void display(char show[ROWS][COLS]); //打印出介面 void sweep(char mine[ROWS][COLS], char show[ROWS][COLS]); //開始掃雷 int get_mine(char mine[ROWS][COLS], int x, int y); //附近雷的個數 #endif
Mine_sweeper.c(掃雷主要功能實現)

#define _CRT_SECURE_NO_WARNINGS 1
#include"Mine_sweeper.h"
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> void init_game(char mine[ROWS][COLS], char show[ROWS][COLS]) //初始化掃雷介面 { memset(mine, '0', ROWS*COLS*sizeof(char)); memset(show, '*', ROWS*COLS*sizeof(char)); set_mine(mine); } int get_mine_num(int x, int y) //隨機產生雷的位置 { return rand() % (y - x + 1) + x; } void set_mine(char mine[ROWS][COLS]) //設定雷區 { int count = COUNT; int x = 0; int y = 0; srand((unsigned)time(NULL)); while (count) { x = get_mine_num(1, 9); y = get_mine_num(1, 9); if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } void display(char show[ROWS][COLS]) //打印出介面 { int i = 0; int j = 0; printf(" "); for (i = 1; i < COLS - 1; i++) { printf(" %d ", i); } printf("\n"); for (i = 1; i < ROWS - 1; i++) { printf("%d", i); for (j = 1; j < COLS - 1; j++) { printf(" %c ", show[i][j]); } printf("\n"); } } void sweep(char mine[ROWS][COLS], char show[ROWS][COLS])//開始掃雷 { int count = 0; int x = 0; int y = 0; while(count!=((ROWS-2)*(COLS-2)-COUNT)) { printf("請輸入座標>:"); scanf("%d%d", &x, &y); if (mine[x][y] == '1') { printf("踩雷了!\n"); return; } else { int ret = get_mine(mine, x, y); show[x][y] = ret + '0'; display(show); count++; } } printf("恭喜你贏了!\n"); display(mine); } int get_mine(char mine[ROWS][COLS], int x, int y) //附近雷的個數 { int count = 0; if (mine[x - 1][y - 1] == '1') count++; //座標位置的上3個 if (mine[x - 1][y] == '1') count++; if (mine[x - 1][y + 1] == '1') count++; if (mine[x][y - 1] == '1') count++; //座標位置的左右 if (mine[x][y + 1] == '1') count++; if (mine[x + 1][y - 1] == '1') count++; //座標位置的下3個 if (mine[x + 1][y] == '1') count++; if (mine[x + 1][y + 1] == '1') count++; return count; }
test.c(測試函式)

#define _CRT_SECURE_NO_WARNINGS 1
#include"Mine_sweeper.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
    printf("********************\n");
    printf("****  1.play  ******\n");
    printf("****  0.exit  ******\n");
    printf("********************\n");
}

void play_game()
{
    char mine[ROWS][COLS];
    char show[ROWS][COLS];
    init_game(mine, show);
    display(show);
    sweep(mine, show);
}

void test()
{
    int input = 0;
    do
    {
        menu();
        printf("請輸入指令>:");
        scanf("%d", &input);
        switch (input)
        {
        case PLAY:
            play_game();
            break;
        case EXIT:
            break;
        }
    } while(input);
}

int main()
{
    test();
    system("pause");
}

踩雷
贏了
(1表示雷的位置,0表示沒有雷。帶*的是顯示的介面,1/0的是帶雷的介面。)

整個程式碼就是這麼多,總體來說遊戲的介面是比較low的,但是遊戲的功能還是比較完善的。在寫程式碼的時候一定先要梳理好整個邏輯,然後一步一步實現。