using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
public class MineSweeperEditor : EditorWindow {
|
|
|
|
public const int CELL_SIZE = 20;
|
|
public Texture2D ButtonImage;
|
|
public Texture2D EmptyImage;
|
|
|
|
public int MineCount = 10;
|
|
|
|
private Cell[,] Board = new Cell[10, 10];
|
|
|
|
|
|
|
|
// Add menu named "My Window" to the Window menu
|
|
[MenuItem("Addon/Mine Sweeper")]
|
|
static void Init()
|
|
{
|
|
// Get existing open window or if none, make a new one:
|
|
MineSweeperEditor window = (MineSweeperEditor)EditorWindow.GetWindow(typeof(MineSweeperEditor));
|
|
window.Show();
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
Board = new Cell[10, 10];
|
|
|
|
for (int i = 0; i < Board.GetLength(0); i++) {
|
|
for (int j = 0; j < Board.GetLength(1); j++) {
|
|
Board[i, j] = new Cell(this, i, j);
|
|
}
|
|
|
|
}
|
|
|
|
int placedMines = 0;
|
|
while (placedMines < MineCount) {
|
|
int x = Random.Range(0, Board.GetLength(0) - 1);
|
|
int y = Random.Range(0, Board.GetLength(1) - 1);
|
|
|
|
if (!Board[x, y].containsMine) {
|
|
Board[x, y].containsMine = true;
|
|
Debug.Log("Mine at: (" + x + ", " + y + ")");
|
|
placedMines++;
|
|
}
|
|
}
|
|
|
|
ButtonImage = CreateButtonTexture(CELL_SIZE, Color.white, new Color(0.75f, 0.75f, 0.75f), Color.black);
|
|
EmptyImage = CreateButtonTexture(CELL_SIZE, new Color(0.2f, 0.2f, 0.2f), new Color(0.75f, 0.75f, 0.75f), new Color(0.8f, 0.8f, 0.8f));
|
|
|
|
}
|
|
|
|
void OnGUI()
|
|
{
|
|
HeaderGUI();
|
|
BoardGUI();
|
|
DoClick();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
Repaint();
|
|
}
|
|
|
|
private void HeaderGUI()
|
|
{
|
|
GUIStyle style = GUI.skin.label;
|
|
|
|
style.normal.textColor = Color.red;
|
|
style.normal.background = EmptyImage;
|
|
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.Label("000", style);
|
|
|
|
GUILayout.FlexibleSpace();
|
|
GUILayout.EndHorizontal();
|
|
|
|
}
|
|
|
|
private void BoardGUI()
|
|
{
|
|
|
|
for (int i = 0; i < Board.GetLength(0); i++) {
|
|
GUILayout.BeginHorizontal();
|
|
for (int j = 0; j < Board.GetLength(1); j++) {
|
|
Board[i, j].DrawCell();
|
|
}
|
|
GUILayout.EndHorizontal();
|
|
GUILayout.Space(CELL_SIZE + 1);
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
private void DoClick()
|
|
{
|
|
Event e = Event.current;
|
|
|
|
if (e.type == EventType.MouseUp) {
|
|
|
|
foreach (Cell cell in Board) {
|
|
cell.OnClick(e.button, e.mousePosition);
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
public static Texture2D CreateButtonTexture(int size, Color highLight, Color mainColor, Color lowLight)
|
|
{
|
|
Texture2D retval = new Texture2D(size, size);
|
|
|
|
for (int i = 0; i < size; i++) {
|
|
for (int j = 0; j < size; j++) {
|
|
if (i == 0 || j == size - 1) {
|
|
retval.SetPixel(i, j, highLight);
|
|
} else if (i == size - 1 || j == 0) {
|
|
retval.SetPixel(i, j, lowLight);
|
|
} else
|
|
retval.SetPixel(i, j, mainColor);
|
|
}
|
|
}
|
|
retval.Apply();
|
|
return retval;
|
|
}
|
|
|
|
public Cell[] AdjacentCells(int x, int y)
|
|
{
|
|
List<Cell> retVal = new List<Cell>();
|
|
|
|
for (int i = -1; i <= 1; i++) {
|
|
|
|
if (x + i < 0 || x + i >= Board.GetLength(0))
|
|
continue;
|
|
|
|
for (int j = -1; j <= 1; j++) {
|
|
if (y + j < 0 || y + j >= Board.GetLength(0))
|
|
continue;
|
|
if (i == 0 && j == 0)
|
|
continue;
|
|
|
|
retVal.Add(Board[x + i, y + j]);
|
|
}
|
|
}
|
|
|
|
|
|
return retVal.ToArray();
|
|
}
|
|
|
|
public static Color getColor(int count){
|
|
|
|
switch (count) {
|
|
case 1:
|
|
return Color.blue;
|
|
case 2:
|
|
return Color.green;
|
|
case 3:
|
|
return Color.red;
|
|
case 4:
|
|
return new Color(0, 0, 0.54f);
|
|
case 5:
|
|
return new Color(0.64f, 0.16f, 0.16f);
|
|
case 6:
|
|
return Color.cyan;
|
|
case 7:
|
|
return Color.grey;
|
|
case 8:
|
|
return Color.black;
|
|
default:
|
|
return Color.black;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public class Cell {
|
|
|
|
public bool isOpen = false;
|
|
public bool containsMine = false;
|
|
public int adjacentMines = 0;
|
|
|
|
public MineSweeperEditor editor;
|
|
private Rect rect;
|
|
|
|
int x;
|
|
int y;
|
|
|
|
public bool isMarked = false;
|
|
|
|
|
|
public Cell(MineSweeperEditor editor, int x, int y)
|
|
{
|
|
this.editor = editor;
|
|
this.x = x;
|
|
this.y = y;
|
|
}
|
|
|
|
public void DrawCell()
|
|
{
|
|
GUILayout.Space(MineSweeperEditor.CELL_SIZE + 1);
|
|
|
|
if (Event.current.type == EventType.Repaint)
|
|
rect = GUILayoutUtility.GetLastRect();
|
|
rect.height = MineSweeperEditor.CELL_SIZE;
|
|
rect.width = MineSweeperEditor.CELL_SIZE;
|
|
|
|
GUIStyle style = new GUIStyle();
|
|
style.alignment = TextAnchor.MiddleCenter;
|
|
|
|
if (!isOpen) {
|
|
GUI.DrawTexture(rect, editor.ButtonImage);
|
|
if (isMarked)
|
|
GUI.Label(rect, "!",style);
|
|
|
|
} else {
|
|
GUI.DrawTexture(rect, editor.EmptyImage);
|
|
if (containsMine)
|
|
GUI.Label(rect, "X",style);
|
|
else if (adjacentMines > 0) {
|
|
style.normal.textColor = MineSweeperEditor.getColor(adjacentMines);
|
|
|
|
GUI.Label(rect,adjacentMines.ToString(),style);
|
|
//GUI.contentColor = Color.black;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OnClick(int button, Vector2 mousePos)
|
|
{
|
|
if (rect.Contains(mousePos)) {
|
|
if (button == 0)
|
|
DoLeftClick();
|
|
else if (button == 1)
|
|
DoRightClick();
|
|
|
|
EditorUtility.SetDirty(editor);
|
|
|
|
}
|
|
Debug.Log("MousePos: " + mousePos);
|
|
}
|
|
|
|
private void DoLeftClick()
|
|
{
|
|
isOpen = true;
|
|
|
|
Cell[] adjacentCells = editor.AdjacentCells(x, y);
|
|
|
|
foreach (Cell cell in adjacentCells) {
|
|
if (cell.containsMine)
|
|
adjacentMines++;
|
|
}
|
|
|
|
if (adjacentMines == 0 && !containsMine)
|
|
foreach (Cell cell in adjacentCells)
|
|
if (!cell.isOpen)
|
|
cell.DoLeftClick();
|
|
|
|
}
|
|
|
|
private void DoRightClick()
|
|
{
|
|
isMarked = !isMarked;
|
|
}
|
|
}
|