Jaka jest różnica pomiędzy return 0 a -1?

0

Witam, tworzę grę jako projekt na studia są to warcaby. Ale w sumie nie o to chodzi, mam do was pytanie czym się różni return 0 od -1 (domysły to domysły więc wolę zapytać). Pytam bo w przypadku złego ruchu gracza return 0 pomija turę zamiast dać komunikat o błędzie i dać możliwość ponownego ruchu i robi skip na kolejnego gracza, a return -1 daje możliwość ponownego ruchu po błędzie. Poniżej kawałek kodu z zastosowaniem return -1.

if(gracz==WHITE && d[skok_wier][skok_kolu]!=BLACK){
    cout<<"\nMozesz skakac tylko nad przeciwnikiem\n";
    return -1;
}
if(gracz==BLACK && d[skok_wier][skok_kolu]!=WHITE){
    cout<<"\nMozesz skakac tylko nad przeciwnikiem\n";
    return -1;
}
7
Keksan napisał(a):

Pytam bo w przypadku złego ruchu gracza return 0 pomija turę zamiast dać komunikat o błędzie i dać możliwość ponownego ruchu i robi skip na kolejnego gracza, a return -1 daje możliwość ponownego ruchu po błędzie.

WUT? Daj lepiej kod który wywołuje ten fragment kodu. Albo cały kod gry? Tak by było najlepiej jakbyś cały kod gry wgrał na githuba i powiedział w którym pliku masz problem. Chyba że gra mieści się w 1k linii to może być tu

2
Keksan napisał(a):

Witam, tworzę grę jako projekt na studia są to warcaby.
...
czym się różni return 0 od -1 (domysły to domysły więc wolę zapytać).

Autor kodu się domyśla co znaczy we własnym kodzie return 0 lub return -1

0
KamilAdam napisał(a):
Keksan napisał(a):

Pytam bo w przypadku złego ruchu gracza return 0 pomija turę zamiast dać komunikat o błędzie i dać możliwość ponownego ruchu i robi skip na kolejnego gracza, a return -1 daje możliwość ponownego ruchu po błędzie.

WUT? Daj lepiej kod który wywołuje ten fragment kodu. Albo cały kod gry? Tak by było najlepiej jakbyś cały kod gry wgrał na githuba i powiedział w którym pliku masz problem. Chyba że gra mieści się w 1k linii to może być tu

Tutaj cały kod gry

#include<windows.h>
#include<iostream>
#include<conio.h>

using namespace std;

const int EMPTY = 1;
const int WHITE = 2;
const int BLACK = 3;

void przywitanie()
{
    cout<<"\t\t\t\t\tWitajcie w moich warcabach :D!!\n";
    cout<<"\t\t\t\t\t      Krotka instrukcja: \n\n\t\t\t\tRuch pionka odbywa sie ukosnie w osiach Y oraz X \n\t\t\t\t nalezy najpierw wpisac cyfre, a potem litere"<<'\n';
    cout<<"\t\t\t   Jezeli wykonasz jakis ruch zle, gra cie o tym ostrzeze\n\t\t\t\t i da ci mozliwosc ponownego wykonania ruchu"<<'\n';
    cout<<"\t\t\t\t  Gre zaczynaja biale pionki, POWODZENIA!!\n";
    cout<<"\t\t\t\t((niestosowanie sie grozi bledem w konsoli))\n\n\n";
    system("pause");
    system("cls");
}


char wns(int i)     //wns - wartosc na symbol
{
    switch(i)
    {
  	case 0:
            return ' ';
        case 1:
            return ' ';
        case 2:
            return 'B';
        case 3:
            return 'C';
    }
    return '?';
}

void drukujPlansze(int d[8][8])
{
    int r, c;

    //cout<<"  +---+---+---+---+---+---+---+---+\n";
    cout<<"  *~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*\n";

    for (r=0; r<8; ++r)
    {
        cout<<r+1<<" |";
        for (c=0; c<8; ++c)
            cout<<" "<<wns(d[r][c])<<" |";

        //cout<<"\n  +---+---+---+---+---+---+---+---+\n";
        cout<<"\n  *~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*\n";

    }
    cout<<"    a   b   c   d   e   f   g   h\n";
}

void podmienIJKL(int d[8][8],int i,int j,int k,int l)
{
    int temp;

    temp = d[i][j];

    d[i][j] = d[k][l];

    d[k][l] = temp;
}

int ruchPionka(int d[8][8],int gracz,int i,int j,int k,int l)
{
    int skok_wier;
    int skok_kolu;

    /*
    if(gracz == WHITE){
        cout<<"BIALY rusza sie z "<<i+1<<", "<<char(j+'a')<<" do "<<k+1<<", "<<char(l+'a')<<'\n';
        //Sleep(800);
    } else {
        cout<<"CZARNY rusza sie z "<<i<<","<<j+'a'<<" do "<<k<<","<<l+'a'<<'\n';
        //Sleep(800);
    }
    */

    if(gracz == WHITE){
        if(d[i][j] != WHITE){
            cout<<"\nTo nie twoj pionek!\n";
            return -1;
        }
    } else {
        if(d[i][j] != BLACK){
            cout<<"\nTo nie twoj pionek!\n";
            return -1;
        }
    }

    if(d[k][l] != EMPTY){
        cout<<"\nMusisz sie ruszyc na puste pole\n";
        return -1;
    }

    if(gracz == WHITE){
        if(i >= k){
            cout<<"\nBialy pionek moze isc tylko w dol\n";
            return -1;
        }
    } else {
        if(i <= k){
            cout<<"\nCzarny pionek moze isc tylko do gory\n";
            return -1;
        }
    }

    if(i - k == -1 || i - k == 1){  //przemieszczanie pionka
        if(j - l == 1 || j - l == -1){
            podmienIJKL(d,i,j,k,l);
            return 0;
        }
    }
    if(i - k == -2 || i - k == 2){      //bicie
        if(j - l == -2 || j - l == 2){
            if(i < k){
                skok_wier = i + 1;
            } else {
                skok_wier = i - 1;
            }
            if(j < l){
                skok_kolu = j + 1;
            } else {
                skok_kolu = j - 1;
            }

            if(gracz==WHITE && d[skok_wier][skok_kolu]!=BLACK){
                cout<<"\nMozesz skakac tylko nad przeciwnikiem\n";
                return -1;
            }
            if(gracz==BLACK && d[skok_wier][skok_kolu]!=WHITE){
                cout<<"\nMozesz skakac tylko nad przeciwnikiem\n";
                return -1;
            }
            d[skok_wier][skok_kolu] = 1;
            podmienIJKL(d,i,j,k,l);
            return 0;
        }
    }

    cout<<"\nMozesz sie ruszac tylko po ukosie\n";
    return -1;
}

int main()
{
	int i, k;
	char j, l;
	int d[8][8]={
    {0,2,0,2,0,2,0,2},
    {2,0,2,0,2,0,2,0},
    {0,2,0,2,0,2,0,2},
    {1,0,1,0,1,0,1,0},
    {0,1,0,1,0,1,0,1},
    {3,0,3,0,3,0,3,0},
    {0,3,0,3,0,3,0,3},
	{3,0,3,0,3,0,3,0}};

    przywitanie();

    while(1){
        drukujPlansze(d);
        while(1){
            cout<<"Tura gracza Bialego: ";
            i=(getch()-'0'); cout<<i;
            j=getch(); cout<<j;
    	    cout<<" do: ";
        	k=(getch()-'0'); cout<<k;
            l=getch(); cout<<l;
        	if(ruchPionka(d, WHITE, i-1,j -'a',k-1,l - 'a') == 0){
        	    break;
        	}
        	cout<<"Niedozwolony ruch, sprobuj ponownie\n";
            Sleep(3000);
            system("cls");
            drukujPlansze(d);
        }
        system("cls");

        drukujPlansze(d);
        while(1){
            cout<<"Tura gracza Czarnego: ";
            i=(getch()-'0'); cout<<i;
            j=getch(); cout<<j;
    	    cout<<" do :";
        	k=(getch()-'0'); cout<<k;
            l=getch(); cout<<l;
        	if(ruchPionka(d, BLACK, i-1,j - 'a',k-1,l - 'a') == 0){
        	    break;
        	}
        	cout<<"Niedozwolony ruch, sprobuj ponownie\n";
            Sleep(3000);
            system("cls");
            drukujPlansze(d);
        }
        system("cls");
    }
}
6

Ale w sumie nie o to chodzi, mam do was pytanie czym się różni return 0 od -1 (domysły to domysły więc wolę zapytać).

Wartością zwracaną.

Pytam bo w przypadku złego ruchu gracza return 0 pomija turę zamiast dać komunikat o błędzie i dać możliwość ponownego ruchu i robi skip na kolejnego gracza, a return -1 daje możliwość ponownego ruchu po błędzie.

To Ty jako programista nadajesz znaczenie wartościom zmiennych i je interpretujesz (np. w oparciu o wartość podejmujesz decyzję co dalej np. wyświetlasz znak '*' albo komunikaty "Koniec gry").

Poniżej kawałek kodu z zastosowaniem return -1.

To Twój kod czy go dostałeś/znalazłeś i się zastanawiasz co robi?

6

Różni się tym że jak zwracasz 0 to jest zwrócone 0 i potem to 0 porównujesz w

if(ruchPionka(d, WHITE, i-1,j -'a',k-1,l - 'a') == 0){
    break;
}

Więc jak zwrócisz 0 to jest true, a jak zwrócisz nie 0 to jest wynik false

Równie dobrze zamiast -1 mógłbyś zwracać 666 czy 69. Albo 1 jak programista C a nie programista Fortha. Forth to chyba był jedyny język co używał konwencji że 0 to false, a true to -1

3

oj oj
Kody błędów jak w C.

enum ERROR {
    SUCCESS = 0,
    GENERIC_ERROR,
    UP_ONLY,
    DOWN_ONLY,
    LEFT_ONLY,
    RIGHT_ONLY,
}

        if(i >= k){
            cout<<"\nBialy pionek moze isc tylko w dol\n";
            return ERROR::DOWN_ONLY;
        }

Kiepskie nazwy ale chyba kumasz o co chodzi?

5

Masz problem z tym kodem, bo nie jest on pisany zgodnie z dobrymi praktykami. Ten return -1 podpada pod Magic Number (polska wiki nie ma odpowiednika tego artykułu).

Generalnie posługiwanie się arbitralnymi wartościami, bezpośrednio w kodzie jest złą praktyką. Takie wartości powinny być schowane za stałymi, których nazwy wyjaśniają ich znaczenie.
W twoi przypadku może być to np: IlleagalMove.

Ergo najlepszą radę dostałeś od revcorey

0

jeszcze rada na przysżłośc bo zpaomniałem dopisać a często wielu pytających studentów/uczniów tego nie robi
statyczn aanaliza kodu, niektóre ide out of the box ją mają niekßóre jako plugin a można też ręcznie np. cppcheck czy też clang-tidy
tu output dla cppecheck

cppcheck --enable=all --suppress=missingIncludeSystem 4p.cpp 
Checking 4p.cpp ...
4p.cpp:72:9: style: The scope of the variable 'skok_wier' can be reduced. [variableScope]
    int skok_wier;
        ^
4p.cpp:73:9: style: The scope of the variable 'skok_kolu' can be reduced. [variableScope]
    int skok_kolu;

0

Jeśli chodzi o obsługę błędów poprzez wartości zwracane, to w języku C najlepiej zerem oznaczać powodzenie, ponieważ akurat zero jest w tym języku specjalnie traktowane, a wariant powodzenia jest jeden, natomiast błędy mogą być różnych rodzajów - a więc wartość zerowa niech oznacza powodzenie, a niezerowa błąd. To, czy używać wartości dodatnich czy ujemnych jako kodów błędów, zależy już od sytuacji. Wyjątkiem jest zwracanie NULL (czyli zera) jako błędu w przypadku zwracania wskaźnika. O metodach obsługi błędów ogólnie można dyskutować, ale tutaj zakładam, że zdecydowałeś się na wartości zwracane i pomijamy inne podejścia.

0
Manna5 napisał(a):

Jeśli chodzi o obsługę błędów poprzez wartości zwracane, to w języku C

Jakby się doktoryzować, to "w zasadzie" jest C++, kolega nie wiedział za co zapłacił (choć w praktyce C z cout), i jest kupę pięknych środków wyrazu

6

Różnica jest taka, że 0 jest o 1 większe.

0

Różni się wartością, tak jak w matematyce. Czasem -1 może być uznany przez autora jako jakiś kod błędu czy coś, ale co to znaczy w twoim kodzie to tylko Ty możesz wiedzieć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1