помогите разобраться в игре сапер
нужно что бы после клика,мины на поле поменяли свое место
у меня это вроде получилось,но как сделать,что бы цифры,которые указывали чисто мин после клика были в клетках написаны как 0
private const int
MR = 10, // кол-во клеток по вертикали
MC = 10, // кол-во клеток по горизонтали
NM = 10, // кол-во мин
W = 40, // ширина клетки
H = 40; // высота клетки
private int[,] Pole = new int[MR + 2, MC + 2];
// значение элемента массива:
// 0..8 - количество мин в соседних клетках
// 9 - в клетке мина
// 100..109 - клетка открыта
// 200..209 - в клетку поставлен флаг
private int nMin;
private int nFlag;
private int status;
private System.Drawing.Graphics g;
public Form1()
{
InitializeComponent();
for (int row = 0; row <= MR + 1; row++)
{
Pole[row, 0] = -3;
Pole[row, MC + 1] = -3;
}
for (int col = 0; col <= MC + 1; col++)
{
Pole[0, col] = -3;
Pole[MR + 1, col] = -3;
}
this.ClientSize = new Size(W * MC + 1, H * MR + menuStrip1.Height + 1);
newGame(); // новая игра
g = panel1.CreateGraphics();
}
private void newGame()
{
int row, col;
int n = 0; // количество поставленных мин
int k; // кол-во мин в соседних клетках
// очистить поле
for (row = 1; row <= MR; row++)
for (col = 1; col <= MC; col++)
Pole[row, col] = 0;
Random rnd = new Random();
// расставим мины
do
{
row = rnd.Next(MR) + 1;
col = rnd.Next(MC) + 1;
if (Pole[row, col] != 9)
{
Pole[row, col] = 9;
n++;
}
}
while (n != NM);
// для каждой клетки вычислим кол-во
// мин в соседних клетках
for (row = 1; row <= MR; row++)
for (col = 1; col <= MC; col++)
if (Pole[row, col] != 9)
{
k = 0;
if (Pole[row - 1, col - 1] == 9) k++;
if (Pole[row - 1, col] == 9) k++;
if (Pole[row - 1, col + 1] == 9) k++;
if (Pole[row, col - 1] == 9) k++;
if (Pole[row, col + 1] == 9) k++;
if (Pole[row + 1, col - 1] == 9) k++;
if (Pole[row + 1, col] == 9) k++;
if (Pole[row + 1, col + 1] == 9) k++;
Pole[row, col] = k;
}
status = 0;
nMin = 0;
nFlag = 0;
}
private void showPole(Graphics g, int status)
{
for (int row = 1; row <= MR; row++)
for (int col = 1; col <= MC; col++)
this.kletka(g, row, col, status);
}
private void kletka(Graphics g,
int row, int col, int status)
{
int x, y;// координаты левого верхнего угла клетки
x = (col - 1) * W + 1;
y = (row - 1) * H + 1;
// не открытые клетки
if (Pole[row, col] < 100)
g.FillRectangle(SystemBrushes.ControlLight,
x - 1, y - 1, W, H);
// открытые или помеченные клетки
if (Pole[row, col] >= 100)
{
// открываем клетку
if (Pole[row, col] != 109)
g.FillRectangle(Brushes.White,
x - 1, y - 1, W, H);
else
// на этой мине подорвались
g.FillRectangle(Brushes.Red,
x - 1, y - 1, W, H);
// если в соседних клетках есть мины,
// указываем их количество
if ((Pole[row, col] >= 101) && (Pole[row, col] <= 108))
g.DrawString((Pole[row, col] - 100).ToString(),
new Font("Tahoma", 10,
System.Drawing.FontStyle.Regular),
Brushes.Blue, x + 3, y + 2);
}
// в клетке поставлен флаг
if (Pole[row, col] >= 200)
this.flag(g, x, y);
// рисуем границу клетки
g.DrawRectangle(Pens.Black,
x - 1, y - 1, W, H);
// если игра завершена (status = 2),
// показываем мины
if ((status == 2) && ((Pole[row, col] % 10) == 9))
this.mina(g, x, y);
}
// открывает текущую и все соседние с ней клетки,
// в которых нет мин
private void open(int row, int col)
{
int x = (col - 1) * W + 1,
y = (row - 1) * H + 1;
if (Pole[row, col] == 0)
{
Pole[row, col] = 100;
// отобразить содержимое клетки
this.kletka(g, row, col, status);
// открыть примыкающие клетки
this.open(row, col - 1);
this.open(row - 1, col);
this.open(row, col + 1);
this.open(row + 1, col);
this.open(row - 1, col - 1);
this.open(row - 1, col + 1);
this.open(row + 1, col - 1);
this.open(row + 1, col + 1);
}
else
if ((Pole[row, col] < 100) &&
(Pole[row, col] != -3))
{
Pole[row, col] += 100;
this.kletka(g, row, col, status);
}
}
private void mina(Graphics g, int x, int y)
{
g.FillRectangle(Brushes.Green,
x + 16, y + 26, 8, 4);
g.FillRectangle(Brushes.Green,
x + 8, y + 30, 24, 4);
g.DrawPie(Pens.Black,
x + 6, y + 28, 28, 16, 0, -180);
g.FillPie(Brushes.Green,
x + 6, y + 28, 28, 16, 0, -180);
}
private void flag(Graphics g, int x, int y)
{
Point[] p = new Point[3];
Point[] m = new Point[5];
g.DrawLine(Pens.Black,
x + 4, y + 4, x + 4, y + 35);
p[0].X = x + 4; p[0].Y = y + 4;
p[1].X = x + 30; p[1].Y = y + 12;
p[2].X = x + 4; p[2].Y = y + 20;
g.FillPolygon(Brushes.Red, p);
m[0].X = x + 8; m[0].Y = y + 14;
m[1].X = x + 8; m[1].Y = y + 8;
m[2].X = x + 10; m[2].Y = y + 10;
m[3].X = x + 12; m[3].Y = y + 8;
m[4].X = x + 12; m[4].Y = y + 14;
g.DrawLines(Pens.White, m);
}
}
private void panel1_MouseClick(object sender, MouseEventArgs e)
{
// игра завершена
if (status == 2) return;
// первый щелчок
if (status == 0) status = 1;
// преобразуем координаты мыши в индексы
int row = (int)(e.Y / H) + 1,
col = (int)(e.X / W) + 1;
// координаты области вывода
int x = (col - 1) * W + 1,
y = (row - 1) * H + 1;
if (e.Button == MouseButtons.Left)
{
// открыта клетка, в которой есть мина
if (Pole[row, col] == 9)
{
Pole[row, col] += 100;
// игра закончена
status = 2;
}
// перерисовать форму
this.panel1.Invalidate();
}
else
{
if (Pole[row, col] < 9)
this.open(row, col);
}
if (e.Button == MouseButtons.Right)
{
// в клетке не было флага, ставим его
if (Pole[row, col] <= 9)
{
nFlag += 1;
if (Pole[row, col] == 9)
nMin += 1;
Pole[row, col] += 200;
if ((nMin == NM) && (nFlag == NM))
{
// игра закончена
status = 2;
// перерисовываем все игровое поле
this.Invalidate();
// игра закончена
this.Invalidate();
}
else
// перерисовываем только клетку
this.kletka(g, row, col, status);
}
else
// в клетке был поставлен флаг,
// повторный щелчок правой кнопки мыши
// убирает его и закрывает клетку
if (Pole[row, col] >= 200)
{
nFlag -= 1;
Pole[row, col] -= 200;
// перерисовываем клетку
this.kletka(g, row, col, status);
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void panel1_MouseClick_1(object sender, MouseEventArgs e)
{
// игра завершена
if (status == 2) return;
// первый щелчок
if (status == 0) status = 1;
int row = (int)(e.Y / H) + 1,
col = (int)(e.X / W) + 1;
// координаты области вывода
int x = (col - 1) * W + 1,
y = (row - 1) * H + 1;
if (e.Button == MouseButtons.Left)
{
// открыта клетка, в которой есть мина
if (Pole[row, col] == 9)
{
Pole[row, col] += 100;
status = 2;
// перерисовать форму
this.panel1.Invalidate();
}
else
if (Pole[row, col] < 9)
this.open(row, col);
}
if (e.Button == MouseButtons.Right)
{
// в клетке не было флага, ставим его
if (Pole[row, col] <= 9)
{
nFlag += 1;
if (Pole[row, col] == 9)
nMin += 1;
Pole[row, col] += 200;
if ((nMin == NM) && (nFlag == NM))
{
// игра закончена
status = 2;
// перерисовываем все игровое поле
this.Invalidate();
}
else
// перерисовываем только клетку
this.kletka(g, row, col, status);
}
else
if (Pole[row, col] >= 200)
{
nFlag -= 1;
Pole[row, col] -= 200;
// перерисовываем клетку
this.kletka(g, row, col, status);
}
}
this.mins(row,col);
}
private void newGameToolStripMenuItem_Click(object sender, EventArgs e)
{
newGame();
showPole(g, status);
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
showPole(g, status);
}
private void flag1(Graphics g, int x, int y)
{
Point[] p = new Point[3];
Point[] m = new Point[5];
p[0].X = x + 4; p[0].Y = y + 4;
p[1].X = x + 30; p[1].Y = y + 12;
p[2].X = x + 4; p[2].Y = y + 20;
g.FillPolygon(Brushes.Red, p);
g.DrawLine(Pens.Black,
x + 4, y + 4, x + 4, y + 35);
}
private void mins(int row,int col)
{
if(Pole[row,col]==9)
{
if (Pole[row,col+1]==0)
{
Pole[row,col+1]=9;
Pole[row,col]=0;
}
else if (Pole[row+1,col]==0)
{
Pole[row+1,col]=9;
Pole[row,col]=0;
}
else if (Pole[row+1,col+1]==0)
{
Pole[row+1,col+1]=9;
Pole[row,col]=0;
}
else if (Pole[row, col - 1] == 0)
{
Pole[row, col - 1] = 9;
Pole[row, col] = 0;
}
else if (Pole[row-1, col] == 0)
{
Pole[row-1, col] = 9;
Pole[row, col] = 0;
}
else if (Pole[row - 1, col-1] == 0)
{
Pole[row - 1, col-1] = 9;
Pole[row, col] = 0;
}
}
this.findMin(row,col);
}
private void findMin(int row,int col)
{
int n = 0;
int k;
int x, y
x = (col - 1) * W + 1;
y = (row - 1) * H + 1;
// для каждой клетки вычислим кол-во
// мин в соседних клетках
for (row = 1; row <= MR; row++)
for (col = 1; col <= MC; col++)
if (Pole[row, col] != 9)
{
k = 0;
if (Pole[row - 1, col - 1] == 9) k++;
if (Pole[row - 1, col] == 9) k++;
if (Pole[row - 1, col + 1] == 9) k++;
if (Pole[row, col - 1] == 9) k++;
if (Pole[row, col + 1] == 9) k++;
if (Pole[row + 1, col - 1] == 9) k++;
if (Pole[row + 1, col] == 9) k++;
if (Pole[row + 1, col + 1] == 9) k++;
Pole[row, col] = k;
}
if ((Pole[row,col] >= 101) && (Pole[row, col] <= 108))
g.DrawString(n.ToString() ,
new Font("Tahoma", 10,
System.Drawing.FontStyle.Regular),
Brushes.Blue, x + 3, y + 2);