Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 30.05.2014, 00:59   #1 (permalink)
brodoladobar
Новичок
 
Регистрация: 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);
brodoladobar вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 11:03.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.