[C++] Statki, wczytaj zapisz stan gry oraz strzelaj az trafi

opolak
Użytkownik
Użytkownik
Posty: 12
Rejestracja: 21 sty 2011, o 22:39
Płeć: Mężczyzna
Lokalizacja: warszawa
Podziękował: 3 razy

[C++] Statki, wczytaj zapisz stan gry oraz strzelaj az trafi

Post autor: opolak »

Witam chciałbym napisać grę statki. I mam problem mianowicie co wstawić żeby gra była zapisywana i wczytywana oraz jakich warunków pętli użyć żeby gra toczyła się dopóki wszystkie statki nie zostaną zestrzelone.

Kod: Zaznacz cały

#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
class statek
{
public:
    int wspolrzednex,wspolrzedney,wspolrzednekompx,wspolrzednekompy,x,y;
    int strzelx,strzely,okret;
    int iloscteraz,nrokretu;
    int punktygracza,punktykomputera;
    int wylosujx,wylosujy;
    int iloscstatkowgracza,iloscstatkowkomputera;
    int mapgracza[10][10],mapkomputera[10][10];
    int spacja;
    statek();
    void status()
    {
        cout<<"Punkty gracza:"<<punktygracza<<endl;
		cout<<"Liczba statkow gracza:"<<iloscstatkowgracza<<endl;
        cout<<"Punkty komputera:"<<punktykomputera<<endl;
        cout<<"==============="<<endl;
    }
    void wprowadzdane_i_ustaw()
	{
        do
        {
			
            status();
printf("0 1 2 3 4 5 6 7 8 9  
");           
			for(int i=1; i<10; i++)
            {
				printf("%d", i);
				for (int j=1;j<10;j++)
					
				{
printf(" %d", mapgracza[i][j]);
				}
                printf("
");
            }
           
			printf("========= 
 Podaj wspolrzedne statkow, najpierw parametr x potem y 
");
			cin>>wspolrzednex;
            cin>>wspolrzedney;
			
			printf("========= 
"); 
           
            okret = 1;
            switch(okret)
            {
            case 1:
                mapgracza[wspolrzednex][wspolrzedney]=1;
                
                break;

            };

            iloscstatkowgracza++;
            x=rand()%(8)+1;
            y=rand()%(8)+1;
            mapkomputera[x][y]=4;
			system("cls");
        }
        while(iloscstatkowgracza!=4);
    }
    void sprawdz_i_wylosuj()
	{   
		
		
        srand(time(NULL));
        wspolrzednekompx=rand()%1+(8);
        wspolrzednekompy=rand()%(8)+1;
		
        if(mapgracza[wspolrzednekompx][wspolrzednekompy]==1)
        {
            cout<<"Komputer trafil i zatopil!"<<endl;
            punktykomputera=punktykomputera+100;
            mapgracza[wspolrzednekompx][wspolrzednekompy]=2;
			iloscstatkowgracza--;
        }
        else
        {
            cout<<"Komputer niestety nie trafil"<<endl;
			
		}
		
		
		
        

        do
        {
            
            status();
           printf("0 1 2 3 4 5 6 7 8 9  
");           
			for(int i=1; i<10; i++)
            {
				printf("%d", i);
				for (int j=1;j<10;j++)
					
				{
printf(" %d", mapgracza[i][j]);
				}
                printf("
");
            }
			cout<<"Wybierz gdzie chcesz strzelic najpierw parametr x potem y: 
";
            cin>>strzelx;
            cin>>strzely;
            if(mapkomputera[strzelx][strzely]!=4)
            {
                cout<<"Niestety nie trafils"<<endl;

            }
            else
            {
                cout<<"Trafiles "<<endl;
				punktygracza+100;
            }
            getch();
            iloscstatkowkomputera++;
			
        }
        while(iloscstatkowkomputera!=4);
    }
    void menu_i_gra()
    {
        cout<<"--------------------"<<endl;
        cout<<"Witaj w grze w statki!"<<endl;
        
            wprowadzdane_i_ustaw();
            sprawdz_i_wylosuj();
            iloscteraz++;
        

	}

};

class kolega : public statek
{
public:
    int wspolrzednex,wspolrzedney,wspolrzednekolx,wspolrzednekoly;
    int mapkolega[10][10];
    kolega();
    void status()
    {
        cout<<"Punkty gracza1:"<<punktygracza<<endl;
        cout<<"Ruchy gracza:"<<iloscstatkowgracza<<endl;
        cout<<"Punkty gracza2:"<<punktykomputera<<endl;
        cout<<"==============="<<endl;
    }
    void wprowadzdane_i_ustaw()
	{
        do
        {
			
            status();
printf("0 1 2 3 4 5 6 7 8 9  
");           
			for(int i=1; i<10; i++)
            {
				printf("%d", i);
				for (int j=1;j<10;j++)
					
				{
printf(" %d", mapgracza[i][j]);
				}
                printf("
");
				system("cls");
            }
           
			printf("========= 
 Gracz1: Podaj wspolrzedne statkow najpierw parametr x potem y: 
");
			cin>>wspolrzednex;
            cin>>wspolrzedney;
			
			printf("========= 
"); 
           
            okret = 1;
            switch(okret)
            {
            case 1:
                mapgracza[wspolrzednex][wspolrzedney]=1;
                
                break;

            };

            iloscstatkowgracza++;
			cout<<"Gracz2: Podaj wspolrzedne statkow najpierw parametr x potem y:"<<endl;
            cin>>x;
			cin>>y;
            mapkolega[x][y]=4;
        }
        while(iloscstatkowgracza!=6);
	}
    void sprawdz_i_wylosuj()
	{
		
		int i;
		for(i=0;i<5;i++){
			cout<<"Gracz2: podaj wspolrzedne gdzie chcesz strzelic:"<<endl;
		cin>>wspolrzednekolx;
		cin>>wspolrzednekoly;
		int i;
		
        if(mapgracza[wspolrzednekolx][wspolrzednekoly]==1)
        {
            cout<<"Gracz2 trafil i zatopil!"<<endl;
            punktykomputera=punktykomputera+100;
            mapgracza[wspolrzednekolx][wspolrzednekoly]=2;
        }
        else
        {
            cout<<"Gracz2 niestety nie trafil minut 1pkt"<<endl;
			punktykomputera=punktykomputera-1;
        }
		}
		
        getch();

        do
        {
            
            status();
           printf("0 1 2 3 4 5 6 7 8 9  
");           
			for(int i=1; i<10; i++)
            {
				printf("%d", i);
				for (int j=1;j<10;j++)
					
				{
printf(" %d", mapkolega[i][j]);
				}
                printf("
");
            }
			cout<<"Gracz1 gdzie chcesz strzelic: 
";
            cin>>strzelx;
            cin>>strzely;
            if(mapkolega[strzelx][strzely]!=4)
            {
				cout<<"Gracz1 niestety nie trafiles."<<endl;

            }
            else
            {
                cout<<"Gracz1 trafiles i zatopiles!"<<endl;
				punktygracza+100;
            }
            getch();
            iloscstatkowkomputera++;
        }
        while(iloscstatkowkomputera!=4);
	}
    void menu_i_gra()
    {
        cout<<"--------------------"<<endl;
        cout<<"Witaj w grze w statki!"<<endl;
        
            wprowadzdane_i_ustaw();
            sprawdz_i_wylosuj();
            iloscteraz++;
        

	}
	};



statek::statek():
    wspolrzednex(0),
    wspolrzedney(0),
    wspolrzednekompx(0),
    wspolrzednekompy(0)
{
    for(int i=0; i<10; i++)
    {
        for(int j=0; j<10; j++)
        {
            mapgracza[i][j]=0;
            mapkomputera[i][j]=0;
        }
    }
	}
	kolega::kolega():

 wspolrzednex(0),
    wspolrzedney(0),
    wspolrzednekolx(0),
    wspolrzednekoly(0)
{
    for(int i=0; i<10; i++)
    {
        for(int j=0; j<10; j++)
        {
            mapgracza[i][j]=0;
            mapkolega[i][j]=0;
        }
	}
 };
 
	


statek uruchom;
kolega wlacz;
int main()
{
	int a;
	cout<<"Wybierz tryb gry w statki: 1- z komputerem, 2 - ze znajomym, 3- wczytaj stan gry, Aby zakonczyc gre nacisnij dowolnie inny przycisk"<<endl;
		cin>>a;
		
		switch(a){
		case 1:
			cout<<"Tryb gry z komputerem"<<endl;
		uruchom.menu_i_gra();
		break;
		case 2: 
			cout<<"wybrales tryb ze znajomym"<<endl;
	wlacz.menu_i_gra();
		
		case 3: 
			cout<<"Wczytaj stan gry:"<<endl;
				break;
		default: 
			cout<<"Wylaczyles gre. Nacisnij jakis przycisk."<<endl;
			break;
		}
		
	
    return 0;
}
Ostatnio zmieniony 2 wrz 2012, o 17:46 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Kacperdev
Użytkownik
Użytkownik
Posty: 3260
Rejestracja: 23 mar 2010, o 19:19
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 17 razy
Pomógł: 686 razy

[c++]statki, wczytaj zapisz stan gry oraz strzelaj az trafi

Post autor: Kacperdev »

użyj np. biblioteki fstream i zapisuj najważniejsze dane do pliku. CO do trybu gry nie widze w twoim programie głównej pętli. Tworzysz np. bool'owska zmienna

Kod: Zaznacz cały

bool gra=true;
while (gra) {//wykonuje czynnosci}
gdy gra sie zakonczy (wygraniem, przyciskiem ESC, czymkolwiek) zmieniasz stan zmiennej na false.
opolak
Użytkownik
Użytkownik
Posty: 12
Rejestracja: 21 sty 2011, o 22:39
Płeć: Mężczyzna
Lokalizacja: warszawa
Podziękował: 3 razy

[C++] Statki, wczytaj zapisz stan gry oraz strzelaj az trafi

Post autor: opolak »

mimo wielkiej podpowiedzi nie wiem jak mam zrobić z tym bool
Awatar użytkownika
Kacperdev
Użytkownik
Użytkownik
Posty: 3260
Rejestracja: 23 mar 2010, o 19:19
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 17 razy
Pomógł: 686 razy

[C++] Statki, wczytaj zapisz stan gry oraz strzelaj az trafi

Post autor: Kacperdev »

Moim zdaniem trochę źle zaprojekotwałeś gre. Powinieneś zrobić singleton i wiecej klas dziedziczących (implementacje funkcji robić na zewnątrz lub w pliku, poprawiajać czytelność).

Można inaczej- tworzysz while(true) i gdy chcesz opuścić (w petli gry) stawiasz instrukcje

Kod: Zaznacz cały

if (klawisz ESC) {break;}
Ważne żeby pętla gry obejmowała strumienie wejscia i wyjscia.

P.S.
Nawyki czystego C. printf lepiej zastapic cout'em.

Ty najlepiej znasz swój program ; )
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Statki, wczytaj zapisz stan gry oraz strzelaj az trafi

Post autor: royas »

Również wydaje mi się, że trochę źle to zaprojektowałeś. Masz dwie klasy jedną do gry z komputerem drugą do gry człowiek-człowiek. W grze z komputerem widzę, że coś jest nie tak w spraedz_i_wylosuj:
Najpierw komputer strzela raz (pierwszy if-else), a potem gracz strzela do skutku pętla-do.
Proponowałbym przeprojektowanie tego tak: klasa gracz:
przechowuje mapę, punkty i liczbę niezatopionych statków tego gracza;
i ma funkcje:
ustawMape - ustawia statki na mapie
bool strzal(int &x, int &y) - zwraca true i wspolrzedne strzalu gracza
sprawdz(x,y) - sprawdza czy strzał w mapę gracza jest celny i zatapia statek.
wszystkoZatopione - sprawdza czy gracz przegrał
Dwie klasy dziedziczące z tej klasy: komputer i czlowiek
z przedefiniowanymi funkcjami ustawMapę i strzał
dla komputera - losowe
dla człowieka - wczytujące dane od użytkownika
dodatkowo dla czlowieka strzal zwraca true jesli wprowadzil wspolrzedne, a false jesli wstrzymal grę.
No i właściwa główna część (w jakimś pseudo c++)

Kod: Zaznacz cały

class gra {
public:
    gracz* aktywny;
    gracz* pasywny;
    void ustawMapy(){
        aktywny->ustawMape();
        pasywny->ustawMape();
    }
    //zwraca true gdy gra skonczone, false gdy wstrzymana.
    bool graj() {
        while(true) {
            int x,y;
            if (aktywny->strzal(x,y)) {
                pasywny.sprawdz(x,y)
                    if (pasywny.wszystkoZatopione) return true;
                zamienGraczy();
            } else {
                return false;
            }
        }
    }
    void zamienGraczy() {
        gracz* tmp;
        tmp=aktywny;aktywny=pasywny;pasywny=tmp;
    }
};
    
void main() {
    gra g;
    //zapytaj o tryb gry
        if (czlowiek-komputer) {
            g.aktywny=new czlowiek();
            g.pasywny=new komputer();
        }else{//czyli czlowiek-czlowiek
            g.aktywny=new czlowiek();
            g.pasywny=new czlowiek();
        }
    bool koniec = false;
    do {
        if (g.graj()) {
            //koniec,wyswietl wyniki
            koniec=true;
        } else {
            //gra wstrzymana
            //zapytaj co zrobic (zapisz,wczytaj,zakończ,wznow)
            //jeśli zakońćz to koniec=true
            //jesli wznow to conitnue
        }
    }while (!koniec);
}
ODPOWIEDZ