Обмен картинок в игре "Пятнашки" - C#
Формулировка задачи:
Пишу игру пятнашки но без использования элементов формы. Работаю со списками. При нажатии на части картинок должна происходить их замена, собственно говоря это и происходит, но криво. На 2-3 скрине замена происходит правильно, а вот на 3-4 нет(3 строка 3 столбец должен быть белым) на 174-178 строке происходит замена местами кликнутых картинок. Почему же у меня неправильно происходит замена, подскажите пожалуйста.
Решение задачи: «Обмен картинок в игре "Пятнашки"»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Timers;
namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int movement = 0;
string place;
int countOfBlocks = 0;
int mode = 0;
int width = 0;
int height = 0;
List<Bitmap> listBitMap = new List<Bitmap>();
List<Point> listPoint = new List<Point>();
int state = 1;
public void Form1_Paint(object sender, PaintEventArgs e)
{
var g = e.Graphics;
switch (state)
{
case 1:
g.DrawString("НАЧАТЬ ИГРУ", new Font("Arial black", 30), new SolidBrush(Color.Black), 300, 100);
g.DrawString("РЕКОРДЫ", new Font("Arial black", 30), new SolidBrush(Color.Black), 330, 150);
g.DrawString("ПРАВИЛА ИГРЫ", new Font("Arial black", 30), new SolidBrush(Color.Black), 275, 200);
break;
case 2:
for (var i = 0; i < countOfBlocks; i++)
{
listBitMap.Add(new Bitmap(place + i + ".jpg"));
}
for (height = 0; height < 4; height++)
for (width = 0; width < 4; width++)
{
listPoint.Add(new Point(177 * width, 107 * height));
}
for (int i = 0; i < countOfBlocks; i++)
{
if (listPoint.ElementAt(i) != null)
{
g.DrawImage(listBitMap[i], listPoint[i]);
}
}
Bitmap pole = new Bitmap("pole.png");
g.DrawImage(pole, 710, 0);
break;
case 3:
g.DrawString(
" Классическое игровое поле представляет собой матрицы 3х3, 4х4, 5х5 клеток, на котором по порядку (слева - направо и сверху\n " +
" - вниз) располагаются пазлы картинки. Последний пазл – пустой. Пазлы перемешиваются определенным образом, и задача\n" +
" игрока состоит в том, чтобы восстановить их первоначальное правильное расположение. Делать это можно лишь путем\n" +
" перемещения на пустой пазл другой, соседний с ним пазл (расположенный слева, справа, сверху или снизу от пустой).\n"
, new Font("Arial", 11), new SolidBrush(Color.Black), 10, 10);
g.DrawString("Назад", new Font("Arial", 11), new SolidBrush(Color.Black), 420, 100);
break;
case 4:
g.DrawString("3x3", new Font("Arial black", 40), new SolidBrush(Color.Black), 420, 100);
g.DrawString("4x4", new Font("Arial black", 40), new SolidBrush(Color.Black), 420, 150);
g.DrawString("5x5", new Font("Arial black", 40), new SolidBrush(Color.Black), 420, 200);
break;
case 5:
for (var i = 0; i < countOfBlocks; i++)
{
listBitMap.Add(new Bitmap(place + i + ".jpg"));
}
for (height = 0; height < 3; height++)
for (width = 0; width < 3; width++)
{
listPoint.Add(new Point(233 * width, 141 * height));
}
for (int i = 0; i < countOfBlocks; i++)
{
if (listPoint.ElementAt(i) != null)
{
g.DrawImage(listBitMap[i], listPoint[i]);
}
}
Bitmap pole2 = new Bitmap("pole.png");
g.DrawImage(pole2, 710, 0);
state = 2;
break;
case 6:
for (var i = 0; i < countOfBlocks; i++)
{
listBitMap.Add(new Bitmap(place + i + ".jpg"));
}
for (height = 0; height < 5; height++)
for (width = 0; width < 5; width++)
{
listPoint.Add(new Point(140 * width, 85 * height));
}
for (int i = 0; i < countOfBlocks; i++)
{
if (listPoint.ElementAt(i) != null)
{
g.DrawImage(listBitMap[i], listPoint[i]);
}
}
Bitmap pole1 = new Bitmap("pole.png");
g.DrawImage(pole1, 710, 0);
state = 2;
break;
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
int firstClick = -1;
int secondClick = -1;
public void Form1_MouseClick(object sender, MouseEventArgs e)
{
switch (state)
{
case 1:
if (e.X >= 295 && e.X <= 635 && e.Y >= 100 && e.Y <= 150)
{
state = 4;
this.Invalidate();
}
if (e.X >= 265 && e.X <= 660 && e.Y >= 200 && e.Y <= 250)
{
state = 3;
this.Invalidate();
}
break;
case 2:
for (int i = 0; i < listPoint.Count; i++)
{
if (e.X >= listPoint[i].X && e.X <= (listPoint[i].X + 174) && e.Y >= listPoint[i].Y && e.Y <= (listPoint[i].Y + 105))
{
if (firstClick < 0)
{
firstClick = i;
}
else
{
secondClick = i;
if (firstClick == secondClick)
{
secondClick = -1;
}
else
{
if (Math.Abs(firstClick - secondClick) == 1 || Math.Abs(firstClick - secondClick) == mode)
{
var g = this.CreateGraphics();
if (g != null)
{
listBitMap[firstClick] = new Bitmap(place + secondClick + ".jpg");
listBitMap[secondClick] = new Bitmap(place + firstClick + ".jpg");
g.DrawImage(listBitMap[firstClick], listPoint[firstClick]);
g.DrawImage(listBitMap[secondClick], listPoint[secondClick]);
firstClick = secondClick = -1;
movement++;
g.Dispose();
}
}
}
}
}
}
if (e.X >= 200 && e.X <= 260 && e.Y >= 400 && e.Y <= 450)
{
this.Invalidate();
}
break;
case 3:
if (e.X >= 420 && e.X <= 470 && e.Y >= 100 && e.Y <= 120)
{
state = 1;
this.Invalidate();
}
break;
case 4:
if (e.X >= 420 && e.X <= 535 && e.Y >= 120 && e.Y <= 160)
{
countOfBlocks = 9;
place = "3х3";
mode = 3;
state = 5;
this.Invalidate();
}
if (e.X >= 420 && e.X <= 535 && e.Y >= 170 && e.Y <= 210)
{
countOfBlocks = 16;
place = "4x4";
mode = 4;
state = 2;
this.Invalidate();
}
if (e.X >= 420 && e.X <= 535 && e.Y >= 220 && e.Y <= 260)
{
countOfBlocks = 25;
place = "5х5";
mode = 5;
state = 6;
this.Invalidate();
}
break;
}
}
}
}