Обмен картинок в игре "Пятнашки" - 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;
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д