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

tob

Capitan
Регистрация
20 Окт 2013
Сообщения
90
Репутация
0
Спасибо
0
Монет
0
#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 = new char[10];
}
for (int i = 0; i < 10; i++) // заполнение поля пустыми пробелами
{
for (int j = 0; j < 10; j++)
{
field[j] = ' ';
}
}
separation = " ----------------------------------------";

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

Player::~Player()
{
for (int i = 0; i < 10; i++)
{
delete[] field;
}
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[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); }
 
Ты действительно думаешь, что мы в это будем вчитываться, чтобы только оценить?
 
1. не заумный, а китайский - копипастный. везде под каждое число палуб своя ветка. вижу это лишним 2. зачем field динамический, если размер все равно констатный? вот: char field[10][10] = {0}; сразу и объявил и нулями заполнил 3. класс player в отдельный файл вот все основное сказал. больше по архитектуре и алгоритму сказать нечего. тяжело читается из-за пункта 1. больше всего не понравился именно пункт 1. новичок может не знать инициализацию массивов в Плюсах, но думать он уметь обязан. видно не самый высокий уровень абстрактного интеллекта и таланта. у меня тоже. и лишь спустя год работы я понял, что надо тренировать
 
Назад
Сверху