@nikvay

Как переделать код (см. внутри)?

Здравствуйте! Не могу разобраться как переделать данный данный код:
using System;
using System.Drawing;
using System.Text;
 
namespace Fifteens
{
    class Field
    {
        public string[,] field = new string[5, 5];
        Random ran = new Random();
        Point current; //координаты пустого поля
        public bool CheckingForRepeat(string elem)
        {
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    if (field[i, j] == elem)
                        return true;
                }
            }
            return false;
        }
        public string[,] GetField()
        {
            string forCheck;
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    forCheck = Convert.ToString(ran.Next(0, 25));
                    while (CheckingForRepeat(forCheck) == true)
                    { forCheck = Convert.ToString(ran.Next(0, 25)); }
                    field[i, j] = forCheck;
                    if (field[i, j] == "0") current=new Point(i,j);
                }
            }
            Console.WriteLine();
            return field;
        }
        public void ShowField()
        {
            Console.Clear();
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    if ((i == current.X) && (j==current.Y))
                    {
                        field[i, j] = "\\_/";
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.ResetColor();
                    }
                    Console.Write("{0,4}", field[i, j]);
                }
                Console.WriteLine();
            }
        }
        public void SwapArrayElements(ref string a, ref string b)
        {
            string temp = a;
            a = b;
            b = temp;
        }
        public void MoveRight()
        {
            if (current.Y < field.GetLength(1)-1)
            {
                SwapArrayElements(ref field[current.X, current.Y], ref field[current.X, current.Y + 1]);
                current.Y++;
            }
        }
        public void MoveLeft()
        {
            if (current.Y > 0)
            {
                SwapArrayElements(ref field[current.X, current.Y], ref field[current.X, current.Y - 1]);
                current.Y--;
            }
        }
        public void MoveUp()
        {
            if (current.X > 0)
            {
                SwapArrayElements(ref field[current.X-1, current.Y], ref field[current.X, current.Y]);
                current.X--;
            } 
        }
        public void MoveDown()
        {
            if (current.X < field.GetLength(0)-1)
            {
                SwapArrayElements(ref field[current.X + 1, current.Y], ref field[current.X, current.Y]);
                current.X++;
            }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Field field = new Field();
            field.GetField();
            field.ShowField();
 
 
            while (true)
            {
                ConsoleKeyInfo keyinfo = Console.ReadKey();
 
                switch (keyinfo.Key)
                {
                    case ConsoleKey.UpArrow:
 
                        field.MoveUp();
                        break;
                    case ConsoleKey.DownArrow:
                        field.MoveDown();
 
                        break;
                    case ConsoleKey.LeftArrow:
                        field.MoveLeft();
 
                        break;
                    case ConsoleKey.RightArrow:
                        field.MoveRight();
                        break;
                }
                field.ShowField();
            }
        }
    }
}

Что именно нужно переделать: нужно реализовать игру "пятнашки" без использования System.Drawing. В источнике где я взял код уже ответили на данную проблему, но я, из-за того что я еще не опытный, не могу понять как именно это сделать. Пожалуйста объясните как мне это сделать или покажите готовый результат который я бы мог проанализировать. Прошу для обучения.
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
FoggyFinder
@FoggyFinder
Давайте попробуем вместе разобраться как решать подобные вопросы.

В таких случаях первое что нужно сделать это правильно докопаться до корня проблемы.

Ваша задача убрать использование пространства имен System.Drawing.

Что для этого нужно сделать?
1. Убрать вверху заголовочный using
using System.Drawing;
2. Удалить ссылку на сборку

Теперь пробуем скомпилировать проект, получаем ошибки:

error CS0246: Не удалось найти тип или имя пространства имен "Point" (возможно, отсутствует директива using или ссылка на сборку)


Значит вопрос можно переформулировать примерно следующим образом:

Чем можно заменить класс Point из System.Drawing?


Согласитесь, что чем более конкретен вопрос тем легче на него ответить.

Итак, всего одна ошибка значит большого труда исправление не составит. Не хватает одного класса Point. Можно пойти посмотреть исходники и скопировать класс оттуда, но мы пойдем другим путем.

Компилятор пишет что нужен класс? Окей, давайте создадим класс

class Point
{

}


Пробуем собрать, ошибок стало еще больше. Но пугаться не нужно, внимательно читаем сообщения и строки которые вызывают ошибки

if (field[i, j] == "0") current = new Point(i, j);

1>error CS1061: "Point" не содержит определения "X", и не удалось найти доступный метод расширения "X", принимающий тип "Point" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).


if ((i == current.X) && (j == current.Y))


1>error CS1061: "Point" не содержит определения "Y", и не удалось найти доступный метод расширения "Y", принимающий тип "Point" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
1>error CS1061: "Point" не содержит определения "Y", и не удалось найти доступный метод расширения "Y", принимающий тип "Point" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).


Кажется, все понятно. Мы пытаемся использовать несуществующий конструктор и несуществующие свойства.

Добавляем все необходимое. Компилятор ругается на два свойства и ожидает увидеть конструктор с двумя параметрами? Ага, зависимость видна - каждому параметру соответствует свое свойство с названиями X и Y соответственно.

Как определить их тип? Смотрим что мы пытаемся туда передать? i , j - целые числа - int. Значит его и ставим.

class Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}


Пробуем скомпилировать? Ошибок нет, можно переходить к этапу проверки работоспособности.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
уже ответили на данную проблему

так а почему не уточнить именно там?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы