Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 33
#1

Оцените программу: Шахматы - C++

12.03.2014, 18:20. Просмотров 1230. Ответов 17
Метки нет (Все метки)

Я почти не учил раньше программирование, чуть в школе, чуть в универе (все знания сводились о знании о переменных и цыклах). А месяцев 9 назад задумал подучить программирование, в свободное время читал книгу Лафоре "ООП в С++". Прочитал пол книги и недавно надумал сделать шахмоты в консоле)) Я понимаю что в консоли никто играть не будет в них, это просто вызов самому себе "смогу ли?" А кроме консоли пока толком ничего незнаю).
Зацените, если кто хочет, потестируйте на наличие багов. Это моя первая программа, отличная от задачек в книге, и большая 150 строк, поэтому скажите что-то за стиль и оформление) (я так догадуюсь что "ужасно")
P.S. эсли кто будет разбираться в коде: в коментариях "тура" это "ладья".
Архив с файлом кода: шахматы.7z
Для тех кто нехочет качать код тут:
Кликните здесь для просмотра всего текста

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;

class kletka
{
private:
int x; // x, y -координаты
int y;
int n; // что на этой клетке: 0-пусто, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
bool color_kletki; // цвет клетки: 0-черный, 1-белый
bool color_figur; // цвет фигур: 0-черный, 1-белый
bool hod_peshki; // идентефикатор, обозначающий сделала ли фигура первый ход: 0 - не сделала, 1 - сделала
public:
kletka():x(0),y(0),n(0),color_kletki(0),color_figur(0),hod_peshki(0){}
//kletka(int x, int y, int n, bool ck, bool cf):x(x), y(y), n(n), color_kletki(ck),color_figur(cf){} // пока ненужно
void setx(int X){x=X;}
void sety(int Y){y=Y;}
void setn(int N){n=N;}
void setck(bool CK){color_kletki=CK;}
void setcf(bool CF){color_figur=CF;}
void sethp(bool HP){hod_peshki=HP;}
int getx()const{return x;}
int gety()const{return y;}
int getn()const{return n;}
int getck()const{return color_kletki;}
int getcf()const{return color_figur;}
int gethp()const{return hod_peshki;}
void draw()const; // отображение элемента (клетка или фигура)
void zapolnenie(int i); // заполнение созданых клеток (начальная ростановка фигур)
};
void kletka::draw()const
{
setlocale(LC_CTYPE, ".866"); // Установка DOS локализации для правильного отображения клеток
if(n==0) // пустая клетка
{
if(color_kletki==0)
cout<<char(176); // черная
if(color_kletki==1)
cout<<char(178); // белая
}
if(n==1) // пешка
{
if(color_figur==0)
cout<<"P"; // черная
if(color_figur==1)
cout<<"p"; // белая
}
if(n==2) // слон
{
if(color_figur==0)
cout<<"B"; // черный
if(color_figur==1)
cout<<"b"; // белый
}
if(n==3) // конь
{
if(color_figur==0)
cout<<"H"; // черный
if(color_figur==1)
cout<<"h"; // белый
}
if(n==4) // тура
{
if(color_figur==0)
cout<<"C"; // черная
if(color_figur==1)
cout<<"c"; // белая
}
if(n==5) // ферзь
{
if(color_figur==0)
cout<<"Q"; // черная
if(color_figur==1)
cout<<"q"; // белая
}
if(n==6) // король
{
if(color_figur==0)
cout<<"K"; // черный
if(color_figur==1)
cout<<"k"; // белый
}
}
void kletka::zapolnenie(int i)
{
x=i%8+1; // заполнение координат х
y=i/8+1; // заполнение координат у
if((x%2!=0&&y%2!=0)||(x%2==0&&y%2==0)) // если х и у оба нечетные или оба четные то
color_kletki=1; // клетка белая
else // иначе
color_kletki=0; // клетка черная
if(y<3)
color_figur=0; // черные фигуры
if(y>6)
color_figur=1; // белые фигуры
if(y>2&&y<7)
n=0; //пустые поля
if(y==2||y==7)
n=1; // пешки
if((x==1&&y==1)||(x==8&&y==1)||(x==1&&y==8)||(x==8&&y==8))
n=4; // туры
if((x==2&&y==1)||(x==7&&y==1)||(x==2&&y==8)||(x==7&&y==8))
n=3; // кони
if((x==3&&y==1)||(x==6&&y==1)||(x==3&&y==8)||(x==6&&y==8))
n=2; // слоны
if((x==4&&y==1)||(x==4&&y==8))
n=5; // ферзи
if((x==5&&y==1)||(x==5&&y==8))
n=6; // короли
}

void obnovit_pole(kletka arr[64]); // функция обновляет поле (заново перересовует расположение фигур на доске, и саму доску)
int hod(int c, kletka arr[64], bool& clf);
void obmen_peshki(kletka arr[64], bool cf, int ct); // функция вызывается при достижении пешкой противоположного края доски
int pod_udarom(int figura, int target, bool& clf, kletka arr[64]); // функция принимает массив и кординаты в нем обьекта и цели, а возвращает фигуру которая под ударом
void help(); // справка
int shah(kletka arr[64], int co, int ct, bool& clf); // проверка на наличие шаха

int main()
{
// создание и заполнение массива (шахматной доски)
int count=1; // счетчик номера хода (для установки очередности хода)
int c; // переменная которая показует был ли сделан ход
bool cl_f; // переменна которая показывает цвет фигуры которая под ударом (для функции "pod_udarom")...
kletka arr[64];
for(int i=0;i<64;i++)
arr[i].zapolnenie(i); // растановка фигур
obnovit_pole(arr); // нарисовать поле
while(1)
{
c=hod(count, arr, cl_f);
if(c==0)
count++;
obnovit_pole(arr);
cout<<endl;
}
system("pause");
return 0;
}
void obnovit_pole(kletka arr[64])
{
system("cls"); // очистка экрана (типа clrscr()
int k=0; // счетчик номера элемента массива
for(int i=0; i<9; i++)
{
if(i==8)
{
cout<<endl<<"ABCDEFGH"<<endl;
break;
}
for(int j=0; j<8; j++)
{
arr[k].draw();
k++;
}
cout<<" "<<8-i<<endl;
}
}

int hod(int count, kletka arr[64], bool& clf) // функция принимает доску с фигурами и номер хода, а возвращает 0 если ход был выполнен или 1 если ход еще не сделан
{
// count - идентефикатор для установления очередности хода (четное значение - ходят черные, нечетное - белые)
int x1=0, x2=0, y1=0, y2=0;
char cx1, cx2, cy1, cy2;
kletka object;
kletka target;
int co, ct; // адреса в масиве обьекта и цели
setlocale( LC_ALL,"Russian" ); // Локализация под вывод кирилицы
while(1) // безконечный цикл, внутри которого будет идти проверка на правильность хода (цикл будет повторятся пока не будут введены корректные координаты)
{
cout<<endl<<endl<<"Для справки напишите \"help\""<<endl;
if(count%2==1)
cout<<endl<<"Ход белых"<<endl;
else
cout<<endl<<"Ход черных"<<endl;
cout<<endl<<"Кем и куда идти: ";
cin>>cx1>>cy1>>cx2>>cy2;
if(cx1=='h' && cy1=='e' && cx2=='l' && cy2=='p')
help();

//////// перевод значений переменных////////

switch (cx1)
{
case 'a': x1=1;break;
case 'b': x1=2;break;
case 'c': x1=3;break;
case 'd': x1=4;break;
case 'e': x1=5;break;
case 'f': x1=6;break;
case 'g': x1=7;break;
case 'h': x1=8;break;
}

switch (cx2)
{
case 'a': x2=1;break;
case 'b': x2=2;break;
case 'c': x2=3;break;
case 'd': x2=4;break;
case 'e': x2=5;break;
case 'f': x2=6;break;
case 'g': x2=7;break;
case 'h': x2=8;break;
}

switch (cy1)
{
case 49: y1=8;break;
case 50: y1=7;break;
case 51: y1=6;break;
case 52: y1=5;break;
case 53: y1=4;break;
case 54: y1=3;break;
case 55: y1=2;break;
case 56: y1=1;break;
}

switch (cy2)
{
case 49: y2=8;break;
case 50: y2=7;break;
case 51: y2=6;break;
case 52: y2=5;break;
case 53: y2=4;break;
case 54: y2=3;break;
case 55: y2=2;break;
case 56: y2=1;break;
}
if(x1<1 || x1>8 || x2<1 || x2>8 || y1<1 || y1>8 || y2<1 || y2>8)
return 1; // ошибка координат
////////Определение элементов массива (обьекта и цели) по их координатам х и у//////////////////

for(int i=0; i<64; i++) // поиск в массиве клетки с заданиыми координатами
{
if(arr[i].getx()==x1 && arr[i].gety()==y1)
{
object=arr[i];
co=i;
}
if(arr[i].getx()==x2 && arr[i].gety()==y2)
{
target=arr[i];
ct=i;
}
}

//////////Проверка соблюдения очередности хода///////////

if((count%2==1 && arr[co].getcf()==0) || (count%2==0 && arr[co].getcf()==1)) // если очередь не соблюдается
return 1; // ошибка

//////////Проверка правильности хода/////////

if(arr[co].getn()!=0) // если клетка-обьект не пуста
{
/////////////////////////// если обьект - конь /////////////////////////////////////////
if(arr[co].getn()==3)
{
if(((abs(arr[co].getx()-arr[ct].getx())==1) && (abs(arr[co].gety()-arr[ct].gety())==2)) || ((abs(arr[co].getx()-arr[ct].getx())==2) && (abs(arr[co].gety()-arr[ct].gety())==1))) // правило для хода коня
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break; // если это конь и для него задан правильный ход, и на клетке-ценли нету своей фигуры то выход из бесконечного цикла
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
else
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break; // а если клетка-цель пуста, то проверки на "свой-чужой" ненада
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}
int k=0; // идентефикатор наличия препятствия

//////////////////////// если обьект - слон ////////////////////////////////////
if(arr[co].getn()==2)
{
if(abs(arr[co].getx()-arr[ct].getx())==abs(arr[co].gety()-arr[ct].gety())) // правило хода слона
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if(arr[i].getn()!=0 && i!=co) // если клетка не пуста, или эта клетка не сам обьект
{
if(abs(arr[co].getx()-arr[i].getx())==abs(arr[co].gety()-arr[i].gety())) // если расположение клетки допускает возможность хода слона на нее (правило хода слона)
{
// ниже в ифе сравнивается знак(больше или меньше нуля) разницы координат (х и у) выбраного пользователем обьекта и обьекта массива[i] и разницы координат (х и у) выбраного пользователем обьекта и цели. Если знак разниц координат со.[i] совпадает с знаком разниц координат co.ct значит направление одинаково
if((((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0)) && (((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0))) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) && (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
else
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}
} // конец проверки хода слона

/////////////////////если обьект - тура////////////////////////
if(arr[co].getn()==4)
{
if(((arr[co].getx()==arr[ct].getx()) && (arr[co].gety()!=arr[ct].gety())) || ((arr[co].gety()==arr[ct].gety()) && (arr[co].getx()!=arr[ct].getx()))) // правило хода туры
{
for(int i=0;i<64;i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if(((arr[co].getx()==arr[i].getx()) && (arr[co].gety()!=arr[i].gety())) || ((arr[co].gety()==arr[i].gety()) && (arr[co].getx()!=arr[i].getx()))) // если расположение клетки допускает возможность хода туры на нее (правило хода туры)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
else
{
if(shah(arr, co, ct,clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}
} // конец проверки хода туры

////////////////////////// если обьект - ферзь ///////////////////////////////
if(arr[co].getn()==5)
{
///////////часть описания хода ферзя, взятая с слона/////////////////
if(abs(arr[co].getx()-arr[ct].getx())==abs(arr[co].gety()-arr[ct].gety())) // правило хода слона
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if(arr[i].getn()!=0 && i!=co) // если клетка не пуста, или эта клетка не сам обьект
{
if(abs(arr[co].getx()-arr[i].getx())==abs(arr[co].gety()-arr[i].gety())) // если расположение клетки допускает возможность хода слона на нее (правило хода слона)
{
// ниже в ифе сравнивается знак(больше или меньше нуля) разницы координат (х и у) выбраного пользователем обьекта и обьекта массива[i] и разницы координат (х и у) выбраного пользователем обьекта и цели. Если знак разниц координат со.[i] совпадает с знаком разниц координат co.ct значит направление одинаково
if((((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0)) && (((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0))) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) && (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
else
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}

//////////////часть описания хода ферзя, взятая от туры///////////////
if(((arr[co].getx()==arr[ct].getx()) && (arr[co].gety()!=arr[ct].gety())) || ((arr[co].gety()==arr[ct].gety()) && (arr[co].getx()!=arr[ct].getx()))) // правило хода туры
{
for(int i=0;i<64;i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if(((arr[co].getx()==arr[i].getx()) && (arr[co].gety()!=arr[i].gety())) || ((arr[co].gety()==arr[i].gety()) && (arr[co].getx()!=arr[i].getx()))) // если расположение клетки допускает возможность хода туры на нее (правило хода туры)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
else
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}

} // конец проверки хода ферзя

//////////////////////////// если обьект - пешка /////////////////////////////
if(arr[co].getn()==1) // если это пешка
{
if(arr[co].getcf()==0) // если это черная пешка
{
if((arr[ct].gety()-arr[co].gety()==1) && (abs(arr[co].getx()-arr[ct].getx())==1)) // если черной пешкой пытаются бить
{
for(int i=0;i<64;i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].gety()-arr[co].gety()==1) && (abs(arr[co].getx()-arr[i].getx())==1)) // если на этой клетке
{
if((arr[i].getn()!=0) && (arr[i].getcf()==1)) // есть белая фигура
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
goto peremeshenie_figur; // тут использую goto потому что нужно выйти сразу из 2 циклов, а break выводит только с одного (конструкция break; break; не работает)
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}
}
if(arr[co].gethp()==0) // если это первый ход черной пешки
{
if((arr[co].getx()==arr[ct].getx()) && ((arr[ct].gety()-arr[co].gety()==1) || (arr[ct].gety()-arr[co].gety()==2))) // правило хода черной пешки (для ее первого хода)
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if((arr[co].getx()==arr[i].getx()) && ((arr[i].gety()-arr[co].gety()==1) || (arr[i].gety()-arr[co].gety()==2))) // если расположение клетки допускает возможность хода пешки на нее (правило хода пешки)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()==0) // если клетка-цель пуста
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}

}
}
}
if(arr[co].gethp()==1) // если это не первый ход черной пешки
{
if((arr[co].getx()==arr[ct].getx()) && (arr[ct].gety()-arr[co].gety()==1)) // правило хода черной пешки (для ее последующих ходов)
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if((arr[co].getx()==arr[i].getx()) && (arr[i].gety()-arr[co].gety()==1)) // если расположение клетки допускает возможность хода пешки на нее (правило хода пешки)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()==0) // если клетка-цель пуста
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}

}
}
}
}
////////////////////////////////////////////////////
if(arr[co].getcf()==1) // если это белая пешка
{
if((arr[co].gety()-arr[ct].gety()==1) && (abs(arr[co].getx()-arr[ct].getx())==1)) // если белой пешкой пытаются бить
{
for(int i=0;i<64;i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[co].gety()-arr[i].gety()==1) && (abs(arr[co].getx()-arr[i].getx())==1)) // если на этой клетке
{
if((arr[i].getn()!=0) && (arr[i].getcf()==0)) // есть черная фигура
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
goto peremeshenie_figur; // тут использую goto потому что нужно выйти сразу из 2 циклов, а break выводит только с одного (конструкция break; break; не работает)
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}
}
if(arr[co].gethp()==0) // если это первый ход белой пешки
{
if((arr[co].getx()==arr[ct].getx()) && ((arr[co].gety()-arr[ct].gety()==1) || (arr[co].gety()-arr[ct].gety()==2))) // правило хода белой пешки (для ее первого хода)
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if((arr[co].getx()==arr[i].getx()) && ((arr[co].gety()-arr[i].gety()==1) || (arr[co].gety()-arr[i].gety()==2))) // если расположение клетки допускает возможность хода пешки на нее (правило хода пешки)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()==0) // если клетка-цель пуста
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}
}
if(arr[co].gethp()==1) // если это не первый ход белой пешки
{
if((arr[co].getx()==arr[ct].getx()) && (arr[co].gety()-arr[ct].gety()==1)) // правило хода белой пешки (для ее последующих ходов)
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if((arr[co].getx()==arr[i].getx()) && (arr[co].gety()-arr[i].gety()==1)) // если расположение клетки допускает возможность хода пешки на нее (правило хода пешки)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()==0) // если клетка-цель пуста
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}
}
}

} // конец описания хода пешки

///////////////////////////////// если обьект - король /////////////////////////////////
if(arr[co].getn()==6) // если обьект - король
{
if(abs(arr[co].getx()-arr[ct].getx())<2 && abs(arr[co].gety()-arr[ct].gety())<2) // правило хода короля
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
else
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
break;
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}

//////////////рокировка//////////////////
if(arr[co].getcf()==1) //для белого короля
{
if(arr[co].gethp()==0) //если король еще не ходил
{
if(ct==62) //если это короткая рокировка
{
if(arr[ct].getn()==0 && arr[61].getn()==0 && arr[63].gethp()==0) // если клетки между королем и турой пусты и если тура еще не ходила
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
{
arr[61].setn(arr[63].getn());
arr[61].setcf(arr[63].getcf());
arr[61].sethp(1);
arr[63].setn(0);
break;
}
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
if(ct==58) //если это длинная рокировка
{
if(arr[ct].getn()==0 && arr[59].getn()==0 && arr[57].getn()==0 && arr[56].gethp()==0) // если клетки между королем и турой пусты и если тура еще не ходила
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
{
arr[59].setn(arr[56].getn());
arr[59].setcf(arr[56].getcf());
arr[59].sethp(1);
arr[56].setn(0);
break;
}
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}
}
if(arr[co].getcf()==0) //для черного короля
{
if(arr[co].gethp()==0) //если король еще не ходил
{
if(ct==6) //если это короткая рокировка
{
if(arr[ct].getn()==0 && arr[5].getn()==0 && arr[7].gethp()==0) // если клетки между королем и турой пусты и если тура еще не ходила
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
{
arr[5].setn(arr[7].getn());
arr[5].setcf(arr[7].getcf());
arr[5].sethp(1);
arr[7].setn(0);
break;
}
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
if(ct==2) //если это длинная рокировка
{
if(arr[ct].getn()==0 && arr[3].getn()==0 && arr[1].getn()==0 && arr[0].gethp()==0) // если клетки между королем и турой пусты и если тура еще не ходила
{
if(shah(arr, co, ct, clf)==0) // если нет шаха
{
arr[3].setn(arr[0].getn());
arr[3].setcf(arr[0].getcf());
arr[3].sethp(1);
arr[0].setn(0);
break;
}
if(shah(arr, co, ct, clf)==1) // если шах
cout<<endl<<"Шах";
}
}
}
}
} // конец описания хода короля
}
} // эта дужка оканчивает бесконечный цикл


///////////Перемещение фигуры///////////////
peremeshenie_figur: // метка goto для перехода сюда из описания хода пешки
target.setn(object.getn()); //перемещение выбраной фигуры на выбраную позицию
target.setcf(object.getcf()); // и выбраного цвета
target.sethp(1); // установка метки о совершении пешкой первого хода
arr[ct]=target;
arr[co].setn(0); // со старой клетки фигура убирается

////////////////// проверка. Добралась ли пешка до противоположного края доски ///////////////////////
if(arr[ct].getn()==1)
{
if(((arr[ct].getcf()==0) && (arr[ct].gety()==8)) || ((arr[ct].getcf()==1) && (arr[ct].gety()==1))) // если першка добралась до противоположного края
{
obmen_peshki(arr, arr[ct].getcf(), ct); // то предлагается ее обменять на другую фигуру
}
}
return 0;
}

void obmen_peshki(kletka arr[64], bool cf, int ct) // функция вызывается при достижении пешкой противоположного края доски
{
int h=0, o=0, t=0, f=0, j=0; // j - метка правильности выбора воскрешаемой фигуры
char fig;
for(int i=0;i<64;i++) // проверка на наличие битых фигур
{
if(arr[i].getn()==2 && arr[i].getcf()==cf)
o++;
if(arr[i].getn()==3 && arr[i].getcf()==cf)
h++;
if(arr[i].getn()==4 && arr[i].getcf()==cf)
t++;
if(arr[i].getn()==5 && arr[i].getcf()==cf)
f++;
}
if((o+h+t+f)!=7) // если битые фигуры есть - смотрим какие именно фигуры биты и предлагаем выбор какую именно фигуру воскрешать
{
cout<<endl<<"Vuberite figuru ";
cout<<"(p - peshka) ";
if(o<2)
cout<<"(o - oficer) ";
if(h<2)
cout<<"(h - horse) ";
if(t<2)
cout<<"(t - tura) ";
if(f<1)
cout<<"(f - ferz) ";
cout<<": ";
do
{
cin>>fig;
switch(fig)
{
case 'p': arr[ct].setn(1); j=1; break;
case 'o': if(o<2)
{
arr[ct].setn(2);
j=1;
break;
}
else
cout<<endl<<"Ne dopustimuy parametr, povtorite vubor "; break;
case 'h': if(h<2)
{
arr[ct].setn(3);
j=1;
break;
}
else
cout<<endl<<"Ne dopustimuy parametr, povtorite vubor "; break;
case 't': if(t<2)
{
arr[ct].setn(4);
j=1;
break;
}
else
cout<<endl<<"Ne dopustimuy parametr, povtorite vubor "; break;
case 'f': if(f<1)
{
arr[ct].setn(5);
j=1;
break;
}
else
cout<<endl<<"Ne dopustimuy parametr, povtorite vubor "; break;
default: cout<<endl<<"Ne dopustimuy parametr, povtorite vubor "; break;
}
}while(j!=1);
}
}

int pod_udarom(int co, int ct, bool& clf, kletka arr[64]) // функция принимает массив и кординаты в нем обьекта и цели, а возвращает фигуру которая под ударом
{
// co, ct - адресa в масиве обьекта и цели
if(arr[co].getn()!=0) // если на этой клетке есть фигура
{
//if(arr[co].getcf()!=arr[ct].getcf()) // если цвета фигур разные
//{
////////////////// алгоритмы ходов фигур взятые с функции ход (все тоже самое только вместо брейков стоит ретурн //////////////////////
//////////////////
/////////////////////////// если обьект - конь /////////////////////////////////////////
if(arr[co].getn()==3)
{
if(((abs(arr[co].getx()-arr[ct].getx())==1) && (abs(arr[co].gety()-arr[ct].gety())==2)) || ((abs(arr[co].getx()-arr[ct].getx())==2) && (abs(arr[co].gety()-arr[ct].gety())==1))) // правило для хода коня
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
else
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
}
int k=0; // идентефикатор наличия препятствия

//////////////////////// если обьект - слон ////////////////////////////////////
if(arr[co].getn()==2)
{
if(abs(arr[co].getx()-arr[ct].getx())==abs(arr[co].gety()-arr[ct].gety())) // правило хода слона
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if(arr[i].getn()!=0 && i!=co) // если клетка не пуста, или эта клетка не сам обьект
{
if(abs(arr[co].getx()-arr[i].getx())==abs(arr[co].gety()-arr[i].gety())) // если расположение клетки допускает возможность хода слона на нее (правило хода слона)
{
// ниже в ифе сравнивается знак(больше или меньше нуля) разницы координат (х и у) выбраного пользователем обьекта и обьекта массива[i] и разницы координат (х и у) выбраного пользователем обьекта и цели. Если знак разниц координат со.[i] совпадает с знаком разниц координат co.ct значит направление одинаково
if((((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0)) && (((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0))) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) && (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
else
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
}
} // конец проверки хода слона

/////////////////////если обьект - тура////////////////////////
if(arr[co].getn()==4)
{
if(((arr[co].getx()==arr[ct].getx()) && (arr[co].gety()!=arr[ct].gety())) || ((arr[co].gety()==arr[ct].gety()) && (arr[co].getx()!=arr[ct].getx()))) // правило хода туры
{
for(int i=0;i<64;i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if(((arr[co].getx()==arr[i].getx()) && (arr[co].gety()!=arr[i].gety())) || ((arr[co].gety()==arr[i].gety()) && (arr[co].getx()!=arr[i].getx()))) // если расположение клетки допускает возможность хода туры на нее (правило хода туры)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
else
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
}
} // конец проверки хода туры

////////////////////////// если обьект - ферзь ///////////////////////////////
if(arr[co].getn()==5)
{
///////////часть описания хода ферзя, взятая с слона/////////////////
if(abs(arr[co].getx()-arr[ct].getx())==abs(arr[co].gety()-arr[ct].gety())) // правило хода слона
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if(arr[i].getn()!=0 && i!=co) // если клетка не пуста, или эта клетка не сам обьект
{
if(abs(arr[co].getx()-arr[i].getx())==abs(arr[co].gety()-arr[i].gety())) // если расположение клетки допускает возможность хода слона на нее (правило хода слона)
{
// ниже в ифе сравнивается знак(больше или меньше нуля) разницы координат (х и у) выбраного пользователем обьекта и обьекта массива[i] и разницы координат (х и у) выбраного пользователем обьекта и цели. Если знак разниц координат со.[i] совпадает с знаком разниц координат co.ct значит направление одинаково
if((((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0)) && (((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0))) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) && (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
else
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
}

//////////////часть описания хода ферзя, взятая от туры///////////////
if(((arr[co].getx()==arr[ct].getx()) && (arr[co].gety()!=arr[ct].gety())) || ((arr[co].gety()==arr[ct].gety()) && (arr[co].getx()!=arr[ct].getx()))) // правило хода туры
{
for(int i=0;i<64;i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if(((arr[co].getx()==arr[i].getx()) && (arr[co].gety()!=arr[i].gety())) || ((arr[co].gety()==arr[i].gety()) && (arr[co].getx()!=arr[i].getx()))) // если расположение клетки допускает возможность хода туры на нее (правило хода туры)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
else
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
}

} // конец проверки хода ферзя

//////////////////////////// если обьект - пешка /////////////////////////////
if(arr[co].getn()==1) // если это пешка
{
if(arr[co].getcf()==0) // если это черная пешка
{
if((arr[ct].gety()-arr[co].gety()==1) && (abs(arr[co].getx()-arr[ct].getx())==1)) // если черной пешкой пытаются бить
{
for(int i=0;i<64;i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].gety()-arr[co].gety()==1) && (abs(arr[co].getx()-arr[i].getx())==1)) // если на этой клетке
{
if((arr[i].getn()!=0) && (arr[i].getcf()==1)) // есть белая фигура
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
}
}
if(arr[co].gethp()==0) // если это первый ход черной пешки
{
if((arr[co].getx()==arr[ct].getx()) && ((arr[ct].gety()-arr[co].gety()==1) || (arr[ct].gety()-arr[co].gety()==2))) // правило хода черной пешки (для ее первого хода)
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if((arr[co].getx()==arr[i].getx()) && ((arr[i].gety()-arr[co].gety()==1) || (arr[i].gety()-arr[co].gety()==2))) // если расположение клетки допускает возможность хода пешки на нее (правило хода пешки)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()==0) // если клетка-цель пуста
{
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
return 0;
}

}
}
}
if(arr[co].gethp()==1) // если это не первый ход черной пешки
{
if((arr[co].getx()==arr[ct].getx()) && (arr[ct].gety()-arr[co].gety()==1)) // правило хода черной пешки (для ее последующих ходов)
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if((arr[co].getx()==arr[i].getx()) && (arr[i].gety()-arr[co].gety()==1)) // если расположение клетки допускает возможность хода пешки на нее (правило хода пешки)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()==0) // если клетка-цель пуста
{
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
return 0;
}

}
}
}
}
////////////////////////////////////////////////////
if(arr[co].getcf()==1) // если это белая пешка
{
if((arr[co].gety()-arr[ct].gety()==1) && (abs(arr[co].getx()-arr[ct].getx())==1)) // если белой пешкой пытаются бить
{
for(int i=0;i<64;i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[co].gety()-arr[i].gety()==1) && (abs(arr[co].getx()-arr[i].getx())==1)) // если на этой клетке
{
if((arr[i].getn()!=0) && (arr[i].getcf()==0)) // есть черная фигура
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
}
}
if(arr[co].gethp()==0) // если это первый ход белой пешки
{
if((arr[co].getx()==arr[ct].getx()) && ((arr[co].gety()-arr[ct].gety()==1) || (arr[co].gety()-arr[ct].gety()==2))) // правило хода белой пешки (для ее первого хода)
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if((arr[co].getx()==arr[i].getx()) && ((arr[co].gety()-arr[i].gety()==1) || (arr[co].gety()-arr[i].gety()==2))) // если расположение клетки допускает возможность хода пешки на нее (правило хода пешки)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()==0) // если клетка-цель пуста
{
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
return 0;
}
}
}
}
if(arr[co].gethp()==1) // если это не первый ход белой пешки
{
if((arr[co].getx()==arr[ct].getx()) && (arr[co].gety()-arr[ct].gety()==1)) // правило хода белой пешки (для ее последующих ходов)
{
for(int i=0; i<64; i++) // проверка на наличие препятствия для хода фигуры
{
if((arr[i].getn()!=0)&&(i!=co)) // если клетка не пуста, или эта клетка не сам обьект
{
if((arr[co].getx()==arr[i].getx()) && (arr[co].gety()-arr[i].gety()==1)) // если расположение клетки допускает возможность хода пешки на нее (правило хода пешки)
{
if(((arr[co].getx()-arr[i].getx())>0 && (arr[co].getx()-arr[ct].getx())>0) || ((arr[co].gety()-arr[i].gety())>0 && (arr[co].gety()-arr[ct].gety())>0) || ((arr[co].getx()-arr[i].getx())<0 && (arr[co].getx()-arr[ct].getx())<0) || ((arr[co].gety()-arr[i].gety())<0 && (arr[co].gety()-arr[ct].gety())<0)) // если препятствие находится в одном направлении с целью
{
if((abs(arr[co].getx()-arr[i].getx())<abs(arr[co].getx()-arr[ct].getx())) || (abs(arr[co].gety()-arr[i].gety())<abs(arr[co].gety()-arr[ct].gety()))) // если припятствие ближе цели
{
k=1; // ходу мешает другая фигура
}
}
}
}
}
if(k==0) //если другая фигура не мешает ходу
{
if(arr[ct].getn()==0) // если клетка-цель пуста
{
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
return 0;
}
}
}
}
}

} // конец описания хода пешки

///////////////////////////////// если обьект - король /////////////////////////////////
if(arr[co].getn()==6) // если обьект - король
{
if(abs(arr[co].getx()-arr[ct].getx())<2 && abs(arr[co].gety()-arr[ct].gety())<2) // правило хода короля
{
if(arr[ct].getn()!=0) // если клетка-цель не пуста
{
if(arr[ct].getcf()!=arr[co].getcf()) // если цвета фигур разные (нельзя бить свои фигуры)
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
else
{
// показует какая именно фигура под ударом: 0 - никого не бьют, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
// cout<<endl<<arr[co].getx()<<"-"<<arr[co].gety()<<" . "<<arr[ct].getx()<<"-"<<arr[ct].gety()<<endl;
clf=arr[ct].getcf();
return arr[ct].getn();
}
}
} // конец описания хода короля
}
//}
return 7; // в любом другом непонятно как получившемся случае (типа как else )
}

void help()
{
system("cls"); // очистка экрана (типа clrscr()
cout<<"Заглавными буквами обозначаются черные фигуры, а строчными - белые."<<endl;
cout<<"Р - пешка (pawn)"<<endl;
cout<<"С - ладья (castle)"<<endl;
cout<<"H - конь (horse)"<<endl;
cout<<"B - слон (bishop)"<<endl;
cout<<"Q - ферзь (queen)"<<endl;
cout<<"K - король (king)"<<endl;
cout<<"Для перемещения фигуры введите координаты своей фигуры и пункта назначения."<<endl<<"Например: b1 c3"<<endl;
cout<<"Эта версия не поддерживает взятие \"на проходе\"."<<endl;
system("pause");
}

int shah(kletka arr[64], int co, int ct, bool& clf)
{

kletka mas[64]; // массив - копия игровой доски, но которой будут делатся ход для проверки "не призвел ли они к шаху"
for(int i=0;i<64;i++)
{
mas[i]=arr[i]; // сам процесс копирования массива
}
mas[ct].setn(mas[co].getn()); // выполнение хода на доске-копии
mas[ct].setcf(mas[co].getcf());
mas[co].setn(0);
int pu;
for(int co_f=0;co_f<64;co_f++) // проверка нет ли шаха
for(int ct_f=0;ct_f<64;ct_f++)
{
pu=pod_udarom(co_f, ct_f, clf, mas);
if(pu==6 && arr[co].getcf()==clf) // если под ударом король того же цвета что и цвет играющих фигур
{
return 1; // если шах есть
}
}
return 0; // если шаха нет
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2014, 18:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оцените программу: Шахматы (C++):

Оцените программу - C++
Не давно написал эту программу. Охота услышать ваше мнение. Может для не которых она покажется простой, как одноклеточная бактерия, но...

Оцените программу расчета стоимости парковки - C++
У Дейтлов есть задача: Я написал такой код: #include&lt;iostream&gt; using namespace std; #include&lt;windows&gt; #include&lt;iomanip&gt; ...

Шахматы - C++
Помогите пожалуйста разобраться с задачкой.. Даны натуральные числа k,l,m,n. Необходимо выяснить, угрожает ли конь, стоящий на поле...

Шахматы - C++
По умолчанию Ферзь, ладья и конь Ферзь, ладья и конь На шахматной доске 8х8 расположены три фигуры: ферзь, ладья и конь. Требуется...

Шахматы в С++ - C++
Ребят, срочно, помогите, пожалуйста. Нужно написать код для простейшей компьютерной игры: шахмат. Ничего не понимаю ни в шахматах, ни в...

Шахматы - C++
не могу понять задачи .. помогите Класс &quot;фигура&quot;: координаты на шахматной доске, цвет. Метод - &quot;ход&quot; на одну позицию в одном из 4...

17
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 33
12.03.2014, 18:26  [ТС] #2
забыл добавить:
программа поддерживает: рокировку, превращение пешки (только в те фигуры что были биты... Узнал что это неправильно а можно превращать в любые только недавно)
что не сделано: нет ИИ, нет логического конца игры (программа не говорит когда поставлен мат, просто в случае мата ничем не получится больше походить)
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,070
12.03.2014, 18:29 #3
Даже без тегов сразу бросаются в глаза имена транслитом - проверка на вшивость не пройдена.
0
John Prick
802 / 735 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
12.03.2014, 18:32 #4
Ну тогда вперёд в TCEC участвовать!

Добавлено через 1 минуту
Цитата Сообщение от Bino321 Посмотреть сообщение
4-тура
Правильно "ладья". Хорошо хоть "слон", а не "офицер".
0
ValeryS
Модератор
6682 / 5091 / 477
Регистрация: 14.02.2011
Сообщений: 17,092
12.03.2014, 18:33 #5
Цитата Сообщение от Bino321 Посмотреть сообщение
if(n==0) // пустая клетка
{
if(color_kletki==0)
cout<<char(176); // черная
if(color_kletki==1)
cout<<char(178); // белая
}
}
Цитата Сообщение от Bino321 Посмотреть сообщение
bool color_kletki; // цвет клетки: 0-черный, 1-белый
bool color_figur; // цвет фигур: 0-черный, 1-белый

bool не надо сравнивать с 0 или 1 она итак имеет два значения false 0 true 1
и результат сравнения тоже false 0 true 1 так что это тавтология
и клетка может быть или черной или белой третьего не дано
следовательно можно переписать вот так
C++
1
2
3
4
5
6
7
if(n==0) // пустая клетка
 {
 if(color_kletki)
    cout<<char(178); // белая
 else
    cout<<char(176); // черная
 }
1
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,070
12.03.2014, 18:34 #6
Цитата Сообщение от ValeryS Посмотреть сообщение
и клетка может быть или черной или белой третьего не дано
Но даже при этом я бы завел enum.
0
ValeryS
Модератор
6682 / 5091 / 477
Регистрация: 14.02.2011
Сообщений: 17,092
12.03.2014, 18:37 #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Но даже при этом я бы завел enum.
Ну там много чего можно завести
например в рисовании switch напрашивается
0
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 33
12.03.2014, 18:37  [ТС] #8
Правильно "ладья". Хорошо хоть "слон", а не "офицер".
Тура на украинском, а я с Украины.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,535
Завершенные тесты: 1
12.03.2014, 18:46 #9
Bino321, магические числа все заменить хорошо бы было.
Цитата Сообщение от 0x10 Посмотреть сообщение
я бы завел enum
Вообще кругом все в перечисления завернуть.
0
ValeryS
Модератор
6682 / 5091 / 477
Регистрация: 14.02.2011
Сообщений: 17,092
12.03.2014, 18:52 #10
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Вообще кругом все в перечисления завернуть.
и сделать степенями двойки
сравнения упростятся
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,070
12.03.2014, 18:58 #11
Цитата Сообщение от Bino321 Посмотреть сообщение
Тура на украинском, а я с Украины.
Пользуйтесь: King, Queen, Rook, Knight, Bishop, Pawn.
0
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 33
12.03.2014, 19:02  [ТС] #12
и сделать степенями двойки
сравнения упростятся
Что-то я несовсем понял...
0
Progers
New to C++
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
12.03.2014, 19:05 #13
Ну и код, вы хотя бы его на файлы чтоль бы поделили?
0
ValeryS
Модератор
6682 / 5091 / 477
Регистрация: 14.02.2011
Сообщений: 17,092
12.03.2014, 19:09 #14
Цитата Сообщение от Bino321 Посмотреть сообщение
Что-то я несовсем понял...
ну вот это
Цитата Сообщение от Bino321 Посмотреть сообщение
int n; // что на этой клетке: 0-пусто, 1-пешка, 2-слон, 3-конь, 4-тура, 5-ферзь, 6-король
C++
1
int n; // что на этой клетке: 0-пусто, 1-пешка, 2-слон, 4-конь, 8-тура, 16-ферзь, 32-король
и суда бы ввел и цвет фигура
color 64
тогда белая пешка будет 1 а черная 65

и ход проверить проще
C++
1
2
3
4
if( a&64==b&64)
 // воя фигура бить нельзя
else
// чужая можно бить
почитай что такое битовые поля, может пригодится
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,535
Завершенные тесты: 1
12.03.2014, 19:27 #15
Цитата Сообщение от ValeryS Посмотреть сообщение
и сделать степенями двойки
Чтобы играть в шахматный суперблиц? ) У меня просто первая мысль была сделать так, чтобы заюзать смещение.
0
12.03.2014, 19:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 19:27
Привет! Вот еще темы с ответами:

Шахматы - C++
Нужен исходный код шахмат, для игры ИИ + человек зачем нужен: пишу программу к роботу, который будет играть в шахматы. Сама программа...

Шахматы - C++
Помогите пожалуйста решить прогу, так как я абсолютно не шарю, что здесь делать. Вот в чём она заключается: На шахматной доске стоит белый...

Шахматы в с++ - C++
Даны фигуры: Пешка, слон, король.(цвет фигуры не зависит). Суть задачи состоит в том, что человек вводит координаты фигур, а программа...

шахматы - C++
Разработать класс для моделирования шахматной фигуры, позволяю- щий хранить вместе с экземпляром объекта его координаты на доске, цвет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru