Здравствуйте, в классе (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'; является демонстрационным, в коде немного по другому, но суть проблемы явно проявляется.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Установил через диспетчер пакетов nuget библиотеку pjsuaиспользуя using подключаю ее и все нормально, могу использовать классы и методы
Я знаю что нужно выполнить преобразование типов, но хотел бы разобраться в механизмеПочему этот код выдает ошибку?
Есть примерно 10 USB устройств подключенных через USB-хабДля работы с устройствами есть библиотека производителя