Draqun
Użytkownik
- Dołączył
- Sierpień 27, 2007
- Posty
- 67
Postanowiłem dalej zgłębiać tajemnice programowania obiektowego. Brnąc dalej z kursem "Od zera do gier kodera" ukończyłem dział związany z Obiektami i chciałem zrobić kolko krzyzyk obiektowo. Kod zaczyna się kompilować ale nagle wywala mi masę błędów. Oto kod.
main.cpp
lib.h
akction.cpp
Bugi
main.cpp
Kod:
#include<iostream>
#include"lib.h"
using namespace std;
int main()
{
string imie1;
Gracz *gracz1, *gracz2;
Plansza *Obiekt;
cout << "Podaj nazwy graczy" << endl;
cin>>imie1;
gracz1=new Gracz(imie1);
cin>>imie1;
gracz2=new Gracz(imie1);
Obiekt->Creat(gracz1, gracz2);
Obiekt->graj();
return 0;
}
lib.h
Kod:
#include<iostream>
using namespace std;
enum FINAL{FIN_WIN, FIN_LOSE, FIN_TIE, FIN_EMPTY}; //przygotowuje sobie typ majacy 4 wartosci dostosowane do wygranej, przegranej, remisu, i pustego, innej wartosci zmienna typu
//FINAL nie przyjmie
//class Akcja;//klasa odpowiedzialna za 'akcje' w grze tutaj deklaruje bo potrzebna bedzie deklaracja obiektu tego typu w klasie plansza
class Akcja
{
private:
char pole[3][3];
FINAL koniec;//zmienna pilnujaca czy jest koniec gry
bool komputer;//zmienna sprawdzajaca kto ma ruch
public:
void wypelnij();
void rysuj();
int start();
int sprawdz(int, char);
void wynik();
};
class Gracz//klasa przchowujaca dane o graczach
{
private:
const string imie;
public:
Gracz(string nazwa)
:imie(nazwa)
{}
~Gracz(){};
};
class Plansza//Singleton poniewaz nie potrzebujemy wiecej plansz do gry w kolko krzyzyk
{
private:
const Gracz *imie1;//imiona graczy
const Gracz *imie2;
Plansza(Gracz *numer1, Gracz *numer2)//konskrtuktor singletona
:imie1(numer1), imie2(numer2)//nadanie imion stałym
{cout<<imie1 << " " <<imie2 <<endl; Istnieje=this;};
public://zmienna potrzebna do sprawdzania czy juz mamy naszego Singletona
static Plansza *Istnieje;
static Plansza *Creat(Gracz *nazwa1, Gracz *nazwa2)//w zaleznosci od wartosci Istnieje tworzymy singletona :P
{
if(Istnieje==NULL)
{
Plansza(nazwa1, nazwa2);//wywolanie konstruktora
}
return Istnieje;
}
void wypisz(int a)
{
if(a==1)
{
cout<<imie1;
}
else
cout<<imie2;
}
Akcja *Gramy;//obiekt typu akcja
void graj()
{
Gramy->start();
}
~Plansza(){Istnieje=NULL;}//destruktor
};
akction.cpp
Kod:
#include<iostream>
#include<conio.h>
#include<ctime>
#include"lib.h"
Plansza *Istnieje=NULL;
using namespace std;
void Akcja::wypelnij()
{
for(int a=0;a<3;a++)
{
int c;
if(a==0){c=7;}
else{if(a==1){c=5;}else c=1;}
for(int b=0;b<3;b++)
{
pole[a][b]=c;
c++;
}
}
koniec=FIN_EMPTY;
}
void Akcja::rysuj()
{
cout<<"KOLKO KRZYZY" <<endl;
Plansza *Pomoc;
cout<<"Ruch wykonuje "; if(komputer==false){Pomoc->wypisz(1); cout<<endl;} else{Pomoc->wypisz(0); cout<<endl;};
for(int a=0; a<3; a++)
{
for(int b=0; b<3; b++)
cout<<pole[a][b];
cout<<endl;
}
cout<<"Podaj miejsce ruchu" <<endl;
}
int Akcja::start()//funkcja odpowiedzialna za rozpoczecie gry,
{
srand(time(NULL));
int b=rand();
if(b%2==0) komputer=false;
else{komputer=true;}
int a=0;
do{
wypelnij();
rysuj();
if(komputer==false)
{
a=getch();
switch(a)
{
case 49:{sprawdz(a,'X');break;}
case 50:{sprawdz(a,'X');break;}
case 51:{sprawdz(a,'X');break;}
case 52:{sprawdz(a,'X');break;}
case 53:{sprawdz(a,'X');break;}
case 54:{sprawdz(a,'X');break;}
case 55:{sprawdz(a,'X');break;}
case 56:{sprawdz(a,'X');break;}
case 57:{sprawdz(a,'X');break;}
case 107:{break;}
default: {cout<<"Zly klawisz" <<endl;}
}
komputer=true;
}
else
{
do{
srand(time(NULL));
int a=rand()%9+1;
b=sprawdz(a, '0');
}while(b!=0);
komputer=false;
}
}while(a!=107 || koniec!=FIN_LOSE || koniec!=FIN_TIE || koniec!=FIN_WIN);
if(koniec==FIN_WIN)
{
cout<<"Wygrales!" <<endl;
}
else
{
if(koniec==FIN_LOSE)
{
cout<<"Przegrales." <<endl;
}
else
{
cout<<"Remis." <<endl;
}
}
return 0;
}
int Akcja::sprawdz(int liczba, char ruch)//funkcja sprawdza czy na danym miejscu w tablicy jest miejsce wolne aby wstawic nasz znak - jako parametr przyjmuje miejsce wstawienia znaku i znak
{
if(liczba==7)//sprawdzamy dla 7 bo 7 jest 1 na tablicy. Patrz jak zbudowana tablica w bibliotece
{
if(pole[0][0]!='X' && pole[0][0]!='O')//sprawdzamy czy nie ma tam juz kolka ani krzyzyka
pole[0][0]=ruch;//jesli bulo wolne wstawiamy nasz znak
else//jesli jest olko albo krzyzyk zwracamy 1 do funkcji akcja
return 1;
}
else{
if(liczba==8)//analogicznie do tego co wyzej i tak samo jest ponizej
{
if(pole[0][1]!='X' && pole[0][1]!='O')
pole[0][1]=ruch;
else
return 1;
}
else{
if(liczba==9)
{
if(pole[0][2]!='X' && pole[0][2]!='O')
pole[0][2]=ruch;
else
return 1;
}
else
{
if(liczba==4)
{
if(pole[1][0]!='X' && pole[1][0]!='O')
pole[1][0]=ruch;
else
return 1;
}
else
{
if(liczba==5)
{
if(pole[1][1]!='X' && pole[1][1]!='O')
pole[1][1]=ruch;
else
return 1;
}
else
{
if(liczba==6)
{
if(pole[1][2]!='X' && pole[1][2]!='O')
pole[1][2]=ruch;
else
return 1;
}
else
{
if(liczba==1)
{
if(pole[2][0]!='X' && pole[2][0]!='O')
pole[2][0]=ruch;
else
return 1;
}
else
{
if(liczba==2)
{
if(pole[2][1]!='X' && pole[2][1]!='O')
pole[2][1]=ruch;
else
return 1;
}
else
{
if(liczba==3)
{
if(pole[2][2]!='X' && pole[2][2]!='O')
pole[2][2]=ruch;
else
return 1;
}
else//jesli podamy cos z innego zakresu niz 1-9 to zwroci 1 a wiec ruch sie powtorzy
{
return 1;
}
}
}
}
}
}
}
}
}
return 0;
}
void Akcja::wynik()//sprawdza wynik
{ //tutaj sprawdzamy czy My wygralismy
if((pole[0][0]=='X' && pole[1][0]=='X' && pole[2][0]=='X') || (pole[0][1]=='X' && pole[1][1]=='X' && pole[2][1]=='X') || (pole[0][2]=='X' && pole[1][2]=='X' && pole[2][2]=='X') || (pole[0][0]=='X' && pole[0][1]=='X' && pole[0][2]=='X') || (pole[1][0]=='X' && pole[1][1]=='X' && pole[1][2]=='X') || (pole[2][0]=='X' && pole[2][1]=='X' && pole[2][2]=='X') || (pole[0][0]=='X' && pole[1][1]=='X' && pole[2][2]=='X') || (pole[2][0]=='X' && pole[1][1]=='X' && pole[0][2]=='X'))
{
koniec=FIN_WIN;
}
else
{ //jesli my nie wygralismy sprawdzamy czy komputer wygral
if((pole[0][0]=='O' && pole[1][0]=='O' && pole[2][0]=='O') || (pole[0][1]=='O' && pole[1][1]=='O' && pole[2][1]=='O') || (pole[0][2]=='O' && pole[1][2]=='O' && pole[2][2]=='O') || (pole[0][0]=='O' && pole[0][1]=='O' && pole[0][2]=='O') || (pole[1][0]=='O' && pole[1][1]=='O' && pole[1][2]=='O') || (pole[2][0]=='O' && pole[2][1]=='O' && pole[2][2]=='O') || (pole[0][0]=='O' && pole[1][1]=='O' && pole[2][2]=='O') || (pole[2][0]=='O' && pole[1][1]=='O' && pole[0][2]=='O'))
{
koniec=FIN_LOSE;
}
else
{ //jesli ani my ani komputer nie wygral to sprawdzamy, moze jest remis
if((pole[0][0]=='O' || pole[0][0]=='X') && (pole[0][1]=='O' || pole[0][1]=='X') && (pole[0][2]=='O' || pole[0][2]=='X') && (pole[1][0]=='O' || pole[1][0]=='X') && (pole[1][1]=='O' || pole[1][1]=='X') && (pole[1][2]=='O' || pole[1][2]=='X') && (pole[2][0]=='O' || pole[2][0]=='X') && (pole[2][1]=='O' || pole[2][1]=='X') && (pole[2][2]=='O' || pole[2][2]=='X'))
{
koniec=FIN_TIE;
}
}
}
}
Kod:
-------------- Build: Debug in 0iXObiektowo ---------------
Compiling: main.cpp
Compiling: action.cpp
Linking console executable: bin\Debug\0iXObiektowo.exe
obj\Debug\main.o(.text$_ZN7Plansza5CreatEP5GraczS1_[Plansza::Creat(Gracz*, Gracz*)]+0x8): In function `ZN5GraczC1ESs':
C:/Users/draqun/Documents/CPP/0iXObiektowo//lib.h: undefined reference to `Plansza::Istnieje'
obj\Debug\main.o(.text$_ZN7Plansza5CreatEP5GraczS1_[Plansza::Creat(Gracz*, Gracz*)]+0x34):C:/Users/draqun/Documents/CPP/0iXObiektowo//lib.h: undefined reference to `Plansza::Istnieje'
obj\Debug\main.o(.text$_ZN7PlanszaD1Ev[Plansza::~Plansza()]+0x5):C:/Users/draqun/Documents/CPP/0iXObiektowo//lib.h: undefined reference to `Plansza::Istnieje'
obj\Debug\main.o(.text$_ZN7PlanszaC1EP5GraczS1_[Plansza::Plansza(Gracz*, Gracz*)]+0x64):C:/Users/draqun/Documents/CPP/0iXObiektowo//lib.h: undefined reference to `Plansza::Istnieje'
Ostatnia edycja: