13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
|
|
1 | |
Оцените программу: Шахматы12.03.2014, 18:20. Показов 3333. Ответов 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
|
12.03.2014, 18:20 | |
Ответы с готовыми решениями:
17
Оцените программу Оцените программу Оцените программу Оцените программу |
13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
|
|
12.03.2014, 18:26 [ТС] | 2 |
забыл добавить:
программа поддерживает: рокировку, превращение пешки (только в те фигуры что были биты... Узнал что это неправильно а можно превращать в любые только недавно) что не сделано: нет ИИ, нет логического конца игры (программа не говорит когда поставлен мат, просто в случае мата ничем не получится больше походить)
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
12.03.2014, 18:29 | 3 |
Даже без тегов сразу бросаются в глаза имена транслитом - проверка на вшивость не пройдена.
0
|
2271 / 1763 / 740
Регистрация: 27.07.2012
Сообщений: 5,238
|
|
12.03.2014, 18:32 | 4 |
Ну тогда вперёд в TCEC участвовать!
Добавлено через 1 минуту Правильно "ладья". Хорошо хоть "слон", а не "офицер".
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,515
|
||||||
12.03.2014, 18:33 | 5 | |||||
bool не надо сравнивать с 0 или 1 она итак имеет два значения false 0 true 1 и результат сравнения тоже false 0 true 1 так что это тавтология и клетка может быть или черной или белой третьего не дано следовательно можно переписать вот так
1
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
12.03.2014, 18:34 | 6 |
0
|
13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
|
|
12.03.2014, 18:37 [ТС] | 8 |
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
12.03.2014, 18:46 | 9 |
Bino321, магические числа все заменить хорошо бы было.
Вообще кругом все в перечисления завернуть.
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
12.03.2014, 18:58 | 11 |
0
|
13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
|
|
12.03.2014, 19:02 [ТС] | 12 |
0
|
New to C++
83 / 44 / 10
Регистрация: 14.01.2013
Сообщений: 258
|
|
12.03.2014, 19:05 | 13 |
Ну и код, вы хотя бы его на файлы чтоль бы поделили?
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,515
|
|||||||||||
12.03.2014, 19:09 | 14 | ||||||||||
ну вот это
color 64 тогда белая пешка будет 1 а черная 65 и ход проверить проще
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
12.03.2014, 19:27 | 15 |
Чтобы играть в шахматный суперблиц? ) У меня просто первая мысль была сделать так, чтобы заюзать смещение.
0
|
2271 / 1763 / 740
Регистрация: 27.07.2012
Сообщений: 5,238
|
|
12.03.2014, 19:43 | 16 |
0
|
13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
|
||||||
12.03.2014, 20:00 [ТС] | 17 | |||||
ну кто как ее называет это дело привычки, но в данном случае нельзя говорить что так правильно, а так неправильно.
Добавлено через 8 минут ну Вы конечно опытнее, Вам виднее, но я невижу чем именно проще... у меня сейчас эта же операция отак записана
Добавлено через 3 минуты Честно сказать... не умею
0
|
New to C++
83 / 44 / 10
Регистрация: 14.01.2013
Сообщений: 258
|
|
12.03.2014, 23:57 | 18 |
Bino321, Роберт Лафоре вполне нормально объясняет что к чему.
0
|
12.03.2014, 23:57 | |
12.03.2014, 23:57 | |
Помогаю со студенческими работами здесь
18
Оцените программу ( написание кода ) Оцените программу учета траффика Оцените программу - Чит на любой кликер Оцените задание: программу анализа текста Пожалуйста, оцените программу редактора текстов Оцените программу на pygame (копия сапёра) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |