Два экземпляра класса при обработке как-бы “склеиваются”

256
04 октября 2017, 06:44

Здравствуйте, в классе (C) создаются и используются два экземпляра класса-наследника (B : A), поля класса (C) взаимодействуют с парой публичных методов класса (B) и используют данные отдельно каждого экземпляра. И класс (C) выдаёт данные согласно полученным данным от экземпляров класса (B). Загвоздка в том что на выходе класс (C) даёт информацию как бы от одного экземпляра.

Суть: в class Session : The_Battle две матрицы (char) заполняются каким либо значением, пусть будет '*', далее путём прохождения по матрицам экземпляров класса Field_Creation – находятся значения (изначально присвоенные кораблям, количество палуб) и в две матрицы (char) класса - Session : The_Battle вносятся коррективы (в ячейки матриц (char) class Session вносится значение аналогичных ячеек класса Field_Creation ( с значениями кораблей ) ). На выходе хотелось бы увидеть два поля 10/10 (производные от матриц (char) class Session) на которых изображена "деятельность" обоих экземпляров (разное размещение кораблей), но в итоге два поля отображают один и тот же экземпляр класса Field_Creation. Так же Session.S_enemyField несущий в себе информацию о расположении кораблей – эту информацию частично теряет.

Надеюсь на хоть какую-то информацию. Проблема обнаружила себя в классе Session.superpositionMyArrays() конкретное место обозначено информирующим комментарием.

class Program
{
    static void Main(string[] args)
    {
        Session session = new Session();
        session.drawBattlefield();
        Console.ReadKey();
    }
}
class Ship_Design
{
    private int valueDeck;
    public Ship_Design(int data)
    {
        this.valueDeck = data;
    }
    public int GetValueShip()
    {
        return valueDeck;
    }
}
class Field_Creation
{
    private int[,] field;
    public Field_Creation()
    {
        createField();
        deployingOnField();
    }
    private void createField()
    {
        field = new int[10, 10];
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                field[i, j] = 0;
            }
        }
    }
    public int[,] getField()
    {
        return field;
    }
    private void deployingOnField()
    {
        Ship_Design fourDeck = new Ship_Design(4);
        Random rnd = new Random();
        for (int i = 0; i < 30; i++)
        {
            int X = rnd.Next(0, 9);
            int Y = rnd.Next(0, 9);
            if (directionRIGHT(fourDeck, X, Y) == true) break;
        }
    }
    private bool directionRIGHT(Ship_Design ship, int x, int y)
    {
        if (y + (ship.GetValueShip() - 1) > 9) return false;
        int sectionCount = 0;
        for (int i = 0; i < ship.GetValueShip(); i++)
        {
            if (checkArea(x, y + i) == 0)
            {
                sectionCount++;
            }
        }
        if (sectionCount == ship.GetValueShip())
        {
            for (int i = 0; i < ship.GetValueShip(); i++)
            {
                marking(ship.GetValueShip(), x, y + i);
            }
            return true;
        }
        return false;
    }
    private int checkArea(int x, int y)
    {
        int[] sequenceParam = new int[] { x, y, x + 1, y, x + 1, y + 1, x, y + 1, x - 1, y + 1, x - 1, y, x - 1, y - 1, x, y - 1, x + 1, y - 1 };
        int bufInt = 0;
        for (int i = 0; i < 18; i++)
        {
            int bufX = sequenceParam[i];
            ++i;
            int bufY = sequenceParam[i];
            bufInt += inArr(bufX, bufY);
        }
        return bufInt;
    }
    private int inArr(int x, int y)
    {
        if (x > 9 || x < 0 || y > 9 || y < 0)
        {
            return 0;
        }
        else
        {
            return field[x, y];
        }
    }
    private void marking(int cellValue, int mx, int my)
    {
        field[mx, my] = cellValue;
    }
}
class The_Battle
{
    Ship_Design[] MyShips;
    Ship_Design[] EnemyShips;
    protected void setMyShips(Ship_Design[] myShips)
    {
        MyShips = myShips;
    }
    protected void setEnemyShips(Ship_Design[] enemyShips)
    {
        EnemyShips = enemyShips;
    }
}
class Session : The_Battle
{
    private char[,] myCharField = new char[10, 10];
    private char[,] enCharField = new char[10, 10];
    private Field_Creation S_myField = new Field_Creation();
    private Field_Creation S_enemyField = new Field_Creation();
    public Session()
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                myCharField[i, j] = '*';
                enCharField[i, j] = '*';
            }
        }
        superpositionMyArrays();
    }
    private void superpositionMyArrays()
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if (S_myField.getField()[i, j] == 1) myCharField[i, j] = '1';
                else if (S_myField.getField()[i, j] == 2) myCharField[i, j] = '2';
                else if (S_myField.getField()[i, j] == 3) myCharField[i, j] = '3';
                else if (S_myField.getField()[i, j] == 4) myCharField[i, j] = '4';
                if (S_enemyField.getField()[i, j] == 1) enCharField[i, j] = '1'; // когда в этой строке мы ставим
                                                                                 // else if – на втором поле не отображаются корабли
                else if (S_enemyField.getField()[i, j] == 2) enCharField[i, j] = '2';//
                else if (S_enemyField.getField()[i, j] == 3) enCharField[i, j] = '3';//
                else if (S_enemyField.getField()[i, j] == 4) enCharField[i, j] = '4';//
            }
        }
    }
    public void drawBattlefield()
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                Console.Write(myCharField[i, j] + " ");
            }
            Console.Write("\t");
            for (int k = 0; k < 10; k++)
            {
                Console.Write(enCharField[i, k] + " ");
            }
            Console.WriteLine();
        }
        Console.WriteLine();
    }
}

}

Так же нужно понимать что приведение: if (S_enemyField.getField()[i, j] == N) enCharField[i, j] = 'N'; является демонстрационным, в коде немного по другому, но суть проблемы явно проявляется.

READ ALSO
DllNotFoundException: Не удается загрузить DLL

DllNotFoundException: Не удается загрузить DLL

Установил через диспетчер пакетов nuget библиотеку pjsuaиспользуя using подключаю ее и все нормально, могу использовать классы и методы

431
Почему нельзя сложить в C# byte + byte?

Почему нельзя сложить в C# byte + byte?

Я знаю что нужно выполнить преобразование типов, но хотел бы разобраться в механизмеПочему этот код выдает ошибку?

307
Работа с usb устройствами

Работа с usb устройствами

Есть примерно 10 USB устройств подключенных через USB-хабДля работы с устройствами есть библиотека производителя

289
Keep alive of TCP connection

Keep alive of TCP connection

Добрый день

245