Witam robie na projekt z C++ grę statki w konsoli i w 90% gra jest gotowa wymyśliłem i zaprogramowałem też pseudo-sztuczną inteligencję która działa teoretycznie na takiej zasadzie mamy listę na której zapisuje współrzędne i jeśli dany statek został tylko trafiony ale nie został zatopiony to do listy dodaje elementy w formie współrzędnych gdzie może być kolejny masz statku i z tej listy losuje kolejny ruch jeśli udało się trafić a dalej statek nie jest zatopiony(3- lub 4- masztowiec) to usuwam listę tworzę nową która dodaje elementy w pionie lub w poziomie zależnie od tego jak rozlokowany jest statek problem w tym że według mnie mój kod powinien to realizować a niestety tak nie jest:/ i nie wiem jak sobie z tym poradzić bo próbowałem już wszystkiego. Wrzucam kod gry(jest tego dość sporo ale chodzi o 40 linijek tej funkcji )
#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <ctime>
#include <conio.h>
#include <windows.h>
#define CZAS 500000
#define GORA -32
#define ENTER 13
#define ESC 27
#define BIALY 7
#define CZERWONY 12
#define NIEBIESKI 9
#define ZOLTY 14
#define ZIELONY 10
using namespace std;
struct Wektor
{
int w_x;
int w_y;
bool trafiony;
int kierunek;
Wektor()
{
this->w_x=0;
this->w_y=0;
this->trafiony=false;
}
Wektor & operator =(Wektor wsp1)
{
this->trafiony=wsp1.trafiony;
this->w_x=wsp1.w_x;
this->w_y=wsp1.w_y;
this->kierunek=wsp1.kierunek;
return *this;
}
};
class Cplansza
{
protected:
char tab[11][45],komp[11][45];
int x,y;
public:
Cplansza::Cplansza();
Cplansza::Cplansza(char tab[11][45],char komp[11][45]);
void SetTab(char t[11][45],bool gracz);
void GetTab(char gracz[11][45],char komp[11][45]);
bool Sprawdz(int x, int y,char tabl[11][45],char znak);
void Czysc(char tabl[11][45]);
void Wyswietl( char tablica[11][45]);
void Zeruj();
int ZamienWsp(char x);
int ZamienWsp(int y);
int Zamiana(char a);
int Zam_licz(string z);
virtual bool Ruch();
virtual void Postaw();
void Wpisz(int wx,int wy,char tab[11][45]);
void UsunZbedne(int wx,int wy,char tab[11][45]);
bool CzyZatopiony(char tab[11][45],int wx, int wy);
};
class Cgracz : public Cplansza
{
private:
int zatopienia;
int punkty;
int il_ruchow;
public:
Cgracz();
void DodajZatopienia();
void DodajPunkty();
void DodajRuch();
int ZwrocZatopienia();
int ZwrocPunkty();
void Postaw(char p1, int y,int ile,char tab[11][45]);
bool Ruch(bool pomoc,char a, int y,char tab[11][45],char komp[11][45]);
};
class Clista
{
private:
int il_elementow;
Wektor wsp;
Clista *glowa;
Clista *nastepny;
public:
Clista();
~Clista();
void Skasuj();
void UstawWspolrzedne(Wektor wsp);
void ZwiekszElementy();
Wektor ZwrocWspolrzedne();
int ZwrocIlosc();
void Dodaj(Wektor &e);
Wektor Usun(int nr);
bool ListaPusta();
};
class Ckomputer : public Cplansza
{
private:
Clista pamiec;
int il_ruchow;
public:
void Postaw(char komp[11][45]);
bool Ruch(int wx, int wy,int poziom, int &kierunek,char tab[11][45],char komp[11][45]);
Wektor Wyszukaj(char tab[11][45],char znak,int wx,int wy);
void SkasujPamiec();
};
class Cgra : public Cplansza
{
private:
int poziom;
bool losowo;
public:
Cgra::Cgra();
void Delay(int czas);
bool Wygrana(char tabl[11][45]);
bool Wspolrzedne(char a, int x);
void Intro();
int ZwrocPoziom();
bool CzyLosowo();
int Menu();
};
void gotoxy(const int x, const int y)
{
HANDLE g_hConsol = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord = {x, y};
SetConsoleCursorPosition(g_hConsol, coord);
}
void setcolor(int foreground, int background=0)
{
HANDLE g_hConsol = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(g_hConsol,foreground | background);
}
/*--------------------FUNKCJA GLOWNA MAIN----------------------------*/
int main()
{
char komputer[11][45];
char gracz[11][45];
Cplansza *Polimor = new Cplansza(gracz,komputer);
Cgra Nowa_Gra;
Cgracz G1;
Ckomputer K1;
string wybor=" ";
char w;
char x1;
string x2;
int kier=0;
int y=0,wx=0,wy=0,ilg=0,ilk=0,poziom=0;
bool wk,wg,kor,wsp,pom;
wsp=false;
Polimor->SetTab(komputer,0);
Polimor->SetTab(gracz,1);
do
{
fflush(stdin);
if(Nowa_Gra.Menu()==1)
{
Polimor->Zeruj();
Polimor->Zeruj();
Polimor->GetTab(gracz,komputer);
poziom = Nowa_Gra.ZwrocPoziom();
if (poziom<3) pom=1;
else pom=0;
switch (Nowa_Gra.CzyLosowo())
{
case 0:
// W1->GetTab(gracz,komputer);
for (int i=4;i>=1;i--)
{
do
{
Polimor->Czysc(gracz);
cout<<"Podaj pierwsze wspolrzedne "<<i<<" masztowca"<<endl;
cin>>x1>>x2;
y=Polimor->Zam_licz(x2);
fflush(stdin);
if (y>=1 && y<=10 && (( x1>='a' && x1<='j') ||(x1>='A' && x1<='j')) ) wsp=true;
else
{
wsp=false;
cout<<"Bledne wspolrzedne"<<endl;
}
}
while(wsp==false);
G1.Postaw(x1,y,i,gracz);
//W1->GetTab(gracz,komputer);
}
break;
case 1:
K1.Postaw(gracz);
break;
}
K1.Postaw(komputer);
K1.SkasujPamiec();
system("CLS");
cout<<"---------------------NIECH ROZPOCZNIE SIE GRA--------------------"<<endl;
Nowa_Gra.Delay(200);
// W1->GetTab(gracz,komputer);
Polimor->Czysc(gracz);
do
{
do
{
//W1->GetTab(gracz,komputer);
wg = Nowa_Gra.Wygrana(gracz);
wk = Nowa_Gra.Wygrana(komputer);
if (wg==true || wk==true) goto et;
Nowa_Gra.Delay(200);
// W1->GetTab(gracz,komputer);
Polimor->Czysc(gracz);
// Czysc(komp);
wsp=true;
cout<<"Podaj wspolrzedne do strzalu"<<endl;
cin>>x1>>x2;
if (x1=='k') goto et;
y=Polimor->Zam_licz(x2);
fflush(stdin);
if (y>=1 && y<=10 && ((x1>='a' && x1<='j')||(x1>='A' && x1<='J'))) wsp=true;
else
{
wsp=false;
cout<<"Bledne wspolrzedne"<<endl;
}
}
while(wsp==false);
// ilg++;
kor=G1.Ruch(pom,x1,y,gracz,komputer);
if (kor==false)
{
do
{
wx = rand() % 10 +1;
wy = rand() % 19 +1;
}
while(wy % 2 ==0 || gracz[wx][wy]=='+' || gracz[wx][wy]=='.' || gracz[wx][wy]=='x' );
K1.Ruch(wx,wy,poziom,kier,gracz,komputer);
}
Polimor->SetTab(gracz,komputer);
// W1->GetTab(gracz,komputer);
}
while(wg==false && wk==false);
et:
// W1->GetTab(gracz,komputer);
Polimor->Czysc(gracz);
if (wg==true)
{
cout<<"-------------------------WYGRANA--------------------------------"<<endl;
//cout<<"Wykonales "<<il_gracz<<" ruchow"<<endl;
}
else
{cout<<"-----------------------PRZEGRANA----------------------------"<<endl;
//cout<<"Komputer pokonal Cie wykonujac "<<il_komp<<" ruchow"<<endl;
}
// system("CLS");
}//--koniec pierwszego ifa czyli czy zostala wybrana nowa gra
else return 0;
cout<<"Chcesz zagrac jescze raz t/n"<<endl;
cin>>w;
fflush(stdin);
}
while(w=='T' || w=='t');
return 0;
}
/*-----------------------KLASA Cplansza---------------------------------*/
Cplansza::Cplansza()
{
}
Cplansza::Cplansza(char tab[11][45], char komp[11][45])
{ // konstruktor ktory wczytuje plansze z pliku
FILE *plik;
int j=0;
plik=fopen("statki.txt","r+");
if (!plik) printf("Blad odczytu z pliku");
else
{
while(fgets(tab[j],45,plik)!=NULL ) j++;
for (int i=0;i<11;i++)
for (int j=0;j<45;j++)
komp[i][j]=tab[i][j];
}
tab[j][44]='\0';
fclose(plik);
}
void Cplansza::SetTab(char t[11][45], bool gracz)
{
if (gracz)
{
for(int i=0;i<11;i++)
for(int j=0;j<45;j++)
this->tab[i][j]=t[i][j];
}
else
{
for(int i=0;i<11;i++)
for(int j=0;j<45;j++)
this->komp[i][j]=t[i][j];
}
}
void Cplansza::GetTab(char gracz[11][45],char komp[11][45])
{
for(int i=0;i<11;i++)
for(int j=0;j<45;j++)
{
gracz[i][j]=this->tab[i][j];
komp[i][j]=this->komp[i][j];
}
}
bool Cplansza::Sprawdz(int x, int y,char tabl[11][45],char znak)
{
if (tabl[x][y]==znak && tabl[x][y+2]!='*' && tabl[x][y-2]!='*' && tabl[x+1][y]!='*' && tabl[x-1][y]!='*'
&& tabl[x+1][y+2]!='*' && tabl[x-1][y-2]!='*' && tabl[x+1][y-2]!='*' && tabl[x-1][y+2]!='*') return true;
else return false;
}
void Cplansza::Czysc(char tabl[11][45])
{
system("CLS");
Wyswietl(tabl);
}
void Cplansza::Wyswietl( char tablica[11][45])
{
for (int i=0;i<11;i++)
{
if (i==1) cout<<endl;
for(int j=0;j<43;j++)
{
// if (tablica[i][j]=='.') cout<<'_';
if(tablica[i][j]=='+') setcolor(ZOLTY);
else if(tablica[i][j]=='x') setcolor(CZERWONY);
else if(tablica[i][j]=='.') setcolor(ZIELONY);
else if(tablica[i][j]=='*') setcolor(NIEBIESKI);
else setcolor(BIALY);
cout<<tablica[i][j];
}
}
cout<<endl;
}
void Cplansza::Zeruj()
{
for(int i=0;i<11;i++)
for(int j=0;j<45;j++)
if(this->tab[i][j]=='*' || this->tab[i][j]=='x' || this->tab[i][j]=='.' || this->tab[i][j]=='+')
{
this->tab[i][j]='_';
this->komp[i][j]='_';
}
}
int Cplansza::ZamienWsp(char x)
{
switch (x)
{
case 'a' : case 'A' : return 1;
case 'b' : case 'B' : return 2;
case 'c' : case 'C' : return 3;
case 'd' : case 'D' : return 4;
case 'e' : case 'E' : return 5;
case 'f' : case 'F' : return 6;
case 'g' : case 'G' : return 7;
case 'h' : case 'H' : return 8;
case 'i' : case 'I' : return 9;
case 'j' : case 'J' : return 10;
}
}
int Cplansza::ZamienWsp(int y)
{
switch (y)
{
case 1 : return 1;
case 2 : return 3;
case 3 : return 5;
case 4 : return 7;
case 5 : return 9;
case 6 : return 11;
case 7 : return 13;
case 8 : return 15;
case 9 : return 17;
case 10 : return 19;
}
}
int Cplansza::Zamiana (char a)
{
switch (a)
{
case '0' : return 0;
case '1' : return 1;
case '2' : return 2;
case '3' : return 3;
case '4' : return 4;
case '5' : return 5;
case '6' : return 6;
case '7' : return 7;
case '8' : return 8;
case '9' : return 9;
}
return -1;
}
int Cplansza::Zam_licz(string z)
{
int l=z.length()-1,suma=0,j=1,ster=0;
while (ster<=l)
{
suma=suma+j*Zamiana(z[l]);
l--;
j=j*10;
}
return suma;
}
bool Cplansza::Ruch()
{
return true;
}
void Cplansza::Postaw()
{
}
void Cplansza::Wpisz(int wx,int wy,char tab[11][45])
{
if(wx>1 && tab[wx-1][wy]=='_') tab[wx-1][wy]='.';
if(wx<10 && tab[wx+1][wy]=='_' ) tab[wx+1][wy]='.';
if(wy>2 && tab[wx][wy-2]=='_') tab[wx][wy-2]='.';
if( tab[wx][wy+2]=='_') tab[wx][wy+2]='.';
if(wx>1 && wy>2 && tab[wx-1][wy-2]=='_') tab[wx-1][wy-2]='.';
if(wx>1 && tab[wx-1][wy+2]=='_') tab[wx-1][wy+2]='.';
if(wx<10 && wy>2 && tab[wx+1][wy-2]=='_') tab[wx+1][wy-2]='.';
if(wx<10 && tab[wx+1][wy+2]=='_') tab[wx+1][wy+2]='.';
}
void Cplansza::UsunZbedne(int wx,int wy,char tab[11][45])
{
Wpisz(wx,wy,tab);
if (tab[wx-1][wy]=='+') Wpisz(wx-1,wy,tab);
if (tab[wx+1][wy]=='+') Wpisz(wx+1,wy,tab);
if (tab[wx+2][wy]=='+') Wpisz(wx+2,wy,tab);
if (tab[wx+3][wy]=='+') Wpisz(wx+3,wy,tab);
if (tab[wx-2][wy]=='+') Wpisz(wx-2,wy,tab);
if (tab[wx-3][wy]=='+') Wpisz(wx-3,wy,tab);
if (tab[wx][wy-2]=='+') Wpisz(wx,wy-2,tab);
if (tab[wx][wy-4]=='+') Wpisz(wx,wy-4,tab);
if (tab[wx][wy-6]=='+') Wpisz(wx,wy-6,tab);
if (tab[wx][wy+2]=='+') Wpisz(wx,wy+2,tab);
if (tab[wx][wy+4]=='+') Wpisz(wx,wy+4,tab);
if (tab[wx][wy+6]=='+') Wpisz(wx,wy+6,tab);
}
bool Cplansza::CzyZatopiony(char tab[11][45],int wx, int wy)
{
bool zatopiony = false;
if (Sprawdz(wx,wy,tab,'+')==true ) //trafiony zostal jednomasztowiec
{
if (tab[wx-1][wy]=='+')
{
if (tab[wx-2][wy]=='+') zatopiony=Sprawdz(wx-2,wy,tab,'+');
else zatopiony=Sprawdz(wx-1,wy,tab,'+');
}
else if (tab[wx+1][wy]=='+')
{
if (tab[wx+2][wy]=='+') zatopiony=Sprawdz(wx+2,wy,tab,'+');
else zatopiony=Sprawdz(wx+1,wy,tab,'+');
}
else if (tab[wx][wy-2]=='+')
{
if(tab[wx][wy-4]=='+') zatopiony=Sprawdz(wx,wy-4,tab,'+');
else zatopiony=Sprawdz(wx,wy-2,tab,'+');
}
else if (tab[wx][wy+2]=='+')
{
if (tab[wx][wy+4]=='+') zatopiony=Sprawdz(wx,wy+4,tab,'+');
else zatopiony=Sprawdz(wx,wy+2,tab,'+');
}
else
{ zatopiony=true;
}
}
return zatopiony;
}
/*---------------------------KLASA Cgracz-----------------------------------*/
Cgracz::Cgracz()
{
this->zatopienia=0;
this->punkty=0;
this->il_ruchow=0;
}
void Cgracz::DodajZatopienia()
{
this->zatopienia++;
}
void Cgracz::DodajPunkty()
{
this->punkty++;
}
void Cgracz::DodajRuch()
{
this->il_ruchow++;
}
int Cgracz::ZwrocZatopienia()
{
return this->zatopienia;
}
int Cgracz::ZwrocPunkty()
{
return this->punkty;
}
void Cgracz::Postaw(char p1, int y,int ile,char tab[11][45]) //funkcja stawiajaca 1,2,3,4 masztowce
{
string tmp=" ";
int liczba=0;
char z;
bool d[3];
bool wsp;
int x=ZamienWsp(p1);
y=ZamienWsp(y);
d[0]=Sprawdz(x,y,tab,'_');
switch (ile)
{
case 1 :
do
{
d[0]=Sprawdz(x,y,tab,'_'); //sprawdzanie czy mozna postawic w tym miejscu
if (d[0]==true)
{
liczba++; //licznik n-masztowcow
tab[x][y]='*';
if (liczba==4) break;
do
{
et:
Czysc(tab);
cout<<"Podaj wspolrzedne kolejnego 1 masztowca: ";
cin>>z>>tmp;
y=Zam_licz(tmp);
fflush(stdin);
if (y>=1 && y<=10 && (( z>='a' && z<='j') ||(z>='A' && z<='J')) ) wsp=true;
else
{
wsp=false;
cout<<"Bledne wspolrzedne"<<endl;
}
}
while(wsp==false);
x=ZamienWsp(z);
y=ZamienWsp(y);
d[0]=Sprawdz(x,y,tab,'_');
}
else
{
cout<<"Bledne wspolrzedne"<<endl; //wprowadzenie nastepnych wsp jesli wpisane sa bledne
goto et;
}
}
while (liczba<4);
liczba=0;
break;
case 2:
do
{
d[0]=Sprawdz(x,y,tab,'_');
if (d[0]==true)
{
do
{
cout<<"Podaj kierunek l- lewo p- prawo g-gora d-dol: "; //kierunki w ktore mozna skierowac "reszte danego k-masztowca"
cin>>tmp;
z=tmp[0];
if ((z=='g' || z=='G' || z=='l' || z=='L' || z=='P' || z=='p' || z=='d' || z=='D') &&
tmp.length()==1) wsp=true;
else wsp=false;
fflush(stdin);
Czysc(tab);
}
while(wsp==false);
switch(z)
{
case 'l' :
d[0]=Sprawdz(x,y-2,tab,'_');
if (d[0]==true)
{
liczba++;
}
break;
case 'p' :
d[0]=Sprawdz(x,y+2,tab,'_');
if (d[0]==true)
{
for(int i=0;i<=1;i++) tab[x][y+i*2]='*';
liczba++;
}
break;
case 'g' :
d[0]=Sprawdz(x-1,y,tab,'_');
if (d[0]==true)
{
for(int i=0;i<=1;i++) tab[x-i][y]='*';
liczba++;
}
break;
case 'd' :
d[0]=Sprawdz(x+1,y,tab,'_');
if (d[0]==true)
{
for(int i=0;i<=1;i++) tab[x+i][y]='*';
liczba++;
}
break;
}
}
else cout<<"Bledne wspolrzedne"<<endl;
if (liczba==3) break;
do
{
Czysc(tab);
cout<<"Podaj wspolrzedne kolejnego 2-masztowca"<<endl;
cin>>z>>tmp;
y=Zam_licz(tmp);
fflush(stdin);
if (y>=1 && y<=10 && (( z>='a' && z<='j') ||(z>='A' && z<='J')) ) wsp=true;
else
{
wsp=false;
cout<<"Bledne wspolrzedne"<<endl;
}
}
while(wsp==false);
y=ZamienWsp(y);
x=ZamienWsp(z);
} while(liczba<3);
break;
case 3 :
do
{
d[0]=Sprawdz(x,y,tab,'_');
if (d[0]==true)
{
do
{
cout<<"Podaj kierunek l- lewo p- prawo g-gora d-dol: ";
cin>>tmp;
z=tmp[0];
if ((z=='g' || z=='G' || z=='l' || z=='L' || z=='P' || z=='p' || z=='d' || z=='D') &&
tmp.length()==1) wsp=true;
else wsp=false;
fflush(stdin);
Czysc(tab);
}
while(wsp==false);
switch(z)
{
case 'l' :
for(int i=1;i<=2;i++) d[i-1]=Sprawdz(x,y-i*2,tab,'_');
if (d[0]==true && d[1]==true)
{
for(int i=0;i<=2;i++) tab[x][y-i*2]='*';
liczba++;
}
break;
case 'p' :
for(int i=1;i<=2;i++) d[i-1]=Sprawdz(x,y+i*2,tab,'_');
if (d[0]==true && d[1]==true)
{
for(int i=0;i<=2;i++) tab[x][y+i*2]='*';
liczba++;
}
break;
case 'g' :
for(int i=1;i<=2;i++) d[i-1]=Sprawdz(x-i,y,tab,'_');
if (d[0]==true && d[1]==true)
{
for(int i=0;i<=2;i++) tab[x-i][y]='*';
liczba++;
}
break;
case 'd' :
for(int i=1;i<=2;i++) d[i-1]=Sprawdz(x+i,y,tab,'_');
if (d[0]==true && d[1]==true)
{
for(int i=0;i<=2;i++) tab[x+i][y]='*';
liczba++;
}
break;
}
}
else cout<<"Bledne wspolrzedne"<<endl;
if (liczba==2) break;
do
{
Czysc(tab);
cout<<"Podaj wspolrzedne kolejnego 3-masztowca"<<endl;
cin>>z>>tmp;
y=Zam_licz(tmp);
fflush(stdin);
if (y>=1 && y<=10 && (( z>='a' && z<='j') ||(z>='A' && z<='j')) ) wsp=true;
else
{
wsp=false;
cout<<"Bledne wspolrzedne"<<endl;
}
}
while(wsp==false);
x=ZamienWsp(z);
y=ZamienWsp(y);
}
while (liczba<2);
liczba=0;
break;
case 4 :
do
{
d[0]=Sprawdz(x,y,tab,'_');
if (d[0]==true)
{
do
{
cout<<"Podaj kierunek l- lewo p- prawo g-gora d-dol: ";
cin>>tmp;
z=tmp[0];
if ((z=='g' || z=='G' || z=='l' || z=='L' || z=='P' || z=='p' || z=='d' || z=='D') &&
tmp.length()==1) wsp=true;
else wsp=false;
fflush(stdin);
Czysc(tab);
}
while(wsp==false);
switch(z)
{
case 'l' :
for(int i=1;i<=3;i++) d[i-1]=Sprawdz(x,y-i*2,tab,'_');
if (d[0]==true && d[1]==true && d[2]==true)
{
for(int i=0;i<=3;i++) tab[x][y-i*2]='*';
liczba++;
}
break;
case 'p' :
for(int i=1;i<=3;i++) d[i-1]=Sprawdz(x,y+i*2,tab,'_');
if (d[0]==true && d[1]==true && d[2]==true )
{
for(int i=0;i<=3;i++) tab[x][y+i*2]='*';
liczba++;
}
break;
case 'g' :
for(int i=1;i<=3;i++) d[i-1]=Sprawdz(x-i,y,tab,'_');
if (d[0]==true)
{
for(int i=0;i<=3;i++) tab[x-i][y]='*';
liczba++;
}
break;
case 'd' :
for(int i=1;i<=3;i++) d[i-1]=Sprawdz(x+i,y,tab,'_');
if (d[0]==true)
{
for(int i=0;i<=3;i++) tab[x+i][y]='*';
liczba++;
}
break;
}
}
else cout<<"Bledne wspolrzedne"<<endl;
if (liczba==1) break;
Czysc(tab);
}
while (liczba<1);
liczba=0;
break;
}
}
bool Cgracz::Ruch(bool pomoc,char a, int y,char tab[11][45],char komp[11][45])
{
bool spr;
il_ruchow++;
x=ZamienWsp(a);
y=ZamienWsp(y);
if (komp[x][y]=='x' || komp[x][y]=='+')
{
cout<<"Pole wybrane juz wczesniej"<<endl;
cout<<"Sprobuj jeszcze raz"<<endl;
return true;
}
else
{
if (komp[x][y]=='*')
{
komp[x][y]='+';
tab[x][y+22]='+';
spr = CzyZatopiony(komp,x,y);
if (spr==true)
{
cout<<"Trafiony i zatopiony"<<endl;
if (pomoc==true) UsunZbedne(x,y+22,tab);
}
else cout<<"Trafiles"<<endl;
return true;
}
else
{
komp[x][y]='x';
tab[x][y+22]='x';
cout<<"Pudlo "<<endl;
return false;
}
}
}
/*-----------------KLASA Clista---------------------------------*/
Clista::Clista()
{
glowa = NULL;
il_elementow=0;
nastepny=NULL;
wsp.w_x=0;
wsp.w_y=0;
}
Clista::~Clista()
{
Clista *tmp = glowa;
while(tmp!=NULL)
{
tmp=glowa->nastepny;
delete glowa;
glowa=tmp;
}
}
void Clista::Skasuj()
{
Clista *tmp = glowa;
while(tmp!=NULL)
{
tmp=glowa->nastepny;
delete glowa;
glowa=tmp;
}
this->il_elementow=0;
}
void Clista::UstawWspolrzedne(Wektor wsp)
{
this->wsp.w_x=wsp.w_x;
this->wsp.w_y=wsp.w_y;
this->wsp.trafiony=wsp.trafiony;
}
void Clista::ZwiekszElementy()
{
il_elementow++;
}
Wektor Clista::ZwrocWspolrzedne()
{
return wsp;
}
int Clista::ZwrocIlosc()
{
return il_elementow;
}
void Clista::Dodaj(Wektor &e)
{
Clista *nowy = new Clista;
nowy->wsp=e;
nowy->nastepny=glowa;
glowa=nowy;
il_elementow++;
}
Wektor Clista::Usun(int nr)
{
Wektor ws;
Clista *tmp = glowa;
Clista *tmp2 = NULL;
int licznik=1;
if(tmp!=NULL)
{
while(tmp!=NULL && nr>1)
{
ws = tmp->wsp;
tmp2 = tmp;
tmp=tmp->nastepny;
nr--;
}
if ((nr!=1) || (tmp==NULL))
{
return ws;
}
if(tmp2==NULL)
{
ws=tmp->wsp;
glowa=tmp->nastepny;
}
else tmp2->nastepny=tmp->nastepny;
delete tmp;
il_elementow--;
}
return ws;
}
bool Clista::ListaPusta()
{
if(this->il_elementow==0) return true;
}
/*-----------------------KLASA Ckomputer--------------------*/
/*
*/
void Ckomputer::Postaw(char komp[11][45])
{
int wspx=0, wspy=0,kier=0,licznik=0;
bool d[4];
for (int i=0;i<4;i++) d[i]=false;
for (int i=1;i<=4;i++)
{
switch(i)
{
case 1 :
for(int j=1;j<=4;j++)
{
do
{
wspx= rand() % 10 +1;
wspy = rand() %19 +1;
d[0]=Sprawdz(wspx,wspy,komp,'_');
}
while(d[0]==false);
komp[wspx][wspy]='*';
}
break;
case 2 :
for (int j=1;j<=3;j++)
{
do
{
kier = rand() % 4 +1;
wspx = rand() % 10 +1;
wspy = rand() % 19 +1;
d[0]=Sprawdz(wspx,wspy,komp,'_');
switch (kier)
{
case 1 :
d[1]=Sprawdz(wspx+1,wspy,komp,'_');
break;
case 2 :
d[1]=Sprawdz(wspx-1,wspy,komp,'_');
break;
case 3 :
d[1]=Sprawdz(wspx,wspy+2,komp,'_');
break;
case 4 :
d[1]=Sprawdz(wspx,wspy+2,komp,'_');
break;
}
}
while (d[0]==false || d[1]==false);
komp[wspx][wspy]='*';
switch ( kier)
{
case 1 : komp[wspx+1][wspy]='*';
break;
case 2 : komp[wspx-1][wspy]='*';
break;
case 3 : komp[wspx][wspy+2]='*';
break;
case 4 : komp[wspx][wspy-2]='*';
break;
}
}
break;
case 3 :
for (int j=1;j<=2;j++)
{
do
{
kier = rand() % 4 +1;
wspx = rand() % 10 +1;
wspy = rand() % 19 +1;
d[0]=Sprawdz(wspx,wspy,komp,'_');
switch (kier)
{
case 1 :
for (int i=1;i<=2;i++) d[i]=Sprawdz(wspx+i,wspy,komp,'_');
break;
case 2 :
for (int i=1;i<=2;i++) d[i]=Sprawdz(wspx-i,wspy,komp,'_');
break;
case 3 :
for (int i=1;i<=2;i++) d[i]=Sprawdz(wspx,wspy+i*2,komp,'_');
break;
case 4 :
for (int i=1;i<=2;i++) d[i]=Sprawdz(wspx,wspy-i*2,komp,'_');
break;
}
}
while(d[0]==false || d[1]== false || d[2] == false);
komp[wspx][wspy]='*';
switch(kier)
{
case 1 :
for(int i=1;i<=2;i++) komp[wspx+i][wspy]='*';
break;
case 2 :
for(int i=1;i<=2;i++) komp[wspx-i][wspy]='*';
break;
case 3 :
for(int i=1;i<=2;i++) komp[wspx][wspy+i*2]='*';
break;
case 4 :
for(int i=1;i<=2;i++) komp[wspx][wspy-i*2]='*';
break;
}
}
break;
case 4 :
for (int j=1;j<=2;j++)
{
do
{
kier = rand() % 4 +1;
wspx = rand() % 10 +1;
wspy = rand() % 19 +1;
d[0]=Sprawdz(wspx,wspy,komp,'_');
switch (kier)
{
case 1 :
for(int i=1;i<=3;i++) d[i]=Sprawdz(wspx+i,wspy,komp,'_');
break;
case 2 :
for(int i=1;i<=3;i++) d[i]=Sprawdz(wspx-i,wspy,komp,'_');
break;
case 3 :
for(int i=1;i<=3;i++) d[i]=Sprawdz(wspx,wspy+i*2,komp,'_');
break;
case 4 :
for(int i=1;i<=3;i++) d[i]=Sprawdz(wspx,wspy-i*2,komp,'_');
break;
}
}
while(d[0]==false || d[1]== false || d[2] == false || d[3]==false);
komp[wspx][wspy]='*';
switch(kier)
{
case 1 :
for(int i=1;i<=3;i++) komp[wspx+i][wspy]='*';
break;
case 2 :
for(int i=1;i<=3;i++) komp[wspx-i][wspy]='*';
break;
case 3 :
for(int i=1;i<=3;i++) komp[wspx][wspy+i*2]='*';
break;
case 4 :
for(int i=1;i<=3;i++) komp[wspx][wspy-i*2]='*';
break;
}
break;
}
}
}
}
//void Cgra::Delay(int czas) { for(int i=czas*1000000;i>=0;i--);}
Wektor Ckomputer::Wyszukaj(char tabl[11][45],char znak,int wx,int wy)
{
Wektor w;
w.kierunek=0;
if (tabl[wx-1][wy]==znak)
{
w.w_x=wx-1;
w.w_y=wy;
w.kierunek=1;
}
else if (tabl[wx+1][wy]==znak)
{
w.w_x=wx+1;
w.w_y=wy;
w.kierunek=2;
}
else if (tabl[wx][wy-2]==znak)
{
w.w_x=wx;
w.w_y=wy-2;
w.kierunek=3;
}
else if (tabl[wx][wy+2]==znak)
{
w.w_x=wx;
w.w_y=wy+2;
w.kierunek=4;
}
return w;
}
bool Ckomputer::Ruch(int wx, int wy,int poziom, int &kierunek,char tab[11][45],char komp[11][45])
{
Wektor w;
int i=0,licznik=0;
bool zatopiony=false;
this->il_ruchow++;
int nr=0;
switch (poziom)
{
case 1: /* Ruch komputera opiera sie na losowym strzelaniu do pol */
if (tab[wx][wy]=='*')
{
cout<<"Zostales trafiony"<<endl;
tab[wx][wy]='+';
komp[wx][wy+22]='+';
wx = rand() % 10 +1;
do
wy = rand() % 19 +1;
while( wy % 2 == 0);
Ruch(wx,wy,poziom,kierunek,tab,komp);
}
else
{
if (tab[wx][wy]=='_')
{
cout<<"Komputer spudlowal"<<endl;
tab[wx][wy]='x';
komp[wx][wy+22]='x';
return false;
}
else
{
while (tab[wx][wy]=='x' || tab[wx][wy]=='+')
{
wx = rand() % 10 +1;
do
wy= rand() % 19 +1;
while(wy % 2 == 0);
}
this->Ruch(wx,wy,poziom,kierunek,tab,komp);
}
}
break;
case 2:
if (tab[wx][wy]=='*') //Sprawdzamy czy pod wylosowanymi wsp kryje sie statek lub jego
{
cout<<"Zostales trafiony"<<endl; // czesc
tab[wx][wy]='+';
komp[wx][wy+22]='+';
zatopiony = CzyZatopiony(tab,wx,wy);
if (zatopiony==true) /* jesli statek zostal zatopiony "okropkowujemy" miejsca
w ktorych na pewno nie bedzie innych statkow */
{
cout<<" i zatopiony"<<endl;
UsunZbedne(wx,wy,tab); //okropkowujemy miejsca gdzie strzal jest bez celowy gdyz wokol statku masztow innego
//zgodnie z konstrukcja nie bedzie
do // Losowe wybranie kolejnych wspolrzednych dla ruchu komputera
{ // i rekursywne wywolanie jego ruchu
wx= rand() % 10 +1; //
wy= rand() % 19 +1;
}
while(wy % 2 == 0 || tab[wx][wy]=='.' || tab[wx][wy]=='+' || tab[wx][wy]=='x');
this->Ruch(wx,wy,poziom,kierunek,tab,komp);
}
else if (zatopiony==false)
{
w=Wyszukaj(tab,'*',wx,wy);
if (w.w_x!=0) this->Ruch(w.w_x,w.w_y,poziom,kierunek,tab,komp);
}
}
else
{
cout<<"Komputer spudlowal"<<endl;
tab[wx][wy]='x';
komp[wx][wy+22]='x';
return false;
}
break;
case 3:
//Prosze analizowac od tego miejsca
if (pamiec.ListaPusta()==true)
{
cout<<"Pamiec jest pusta!!!!!"<<endl;
if (tab[wx][wy]=='*') //Sprawdzamy czy pod wylosowanymi wsp kryje sie statek lub jego
{
cout<<"Zostales trafiony"<<endl; // czesc
tab[wx][wy]='+';
komp[wx][wy+22]='+';
zatopiony = CzyZatopiony(tab,wx,wy);
w.w_x = wx;
w.w_y = wy;
w.trafiony = false;
if (zatopiony == false)
{
//Statek zostal tylko trafiony a nie zostal zatopiony
if ( tab[w.w_x-1][w.w_y]=='_' || tab[w.w_x-1][w.w_y]=='*')
{
w.w_x=w.w_x-1;
pamiec.Dodaj(w);
w.w_x=w.w_x+1;
}
if ( tab[w.w_x+1][w.w_y]=='_' || tab[w.w_x+1][w.w_y]=='*')
{
w.w_x=w.w_x+1;
pamiec.Dodaj(w);
w.w_x=w.w_x-1;
}
if ( tab[w.w_x][w.w_y-2]=='_' || tab[w.w_x][w.w_y-2]=='*')
{
w.w_y=w.w_y-2;
pamiec.Dodaj(w);
w.w_y=w.w_y+2;
}
if ( tab[w.w_x][w.w_y+2]=='_' || tab[w.w_x][w.w_y+2]=='*')
{
w.w_y=w.w_y+2;
pamiec.Dodaj(w);
w.w_y=w.w_y-2;
}
this->Ruch(1,1,poziom,kierunek,tab,komp);
}//-if statek niezatopiony
else
{
cout<<"i zatopiony"<<endl;
UsunZbedne(w.w_x,w.w_y,tab);
if ( pamiec.ListaPusta()!=false) pamiec.Skasuj();
do // Losowe wybranie kolejnych wspolrzednych dla ruchu komputera
{ // i rekursywne wywolanie jego ruchu
wx= rand() % 10 +1; //
wy= rand() % 19 +1;
}
while(wy % 2 == 0 || tab[wx][wy]=='.' || tab[wx][wy]=='+' || tab[wx][wy]=='x');
this->Ruch(wx,wy,poziom,kierunek,tab,komp);
}
}//-koniec if trafiono masz
else
{
if (tab[wx][wy]=='_')
{
cout<<"Komputer spudlowal"<<endl;
tab[wx][wy]='x';
komp[wx][wy+22]='x';
return false;
}
else
{
while (tab[wx][wy]!='_' || tab[wx][wy]!='*')
{
wx = rand() % 10 +1;
do
wy= rand() % 19 +1;
while(wy % 2 == 0);
}
this->Ruch(wx,wy,poziom,kierunek,tab,komp);
}
}
}//--if pamiec jest pusta
//----------------pamiec nie jest pusta-------------------
else
{
//Lista nie jest pusta w przypadku gdy ktorys masz n-masztowca zostal w poprzednim ruchu odkryty
//Sprawdzam czy obok trafionego sa juz jakies maszty trafione
nr = rand() % pamiec.ZwrocIlosc()+1;
cout<<"Zmienna nr ma wartosc: "<<nr<<endl;
getch();
w = pamiec.Usun(nr);
if(tab[w.w_x][w.w_y]=='*')
{
tab[w.w_x][w.w_y]='+';
komp[w.w_x][w.w_y+22]='+';
cout<<"Zostales trafiony"<<endl;
if(CzyZatopiony(tab,w.w_x,w.w_y)==true)
{
cout<<"i zatopiony"<<endl;
pamiec.Skasuj(); //jezeli statek zostal juz zatopiony to kasujemy liste i wracamy
//do losowania pola uderzenia random oczywiscie bierzemy pod uwage
//tylko pola logicznie poprawne tj te ktore nie sasiaduja z np odkrytym wczesniej
//statkiem
UsunZbedne(w.w_x,w.w_y,tab);
do // Losowe wybranie kolejnych wspolrzednych dla ruchu komputera
{ // i rekursywne wywolanie jego ruchu
wx= rand() % 10 +1; //
wy= rand() % 19 +1;
}
while(tab[wx][wy]!='*' && tab[wx][wy]!='_');
this->Ruch(wx,wy,poziom,kierunek,tab,komp);
}
else
{
w=Wyszukaj(tab,'+',w.w_x,w.w_y); //----Sprawdzamy w jakiej pozycji znajduje sie poprzedni odkryty juz
//maszt statku
pamiec.Skasuj(); //kasujemy liste mozliwosci poniewaz moga byc w niej ruchy bezsensowne
//i tworzymy nowa liste ruchow w ktorych szansa trafienia kolejnego masztu to 50%
cout<<"jestesmy tu kurwa!! czyli dwa maszty sa jebniete!!!"<<endl;
switch(w.kierunek)
{
case 1: //szukany masz znajduje sie w pozycji wx-1 a wiec kolejne maszty statku moga byc w ponizszych pozycjach
if(tab[w.w_x-1][w.w_y]=='_' || tab[w.w_x-1][w.w_y]=='*')
{
w.w_x=w.w_x-1;
pamiec.Dodaj(w);
w.w_x=w.w_x+1; //przywrocenie do pozycji poczatkowej
}
if(tab[w.w_x+2][w.w_y]=='_' || tab[w.w_x+2][w.w_y]=='*')
{
w.w_x=w.w_x+2;
pamiec.Dodaj(w);
w.w_x=w.w_x-2;
}
break;
case 2: //szukany maszt w wx+1
if(tab[w.w_x+1][w.w_y]=='_' || tab[w.w_x+1][w.w_y]=='*')
{
w.w_x=w.w_x+1;
pamiec.Dodaj(w);
w.w_x=w.w_x-1;
}
if(tab[w.w_x-2][w.w_y]=='_' || tab[w.w_x-2][w.w_y]=='*')
{
w.w_x=w.w_x-2;
pamiec.Dodaj(w);
w.w_x=w.w_x+2;
}
break;
case 3: //szukany maszt w wy-2
if(tab[w.w_x][w.w_y-2]=='_' || tab[w.w_x][w.w_y-2]=='*')
{
w.w_y=w.w_y-2;
pamiec.Dodaj(w);
w.w_x=w.w_y+2;
}
if(tab[w.w_x][w.w_y+4]=='_' || tab[w.w_x][w.w_y+4]=='*')
{
w.w_y=w.w_y+4;
pamiec.Dodaj(w);
w.w_y=w.w_y-4;
}
break;
case 4: //szukany maszt w wy+2
if(tab[w.w_x][w.w_y+2]=='_' || tab[w.w_x][w.w_y+2]=='*')
{
w.w_y=w.w_y+2;
pamiec.Dodaj(w);
w.w_y=w.w_y-2;
}
if(tab[w.w_x][w.w_y-4]=='_' || tab[w.w_x][w.w_y-4]=='*')
{
w.w_y=w.w_y-4;
pamiec.Dodaj(w);
w.w_y=w.w_y+4;
}
break;
}//--koniec tego switcha
// if(pamiec.ZwrocIlosc()>0) nr = rand()% pamiec.ZwrocIlosc()+1;
// w = pamiec.Usun(nr);
Ruch(1,1,3,kierunek,tab,komp);
}//--koniec elsa ktory mowi ze statek zostal trafiony ale nie zostal zatopiony
}//--koniec ifa ze statek zostal trafiony
else
{
if (tab[w.w_x][w.w_y]!='x')
{
tab[w.w_x][w.w_y]='x';
komp[w.w_x][w.w_y+22]='x';
cout<<"Komputer spudlowal"<<endl;
}
else Ruch(wx,wy,3,kierunek,tab,komp);
return false;
}
} //-koniec else czyli kodu obslugujacego gdy lista nie jest pusta
//------------Poziom inteligentny ----------------------/
} //--koniec switcha
} //--koniec funkcji
void Ckomputer::SkasujPamiec()
{
pamiec.Skasuj();
}
/*----------------------KLASA Cgra--------------------------*/
Cgra::Cgra()
{
// generowanie ziarna czasowego do losowania pol przez komputer
this->poziom=1;
this->losowo=1;
srand (static_cast<unsigned int>(time(NULL)));
}
void Cgra::Delay(int czas)
{
for(int i=0;i<czas*CZAS;i++);
}
bool Cgra::Wygrana(char tabl[11][45])
{
int licznik=0;
for (int i=1;i<11;i++)
for (int j=0;j<20;j++)
{
if (tabl[i][j]=='*') licznik++;
}
if (licznik==0) return true;
else return false;
}
bool Cgra::Wspolrzedne( char a, int x)
{
if ((a>='a' && a<='j') || (a>='A' && a<='J') && x>=1 && x<=10) return true;
else return false;
}
void Cgra::Intro()
{
system("COLOR 4E");
system("CLS");
for(int i=1;i<12;i++)
cout<<endl;
for(int i=1;i<35;i++)
{
Delay(100);
cout<<"-" ;
}
Delay(100);
cout<<"S";
Delay(100);
cout<<"T";
Delay(100);
cout<<"A";
Delay(100);
cout<<"T";
Delay(100);
cout<<"K";
Delay(100);
cout<<"I";
for(int i=1;i<35;i++)
{
Delay(100);
cout<<"-" ;
}
for(int i=1;i<15;i++)
cout<<endl;
cout<<" Pawel Czech II EF-DI"<<endl;
Delay(1000);
system("CLS");
}
int Cgra::Menu()
{
int pozycja = 1;
int pozycja_pod_menu=1;
int pozycja_pod_pod_menu=1;
char znak='a';
while(znak!=ESC)
{
if(znak=='s') pozycja++;
if(znak=='w') pozycja--;
if(pozycja==0) pozycja=3;
if(pozycja==4) pozycja=1;
system("CLS");
switch(pozycja)
{
case 1:
gotoxy(30,8);
setcolor(CZERWONY);
cout<<"NOWA GRA"<<endl;
gotoxy(30,11);
setcolor(BIALY);
cout<<"OPCJE"<<endl;
gotoxy(30,14);
cout<<"ZAKONCZ"<<endl;
break;
case 2:
gotoxy(30,8);
setcolor(BIALY);
cout<<"NOWA GRA"<<endl;
gotoxy(30,11);
setcolor(CZERWONY);
cout<<"OPCJE"<<endl;
gotoxy(30,14);
setcolor(BIALY);
cout<<"ZAKONCZ"<<endl;
break;
case 3:
gotoxy(30,8);
setcolor(BIALY);
cout<<"NOWA GRA"<<endl;
gotoxy(30,11);
cout<<"OPCJE"<<endl;
gotoxy(30,14);
setcolor(CZERWONY);
cout<<"ZAKONCZ"<<endl;
break;
}
znak = getch();
if(znak==ENTER)
{
switch(pozycja)
{
case 1:
return 1;
case 3:
return 0;
case 2:
system("CLS");
do
{
switch(pozycja_pod_menu)
{
case 1:
gotoxy(30,8);
setcolor(CZERWONY);
cout<<"LOKALIZACJA"<<endl;
gotoxy(30,11);
setcolor(BIALY);
cout<<"POZIOM"<<endl;
break;
case 2:
gotoxy(30,8);
setcolor(BIALY);
cout<<"LOKALIZACJA"<<endl;
gotoxy(30,11);
setcolor(CZERWONY);
cout<<"POZIOM"<<endl;
break;
}
znak=getch();
if(znak=='s') pozycja_pod_menu++;
if(znak=='w') pozycja_pod_menu--;
if(pozycja_pod_menu==3) pozycja_pod_menu=1;
if(pozycja_pod_menu==0) pozycja_pod_menu=2;
}
while(znak!=ESC && znak!=ENTER);
system("CLS");
if(znak==ENTER)
{
switch(pozycja_pod_menu)
{
case 1:
do
{
switch(pozycja_pod_pod_menu)
{
case 1:
this->losowo=0;
gotoxy(30,8);
setcolor(CZERWONY);
cout<<"RECZNA"<<endl;
gotoxy(30,11);
setcolor(BIALY);
cout<<"LOSOWA"<<endl;
break;
case 2:
this->losowo=1;
gotoxy(30,8);
setcolor(BIALY);
cout<<"RECZNA"<<endl;
gotoxy(30,11);
setcolor(CZERWONY);
cout<<"LOSOWA"<<endl;
break;
}
znak=getch();
if(znak=='s') pozycja_pod_pod_menu++;
if(znak=='w') pozycja_pod_pod_menu--;
if(pozycja_pod_pod_menu==0) pozycja_pod_pod_menu=2;
if(pozycja_pod_pod_menu==3) pozycja_pod_pod_menu=1;
}
while(znak!=ESC && znak!=ENTER);
break;
case 2:
system("CLS");
do
{
switch(pozycja_pod_pod_menu)
{
case 1:
this->poziom=1;
gotoxy(30,8);
setcolor(CZERWONY);
cout<<"LATWY"<<endl;
gotoxy(30,11);
setcolor(BIALY);
cout<<"SREDNI"<<endl;
gotoxy(30,14);
cout<<"TRUDNY"<<endl;
break;
case 2:
this->poziom=2;
gotoxy(30,8);
setcolor(BIALY);
cout<<"LATWY"<<endl;
gotoxy(30,11);
setcolor(CZERWONY);
cout<<"SREDNI"<<endl;
gotoxy(30,14);
setcolor(BIALY);
cout<<"TRUDNY"<<endl;
break;
case 3:
this->poziom=3;
gotoxy(30,8);
setcolor(BIALY);
cout<<"LATWY"<<endl;
gotoxy(30,11);
cout<<"SREDNI"<<endl;
gotoxy(30,14);
setcolor(CZERWONY);
cout<<"TRUDNY"<<endl;
break;
}
znak=getch();
if(znak=='s') pozycja_pod_pod_menu++;
if(znak=='w') pozycja_pod_pod_menu--;
if(pozycja_pod_pod_menu==0) pozycja_pod_pod_menu=3;
if(pozycja_pod_pod_menu==4) pozycja_pod_pod_menu=1;
}
while(znak!=ESC && znak!=ENTER);
break;
}
}
}
}
}
}
int Cgra::ZwrocPoziom()
{
return this->poziom;
}
bool Cgra::CzyLosowo()
{
return this->losowo;
}
Ta funkcja ktora niedokońca działa to w klasie CKomputer Ruch(...) i tam od case 3 : proszę analizować.