中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用C語言代碼實現掃雷游戲

發布時間:2022-08-03 15:27:42 來源:億速云 閱讀:149 作者:iii 欄目:開發技術

今天小編給大家分享一下怎么使用C語言代碼實現掃雷游戲的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、游戲介紹

掃雷游戲是在一個指定的二維空間里,隨機布置雷,把不是雷的位置都找出來,在你點一個位置的時候它會顯示它周圍全部雷的個數,根據這個線索去找 ,會更容易贏。

二、實現模塊

文件名                作用
clear_mine.h      三子棋的函數聲明,頭文件聲明等
clear_mine.c      三子棋函數接口的實現
main.c               三子棋函數測試功能

三、實現原理

1、用兩個2維數組保存掃雷信息,一個用來設置雷,另一個用來展示看不見的雷,并把周圍的雷的個數統計出來展示。
2、也就是當在排查雷輸入坐標的時候要使用這個兩個數組,這個坐標位置在設置雷的數組里面如果不是雷,就統計它周圍雷個數放在另一個數組里面進行顯示。直到我們排查排查 ROW乘COL-雷個數次,即可勝利
3、這里面最重要的怎樣在方格位置上是顯示個數,用字符是最方便的,不是雷的初始化為字符0,是雷放字符置為1。當一個位置上不是雷把他周圍8個的字符加起來-去8*字符0就是有多少個雷的個數。再把雷的個數轉化為字符放在可視化數字里面顯示,只需要個數加上字符0即可。

四、實現邏輯

(一)、創建menu菜單函數

void menu()
{
    printf("###########  1、游戲開始 ##########\n");
    printf("###########  2、退出   ##############\n");
}

(二)、用switch語句去創建game游戲開始函數和退出功能

void game()
{
    //用2個棋盤即兩個2維數組,一個進行放雷另一個進行展示棋盤信息
    char mine[ROWS][COLS] = { 0 };
    char show[ROWS][COLS] = { 0 };
    Init(mine,ROWS,COLS,'0');//先把放雷的數組初始化為字符0
    Init(show,ROWS, COLS, '*');//再把棋盤信息初始化為字符*
    set_mine(mine, ROW, COL );//放置雷
    show1(show, ROW, COL);//展示棋盤信息
    clear_mine(mine, show, ROW, COL);//排查雷
}
int main()
{
    int insert = 0;
    srand((unsigned int)time(NULL));
    do{
        menu();
        printf("請選擇:");
        scanf("%d", &insert);
        switch (insert)
        {
        case 1:
            game();
            break;
        case 2:
            printf("退出游戲");
            break;
        default:
            printf("請重新輸入");
            break;
        }

    } while (insert);
}

(三)、在void game()函數里面創建上層調用框架

(1)、初始化棋盤并可視化棋盤

1、創建兩個數組一個mine數組,一個是show數組并初始化,把它們分別置為字符0和字符*。然后創建一個打印棋盤函數以便呈現我們眼前。我們先調用Init和show1函數來看一下打印效果。
2、需要注意的是我們用二維數組打印兩個棋盤,我們就是要打印9x9的棋盤?答案不是,因為我們在設計算法時需要統計坐標周圍8個方位的個數,假如要統計邊界周圍雷的個數,那么就會有數組越界的問題,那么我們就需要在9×9的基礎上加2,這些元素我們不打印,心里有數就行。

怎么使用C語言代碼實現掃雷游戲

void Init(char a[][COLS], int rows, int cols, char set)
{
    int i = 0;
    int j = 0;
    for(i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            a[i][j] = set;
        }
    }
}
void show1(char a[][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    for (j = 0; j <col+1; j++)
    {
        printf("%d ", j);
    }
    printf("\n");
    for (i = 1; i < row+1; i++)
    {
        printf("%d ", i);
        for (j= 1; j <col+1; j++)
        {
            printf("%c ", a[i][j]);
        }
        printf("\n");
    }
;
}

怎么使用C語言代碼實現掃雷游戲

(2)、設置雷

這一步我門要去設置雷,就在剛剛我們初始化的mine數組里面去放隨機雷,這個雷我們可以指定大小 我們定義宏,以便可以方便改。當然我們要現在測試函數main里面設置一個隨機數生成器。然后再set_mine函數設置rand函數生成隨機坐標。我們雷置為字符1,以便我更好計算。如圖代碼:

void set_mine(char mine[][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    int x = 0;
    int y = 0;
    int count = mine_count;//雷的個數
    while (count)
    {
        x = rand() % row + 1;//生成一到0的數
        y = rand() % col + 1;
        if (mine[x][y] == '0')
        {
            mine[x][y] = '1';
            count--;
        }
    }
        
}

(3)、展示棋盤信息

展示棋盤信息是剛才我們初始化的show函數里面 放的都是字符*,在這里就調用一次來開始玩游戲,進行第一次掃雷。
如圖效果:

怎么使用C語言代碼實現掃雷游戲

(4)、排查雷

1、這一步是游戲的核心,進行排查雷,要輸入坐標就要先考慮它的合法性。
2、要要考慮他是否被排查過 也就是去重性。
3、在進行判斷這個坐標在mine數組里面是否是字符1,如果是游戲結束,反之則把他周圍的雷數統計出來給show數組,再調用show1來顯示。
4、最一步判斷排雷是否成功,只要排了ROW*COL-雷個數次,說明排雷成功。

void clear_mine(char  mine[][COLS], char show[][COLS], int row, int col)
{
    int x = 0;
    int y = 0;
    int count = 0;
    while (count = row*col - mine_count)
    {
        printf("請輸入坐標:");
        scanf("%d %d", &x, &y);
        if (x >= 1&& x <= row && y >= 1 && y <= col)
        {
            if (show[x][y] == '*')
            {
                if (mine[x][y] != '1')
                {
                    int count1 = 0;
                    count1 = round_mineCount(mine, x, y);
                    show[x][y] = count1 + '0';
                    show1(show, row, col);
                    count--;
                }
                else
                {
                    printf("踩到雷,游戲結束\n");
                    show1(mine, row, col);
                    break;
                }
            }
            else
            {
                printf("已經被排查\n");
            }
        }
        else
        {
            printf("坐標非法,請重新輸入\n");
        }
        if (count == 0)
        {
            printf("排雷成功");
            show1(mine, row, col);
        }
    }
}
//t統計雷的個數,八個方向
int round_mineCount(char mine[][COLS],int x,int y)
{
    return  ( mine[x - 1][y] + mine[x + 1][y] +
        mine[x][y - 1] + mine[x][y + 1] +
        mine[x - 1][y - 1] + mine[x - 1][y + 1]
        + mine[x + 1][y - 1] + mine[x + 1][y + 1]-8*'0');
}

五、全部代碼

main.c

#include"clear_mine.h"
void menu()
{
    printf("###########  1、游戲開始 ##########\n");
    printf("###########  2、退出   ##############\n");
}
void game()
{
    //用2個棋盤即兩個2維數組,一個進行放雷另一個進行展示棋盤信息
    char mine[ROWS][COLS] = { 0 };
    char show[ROWS][COLS] = { 0 };
    Init(mine,ROWS,COLS,'0');//先把放雷的數組初始化為字符0
    Init(show,ROWS, COLS, '*');//再把棋盤信息初始化為字符*
    set_mine(mine, ROW, COL );//放置雷
    show1(show, ROW, COL);//展示棋盤信息
    clear_mine(mine, show, ROW, COL);//排查雷
}
int main()
{
    int insert = 0;
    srand((unsigned int)time(NULL));
    do{
        menu();
        printf("請選擇:");
        scanf("%d", &insert);
        switch (insert)
        {
        case 1:
            game();
            break;
        case 2:
            printf("退出游戲");
            break;
        default:
            printf("請重新輸入");
            break;
        }

    } while (insert);
}

clear_mine.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10//設置雷的個數
#define count2 row*col-Count
void Init(char a[][COLS], int rows,int cols, char set);//初始化棋盤
void set_mine(char mine[][COLS], int row, int col);//設置雷
void show1(char a[][COLS], int row, int col);//展示棋盤信息
void clear_mine(char mine[][COLS], char show[][COLS], int row, int col);// 排查雷
int  round_mineCount(char mine[][COLS], int row, int col);//統計一個位置周圍的雷的個數

clear_mine.c

#include"clear_mine.h"
void Init(char a[][COLS], int rows, int cols, char set)
{
    int i = 0;
    int j = 0;
    for(i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            a[i][j] = set;
        }
    }
}
void show1(char a[][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    for (j = 0; j <col+1; j++)
    {
        printf("%d ", j);
    }
    printf("\n");
    for (i = 1; i < row+1; i++)
    {
        printf("%d ", i);
        for (j= 1; j <col+1; j++)
        {
            printf("%c ", a[i][j]);
        }
        printf("\n");
    }
;
}
void set_mine(char mine[][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    int x = 0;
    int y = 0;
    int count = mine_count;
    while (count)
    {
        x = rand() % row + 1;
        y = rand() % col + 1;
        if (mine[x][y] == '0')
        {
            mine[x][y] = '1';
            count--;
        }
    }
        
}
void clear_mine(char  mine[][COLS], char show[][COLS], int row, int col)
{
    int x = 0;
    int y = 0;
    int count = 0;
    while (count = row*col - mine_count)
    {
        printf("請輸入坐標:");
        scanf("%d %d", &x, &y);
        if (x >= 1&& x <= row && y >= 1 && y <= col)
        {
            if (show[x][y] == '*')
            {
                if (mine[x][y] != '1')
                {
                    int count1 = 0;
                    count1 = round_mineCount(mine, x, y);
                    show[x][y] = count1 + '0';
                    show1(show, row, col);
                    count--;
                }
                else
                {
                    printf("踩到雷,游戲結束\n");
                    show1(mine, row, col);
                    break;
                }
            }
            else
            {
                printf("已經被排查\n");
            }
        }
        else
        {
            printf("坐標非法,請重新輸入\n");
        }
        if (count == 0)
        {
            printf("排雷成功");
            show1(mine, row, col);
        }
    }
}
int round_mineCount(char mine[][COLS],int x,int y)
{
    return  ( mine[x - 1][y] + mine[x + 1][y] +
        mine[x][y - 1] + mine[x][y + 1] +
        mine[x - 1][y - 1] + mine[x - 1][y + 1]
        + mine[x + 1][y - 1] + mine[x + 1][y + 1]-8*'0');
}

六、運行結果

怎么使用C語言代碼實現掃雷游戲

以上就是“怎么使用C語言代碼實現掃雷游戲”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

土默特右旗| 山西省| 公安县| 鸡泽县| 马关县| 岳阳市| 五原县| 平顶山市| 宜宾县| 政和县| 金寨县| 普安县| 嘉定区| 台前县| 华宁县| 青铜峡市| 得荣县| 法库县| 浠水县| 富民县| 云南省| 措美县| 林周县| 太白县| 贵定县| 鹿邑县| 虹口区| 连城县| 宝坻区| 雅安市| 明星| 大邑县| 静宁县| 田林县| 徐州市| 谢通门县| 东阳市| 定日县| 新乡县| 锦州市| 郁南县|