扫雷游戏

using UnityEngine;

using System.Collections;

using System.Collections.Generic;



//public enum GameState

//{

//    NormalState,

//    MineState,

//}

//坐标数据

// 这个类主要是用来存储当前方格的状态和是否有雷

public class Point

{

    public int x;

    public int y;

    public int flag;// 0 表示未翻开,1表示以翻开 2表示标记为雷

    public int state;//0 表示没有雷 1表示有地雷

    //private int nabar; //周围的炸弹数量

    public Point(int _x, int _y)

    {

        this.x = _x;

        this.y = _y;

        this.flag = 0;

        this.state = 0;

    }

    public int Flag

    {

        get{return flag;}

        set{flag = value;}

    }

}

public class GamePlayScript : MonoBehaviour {



    public Texture2D bg;

    public Texture2D mine;

    public Texture2D[] number;

    public Texture2D flagImage;

    public Texture2D error;

    public GUISkin skin;// GUI皮肤

    public int row;// 地图的行数

    public int col;// 地图的列数

    public int countMine;//输入随机的雷数

    

    const int GameWidth = 320;// 游戏窗体的宽

    const int GameHeight = 480;

    const int blankWidth = 32;// 方块的宽

    const int blankHeight = 32;

    

    static int clearMines = 0;  //成功清除炸弹数量

    static int gameTime = 0;

    static int sec = 0;

    static int minute = 0;

//    public float updateInterval = 0.5F;

//    private double lastInterval;

//    private int frames = 0;

//    private float fps;

    

    float secTime;// 定时器

    float mouseX;// 鼠标点击的x坐标

    float mouseY;// 鼠标点击的y坐标

    Texture2D[,] tempImage;

    int[,] isMine;// 存放随机数据的 0没有1是有雷

    Point[,] point;// 存储当前方格的状态和是否有雷

    bool isWin;

    bool isOver;

    float tempTime;// 2秒后跳转界面



    

    // Use this for initialization

    void Awake () {

        mouseX = 0f;

        mouseY = 0f;

        isWin = false;

        isOver = false;

        tempTime = 0f;

        secTime = 0f;

//        lastInterval = Time.realtimeSinceStartup;

//        frames = 0;

        RandomMine();

        InitDatas();

    }

    

    // Update is called once per frame

    void Update () {

        if(!isWin && !isOver)

        {

            MouseListener(); //鼠标监听事件

            if( secTime > 1f )

            {

                secTime = 0;

                sec = ++gameTime;

                sec %= 60;

                if( 0 == gameTime % 60 )

                {

                    minute += 1;

                    if(0 == gameTime % 3600)

                    {

                        minute = 0;

                    }

                }

            }

            else{

                secTime += Time.deltaTime;

            }

        }

    }

//    void ClockTime()//一个FPs计时器

//    {

//        ++frames;

//        float timeNow = Time.realtimeSinceStartup;

//        if (timeNow > lastInterval + updateInterval) {

//            fps = frames / (timeNow - (float)lastInterval);

//            frames = 0;

//            lastInterval = timeNow;

//        }

//    }

    void OnGUI()

    {

        GUI.skin = skin;

        GUI.Window( 1,new Rect(((Screen.width - (int)GameWidth) >> 1)+15,(Screen.height - (int)GameHeight) >> 1, GameWidth, GameHeight ),WindowFun,"扫雷" );

        for(int i = 1; i < row; ++i)

        {

            for(int j = 1; j < col; ++j)

            {

                GUI.Button(new Rect( j * blankWidth + ((Screen.width - blankWidth * col ) >> 1), i * blankHeight + ((Screen.height - blankHeight * row) >> 1) ,blankWidth,blankHeight),tempImage[i,j]);

            }

        }

        GUI.skin.label.alignment = TextAnchor.MiddleCenter;

        GUI.skin.label.normal.textColor = Color.red;

        GUI.skin.label.fontSize = 18;

        GUI.Label( new Rect(((Screen.width - (int)GameWidth) >> 1)+20,(Screen.height - (int)GameHeight) >> 1,100f,20f ), minute.ToString() + ":" + sec.ToString());//

        if( isWin )

        {

            

            GUI.skin.label.fontSize = 40;

            GUI.skin.label.normal.textColor = Color.red;

            GUI.Label(new Rect( 0f,0f,Screen.width, Screen.height),string.Format("您胜利了"));

            if( tempTime > 4f )

            {

                Application.LoadLevel("Menu");

            }

            else

                tempTime += Time.deltaTime;

        }

        if( isOver )

        {

            //GUI.skin.label.alignment = TextAnchor.MiddleCenter;

            GUI.skin.label.fontSize = 40;

            GUI.skin.label.normal.textColor = Color.red;

            GUI.Label(new Rect( 0f,0f,Screen.width, Screen.height),string.Format("您失败了"));

            if( tempTime > 4f )

            {

                Application.LoadLevel("Menu");

            }

            else

                tempTime += Time.deltaTime;

        }

    }

    public void RandomMine()

    {

        tempImage = new Texture2D[row+1,col+1];

        isMine = new int[row+1,col+1];

        for(int i = 1; i < row; ++i)

        {

            for(int j = 1; j < col; ++j)

            {

                isMine[i,j] = 0;//没有雷

                tempImage[i,j] = bg;

            }

        }

        int count = 0;

        while(count < countMine)

        {

            int i = Random.Range(1,row);

            int j = Random.Range(1,col);

            if( 0 == isMine[i,j] )

            {

                isMine[i,j] = 1;//放置雷

                count++;

                //tempImage[i,j] = mine;//测试查看地雷位置

            }

        }

    }

    public void InitDatas()

    {

        point = new Point[row+1,col+1];

        for(int i = 1; i < row; ++i)

        {

            for(int j = 1; j < col; ++j)

            {

                point[i,j] = new Point(i,j);

                point[i,j].state = isMine[i,j];

            }

        }

    }

    public void MouseListener()

    {

        mouseX = Input.mousePosition.x;

        mouseY = Screen.height - Input.mousePosition.y;

        int r = (int)(mouseY - ((Screen.height - blankHeight * row) >> 1)) / blankHeight;

        int c = (int)(mouseX - ((Screen.width - blankWidth * col) >> 1)) / blankWidth;

        if(Input.GetMouseButtonDown(0))

        {

            if( 1 == isMine[r,c] )//点中雷 gameover

            {

                tempImage[r,c] = mine;

                isOver = true;

            }

            else

            {

                int count = MineCount(r,c);

                

                if( 0 == count ) //如果该砖块周围没有地雷就进打开周围砖块

                {

                    Clear(r,c);

                }

                else{

                    point[r,c].flag = 1;

                }

                CheckGame();

            }

        }

        if(Input.GetMouseButtonDown(1))//右键插红旗

        {

            RightBtnMine(r,c);

        }

    }

    //计算周围地雷的数量并根据地雷数量在该砖块上添加相应数值图片

    public int MineCount(int i, int j)

    {

        int row = i;

        int col = j;

        int countMine = 0;

                // right

                if( 1 == isMine[i,j+1] )

                {

                    countMine++;            

                }//bottom

                

                if( 1 == isMine[i+1,j] )

                {

                    countMine++;        

                }

                // left

                if( 1 == isMine[i,j-1])

                {

                    countMine++;

                }

                // top

                if(1 == isMine[i-1,j])

                {

                    countMine++;

                }//left top 

                if(1 == isMine[i-1,j-1])

                {

                    countMine++;

                }//left bottom

                if(1 == isMine[i+1,j-1])

                {

                    countMine++;

                }//right top

                if(1 == isMine[i-1,j+1])

                {

                    countMine++;

                }

                if(1 == isMine[i+1,j+1])

                {

                    countMine++;

                }



        //Debug.Log( countMine.ToString() );

        

        tempImage[row,col] = number[countMine];

        return countMine;

    }

    

    //清除周围没有地雷砖块周围的砖块

    public void Clear(int x, int y)

    {

        int i = x;

        int j = y;

        // 如果不是未翻开状态,则退出

        if( 0 != point[i,j].flag )

            return;

        point[i,j].flag = 1;

        if(point[i,j].state == 0)

        {

            //当前的周围没有雷,就进行递归的排雷 

            if( 0 == isMine[i,j] )//

            {  

                if(j+1 < col && 0 == MineCount(i,j+1)){Clear(i,j+1);}

                if(i+1 < row && 0 == MineCount(i+1,j)){Clear(i+1,j);}

                if(j-1 >= 1 && 0 == MineCount(i,j-1)){Clear(i,j-1);}    

                if(i-1 >= 1 && 0 == MineCount(i-1,j)){Clear(i-1,j);}

                if(i-1 >= 1 && j-1 >= 1 && 0 == MineCount(i-1,j-1)){Clear(i-1,j-1);}

                if(i+1 < row && j-1 >= 1 && 0 == MineCount(i+1,j-1)){Clear(i+1,j-1);}

                if(i-1 >= 1 && j+1 < col && 0 == MineCount(i-1,j+1)){Clear(i-1,j+1);}

                if(i+1 < row && j+1 < col && 0 == MineCount(i+1,j+1)){ Clear(i+1,j+1);}

                

            }

        }

        CheckGame();

        

    }

    public void RightBtnMine(int x, int y)

    {

        int i = x;

        int j = y;

        // 已经翻开则不能右击

        if( 1 == point[i,j].flag)

            return;

        // 没有翻开则插红旗

        if( 0 == point[i,j].flag )

        {

            tempImage[i,j] = flagImage;

            if( 1 == point[i,j].state )

                clearMines++;//扫雷数增加

            

            point[i,j].flag = 2;

        }

        // 判断不是地雷则选回来

        else 

        {

            tempImage[i,j] = bg;

            if( 1 == point[i,j].state)

                clearMines--;

            

            point[i,j].flag = 0;

        }

        CheckGame();

    }

    public void CheckGame()

    {

        //清除所有雷 

        Debug.Log(string.Format("clerMines={0}",clearMines));

        if( clearMines == countMine )

        {

            for(int i = 1; i < row; ++i)

            {

                for(int j = 1; j < col; ++j)

                {

                    if( tempImage[i,j] == bg )

                    {

                        return;//还有没有翻开的

                    }

                }

            }

            Debug.Log(string.Format("nin win l"));

            isWin = true;

        }

    }

    public void WindowFun(int id)

    {

        

    }

}

 

你可能感兴趣的:(游戏)