Clase Buscaminas
En esta clase trabajaremos la parte de la lógica del juego, donde ubicaremos el tipo de color de nuestro tablero, la posición de las minas.
De igual forma daremos la estructura de la imagen en la cual vamos a jugar.
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace BuscaMinas
{
class MapaMinas
{
Celda[,] mapa;
//9 >= mina. 1,2,3,4,5,6,7,8 = minas adyacentes. 0 = casilla vacía y sin minas adyacentes.
int nMinas;
int casillasVistas = 0;
int ancho;
int alto;
bool primerclick = true;
PointF posicion;
int anchoCelda = 22;
int altoCelda = 22;
internal MapaMinas() { }
internal MapaMinas(int ancho, int alto, int numeroMinas, PointF posicion)
{
mapa = new Celda[alto, ancho];
nMinas = numeroMinas;
if (nMinas >= mapa.Length)
throw new ArgumentOutOfRangeException("Debe haber al menos una casilla libre de minas");
this.posicion = posicion;
this.ancho = mapa.GetLength(1);
this.alto = mapa.GetLength(0);
}
internal void DibujarCuadricula(System.Drawing.Graphics g)
{
//Aqui definimos los colores del tablero del buscaminas
Pen lapizAzul = new Pen(Color.Blue, 1.0f);
Pen lapizRojo = new Pen(Color.Red, 1.0f);
Pen lapizNegro = new Pen(Color.Black, 1.0f);
Pen lapizlima = new Pen(Color.Green, 1.0f);
Pen lapiz = lapizNegro;
Brush brushMina = Brushes.Blue;
Brush brush = Brushes.BlueViolet;
Brush brushLima = Brushes.PaleGoldenrod;
Brush brushTexto = Brushes.Black;
List<object> fig = imgMap();
int[] ex = (int[])fig[0];
int[] ey = (int[])fig[1];
//Aqui inhabilitamos los espacios que no son de juego
for (int i = 0; i < ex.Length; i++)
{
int auxy = ex[i];
int auxx = ey[i];
mapa[auxy, auxx].Visible = false;
}
//Aqui definimos las casillas que van a ser visibles en el juego
for (int i = 0; i < alto; i++)
{
for (int j = 0; j < ancho; j++)
{
if (mapa[i, j].Visible == true)
{
int valor = mapa[i, j].Valor;
lapiz = lapizAzul;
switch (valor)
{
case 0:
break;
case 9:
g.FillRectangle(brushMina, j * anchoCelda + posicion.X, i * altoCelda + posicion.Y, anchoCelda, altoCelda);
break;
default:
g.DrawString(valor.ToString(), new Font("Calibri", 8), brushTexto, j * anchoCelda + posicion.X, i * altoCelda + posicion.Y);
break;
}
}
else
{
int reg = 0;
int auxy = 0, auxx = 0;
for (int id = 0; id < ex.Length; id++)
{
auxy = ey[id];
auxx = ex[id];
if (auxy == j && auxx == i)
{
g.FillRectangle(brushLima, j * anchoCelda + posicion.X, i * altoCelda + posicion.Y, anchoCelda, altoCelda);
reg++;
}
}
if (reg == 0) {
g.FillRectangle(brush, j * anchoCelda + posicion.X, i * altoCelda + posicion.Y, anchoCelda, altoCelda);
}
}
}
}
//Aqui dibujamos las lineas horizontales del tablero de juego
for (int i = 0; i <= alto; i++)
{
g.DrawLine(lapizNegro, posicion.X, altoCelda * i + posicion.Y, anchoCelda * ancho + posicion.X, altoCelda * i + posicion.Y);
}
//Aqui dibujamos las lineas verticales del tablero de juego
for (int i = 0; i <= ancho; i++)
{
g.DrawLine(lapizNegro, anchoCelda * i + posicion.X, posicion.Y, anchoCelda * i + posicion.X, altoCelda * alto + posicion.Y);
}
}
private void ColocarMinas(int xInicial, int yInicial)
{
//Aqui hacemos el proceso de generar minas de manera aleatoria
Point[] puntosMinas = new Point[nMinas];
Random r = new Random();
Point puntoIn = new Point(xInicial, yInicial);
List<object> fig = imgMap();
int[] ex = (int[])fig[1];
int[] ey = (int[])fig[0];
int ind = 0;
for (int i = 0; i < nMinas; i++)
{
Point p = new Point();
do
{
int aux1 = r.Next(0, mapa.GetLength(1));
int aux2 = r.Next(0, mapa.GetLength(0));
int control = 0;
for (ind = 0; ind < ex.Length; ind++) {
if (aux1 == ex[ind] && aux2 == ey[ind]) {
control++;
}
}
if (control == 0) {
p.X = aux1;
p.Y = aux2;
}
} while (Contiene(puntosMinas, p) ^ p == puntoIn);
puntosMinas[i] = p;
}
//Aqui ponemos los numeros de referencia para que el usuario pueda determinar donde hay mina
for (int i = 0; i < puntosMinas.Length; i++)
{
mapa[puntosMinas[i].Y, puntosMinas[i].X].Valor = 9;
if (puntosMinas[i].Y + 1 < alto)
if (mapa[puntosMinas[i].Y + 1, puntosMinas[i].X].Valor < 9)
mapa[puntosMinas[i].Y + 1, puntosMinas[i].X].Valor++;
if (puntosMinas[i].X + 1 < ancho)
if (mapa[puntosMinas[i].Y, puntosMinas[i].X + 1].Valor < 9)
mapa[puntosMinas[i].Y, puntosMinas[i].X + 1].Valor++;
if (puntosMinas[i].Y - 1 >= 0)
if (mapa[puntosMinas[i].Y - 1, puntosMinas[i].X].Valor < 9)
mapa[puntosMinas[i].Y - 1, puntosMinas[i].X].Valor++;
if (puntosMinas[i].X - 1 >= 0)
if (mapa[puntosMinas[i].Y, puntosMinas[i].X - 1].Valor < 9)
mapa[puntosMinas[i].Y, puntosMinas[i].X - 1].Valor++;
if (puntosMinas[i].Y + 1 < alto && puntosMinas[i].X + 1 < ancho)
if (mapa[puntosMinas[i].Y + 1, puntosMinas[i].X + 1].Valor < 9)
mapa[puntosMinas[i].Y + 1, puntosMinas[i].X + 1].Valor++;
if (puntosMinas[i].Y + 1 < alto && puntosMinas[i].X - 1 >= 0)
if (mapa[puntosMinas[i].Y + 1, puntosMinas[i].X - 1].Valor < 9)
mapa[puntosMinas[i].Y + 1, puntosMinas[i].X - 1].Valor++;
if (puntosMinas[i].Y - 1 >= 0 && puntosMinas[i].X - 1 >= 0)
if (mapa[puntosMinas[i].Y - 1, puntosMinas[i].X - 1].Valor < 9)
mapa[puntosMinas[i].Y - 1, puntosMinas[i].X - 1].Valor++;
if (puntosMinas[i].Y - 1 >= 0 && puntosMinas[i].X + 1 < ancho)
if (mapa[puntosMinas[i].Y - 1, puntosMinas[i].X + 1].Valor < 9)
mapa[puntosMinas[i].Y - 1, puntosMinas[i].X + 1].Valor++;
}
}
private bool Contiene(Point[] conjunto, Point elemento)
{
for (int i = 0; i < conjunto.Length; i++)
{
if (conjunto[i].X == elemento.X && conjunto[i].Y == elemento.Y)
return true;
}
return false;
}
internal bool DestaparCelda(int x, int y)
{
//Destapa las celdas cliqueadas, si es la primera vez que se carga el juego se ejecuta el metodo Colocar minas si no ignora
//el condicional if (primerclick) y empieza a validar si hay mina y las pocisiones que hay a lado
if (primerclick)
{
ColocarMinas(x, y);
primerclick = false;
}
if (x < ancho && y < alto && x >= 0 && y >= 0 && mapa[y, x].Visible == false)
{
if (mapa[y, x].Valor >= 9)
{
casillasVistas++;
return true;
}
DescubrirArea(x, y);
casillasVistas=0;
for (int i = 0; i < alto; i++)
{
for (int j = 0; j < ancho; j++)
{
if (mapa[i, j].Visible == true)
{
casillasVistas++;
}
}
}
//mapa[y, x].Visible = true;
}
return false;
}
private void DescubrirArea(int x, int y)
{
//Si la casilla esta tapada
if (mapa[y, x].Visible == false)
{
//Descubre la casilla
mapa[y, x].Visible = true;
//casillasVistas++;
//Si no hay minas cercanas
if (mapa[y, x].Valor == 0)
{
//Recorre las casillas cercanas y tambien las ejecuta
for (int f2 = Math.Max(0, x - 1); f2 < Math.Min(ancho, x + 2); f2++)
{
for (int c2 = Math.Max(0, y - 1); c2 < Math.Min(alto, y + 2); c2++)
{
DescubrirArea(f2, c2);
}
}
}
}
}
internal void HacerTodoVisible()
{
for (int i = 0; i < alto; i++)
{
for (int j = 0; j < ancho; j++)
{
mapa[i, j].Visible = true;
}
}
}
internal Celda[,] Casillas
{
get { return mapa; }
}
internal PointF Posicion
{
get { return posicion; }
}
internal int AnchoCelda
{
get { return anchoCelda; }
}
internal int AltoCelda
{
get { return altoCelda; }
}
internal int Ancho
{
get { return ancho; }
}
internal int Alto
{
get { return alto; }
}
internal int CasillasVistas
{
get { return casillasVistas; }
}
public List<Object> imgMap() {
// Aqui dibujamos las letras haciendo una tabulacion en los campos
List<object>ls= new List<object>();
int[]ejex={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,4,4,4,4,4, 5,5,5,5,5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7 ,8,8,8,8,8,8,8,8,8,8 ,9,9,9,9,9,9,9,9,9,9, 10,10,10,10,10,10,10,10,10,10 ,11,11,11,11,11,11,11,11,11,11 ,12,12,12,12,12,12,12,12,12,12,12, 13,13,13,13,13,13,13,13,13,13,13,13, 14,14,14,14,14,14,14,14,14,14,14,14,14, 15,15,15,15,15,15,15,15,15,15,15,15, 16,16,16,16,16,16,16,16,16,16,16,16, 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, 19,19};
int[]ejey={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 0,1,2,3,7,8,9,10,11,12,13,14,18,19 ,0,1,2,3,8,9,10,11,12,13,14,18,19, 0,1,2,3,9,10,11,12,13,14,18,19, 0,1,2,3,10,11,12,13,14,18,19 ,0,1,2,3,11,12,13,14,18,19, 0,1,2,3,7,12,13,14,18,19, 0,1,2,3,7,8,13,14,18,19, 0,1,2,3,7,8,9,14,18,19, 0,1,2,3,7,8,9,10,18,19, 0,1,2,3,7,8,9,10,11,18,19 ,0,1,2,3,7,8,9,10,11,12,18,19, 0,1,2,3,7,8,9,10,11,12,13,18,19, 0,3,7,8,9,10,11,12,13,14,18,19, 0,3,7,8,9,10,11,12,13,14,18,19, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 0,19};
ls.Add(ejex);
ls.Add(ejey);
return ls;
}
internal bool bandera(int x, int y, System.Drawing.Graphics g)
{
Brush brushLima = Brushes.DarkSlateBlue;
//g.FillRectangle(brushLima, y * anchoCelda + x, x * altoCelda + y, anchoCelda, altoCelda);
return false;
}
}
}
Suscribirse a:
Entradas (Atom)
No hay comentarios.:
Publicar un comentario
Gracias por participar en esta página