Шустрый

Профиль
Группа: Участник
Сообщений: 71
Регистрация: 9.8.2011
Репутация: нет Всего: нет
|
Здравствуйте! у меня проблема =( вот код: | Код | #include <iostream> #include <stdlib.h> #include <time.h> #include <Windows.h> #include <conio.h> using namespace std; char cursor='+'; int x=17,y=2; HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE); COORD c={x,y}; #define s 12 //РАЗМЕР ПОЛЯ #define FildSize 10 #define FildEnd 'J' #define score 16 #define ShipSize4 4 //4х ПАЛУБНЫЙ КОРАБЫЛЬ #define ShipSize3 3 //3х ПАЛУБНЫЙ КОРАБЫЛЬ #define ShipSize2 2 //2х ПАЛУБНЫЙ КОРАБЫЛЬ char plr[s][s]; //ПОЛЕ ИГРОКА char sht[s][s]; //СТРЕЛЬБИЩЕ char cmp[s][s]; //ПОЛЕ КОМПЬЮТЕРА const char up1=201,up2=187; //СИМВОЛЫ ЛЕВОГО-ВЕРХНЕГО И ПРАВОГО-ВЕРХНЕГО УГЛА const char down1=200,down2=188; //СИМВОЛЫ ЛЕВОГО-НИЖНЕГО И ПРАВОГО-ВЕРХНЕГО УГЛА const char vertical=186,horizontal=205; //ВЕРТИКАЛЬНЫЙ И ГОРИЗОНТАЛЬНЫЙ СИМВОЛЫ const char ship=219; //ОТОБРАЖЕНИЕ КОРАБЛЯ const char round=250; //ОБЛАСТЬ ВОКРУГ КОРАБЛЯ const char hit=177; const char miss=253; int PlrScore=score; int CmpScore=score; void begin(char arr[][s])//ФУНКЦИЯ РАСТАНОВКИ ПОЛЕЙ { for(int i=0;i<s;i++) { for(int j=0;j<s;j++) { if(i==0||i==s-1) arr[i][j]=horizontal;// |ВЕРХ-НИЗ if(j==0||j==s-1) arr[i][j]=vertical;// |ЛЕВО-ПРАВО
if(i==0&&j==0) arr[i][j]=up1;// |ЛЕВЫЙ ВЕРХНИЙ УГОЛ if(i==0&&j==s-1) arr[i][j]=up2;// |ПРАВЫЙ ВЕРХНИЙ УГОЛ
if(i==s-1&&j==0) arr[i][j]=down1;// |ЛЕВЫЙ НИЖНИЙ УГОЛ if(i==s-1&&j==s-1) arr[i][j]=down2;// |ПРАВЫЙ НИЖНИЙ УГОЛ } } } void TakePoint(int &hor,int &ver)// ФУНКЦИЯ ГЕНЕРАЦИИ КООРДИНАТЫ { hor=rand()%(s-3)+1;// КООРДИНАТА 1 ver=rand()%(s-3)+1;// КООРДИНАТА 2 } int Test(char arr[][s],int &hor,int&ver,int pos,int size)//ФУНКЦИЯ ПРОВЕРКИ ПРАВИЛЬНОСТИ КООРДИНАТ { int t=1; if(pos) { for(int i=0,j=hor;i<ShipSize3;i++,j++) { if(arr[j][ver]==ship||arr[j][ver]==round) {TakePoint(hor,ver);t=0;} } } else { for(int i=0,j=ver;i<size;i++,j++) { if(arr[hor][j]==ship||arr[hor][j]==round) {TakePoint(hor,ver);t=0;} } } return t; } void ShipIn(char arr[][s],int size)// ФУНКЦИЯ АВТОМАТИЧЕСКОЙ РАСТАНОВКИ КОРАБЛЕЙ { int hor,ver; TakePoint(hor,ver);//ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ int nap=rand()%2;// НАПРАВЛЕНИЕ КОРАБЛЯ if(nap)// ВЕРТИКАЛЬНО { while(!Test(arr,hor,ver,nap,size)) Test(arr,hor,ver,nap,size); if(hor+size<s-1) { for(int i=0,j=hor;i<size;i++,j++) { if(ver>1) arr[j][ver-1]=round;//ЛЕВО if(ver<10)arr[j][ver+1]=round;//ПРАВО if(hor>1)arr[hor-1][ver]=round; if(hor>1&&ver>1) arr[hor-1][ver-1]=round; if(hor>1&&ver<10) arr[hor-1][ver+1]=round; if(hor+size<s-1)arr[hor+size][ver]=round; if(hor+size<s-1&&ver>1) arr[hor+size][ver-1]=round; if(hor+size<s-1&&ver<10) arr[hor+size][ver+1]=round; arr[j][ver]=ship; } } else ShipIn(arr,size); } else// ГОРИЗОНТАЛЬНО { while(!Test(arr,hor,ver,nap,size)) Test(arr,hor,ver,nap,size); if(ver+size<s-1) { for(int i=0,j=ver;i<size;i++,j++) { if(hor>1) arr[hor-1][j]=round; if(hor<10)arr[hor+1][j]=round; if(ver>1) arr[hor][ver-1]=round; if(ver>1&&hor>1) arr[hor-1][ver-1]=round; if(ver>1&&hor<10) arr[hor+1][ver-1]=round; if(ver+size<s-1)arr[hor][ver+size]=round; if(ver+size<s-1&&hor>1) arr[hor-1][ver+size]=round; if(ver+size<s-1&&hor<10) arr[hor+1][ver+size]=round; arr[hor][j]=ship; } } else ShipIn(arr,size); } } void AutoSet(char arr[][s]) { ShipIn(arr,ShipSize4); ShipIn(arr,ShipSize3); ShipIn(arr,ShipSize3); ShipIn(arr,ShipSize2); ShipIn(arr,ShipSize2); ShipIn(arr,ShipSize2);
} void Vertical(int size) { bool t=false; int h,v; char c; do { t=false; cout<<"Please, enter a coordinates\n"<<endl; do { cout<<"H "; cin>>h; if(h<1||h>=FildSize-size) cout<<"Error!"<<endl; } while(h<1||h>FildSize-size); do { cout<<"V "; cin>>c; if(c<'A'||c>'J') cout<<"Error!"<<endl; } while(c<'A'||c>'J'); v=c%64; cout<<v<<endl; for(int i=0,j=h;i<size;i++,j++) { if(plr[j][v]==ship||plr[j][v]==round) { t=true; cout<<"Error!"<<endl; } } } while(t); for(int i=0,j=h;i<size;i++,j++) { if(v>1) plr[j][v-1]=round;//ЛЕВО if(v<10)plr[j][v+1]=round;//ПРАВО if(h>1) plr[h-1][v]=round; if(h>1&&v>1) plr[h-1][v-1]=round; if(h>1&&v<10) plr[h-1][v+1]=round; if(h+size<s-1) plr[h+size][v]=round; if(h+size<s-1&&v>1) plr[h+size][v-1]=round; if(h+size<s-1&&v<10) plr[h+size][v+1]=round; plr[j][v]=ship; } } void Horizontal(int size) { bool t=false; int h,v; char c; do { t=false; cout<<"Please, enter a coordinates\n"<<endl; do { cout<<"H "; cin>>h; if(h<1||h>FildSize) cout<<"Error!"<<endl; } while(h<1||h>FildSize); do { cout<<"V "; cin>>c; if(c<'A'||c>=FildEnd-size) cout<<"Error!"<<endl; } while(c<'A'||c>=FildEnd-size); v=c%64; cout<<v<<endl; for(int i=0,j=v;i<size;i++,j++) { if(plr[h][j]==ship||plr[h][j]==round) { t=true; cout<<"Error!"<<endl; } } } while(t); for(int i=0,j=v;i<size;i++,j++) { if(h>1) plr[h-1][j]=round; if(h<10)plr[h+1][j]=round; if(v>1) plr[h][v-1]=round; if(v>1&&h>1) plr[h-1][v-1]=round; if(v>1&&h<10) plr[h+1][v-1]=round; if(v+size<s-1)plr[h][v+size]=round; if(v+size<s-1&&h>1) plr[h-1][v+size]=round; if(v+size<s-1&&h<10) plr[h+1][v+size]=round; plr[h][j]=ship; } } void show(char arr1[][s],char arr2[][s]) { cout<<" ABCDEFGHIJ\t ABCDEFGHIJ"<<endl; for(int i=0;i<s;i++) { if(i>0&&i<s-2) cout<<i<<' '; else if(i==10) cout<<i; else cout<<" "; for(int j=0,k=-s;k<s;j++,k++) { if(j==s) cout<<'\t'; if(k<0) cout<<arr1[i][j]; else cout<<arr2[i][k]; } if(i>0&&i<s-2) cout<<i<<' '; else if(i==10) cout<<i; else cout<<" "; cout<<endl; } cout<<" ABCDEFGHIJ\t ABCDEFGHIJ"<<endl; } void HandSet()//ФУНКЦИЯ РУЧНОЙ РАСТАНОВКИ КОРАБЛЕЙ { char key; show(plr,cmp); cout<<"Please, enter ship4"<<endl; cout<<"Vertical (V) or Horizontal(H)"<<endl; do { cin>>key; if(key!='V'||key!='H') cout<<"Error!"<<endl; } while(key!='V'||key!='H'); if(key=='V') { Vertical(ShipSize4); } else { Horizontal(ShipSize4); }
} void Move(char arr[][s],int &hor,int &ver) { do { if((GetKeyState(VK_UP)&0x80)!=0) { if(c.Y>y) { SetConsoleCursorPosition(h,c); cout<<arr[c.Y-(y-1)][c.X-(x-1)]; c.Y--; } SetConsoleCursorPosition(h,c); cout<<cursor; Sleep(150); } if((GetKeyState(VK_DOWN)&0x80)!=0) { if(c.Y<=FildSize) { SetConsoleCursorPosition(h,c); cout<<arr[c.Y-(y-1)][c.X-(x-1)]; c.Y++; } SetConsoleCursorPosition(h,c); cout<<cursor; Sleep(150); } if((GetKeyState(VK_LEFT)&0x80)!=0) { if(c.X>17) { SetConsoleCursorPosition(h,c); cout<<arr[c.Y-(y-1)][c.X-(x-1)]; c.X--; } SetConsoleCursorPosition(h,c); cout<<cursor; Sleep(150); } if((GetKeyState(VK_RIGHT)&0x80)!=0) { if(c.X<26) { SetConsoleCursorPosition(h,c); cout<<arr[c.Y-(y-1)][c.X-(x-1)]; c.X++; } SetConsoleCursorPosition(h,c); cout<<cursor; Sleep(150); } } while(!GetKeyState(VK_RETURN)); hor=c.Y-1; ver=c.X-16; } void PlrShot(char arr[][s]) { int hor,ver; bool chek=false; do{ Move(sht,hor,ver); if(cmp[hor][ver]==ship) { cmp[hor][ver]=hit; arr[hor][ver]=hit; CmpScore--; system("cls"); show(plr,sht); cout<<"\nWe have hit ship of enemy!\n"<<endl; if(CmpScore)chek=true; } else { if(cmp[hor][ver]==hit||cmp[hor][ver]==miss) { system("cls"); show(plr,sht); cout<<"\nThis area was shot early!\n"<<endl; chek=true; } else { if(cmp[hor][ver]==0) { cmp[hor][ver]=miss; arr[hor][ver]=miss; system("cls"); show(plr,sht); cout<<"\nWe have a miss =(\n"<<endl; chek=false; } } } } while(chek); } void CmpShot() { int hor,ver; TakePoint(hor,ver); if(plr[hor][ver]==ship) { plr[hor][ver]=hit; PlrScore--; system("cls"); show(plr,sht); CmpShot(); } else { if(plr[hor][ver]==hit||plr[hor][ver]==miss) CmpShot(); else { plr[hor][ver]=miss; system("cls"); show(plr,sht); cout<<"\nEnemy was shot in "<<hor<<" "<<ver<<endl; } } } void Clean(char arr[][s]) { for(int i=0;i<s;i++){ for(int j=0;j<s;j++){ if(arr[i][j]==round)arr[i][j]=0; } } } void main() { srand(time(0)); begin(plr); begin(cmp); begin(sht); AutoSet(cmp); Clean(cmp); AutoSet(plr); Clean(plr); show(plr,sht); do { PlrShot(sht); CmpShot(); } while(CmpScore&&PlrScore); }
|
При выстреле кнопкой "Enter" цикл начинает постоянно срабатывать, при повторном нажатии все становится нормально и курсором можно пользоваться. При использовании функции cin.ignore() в функции Move() начинаются другие проблемы после выстрела приходится вводить 2 любых не числа что бы пользоваться курсором =( Помогите пожалуйста! я не знаю что делать =(((
|