C语言实现扫雷

作者: 修夏之夏i | 来源:发表于2018-04-05 22:12 被阅读0次

    game.h

    #ifndef __GAME_H__  
    #define __GAME_H__  
    
    #define  ROWS 10  
    #define  COLS 10  
    #define DEFAULT_COUNT 20  
    typedef unsigned int uint_t;//类型重命名  
    
    #include<string.h>  
    #include<stdio.h>  
    #include<time.h>  
    #include<stdlib.h>  
    
    void init_board(char arr[ROWS + 2][COLS + 2], int row, int col, char ch);//初始化  
    void display(char arr[ROWS + 2][COLS + 2], int row, int col);
    void mine_set(char arr[ROWS + 2][COLS + 2], int row, int col);//放雷  
    int get_mine_num(char arr[ROWS + 2][COLS + 2], int row, int col);//统计坐标周围雷的个数  
    
    
    #endif  //__GAME_H__  
    
    

    game.c

    #define _CRT_SECURE_NO_WARNINGS 1  
    #include "game.h"  
    #include<stdlib.h>  
    #include<stdio.h>  
    #include<string.h>  
    
    void init_board(char arr[ROWS + 2][COLS + 2], int row, int col, char ch)
    {
        memset(arr, ch, sizeof(char)* row * col);
    }
    void display(char arr[ROWS + 2][COLS + 2], int row, int col)
    {
        int i = 0;
        int j = 0;
        printf("   ");
        for (i = 0; i < col - 2; i++)
        {
            printf("%d ", i + 1);
        }
        printf("\n");
        for (i = 0; i < row - 2; i++)
        {
            printf("%2d ", i + 1);
            for (j = 0; j < col - 2; j++)
            {
                printf("%c ", arr[i + 1][j + 1]);
            }
            printf("\n");
        }
    }
    void mine_set(char arr[ROWS + 2][COLS + 2], int row, int col)
    {
        int x = 0;
        int y = 0;
        int count = DEFAULT_COUNT;
        while (count)
        {
            x = rand() % 10 + 1;
            y = rand() % 10 + 1;
            if (arr[x][y] != '1')
            {
                arr[x][y] = '1';
                count--;
            }
        }
    }
    int get_mine_num(char arr[ROWS + 2][COLS + 2], int x, int y)
    {
        return (arr[x][y - 1] - '0') +
            (arr[x - 1][y - 1] - '0') - +
            (arr[x - 1][y] - '0') +
            (arr[x - 1][y + 1] - '0') +
            (arr[x][y + 1] - '0') +
            (arr[x + 1][y + 1] - '0') +
            (arr[x + 1][y] - '0') +
            (arr[x + 1][y - 1] - '0');//返回周围雷的个数  
    }
    
    

    test.c

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>  
    #include<stdlib.h>  
    #include<time.h>  
    #include "game.h"  
    
    
    void menu()
    {
        printf("********* welcome ********\n");
        printf("**********1.play**********\n");
        printf("**********0.exit**********\n");
    }
    enum Option
    {
        EXIT,
        PLAY
    };
    
    void game()
    {
        int x = 0;
        int y = 0;
        int i = 0;
        int win = 0;
        char mine[ROWS + 2][COLS + 2] = { 0 };
        char show[ROWS + 2][ROWS + 2] = { 0 };
        init_board(mine, ROWS + 2, COLS + 2, '0');
        init_board(show, ROWS + 2, COLS + 2, '*');
        //display(mine, ROWS + 2, COLS + 2);#define _CRT_SECURE_NO_WARNINGS  
        //display(show, ROWS + 2, COLS + 2);  
        mine_set(mine, ROWS + 2, COLS + 2);
        display(mine, ROWS + 2, COLS + 2);
        while (win<ROWS*COLS - DEFAULT_COUNT)
        {
            for (i = 0; i <= win; i++)
            {
                printf("请输入坐标:>");
                scanf("%d%d", &x, &y);
                //合法性判断  
                if ((x>0) && (x <= ROWS) && (y > 0) && (y <= COLS))
                {
                    if ((i == 0) && (mine[x][y] == '1'))
                    {
                        (mine[x][y] = '0');
                    }
                    if (mine[x][y] == '1')
                    {
                        printf("很遗憾,你被炸死了\n");
                        break;
                    }
                    else
                    {
                        int count = 0;
                        win++;
                        count = get_mine_num(mine, x, y);
                        show[x][y] = count + '0';
                        display(show, ROWS + 2, COLS + 2);
                    }
                }
                else
                {
                    printf("输入错误请重新输入\n");
                }
            }
            if (win >= ROWS*COLS - DEFAULT_COUNT)
            {
                printf("恭喜你,扫雷成功\n");
            }
        }
    }
    int main()
    {
        int input = 0;
        srand((uint_t)time(NULL));
        do
        {
            menu();
            printf("请选择:>");
            scanf("%d", &input);
            switch (input)
            {
            case PLAY:
                game();
                break;
            case EXIT:
                break;
            default:
                printf("输入错误,请重新输入\n");
                break;
            }
        } while (input);
        system("pause\n");
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:C语言实现扫雷

        本文链接:https://www.haomeiwen.com/subject/vzodhftx.html