30.05.2014, 00:59 | #1 (permalink) |
Новичок
Регистрация: 30.05.2014
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите с перемещением мин
нужно что бы после клика,мины на поле поменяли свое место у меня это вроде получилось,но как сделать,что бы цифры,которые указывали чисто мин после клика были в клетках написаны как 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); |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|