Помогите пожалуйста с программой на С++, чего то не могу разобраться с чего ее начать.
Поле шахматной доски задается парой натуральных чисел: первое указывает номер вертикали при счете снизу вверх. Расстановка фигур задается таким образом, что пользователь определяет вначале поля, на которых стоят перечисленные белые фигуры, затем поля - на которых стоят перечисленные черные фигуры. На доске стоят белый ферзь, белая ладья и черный ферзь. Составить программу, которая укажет поля, на которые может пойти черный ферзь, чтобы не попасть под удар белых.
#include <iomanip> //- библиотека в которой имеются функции для выравнивания, при выводе в коде есть setw(x) - х - кол-во символов заданных для вывода.
#include <iostream>
#include <cstdlib>
using namespace std;
#define SIZE 8 //означает что выражение SIZE это число 8, то есть где имеется слово SIZE то программа вместо СИЗЕ видить 8
char Desk[SIZE][SIZE]; //создаем двумерный массив символов, то бишь шахматную доску где клетка это символ
void DeskCompare()
{//заполнение доски точками
for (int i = 0; i < SIZE; ++i)
for (int j = 0; j < SIZE; ++j)
Desk[j] = '.';
}
void klpdb(char c, int i, int j)//С - параметр указывающий какой символ нужноиспользовать, i j координаты
{
if (c=='*') {//если указана звезда, то надо ставить звездочку
if (Desk[j] == '.') Desk[j]='*';}//все просто - если в клетке стоит точка то меняет на звездочку, если там другие символы то ничего не делает
if (c=='$')//если нужно указать ходы черному ферзю
{ if (Desk[j]=='.') Desk[j]='$';} //также ставим знак бакса только там где точка, так как поля со звездами не подходят
}
void QSet(unsigned short i, unsigned short j)
{
//проверка значений
if (((i < 0 || i > 7) && (j < 0 || j > 7)) || Desk[j] == 'C')//если значения не находятся в диапазоне от 0 до 7 или координаты совпадают с координатами ладьи
{
cout << "Wrong distance!n";//то послать все к черту ибо ошибка, так как значения не находятся в нужном диапазоне, не "неправильный ход" а не правильное значение ферзь не может стоять на координате х=9 у=-4
exit(0); //выход
}
int y = i;
int x = j;
Desk[y][x] = 'Q';//ставим белого короля на заданные координаты
//дальше начинается расчет возможных ходов, во все стороны
// По диагонали сверху вниз слева направо.
// (++у - начинаем со значения равного у+1; цикл работает пока У меньше 8 и Х меньше 8; прибавлять к Х и У по еденице)
for (++y, ++x; y < SIZE && x < SIZE; ++y, ++x)
{
klpdb('*',x,y); // Х и У координаты в которой нужно поставить *
}
// По диагонали снизу вверх слева направо.
y = i;
x = j;
for (--y, ++x; y >= 0 && x < SIZE; --y, ++x)
{
klpdb('*',x,y);
}
// По диагонали сверху вниз справа налево.
y = i;
x = j;
for (++y, --x; y < SIZE && x >= 0 ; ++y, --x)
{
klpdb('*',x,y);
}
// По диагонали снизу вверх слева направо.
y = i;
x = j;
for (--y, --x; y >= 0 && x >= 0; --y, --x)
{
klpdb('*',x,y);
}
// горизонтль.
y = i;
x = j;
for (x=0; x < SIZE; x++)
{
klpdb('*',x,y);
}
// вертикаль.
y = i;
x = j;
for (y=0; y < SIZE; y++)
{
klpdb('*',x,y);
}
}
void CSet(unsigned short i, unsigned short j)
{
if ((i < 0 || i > 7) && (j < 0 || j > 7)) //если значения не находятся в диапазоне от 0 до 7
{
cout << "Wrong distance!n"; //то поясняет об ошибке
exit(0);//ВЫХОД
}
int y = i; //присвоение координат к другой переменной ибо x и y будут меняться а i j нет
int x = j;
Desk[y][x] = 'C'; //присвоение клетке с координатами у х занчение С, то есть там стоит ладься Castel
// По горизонтали.
for (int х=0; x < SIZE; x++)
klpdb('*',x,y);
// По вертикали.
x = j;
for (y=0; y < SIZE; y++)
klpdb('*',x,y);
}
void qSet(unsigned short i, unsigned short j) //черный ферзь
{
if (((i < 0 || i > 7) && (j < 0 || j > 7)) || (Desk[j] == 'C' || Desk[j] == 'Q'))//аналог выше
{
cout << "Wrong distance!n";
exit(0);
}
int y = i;
int x = j;
Desk[y][x] = 'q';
// По диагонали сверху вниз слева направо.
for (++y, ++x; y < SIZE && x < SIZE; ++y, ++x)
{
klpdb('$',x,y);}
// По диагонали снизу вверх слева направо.
y = i;
x = j;
for (--y, ++x; y >= 0 && x < SIZE; --y, ++x)
{
klpdb('$',x,y);
}
// По диагонали сверху вниз справа налево.
y = i;
x = j;
for (++y, --x; y < SIZE && x >= 0; ++y, --x)
{
klpdb('$',x,y);
}
// По диагонали снизу вверх слева направо.
y = i;
x = j;
for (--y, --x; y >= 0 && x >= 0; --y, --x)
{
klpdb('$',x,y);
}
// По горизонтали.
y = i;
x = j;
for (x=0; x < SIZE; x++)
{
klpdb('$',x,y);
}
// По вертикали.
y = i;
x = j;
for (y=0; y < SIZE; y++)
{
klpdb('$',x,y);
}
}
void line()
{
cout<<endl<<" -----------------------------------";
}
void ShowDesk() //функция красивого вывода с использованием библиотеки иоманип, все правильно расчитано и соответсвует введенным координатам - по горизонтали х по вертикали У
{//можешь поэксперементировать
cout<<endl<<setw(2)<<" |";
for(int q=1;q<=8;q++)cout<<setw(2)<<q<<" |";
cout<<" <= X";
for (int q=7;q>=0;q--)
{for (int e=1;e>=36;e++) {cout<<"_";}
line();
cout<<endl<<setw(2)<<q+1<<" |";
for(int w=0;w<=7;w++)
{ cout<<setw(2)<<Desk[w][q]<<" |";
}
}
line();
cout<<endl<<" ^"<<endl<<" Y"<<endl<<endl;
}
void FirstCoo(){
int x, y;
cout << "Enter coordinatest White Castel:";
cout<<"x = "; cin >> x;
cout<<"y = "; cin >> y;
CSet( x-1,y-1); //так как в начале показана доска 8х8 а в массиве используется диапазон от 0 до 7 то -1
cout << "Enter coordinatest White Queen:;
cout<<"x = "; cin >> x;
cout<<"y = "; cin >> y;
QSet( x-1,y-1);
cout << "Enter coordinatest Black Queen:;
cout<<"x = "; cin >> x;
cout<<"y = "; cin >> y;
qSet( x-1,y-1);
}
int main()
{
DeskCompare();
ShowDesk();
FirstCoo();
cout<<endl;
ShowDesk();
system("pause");
return 0;
}
Есть вариант массив структур.
#include <cstdlib>
#define SIZE 8
char Desk[SIZE][SIZE];
void DeskCompare()
{
for (int i = 0; i < SIZE; ++i)
for (int j = 0; j < SIZE; ++j)
Desk[j] = '.';
}
void ShowDesk()
{
std::cout << 'n';
for (int i = 0; i < SIZE; ++i)
for (int j = 0; j < SIZE; ++j)
{
if (Desk[j] == '*')
std::cout << ".|";
else
std::cout << Desk[j] << '|';
if (j % 8 == 7)
std::cout << 'n';
}
std::cout << 'n';
}
bool DisasterQ(int i, int j)
{
if (Desk[j] == 'C')
return true;
return false;
}
bool Disasterq(int i, int j)
{
if (Desk[j] == 'C' || Desk[j] == 'Q')
return true;
return false;
}
void QSet(unsigned short i, unsigned short j)
{
if (((i < 0 || i > 7) && (j < 0 || j > 7)) || Desk[j] == 'C')
{
std::cout << "Wrong distance!n";
exit(0);
}
int y = i;
int x = j;
Desk[y][x] = 'Q';
// По диагонали сверху вниз слева направо.
for (++y, ++x; y < SIZE && x < SIZE; ++y, ++x)
{
if (DisasterQ(y, x))
break;
Desk[y][x] = '*';
}
// По диагонали снизу вверх слева направо.
y = i;
x = j;
for (--y, ++x; y >= 0 && x < SIZE; --y, ++x)
{
if (DisasterQ(y, x))
break;
Desk[y][x] = '*';
}
// По диагонали сверху вниз справа налево.
y = i;
x = j;
for (++y, --x; y < SIZE && x >= 0 ; ++y, --x)
{
if (DisasterQ(y, x))
break;
Desk[y][x] = '*';
}
// По диагонали снизу вверх слева направо.
y = i;
x = j;
for (--y, --x; y >= 0 && x >= 0; --y, --x)
{
if (DisasterQ(y, x))
break;
Desk[y][x] = '*';
}
// По горизонтали вперёд.
y = i;
x = j;
for (++x; x < SIZE; ++x)
{
if (DisasterQ(y, x))
break;
Desk[y][x] = '*';
}
// По горизонтали назад.
y = i;
x = j;
for (--x; x >= 0; --x)
{
if (DisasterQ(y, x))
break;
Desk[y][x] = '*';
}
// По вертикали вниз.
y = i;
x = j;
for (++y; y < SIZE; ++y)
{
if (DisasterQ(y, x))
break;
Desk[y][x] = '*';
}
// По веритикали вверх.
y = i;
x = j;
for (--y; y >= 0; --y)
{
if (DisasterQ(y, x))
break;
Desk[y][x] = '*';
}
}
void CSet(unsigned short i, unsigned short j)
{
if ((i < 0 || i > 7) && (j < 0 || j > 7))
{
std::cout << "Wrong distance!n";
exit(0);
}
int y = i;
int x = j;
Desk[y][x] = 'C';
// По горизонтали вперёд.
for (++x; x < SIZE; ++x)
Desk[y][x] = '*';
// По горизонтали назад.
y = i;
x = j;
for (--x; x >= 0; --x)
Desk[y][x] = '*';
// По вертикали вниз.
y = i;
x = j;
for (++y; y < SIZE; ++y)
Desk[y][x] = '*';
// По веритикали вверх.
y = i;
x = j;
for (--y; y >= 0; --y)
Desk[y][x] = '*';
}
void qSet(unsigned short i, unsigned short j)
{
if (((i < 0 || i > 7) && (j < 0 || j > 7)) || (Desk[j] == 'C' || Desk[j] == 'Q'))
{
std::cout << "Wrong distance!n";
exit(0);
}
int y = i;
int x = j;
Desk[y][x] = 'q';
// По диагонали сверху вниз слева направо.
for (++y, ++x; y < SIZE && x < SIZE; ++y, ++x)
{
if (Disasterq(y, x))
break;
if (Desk[y][x] != '*')
Desk[y][x] = '$';
}
// По диагонали снизу вверх слева направо.
y = i;
x = j;
for (--y, ++x; y >= 0 && x < SIZE; --y, ++x)
{
if (Disasterq(y, x))
break;
if (Desk[y][x] != '*')
Desk[y][x] = '$';
}
// По диагонали сверху вниз справа налево.
y = i;
x = j;
for (++y, --x; y < SIZE && x >= 0; ++y, --x)
{
if (Disasterq(y, x))
break;
if (Desk[y][x] != '*')
Desk[y][x] = '$';
}
// По диагонали снизу вверх слева направо.
y = i;
x = j;
for (--y, --x; y >= 0 && x >= 0; --y, --x)
{
if (Disasterq(y, x))
break;
if (Desk[y][x] != '*')
Desk[y][x] = '$';
}
// По горизонтали вперёд.
y = i;
x = j;
for (++x; x < SIZE; ++x)
{
if (Disasterq(y, x))
break;
if (Desk[y][x] != '*')
Desk[y][x] = '$';
}
// По горизонтали назад.
y = i;
x = j;
for (--x; x >= 0; --x)
{
if (Disasterq(y, x))
break;
if (Desk[y][x] != '*')
Desk[y][x] = '$';
}
// По вертикали вниз.
y = i;
x = j;
for (++y; y < SIZE; ++y)
{
if (Disasterq(y, x))
break;
if (Desk[y][x] != '*')
Desk[y][x] = '$';
}
// По веритикали вверх.
y = i;
x = j;
for (--y; y >= 0; --y)
{
if (Disasterq(y, x))
break;
if (Desk[y][x] != '*')
Desk[y][x] = '$';
}
}
int main()
{
int x, y;
DeskCompare();
std::cout << "Enter coordinatest White Castel:nx = ";
std::cin >> x;
std::cout << "y = ";
std::cin >> y;
CSet(y, x);
std::cout << "Enter coordinatest White Castel:nx = ";
std::cin >> x;
std::cout << "y = ";
std::cin >> y;
QSet(y, x);
std::cout << "Enter coordinatest Black Queen:nx = ";
std::cin >> x;
std::cout << "y = ";
std::cin >> y;
qSet(y, x);
ShowDesk();
return 0;
}
Прога работает только можно немного в упрощенном варианте и с подробностями) пожалуйста) просто не все понятно) а сдавать уже скоро) помогите, если не тяжело
И прога, не указывает поля, на которые может пойти черный ферзь, чтобы не попасть под удар белых. Мы просто вводим с клавиатуры числа на которые может пойти ферзь и все.
Спасибо большое Пашка, только еще надо эту прогу в графическом виде представить. Если не трудно сделай, пожалуйста!