Posted by Anonim on Sat 16th Jan 01:21 (zmodyfikowany post przez zobacz różnice)
Zobacz odpowiedź od Heh | ściągnij jako plik | nowy wpis
- #include <iostream>
- #include <ctime> // time()
- #include <cstdlib> // srand()
- using namespace std;
- class kulka // elementarne pole - "kulka"
- {
- private:
- kulka *lewo;
- kulka *prawo;
- kulka *dol;
- kulka *gora;
- int lewo_wartosc, prawo_wartosc, dol_wartosc, gora_wartosc; // wagi
- bool czy_odwiedzona,czy_przeszkoda;
- void wyswietl(int StartMeta);
- public:
- kulka();
- friend void PokazPlansze(kulka &plansza, int rozmiar, int wynik, int iks, int igrek); // zaprzyjaznione funkcje,
- friend int WczytajRozmiarIPokazFabule(); // nie dajemy dostepu
- friend void TworzPlansze(int rozmiar_planszy, kulka &start); // do skladnikow prywatnych
- friend void Graj(int rozmiar_planszy, kulka &start); // nikomu innemu (enkapsulacja)
- };
- kulka::kulka() // konstruktor
- {
- lewo=NULL;
- prawo=NULL;
- dol=NULL;
- gora=NULL;
- czy_odwiedzona=false;
- lewo_wartosc=rand()%6+5, prawo_wartosc=rand()%5+1, dol_wartosc=rand()%5+1, gora_wartosc=rand()%6+5; // losowe wartości
- (rand()%10==3) ? czy_przeszkoda=true : czy_przeszkoda=false;
- }
- void kulka::wyswietl(int StartMeta) // wyswietlanie jednej pojedynczej kulki
- {
- if(StartMeta==0)
- {
- if(!czy_odwiedzona && !czy_przeszkoda)cout << " . ";
- else if(!czy_odwiedzona && czy_przeszkoda) cout << " # ";
- else cout << " ";
- }
- else
- {
- (StartMeta==1) ? cout << " S " : cout << " M ";
- }
- }
- void PokazPlansze(kulka &plansza, int rozmiar, int wynik, int iks, int igrek)
- {
- system("cls");
- kulka *x=&plansza, *x1=x->prawo;
- x=x->prawo;
- cout << "\n";
- for(int i=0; i<rozmiar; i++) // wiersze
- {
- for(int j=0; j<rozmiar; j++) // kolumny
- {
- if(i==0 && j==0 && wynik==0) x->wyswietl(1); // wyswietlenie startu - reagujemy na wspolrzedne w lewym gorym rogu planszy
- else if(i==rozmiar-1 && j==rozmiar-1)
- {
- if(iks==rozmiar-1 && igrek==rozmiar-1) cout << " W "; // wyswietlenie mety - reagujemy na wspolrzedne w prawym dolnym koncu planszy
- else x->wyswietl(2);
- x->dol_wartosc=999; // tak bedziemy potem sprawdzac czy jest meta
- x->prawo_wartosc=999; // j.w.
- }
- else if(i==igrek && j==iks) cout << " W ";
- else x->wyswietl(0);
- x=x->prawo;
- }
- (i==rozmiar-1) ? cout << "" : cout << "\n";
- x1=x1->dol;
- x=x1;
- }
- cout << "\n Ilosc pkt: " << wynik << "\n";
- }
- int WczytajRozmiarIPokazFabule()
- {
- system("cls");
- cout << "Sredniowiecze. Wyspa Fiord. \n"
- << "Kierujesz oblezeniem zamku nieprzyjaciela.\n"
- << "Musisz przemiescic wieze obleznicza z punktu S do punktu M, \n"
- << "Zostawiasz za soba pulapki wiec nie mozesz odwiedzic 2 razy tego samego\n"
- << "pola, bo wpadniesz we wlasne sidla!\n"
- << "Trzymaj sie wyspy, dookola niej grasuja krwiozercze rekiny!\n"
- << "Wieza jest popsuta - w prawo i w dol moze byc ciezko nia sterowac.\n"
- << "Ruchy w lewo i w gore sa punktowanie dwukrotnie.\n"
- << "Uwazaj, zeby nie wpasc w zasadzke wroga (#) \n\n";
- int rozmiar_planszy;
- do{
- cout << "Podaj rozmiar wyspy: ";
- cin >> rozmiar_planszy;
- if(rozmiar_planszy < 2) cout << "Zly rozmiar planszy!\n";
- } while(rozmiar_planszy < 2);
- return rozmiar_planszy;
- }
- void TworzPlansze(int rozmiar_planszy, kulka &start) // funkcja tworzaca plansze o dowonym rozmiarze; polaczenia pinowe i poziome
- {
- kulka *biezaca, *poczatek, *x, *y,*x1,*y1;
- biezaca=&start;
- poczatek=&start;
- x=&start;
- int ograniczam=0; // najpierw w rzedzie sa wszystkie kulki
- for(int j=0; j<rozmiar_planszy; j++) // n rzedow
- {
- for(int i=0; i<rozmiar_planszy-ograniczam; i++) //tworzenie jednego rzedu
- {
- biezaca->prawo=new kulka;
- biezaca->prawo->lewo=biezaca;
- if(i==0 && j==0) biezaca->prawo->lewo=NULL; // z kulki start (inicjalizatora) mozemy isc tylko w prawo, wrocic nie mozemy bo to nie jest wlasciwa plansza
- biezaca=biezaca->prawo;
- }
- if(j==0)
- {
- poczatek->prawo->dol=new kulka; // pierwsze powiazanie pionowe
- poczatek->prawo->dol->gora=poczatek->prawo; // j.w, reverse
- x=poczatek->prawo;
- y=poczatek->prawo->dol;
- poczatek=poczatek->prawo->dol;
- biezaca=poczatek;
- ograniczam=1; // nastepne rzedy beda mialy o 1 kulke mniej bo juz jedna zrobilismy (ta dolna)
- }
- else if(j<=rozmiar_planszy-2)
- {
- poczatek->dol=new kulka;
- poczatek->dol->gora=poczatek;
- poczatek=poczatek->dol;
- biezaca=poczatek;
- ograniczam=1; // j.w.
- }
- }
- x1=x; //
- y1=y; // poreczowki
- for(int i=0; i<rozmiar_planszy-1; i++) // polaczenia pionowe
- {
- for(int j=0; j<rozmiar_planszy-1; j++) // powiazania pionowe w jednym poziomie
- {
- x=x->prawo;
- y=y->prawo;
- x->dol=y;
- x->dol->gora=x;
- }
- x1=x1->dol; // ok, teraz musimy udac sie nizej powiazac inne kulki pionowo
- x=x1;
- y1=y1->dol;
- y=y1;
- }
- }
- void Graj(int rozmiar_planszy, kulka &start)
- {
- kulka *pozycja;
- int wynik=0;
- PokazPlansze(start, rozmiar_planszy, wynik, 999, 999);
- pozycja=start.prawo;
- start.prawo->czy_odwiedzona=true;
- char wybor;
- bool NieMaMety=true;
- int x2=0, y2=0;
- while(NieMaMety)
- {
- cout << "w - w gore s - w dol a - w lewo d - w prawo p - wyjscie ";
- cin >> wybor;
- switch (wybor)
- {
- case 'w':
- if((pozycja->gora) && (!pozycja->gora->czy_odwiedzona) && (!pozycja->gora->czy_przeszkoda)) // z dolu do mety nie da sie dojsc wiec tu nie sprawdzamy mety
- {
- y2-=1;
- pozycja->gora->czy_odwiedzona=true;
- wynik=wynik+pozycja->gora_wartosc;
- pozycja=pozycja->gora;
- }
- else
- {
- cout << "\nGame over! Twoj wynik: " << wynik << endl;
- cin.get();
- cin.get();
- exit(0);
- }
- break;
- case 's':
- if((pozycja->dol) && (!pozycja->dol->czy_odwiedzona) && (!pozycja->dol->czy_przeszkoda))
- {
- y2+=1;
- wynik=wynik+pozycja->dol_wartosc;
- if(pozycja->dol->dol_wartosc==999)
- {
- cout << "Meta!"; // wykrywanie mety jak idziemy na nia z gory
- NieMaMety=false;
- }
- else pozycja->dol->czy_odwiedzona=true;
- pozycja=pozycja->dol;
- }
- else
- {
- cout << "\nGame over! Twoj wynik: " << wynik << endl;
- cin.get();
- cin.get();
- exit(0);
- }
- break;
- case 'd':
- if((pozycja->prawo) && (!pozycja->prawo->czy_odwiedzona) && (!pozycja->prawo->czy_przeszkoda))
- {
- x2+=1;
- wynik=wynik+pozycja->prawo_wartosc;
- if(pozycja->prawo->prawo_wartosc==999)
- {
- cout << "Meta!"; // wykrywanie mety jak idziemy na nia z lewej
- NieMaMety=false;
- }
- else pozycja->prawo->czy_odwiedzona=true;
- pozycja=pozycja->prawo;
- }
- else
- {
- cout << "\nGame over! Twoj wynik: " << wynik << endl;
- cin.get();
- cin.get();
- exit(0);
- }
- break;
- case 'a':
- if((pozycja->lewo) && (!pozycja->lewo->czy_odwiedzona) && (!pozycja->lewo->czy_przeszkoda)) // z prawej na mete nie da sie dojsc wiec tu nie sprawdzamy mety
- {
- x2-=1;
- wynik=wynik+pozycja->lewo_wartosc;
- pozycja->lewo->czy_odwiedzona=true;
- pozycja=pozycja->lewo;
- }
- else
- {
- cout << "\nGame over! Twoj wynik: " << wynik << endl;
- cin.get();
- cin.get();
- exit(0);
- }
- break;
- case 'p':
- cin.get();
- cin.get();
- exit(0);
- break;
- default:
- cout << "Gdzie? Nie znam takiego kierunku!";
- }
- PokazPlansze(start, rozmiar_planszy, wynik, x2, y2);
- }
- cout << "Brawo! Jestes dobrym dowodca!"
- << "\nMianuje Cie na dowodce kierowania maszynami oblezniczymi! Twoj wynik: " << wynik << endl;
- }
- int main()
- {
- srand(time(NULL)); // losowosc przejsc miedzy kulkami
- kulka start; // kulka inicjalizujaca "starter"
- while(1)
- {
- int rozmiar_planszy = WczytajRozmiarIPokazFabule(); // user podaje rozmiar planszy
- TworzPlansze(rozmiar_planszy, start); // stworzenie struktury calej planszy, polaczen etc
- Graj(rozmiar_planszy, start); // wlasciwa gra
- cin.get(); // odpowiednik system("pause");
- cin.get(); //
- }
- return 0;
- }
Wyślij poprawkę poniżej (kliknij tu aby wysłać nowy wpis)
Po wysłaniu poprawki będziesz w stanie łatwo zobaczyć różnice między starym a nowym wpisem.