Другие языки программирования и технологии

C++ как вам код новичка? Не слишком "заумный"?

#include iostream
#include ctime
#include windows.h
#include string

using namespace std;

class Player
{
private:
char **field = new char*[10];
string separation;
int dir, positionX, positionY, numOneDecks = 1, numTwoDecks = 2, numThreeDecks = 3, numFourDecks = 4;
bool SettingIsPossibleScope(int direction, int x, int y, int numDecks);
bool SettingIsPossibleObstacles(char** arr, int x, int y, int numDecks);
void foo(int numDecks);
void randXY(char** arr, int& x, int& y, int &direction);
public:
Player();
void PrintField();
void SetShips(int numDeck);
~Player();
};

Player::Player()
{
for (int i = 0; i < 10; i++)
{
field[i] = new char[10];
}
for (int i = 0; i < 10; i++) // заполнение поля пустыми пробелами
{
for (int j = 0; j < 10; j++)
{
field[i][j] = ' ';
}
}
separation = " ----------------------------------------";

randXY(field, positionX, positionY, dir);
}

Player::~Player()
{
for (int i = 0; i < 10; i++)
{
delete[] field[i];
}
delete[] field;
}

void Player::PrintField()
{
cout << " ";
for (char i = 'а'; i <= 'й'; i++)
{
cout << i << " ";
}
cout << endl << separation << endl;
for (int i = 0; i < 10; i++)
{
if (i == 9)
{
cout << " " << i + 1 << "| ";
}
else
{
cout << " " << i + 1 << " | ";
}
for (int j = 0; j < 10; j++)
{
cout << field[i][j] << " | ";
}
cout << endl << separation << endl;
}
}

bool Player::SettingIsPossibleScope(int direction, int x, int y, int numDecks)
{
switch (direction)
{
case 0:
if (x + (numDecks-1) > 9)
{
return false;
}
return true;
case 1:
if (x - (numDecks - 1) < 0)
{
return false;
}
return true;
case 2:
if (y + (numDecks - 1) > 9)
{
return false;
}
return true;
case 3:
if (y - (numDecks - 1) < 0)
{
return false;
}
return true;
}
}

bool Player::SettingIsPossibleObstacles(char** arr, int x, int y, int numDecks) // проверяет нет ли кораблей вокруг
{
for (int i = 0; i < numDecks; i++)
{
if ((x < 9 && y < 9 && x > 0 && y > 0) && (arr[x + 1][y] == 'X' || arr[x - 1][y] == 'X'
|| arr[x][y + 1] == 'X' || arr[x][y - 1] == 'X'
|| arr[x - 1][y - 1] == 'X' || arr[x - 1][y + 1] == 'X'
|| arr[x + 1][y - 1] == 'X' || arr[x + 1][y + 1] == 'X'))
{
return false;
}
x++;
y++;
}
return true;
}

void Player::randXY(char **arr, int &x, int &y, int &direction) // рандомин начальные координаты
{
do
{
direction = rand() % 4;
y = rand() % 10;
x = rand() % 10;
} while (arr[x][y] != ' ');
}

void Player::foo(int numDecks)
{
for (int i = 0; i < numDecks; i++) //расстановка 4-x палубных
{
field[positionX][positionY] = 'X';
switch (dir)
{
case 0:
if ((!SettingIsPossibleScope(dir, positionX, positionY, numDecks) || !SettingIsPossibleObstacles(field, positionX, positionY, numDecks)) && i == 0)
{
field[positionX][positionY] = ' ';
randXY(field, positionX, positionY, dir);
i--;
break;
}
positionX++;
break;
case 1:
if ((!SettingIsPossibleScope(dir, positionX, positionY, numDecks) || !SettingIsPossibleObstacles(field, positionX, positionY, numDecks)) && i == 0)
{
field[positionX][positionY] = ' ';
randXY(field, positionX, positionY, dir);
i--;
break;
}
positionX--;
break;
case 2:
if ((!SettingIsPossibleScope(dir, positionX, positionY, numDecks) || !SettingIsPossibleObstacles(field, positionX, positionY, numDecks)) && i == 0)
{
field[positionX][positionY] = ' ';
randXY(field, positionX, positionY, dir);
i--;
break;
}
positionY++;
break;
Типичный код для новичка, который не слишком хорошо понимает, как работает язык программирования.

Например, твой первый switch переписывается в виде:

switch (direction) {
case 0: return x + (numDecks-1) <= 9;
case 1: return x - (numDecks - 1) >= 0;
case 2: return y + (numDecks - 1) <= 9;
case 3: return y - (numDecks - 1) >= 0;
}

А последний switch заменяется на простейший if:

if (numDeck < 1 || numDeck > 4) {
cout << "Корабля с таким колличеством палуб не предусмотренно" << endl;
} else {
foo(numDeck);
}
* Кэф *
50 633
Лучший ответ
Daichi Yuu не слишком хорошо изучили язык, это когда пишут вот так

if (numDeck < 1) {
} else if (numDeck > 4) {
cout << "Корабля с таким колличеством палуб не предусмотренно" << endl;
} else {
foo(numDeck);
}

да, лишний else if, т. к. не изучили ||
но такое чудовищное усложнение только от проблем с логикой
Федор Долгополов понятно, а вот интересно стоит ли стремится код класса раскидывать на как можно большее количество методов, чтобы каждый метод выполнял конкретную задачу? так более читаемо будет?
Ты действительно думаешь, что мы в это будем вчитываться, чтобы только оценить?
ТН
Тарас Набок
75 934
Федор Долгополов не вчитываться, глянуть поверхностно
** - это реально необходимо в этой задаче? Сами в этом не запутаетесь?
Игорь Исимбаев
Игорь Исимбаев
23 766
коротко объясни в чем заумность
может в вашем понимакнии
-- заумный это - нагроможденный код излишествами всякими

ps. умный код это оптимизированный под гибкие задачи и ничего лишнего
а можно на пейстбин код выложить?
мерси!
Я бы выложил на гитхаб, чтобы собрать больше обратной связи.
Дима Шулаев
Дима Шулаев
8 520
1. не заумный, а китайский - копипастный. везде под каждое число палуб своя ветка. вижу это лишним

2. зачем field динамический, если размер все равно констатный?
вот:
char field[10][10] = {0};
сразу и объявил и нулями заполнил

3. класс player в отдельный файл

вот все основное сказал.
больше по архитектуре и алгоритму сказать нечего. тяжело читается из-за пункта 1.

больше всего не понравился именно пункт 1. новичок может не знать инициализацию массивов в Плюсах, но думать он уметь обязан.
видно не самый высокий уровень абстрактного интеллекта и таланта.
у меня тоже. и лишь спустя год работы я понял, что надо тренировать
Федор Долгополов мне начали предупреждения выскакивать что то типа память заполнена, массив 100 байт, а всего 110, вот я и переделал в динамический
1. Использование "голого" динамического выделения памяти - всегда сомнительная практика. Но использование "голого" динамического выделения памяти в BoE-инициализаторе для поля класса - за это надо бить по рукам.

2. Зачем в методы `randXY` и `SettingIsPossibleObstacles` массив `field` передается в качестве параметра если он там и так доступен как поле класса?

3. В чем заключается назначение полей `numOneDecks`, `numTwoDecks`, `numThreeDecks`, `numFourDecks`?

4. И т. д. И т. п.
Vlad Ik
Vlad Ik
248
Что это такое?
Федор Долгополов кораблики, морской бой