Часть 1
176
// загружаем файл картинки
pics = new Bitmap("puzzle.bmp");
}
catch (Exception exc)
{
MessageBox.Show("Файл 'puzzle.bmp' не найден.\n",
"Собери картинку",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
this.Close();
return;
}
// определяем высоту и ширину клетки (фишки)
cw = (int)(pics.Width / nw);
ch = (int)(pics.Height / nh);
// установить размер клиентской области формы
this.ClientSize =
new System.Drawing.Size(cw * nw + 1,
ch * nh + 1 + menuStrip1.Height);
// рабочая графическая поверхность
g = this.CreateGraphics();
this.newGame();
}
// новая игра
private void newGame()
{
// располагаем фишки в правильном порядке
for (int j = 0; j < nh; j++)
Примеры и задачи
177
for (int i = 0; i < nw; i++)
field[i, j] = j * nw + i + 1;
// последняя фишка - пустая
field[nw - 1, nh - 1] = 0;
ex = nw - 1; ey = nh - 1;
this.mixer(); // перемешиваем фишки
this.drawField(); // выводим игровое поле
}
// перемешивает фишки
private void mixer()
{
int d; // положение (относительно пустой) перемещаемой
// клетки: 0 - слева; 1 - справа;
// 2 - сверху; 3 - снизу.
int x, y; // перемещаемая клетка
// генератор случайных чисел
Random rnd = new Random();
for (int i = 0; i < nw * nh * 10; i++)
// nw * nh * 10 - кол-во перестановок
{
x = ex;
y = ey;
d = rnd.Next(4);
switch (d)
{
case 0: if (x > 0) x--; break;
Часть 1
178
case 1: if (x < nw - 1) x++; break;
case 2: if (y > 0) y--; break;
case 3: if (y < nh - 1) y++; break;
}
// здесь определили фишку, которую
// нужно переместить в пустую клетку
field[ex, ey] = field[x, y];
field[x, y] = 0;
// запоминаем координаты пустой фишки
ex = x; ey = y;
}
}
// отрисовывает поле
private void drawField()
{
// содержимое клеток
for (int i = 0; i < nw; i++)
for (int j = 0; j < nh; j++)
{
if (field[i, j] != 0)
// выводим фишку с картинкой:
// ( ((field[i,j] - 1) % nw) * cw,
// (int)((field[i,j] - 1) / nw) * ch ) -
// координаты левого верхнего угла
// области файла-источника картинки
g.DrawImage(pics,
new Rectangle(i * cw,
j * ch + menuStrip1.Height,
cw, ch),
new Rectangle(
((field[i, j] - 1) % nw) * cw,
Примеры и задачи
179
((field[i, j] - 1) / nw) * ch,
cw, ch),
GraphicsUnit.Pixel);
else
// выводим пустую фишку
g.FillRectangle(SystemBrushes.Control,
i * cw, j * ch + menuStrip1.Height,
cw, ch);
// рисуем границу
g.DrawRectangle(Pens.Black,
i * cw, j * ch + menuStrip1.Height,
cw, ch);
// номер фишки
if ((showNumbers) && field[i, j] != 0)
g.DrawString(
Convert.ToString(field[i, j]),
new Font("Tahoma", 10,
FontStyle.Bold),
Brushes.Black, i * cw + 5,
j * ch + 5 + menuStrip1.Height);
}
}
// проверяет, расположены ли фишки в правильном порядке
private Boolean finish()
{
// координаты клетки
int i = 0;
int j = 0;
int c; // число в клетке
// фишки расположены правильно, если
// числа в них образуют матрицу:
// 1 2 3 4
// 5 6 7 8
Do'stlaringiz bilan baham: |