Обмен картинок в игре "Пятнашки" - 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;
 
            }
 
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы