private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int dx, dy; // смещения Сокобана(куда идем)
int SprIdx; // текущий номер его спрайта
if (Busy)
{
Application.Exit();
}
Busy = true;
if (e.KeyCode == Keys.Left)
{
dx =-1; dy= 0; SprIdx = SL;
}
else if (e.KeyCode == Keys.Right)
{
dx= 1; dy= 0; SprIdx= SR;
}
else if (e.KeyCode == Keys.Up)
{
dx = 0; dy = -1; SprIdx= SU;
}
else if (e.KeyCode == Keys.Down)
{
dx= 0; dy= 1; SprIdx= SD;
}
else
{
dx = 0; dy = 0; SprIdx = Field[CurX, CurY];
}
if (Field[CurX + dx, CurY + dy] == SPACE) {
Field[CurX + dx, CurY + dy] = SprIdx;
Field[CurX, CurY] = SPACE;
CurX = CurX + dx;
CurY = CurY + dy;
}
else if ((Field[CurX + dx, CurY + dy] == BOULDER) && (Field[CurX + 2 * dx,CurY + 2 * dy]) == SPACE)
{
Field[CurX + dx, CurY + dy] = SprIdx;
Field[CurX + 2 * dx, CurY + 2 * dy] = BOULDER;
Field[CurX, CurY] = SPACE;
CurX = CurX + dx;
CurY = CurY + dy;
}
this.Invalidate();
if (Positioned == N_of_places) {
MessageBox.Show("Уровень пройден!", "Сокобан", MessageBoxButtons.OK);
}
Busy = false;
}
public void RedrawField(Graphics graphics, Rectangle clientRect, ImageList imageList)
{
int i, j;
int code;
Bitmap bitmap;
bitmap = new Bitmap(600, 600);
Positioned = 0;
for (j = 1; j <= 12; j++)
{
for (i = 1; i <= 20; i++)
{
code = Field[i, j]; // код текущего элемента
// пара "пустое пространство" / "место" означает "место"
if (Field[i, j] == SPACE & Places[i, j])
{
code = PLACE;
}
//а пара "камень" / "место" - "камень на месте"
else if (Field[i, j] == BOULDER & Places[i, j])
{
code = PLACEDBOULDER;
Positioned = Positioned + 1;
}
}
}
// рисует картинку с нулевым индексом по координате (1, 1)
imageList1.Draw(graphics, 1, 1, 0);
}
else if ((Field[CurX + dx, CurY + dy] == BOULDER) & (Field[CurX + 2 * dx][CurY + 2 * dy] == SPACE))
// заполняет фон формы белым цветом
e.Graphics.FillRectangle(Brushes.White, ClientRectangle);
// рисует картинку с нулевым индексом по координате (1, 1)
imageList1.Draw(e.Graphics, 1, 1, 0);