zoukankan      html  css  js  c++  java
  • 扫雷游戏

    #include<stdio.h>
    #include<stdlib.h>
    class Bomb
    {
    public:
        Bomb(int n, int m) : m_line(n), m_column(m)
        {
            m_arr = new int* [n];
            m_isVisited = new int* [n];
            for (int i = 0; i < n; i++)
            {
                m_arr[i] = new int[m];
                m_isVisited[i] = new int[m];
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    m_isVisited[i][j] = 0;//has not been visited yet
                    m_arr[i][j] = 0;
                }
            }
        };
        ~Bomb() {
            //delete array
        };
        
        int Traversal(int x, int y);
        void Initialize();
        int IsBomb(int x, int y);
        int** m_arr;
        int** m_isVisited;
    private:
        int m_line;
        int m_column;
    
        
      
    
    };
    
    int Bomb::Traversal(int x, int y)
    {
        //out of range
        if (x < 0 || y < 0 || y >= m_column || x >= m_line)
        {
            return 0;
        }
        //(x,y) has been visited before
        if (1 == m_isVisited[x][y])
            return 1;
        if (0 == m_arr[x][y])
        {
            m_isVisited[x][y] = 1; //set it been visited
            Traversal(x - 1, y-1);
            Traversal(x - 1, y);
            Traversal(x - 1, y+1);
            Traversal(x, y - 1);
            Traversal(x, y + 1);
            Traversal(x + 1, y - 1);
            Traversal(x + 1, y);
            Traversal(x + 1, y + 1);
        }
        else {
            //a bomb(999) or number boundary
            if (999 == m_arr[x][y])
                return 0;
            m_isVisited[x][y] = 1; //visit number boudary
     //       printf("%d", m_arr[x][y]);
                return 0;
        }
        return 0;
    
    }
    int Bomb::IsBomb(int x, int y)
    {
        //out of range
        if (x < 0 || y < 0 || y >= m_column || x >= m_line)
        {
            return 0;
        }
        if (999 == m_arr[x][y])
            return 1;
        return 0;
    
    }
    void Bomb::Initialize()
    {
        for (int i = 0; i < m_line; i++)
        {
            for (int j = 0; j < m_column; j++)
            {
                int sum = 0;
                if (999 == m_arr[i][j])
                    continue;
                sum = IsBomb(i - 1, j - 1) + IsBomb(i - 1, j) + IsBomb(i - 1, j + 1) + IsBomb(i, j - 1) + IsBomb(i, j + 1) + IsBomb(i + 1, j - 1) + IsBomb(i + 1, j) + IsBomb(i + 1, j + 1);
                m_arr[i][j] = sum;
            }
        }
    }
    int main(void)
    {
        int n = 0;
        int m = 0;
        scanf_s("%d%d", &n, &m);
        Bomb obj(n,m);
        int x = 0;
        int y = 0;
        scanf_s("%d%d", &x, &y);
        
        for (int i = 0;i < n;i++)
        {
           char tmp = getchar();//eat '
    '
           for (int j = 0;j < m;j++)
            {
                char in = getchar();
                if ('*' == in)
                    obj.m_arr[i][j] = 999;           
            }
        }
     
    
        obj.Initialize();
    #if 0
        for (int i = 0;i < n;i++)
        {
            for (int j = 0;j < m;j++)
            {
                printf("%d", obj.m_arr[i][j]);
            }
            printf("
    ");
        }
    #endif
    
        if (obj.IsBomb(x-1, y-1))
        {
            printf("GG");
            return 0;
        }
        obj.Traversal(x-1, y-1);
    #if 0
        for (int i = 0;i < n;i++)
        {
            for (int j = 0;j < m;j++)
            {
                printf("%d", obj.m_isVisited[i][j]);
            }
            printf("
    ");
        }
    #endif
    
        for (int i = 0;i < n;i++)
        {
            for (int j = 0;j < m;j++)
            {
                if (obj.m_isVisited[i][j] == 1)
                {
                    printf("%d", obj.m_arr[i][j]);
                    continue;
                }
                else
                {               
                    if (obj.m_arr[i][j] == 999)
                        printf("*");
                    else printf(".");
                }
            }
            printf("
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    Delphi中的接口和抽象类
    设计模式之六大原则
    C 标准库
    linux 管道和重定向
    linux c创建静态库(.a)
    一个C语言程序
    C#动态创建lambda表达式
    linq中order by 和group by (含lambda表达式实现)以及综合案例
    微信扫码登陆原理
    二维码扫码支付原理
  • 原文地址:https://www.cnblogs.com/hitzzq/p/13395746.html
Copyright © 2011-2022 走看看