using System;
using System.Collections.Generic;
using System.Text;
namespace MineSweepR_CON_
{
class Program
{
#region VARIABLES
private static clsField[,] gFields = new clsField[32, 32];
private static int[] gFieldSize = new int[2];
private static string gProgramName = "MineSweepR";
#endregion
#region CLASSES
class clsField
{
#region VARIABLES
private bool gBomb = false;
private int gBombsAround = -1;
private bool gShown = false;
private int[] gPos = new int[2];
#endregion
#region PROPERTIES
public bool Bomb
{
get { return gBomb; }
set { gBomb = value; }
}
public int[] Pos
{
get { return gPos; }
set { gPos = value; }
}
public bool Shown
{
get { return gShown; }
set { gShown = value; }
}
public int BombsAround
{
get { return gBombsAround; }
set { gBombsAround = value; }
}
#endregion
#region METHODS
public clsField(int[] pPos)
{
gPos = pPos;
}
public void calcNeighbours(clsField[,] pFields, int[] tFieldSize)
{
int iBombsFound = 0;
//Oben links
if (gPos[0] - 1 >= 0 && gPos[0] - 1 <= tFieldSize[0] - 1 && gPos[1] - 1 >= 0 && gPos[1] - 1 <= tFieldSize[1] - 1) { if (pFields[gPos[0] - 1, gPos[1] - 1].Bomb) { iBombsFound++; } }
//Links
if (gPos[0] - 1 >= 0 && gPos[0] - 1 <= tFieldSize[0] - 1 && gPos[1] >= 0 && gPos[1] <= tFieldSize[1] - 1) { if (pFields[gPos[0] - 1, gPos[1]].Bomb) { iBombsFound++; } }
////Unten links
if (gPos[0] - 1 >= 0 && gPos[0] - 1 <= tFieldSize[0] - 1 && gPos[1] + 1 >= 0 && gPos[1] + 1 <= tFieldSize[1] - 1) { if (pFields[gPos[0] - 1, gPos[1] + 1].Bomb) { iBombsFound++; } }
////Oben Mitte
if (gPos[0] >= 0 && gPos[0] <= tFieldSize[0] - 1 && gPos[1] - 1 >= 0 && gPos[1] - 1 <= tFieldSize[1] - 1) { if (pFields[gPos[0], gPos[1] - 1].Bomb) { iBombsFound++; } }
////Unten Mitte
if (gPos[0] >= 0 && gPos[0] <= tFieldSize[0] - 1 && gPos[1] + 1 >= 0 && gPos[1] + 1 <= tFieldSize[1] - 1) { if (pFields[gPos[0], gPos[1] + 1].Bomb) { iBombsFound++; } }
////Oben rechts
if (gPos[0] + 1 >= 0 && gPos[0] + 1 <= tFieldSize[0] - 1 && gPos[1] - 1 >= 0 && gPos[1] - 1 <= tFieldSize[1] - 1) { if (pFields[gPos[0] + 1, gPos[1] - 1].Bomb) { iBombsFound++; } }
////Rechts
if (gPos[0] + 1 >= 0 && gPos[0] + 1 <= tFieldSize[0] - 1 && gPos[1] >= 0 && gPos[1] <= tFieldSize[1] - 1) { if (pFields[gPos[0] + 1, gPos[1]].Bomb) { iBombsFound++; } }
////Unten Rechts
if (gPos[0] + 1 >= 0 && gPos[0] + 1 <= tFieldSize[0] - 1 && gPos[1] + 1 >= 0 && gPos[1] + 1 <= tFieldSize[1] - 1) { if (pFields[gPos[0] + 1, gPos[1] + 1].Bomb) { iBombsFound++; } }
gBombsAround = iBombsFound;
}
#endregion
}
#endregion
#region METHODS
private static void updateCon(string pCaption)
{
Console.Clear();
Console.Title = gProgramName + " - " + pCaption;
for (int i = 0; i < (gProgramName + " - " + pCaption).Length + 4; i++)
{
Console.Write("+");
}
Console.Write("\n+ " + gProgramName + " - " + pCaption + " +\n");
for (int i = 0; i < (gProgramName + " - " + pCaption).Length + 4; i++)
{
Console.Write("+");
}
Console.Write("\n\n");
}
private static void drawTable(int mode=0)
{
int iCounter = -1;
Console.Write("\n x");
for (int i = 0; i < gFieldSize[0]; i++)
{
if (iCounter == 9) { iCounter = 0; }
else { iCounter++; }
Console.Write(iCounter.ToString());
}
Console.Write("\n");
Console.Write("y ");
for (int i = 0; i < gFieldSize[0]; i++) { Console.Write("-"); }
Console.Write("\n");
iCounter = -1;
for (int i = 0; i < gFieldSize[1]; i++)
{
if (iCounter == 9) { iCounter = 0; }
else { iCounter++; }
Console.Write(iCounter.ToString() + "|");
for (int j = 0; j < gFieldSize[0]; j++)
{
if (mode == 0)
{
if (gFields[j, i].Shown == false) { Console.Write("?"); }
else { Console.Write(gFields[j, i].BombsAround.ToString()); }
}
else
{
if (gFields[j, i].Bomb == false) { Console.Write("0"); }
else { Console.Write("x"); }
}
}
Console.Write("\n");
}
Console.Write("\n");
}
#endregion
static void Main(string[] args)
{
do
{
//Setup field!
updateCon("Setup");
Console.Write("Enter the field's size (width,height): ");
string tSize = Console.ReadLine();
gFieldSize[0] = Convert.ToInt32(tSize.Split(',')[0]);
gFieldSize[1] = Convert.ToInt32(tSize.Split(',')[1]);
int iTotalFields = gFieldSize[0] * gFieldSize[1];
Console.Write("\nFieldsize: " + gFieldSize[0].ToString() + "*" + gFieldSize[1] + ", " + iTotalFields.ToString() + "\n(Press ENTER)");
Console.ReadLine();
int iBombs = Convert.ToInt32((double)gFieldSize[0] * (double)gFieldSize[1] / (double)10);
//Initializing fields
gFields = new clsField[gFieldSize[0], gFieldSize[1]];
for (int i = 0; i < gFieldSize[0]; i++)
{
for (int j = 0; j < gFieldSize[1]; j++)
{
int[] tPos = new int[2];
tPos[0] = i;
tPos[1] = j;
gFields[i, j] = new clsField(tPos);
}
}
//Planting mines
System.Random tRan = new System.Random();
for (int i = 0; i < iBombs; i++)
{
int[] tPos = new int[2];
tPos[0] = tRan.Next(0, gFieldSize[0]);
tPos[1] = tRan.Next(0, gFieldSize[1]);
if (gFields[tPos[0], tPos[1]].Bomb == true) { i--; }
else { gFields[tPos[0], tPos[1]].Bomb = true; }
}
Console.Write("\nAdded " + iBombs.ToString() + " bombs!\n");
//Show mines
for (int i = 0; i < gFieldSize[1]; i++)
{
for (int j = 0; j < gFieldSize[0]; j++)
{
gFields[j, i].calcNeighbours(gFields, gFieldSize);
}
}
Console.Write("Calculated all bombs - You may play now!");
Console.ReadLine();
System.IO.StreamWriter tWriter = new System.IO.StreamWriter("map.txt",false, Encoding.UTF8);
for (int i = 0; i < gFieldSize[1]; i++)
{
for (int j = 0; j < gFieldSize[0]; j++)
{
if (gFields[j, i].Bomb == false) { tWriter.Write("0"); }
else { tWriter.Write("x"); }
}
tWriter.WriteLine("");
}
tWriter.WriteLine("");
for (int i = 0; i < gFieldSize[1]; i++)
{
for (int j = 0; j < gFieldSize[0]; j++)
{
if (gFields[j, i].Bomb) { tWriter.Write("x"); }
else { tWriter.Write(gFields[j, i].BombsAround.ToString()); }
}
tWriter.WriteLine("");
}
tWriter.Close();
tWriter.Dispose();
int tFieldsFlipped = 0;
while ((iTotalFields - tFieldsFlipped) != iBombs)
{
updateCon("Pick a field");
drawTable();
Console.Write("Pick a field (x,y): ");
string tInput = Console.ReadLine();
int tX = Convert.ToInt32(tInput.Split(',')[0]);
int tY = Convert.ToInt32(tInput.Split(',')[1]);
if (gFields[tX, tY].Bomb == true) { Console.Write("\n\nSorry - This field actually IS a bomb!"); Console.ReadLine(); gFields[tX, tY].Shown = true; break; }
else
{
if (gFields[tX, tY].Shown == false)
{
gFields[tX, tY].Shown = true;
tFieldsFlipped++;
}
}
}
updateCon("End");
for (int i = 0; i < gFieldSize[0]; i++)
{
for (int j = 0; j < gFieldSize[1]; j++)
{
gFields[i, j].Shown = true;
}
}
drawTable(1);
Console.Write("\nYou played this field!\n\nWould you like to quit this game?\n(Enter \"y\" to quit)");
}
while (Console.ReadLine().ToLower() != "y");
}
}
}