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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить число символов в самом длинном слове строки. Слова отделяются пробелом http://www.cyberforum.ru/cpp-beginners/thread1117424.html
Помогите разобраться ,написал код.. ну он считает какойто брет { AnsiString a,b,c; int i; a=Edit1->Text; int k=a.Length(); int m=1; int max=0; int t; for(i=1;i<=k;i++) {if(a==' ') b=a.SubString(m,i-m+1); t=b.Length(); if (t>max) max=t;
C++ Как в цикле увеличить отступ в Printf как в цикле с помощью переменной, в нашем случае, цифра "5" (5 пробелов отступ) увеличивалась в цикле? printf("%5d",20) http://www.cyberforum.ru/cpp-beginners/thread1117423.html
C++ Вычислить значение суммы. Задача с использованием "длинной арифметики".
Тема: «Задачи на длинную арифметику» Задача: Вычислить точное значение суммы 1^2 + 2^2 + 3^2 + ... + n^2 (n ≥ 20000). Пожалуйста, напишите код!
C++ Если целое число М делится на целое число N, то на экран выводится частное от деления, в противном случае выводится сообщение
Если целое число М делится на целое число N, то на экран выводится частное от деления, в противном случае выводится сообщение «M на N нацело не делится» #include<stdio.h> #include<conio.h> #include<math.h> main() {
C++ Изменение кода в течении программы http://www.cyberforum.ru/cpp-beginners/thread1117387.html
#include <ctime> #include <stdio.h> #include <locale.h> #include <string> #include <conio.h> #include <windows.h> #include <iostream> using namespace std;
C++ Как получить доступ к приватному полю Всем доброго времени суток! Есть такое задание: нужно написать класс, который помимо всего прочего состоит из объекта еще одного класса, в итоге получается некий текстовый редактор, я решил реализовать это так: создал клас Strings, его поле - массив, где индекс - это строка, через конструктор я заганяю пустые строки. Потом, я присваиваю объект класса Strings объекту класса Editor и потом хочу уже... подробнее

Показать сообщение отдельно
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
12.03.2014, 18:20     Оцените программу: Шахматы
Я почти не учил раньше программирование, чуть в школе, чуть в универе (все знания сводились о знании о переменных и цыклах). А месяцев 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; // если шаха нет
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 02:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru