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