You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

269 lines
6.5 KiB

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;
}
}