Unity扫雷代码存档


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Game_Mannage : MonoBehaviour
{
//保存场景 雷 旗子 数字
public List<GameObject> QiziObj;
//位置 12*16 192--------------------------------
public int[,] map_position_target; //map_position_target记录map状态 0表示空 1表示雷 2有数字
public GameObject[] map_position_all;
//遮罩数组 12*16 192----------------------------------------
public GameObject[,] mask_all;
public GameObject mask;
//旗子-----------------------------------------------
public GameObject QiZi;
public int QiZi_num=0;//插旗数==雷的数量时判断输赢
public int[,] Qizi_table;//1已插旗
//雷-------------------------------------
public GameObject lei;
public int lei_number = 0;
//雷概率 10-0
public int gailv = 3;
//数字-----------------------
public GameObject[] number;
//鼠标射线点击----------------------
private RaycastHit2D rayhit;
private double timeval = 0;
//游戏状态
public bool gameover = false;
public Text text_lei;
public Text text_flag;
public Text text_level;
public GameObject winer;
public GameObject loser;
public GameObject gaming;
// Start is called before the first frame update 初始化
void Start()
{
if(QiziObj!=null)
ClearFlag();
if(mask_all!=null)
ClearMask();
//初始化数据
gaming.SetActive(true);
winer.SetActive(false);
loser.SetActive(false);
gameover = false;
QiZi_num = 0;
lei_number = 0;
map_position_target = new int[12, 16];
mask_all = new GameObject[12, 16];
Qizi_table= new int[12, 16];
QiziObj = new List<GameObject>();
//生成雷区/遮罩---------------用map_position_target记录map状态
ReSetMap();
//生成数字 标记有数字 2
ReSetNum();
//生成遮罩 12*16
ReSetMask();
//雷ui数量初始化
text_lei.text = lei_number.ToString();
}
private void FixedUpdate()
{
text_level.text = gailv.ToString();
if (!gameover)
{
text_flag.text = QiZi_num.ToString();
//排雷
MouseHit();
//用旗子标记雷
if (timeval < 0.5)
{
TargetLei();
}
timeval -= Time.deltaTime;
}
}
//生成雷区/map_position_target状态--方法
public void ReSetMap()
{
lei_number = 0;
int hang = 0;
int lie = 0;
//遍历所有位置
for (int j = 0; j < 192; j++)
{
//概率生成雷不超过雷数量 图层1
if (Random.Range(0, 10) > 10 - gailv)
{
//雷++生成雷
lei_number++;
QiziObj.Add(Instantiate(lei, map_position_all[j].transform.position, Quaternion.identity));
//标记1 有雷
map_position_target[hang, lie] = 1;
}
else
{
//标记0 无雷
map_position_target[hang, lie] = 0;
}
//列大于15 归0 行++
if (lie >= 15)
{
hang++;
lie = 0;
}
//map列++
else
{
lie++;
}
}
}
//生成数字方法 标记有数字 2
public void ReSetNum()
{
//遍历所有target 位置 0 无雷 1有雷 二维 2有数字
int position_lei = 0;//obj雷 位置 一维数组
for(int i = 0; i < 12; i++)
{
for(int j = 0; j < 16; j++)
{
if (map_position_target[i, j] == 0)
{
//寻找周围雷
int num = SeachLei(i, j);
if (num > 0)
{
//生成数字
QiziObj.Add(Instantiate(number[num - 1], map_position_all[position_lei].transform.position, Quaternion.identity));
//标记数字 2
map_position_target[i, j] = 2;
}
}
position_lei++;
}
}
}
//在map position上生成 mask遮罩 编入 mask_all[12,16]
public void ReSetMask()
{
int position=0;
for(int i=0; i < 12; i++)
{
for(int j = 0; j < 16; j++)
{
mask_all[i,j]=Instantiate(mask, map_position_all[position].transform.position, Quaternion.identity);
position++;
}
}
}
//查询周围雷数量 1有雷,0无雷
public int SeachLei(int x,int y)
{
int num=0;//雷数量
int i, j;
//水平方向-----------------
{
//向左
i = x;
j = y;
while (true)
{
if (i <= 0)
break;
i--;
if (map_position_target[i, j] == 1)
num++;
break;
}
//向右
i = x;
j = y;
while (true)
{
if (i >= 11)
break;
i++;
if (map_position_target[i, j] == 1)
num++;
break;
}
}
//垂直方向-----------------
{
//向上
i = x;
j = y;
while (true)
{
if (j <= 0)
break;
j--;
if (map_position_target[i, j] == 1)
num++;
break;
}
//向下
i = x;
j = y;
while (true)
{
if (j >= 15)
break;
j++;
if (map_position_target[i, j] == 1)
num++;
break;
}
}
//斜上方向-----------------
{
//i- j+
i = x;
j = y;
while (true)
{
if (i <= 0 || j >= 15)
break;
j++;
i--;
if (map_position_target[i, j] == 1)
num++;
break;
}
//i+ j-
i = x;
j = y;
while (true)
{
if (i >= 11 || j <= 0)
break;
j--;
i++;
if (map_position_target[i, j] == 1)
num++;
break;
}
}
//斜下方向-----------------
{
//--
i = x;
j = y;
while (true)
{
if (i <= 0 || j<=0)
break;
j--;
i--;
if (map_position_target[i, j] == 1)
num++;
break;
}
//++
i = x;
j = y;
while (true)
{
if (i >= 11 || j>=15)
break;
j++;
i++;
if (map_position_target[i, j] == 1)
num++;
break;
}
}
return num;
}
//点击摧毁
public void MouseHit()
{
if (Input.GetKey(KeyCode.Mouse0))//鼠标左键点击
{
rayhit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
if (rayhit.collider != null)
{
if (rayhit.collider.tag == "mask")
{
Mask m = rayhit.collider.GetComponent<Mask>();
//被点击位置
int x=-1, y=-1;
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 16; j++)
{
//如果找到被点击的mask位置,进行判断是否需要展开空白区域
if (mask_all[i, j] != null)
{
if (mask_all[i, j].transform.position == m.transform.position)
{
x = i;
y = j;
break;
}
}
}
if (x != -1 && y != -1)
break;
}
//摧毁
m.Die();
mask_all[x, y] = null;
//如果点击雷 游戏结束
if (map_position_target[x, y] == 1)
GameOver();
//展开空白区域
FindMapTarg_0(x,y);
}
}
}
}
//展开空白区域 递归
public void FindMapTarg_0(int x,int y)
{
//0为无雷空白 向周围展开
if (map_position_target[x, y] == 0)
{
int up = x + 1;
int down = x - 1;
int right = y + 1;
int left = y - 1;
//摧毁垂直 水平
if(up < 12)
if (mask_all[up, y] != null)
{
Destroy(mask_all[up, y]);
mask_all[up, y] = null;
FindMapTarg_0(up, y);
}
if(down >= 0)
if (mask_all[down, y] != null)
{
Destroy(mask_all[down, y]);
mask_all[down, y] = null;
FindMapTarg_0(down, y);
}
if (right < 16)
if (mask_all[x, right] != null)
{
Destroy(mask_all[x, right]);
mask_all[x, right] = null;
FindMapTarg_0(x, right);
}
if (left >= 0)
if (mask_all[x, left] != null)
{
Destroy(mask_all[x, left]);
mask_all[x, left] = null;
FindMapTarg_0(x, left);
}
//摧毁斜方向
if (up < 12 && right < 16)
if (mask_all[up, right] != null)
{
Destroy(mask_all[up, right]);
mask_all[up, right] = null;
FindMapTarg_0(up, right);
}
if (down >= 0 && right < 16)
if (mask_all[down, right] != null)
{
Destroy(mask_all[down, right]);
mask_all[down, right] = null;
FindMapTarg_0(down, right);
}
if (up < 12 && left >= 0)
if (mask_all[up, left] != null)
{
Destroy(mask_all[up, left]);
mask_all[up, left] = null;
FindMapTarg_0(up, left);
}
if (down >= 0 && left >= 0)
if (mask_all[down, left] != null)
{
Destroy(mask_all[down, left]);
mask_all[down, left] = null;
FindMapTarg_0(down, left);
}
}
}
//标记雷/取消标记
public void TargetLei()
{
if (Input.GetKey(KeyCode.Mouse1))//鼠标右键点击 标记雷
{
rayhit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
if (rayhit.collider != null)
{
if (rayhit.collider.tag == "mask")
{
Mask m = rayhit.collider.GetComponent<Mask>();
//生成旗子
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 16; j++)
{
//如果找到被点击的mask位置,在此位置上插旗 无旗子
if (mask_all[i, j] != null && Qizi_table[i, j] != 1)
{
if (mask_all[i, j].transform.position == m.transform.position)
{
//插旗
QiziObj.Add(Instantiate(QiZi, m.transform.position, Quaternion.identity));
Qizi_table[i, j] = 1;
//旗子数++
QiZi_num++;
//旗子数量是否达到雷的数量
if (QiZi_num >= lei_number)
WinerOrLoser();
}
}
//有旗子 取消插旗
else if(mask_all[i, j] != null && Qizi_table[i, j] == 1)
{
if (mask_all[i, j].transform.position == m.transform.position)
{
//取消插旗
for(int index = 0; index < QiziObj.Count; index++)
{
if (QiziObj[index].transform.position == mask_all[i, j].transform.position)
{
Destroy(QiziObj[index]);
QiziObj.Remove(QiziObj[index]);
}
}
Qizi_table[i, j] = 0;
//旗子数--
QiZi_num--;
}
}
}
}
}
}
timeval = 1;
}
}
//判断扫雷是否正确
public void WinerOrLoser()
{
//遍历地图状态
int flag = 0;
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 16; j++)
{
//地图标记有雷
if (map_position_target[i, j] == 1)
{
//有旗子
if (Qizi_table[i, j] == 1)
{
flag++;
}
}
}
}
if(flag>=lei_number)
GameWin();
else
{
GameOver();
}
}
//除去全图遮罩
public void ClearMask()
{
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 16; j++)
{
if (mask_all[i, j] != null)
{
Destroy(mask_all[i, j]);
}
}
}
}
//清除 flag number lei
public void ClearFlag()
{
for(int i = 0; i < QiziObj.Count; i++)
{
Destroy(QiziObj[i]);
}
}
//结束方法
public void GameOver()
{
ClearMask();
print("Loser");
gameover = true;
gaming.SetActive(false);
loser.SetActive(true);
}
//赢方法
public void GameWin()
{
ClearMask();
print("Winer");
gameover = true;
gaming.SetActive(false);
winer.SetActive(true);
}
//重新开始游戏
public void RestartGame()
{
Start();
}
//难度+
public void Levelup()
{
if (gailv < 4)
gailv += 1;
}
//难度-
public void Leveldown()
{
if (gailv > 2)
gailv -= 1;
}
}