Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Warunek IF

Ostatnio zmodyfikowano 2015-11-25 23:33
Autor Wiadomość
KIM_PEEK
Temat założony przez niniejszego użytkownika
[C++] Warunek IF
» 2015-11-25 18:42:28
Witam pisze prosta gre ktora dziala w oknie konsolowym. Jednak od kilku dni zatrzymalem sie w miejscu i po nieudanych probach znalezienia odpowiedzi prosze o pomoc was. Wrzucam caly kod zrodlowy gry jednak problem tkwi w funkcji void Mechanika() oddzielony komentarzem // Moj Problem.

Mianowicie prosze o wytłumaczenie czemu spełnia sie tylko jeden pierwszy IF
pomimo ze pozostale  to klony pierwszego.



C/C++
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <cstdlib>
#include <time.h>

using namespace std;

//Zmienne Globalne
COORD coord = { 0, 0 };
bool GameOver;

//Mapa
const int wysokosc = 20;
const int szerokosc = 60;

int GraczX, GraczY;
int HP, Ammo, Score;
int BoxY, BoxX;
int FireX, FireY;

//Przeciwnicy

int MobX0, MobY0;
int MobX1, MobY1;
int MobX2, MobY2;
int MobX3, MobY3;
int MobX4, MobY4;


enum ekierunek { FIRE, LEFT, RIGHT };
ekierunek dir;


void gotoxy( int x, int y )
{
    coord.X = x; coord.Y = y; // X and Y coordinates
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}

void Setup()
{
    GameOver = false;
    GraczX = szerokosc / 2;
    GraczY = 18;
    HP = 100;
    Ammo = 20;
    Score = 0;
}


void Klawiatura()
{
    if( _kbhit() )
    {
        switch( _getch() )
        {
        case 'a':
            dir = LEFT;
            break;
        case 'd':
            dir = RIGHT;
            break;
        case 'k':
            if( Ammo != 0 )
            {
                FireX = GraczX;
                FireY = GraczY - 1;
                Ammo--;
            }
            break;
        }
    }
}
void Rysuj()
{
    gotoxy( 0, 0 );
    for( int i = 0; i < szerokosc + 2; i++ ) // gorna belka
    {
        cout << "#";
    }
    cout << endl;
   
    for( int i = 0; i < wysokosc; i++ )
    {
       
        for( int j = 0; j < szerokosc; j++ )
        {
            if( j == 0 ) cout << "#";
           
            if( i == MobY0 && j == MobX0 ) { cout << "V"; j++; }
            if( i == MobY1 && j == MobX1 ) { cout << "V"; j++; }
            if( i == MobY2 && j == MobX2 ) { cout << "V"; j++; }
            if( i == MobY3 && j == MobX3 ) { cout << "V"; j++; }
            if( i == MobY4 && j == MobX4 ) { cout << "V"; j++; }
            if( i == FireY && j == FireX ) { cout << "."; j++; }
            if( i == GraczY && j == GraczX ) cout << "^";
            else cout << " ";
           
            if( j == szerokosc - 1 ) cout << "#";
           
        }
        cout << endl;
    }
    for( int i = 0; i < szerokosc + 2; i++ )
    {
        cout << "#";
    } // DOLNA BELKA
    cout << MobX0;
    cout << MobY0;
    cout << endl;
    cout << "  Amunicja: " << Ammo << "     " << "Punkty: " << Score << "    " << "HP" << HP << "%" << endl;
} // rysuj()

void Mechanika()
{
    switch( dir )
    {
    case LEFT:
        GraczX--;
        if( GraczX == 0 )
             GraczX++;
       
        break;
    case RIGHT:
        GraczX++;
        if( GraczX == szerokosc - 1 )
             GraczX--;
       
        break;
    }
   
   
    FireY--;
    Score++;
    MobY0++;
    MobY1++;
    MobY2++;
    MobY3++;
    MobY4++;
   
    if( MobY0 == 20 )
    {
        MobY0 = rand() % 10 - 10;
        MobX0 = rand() % 59 + 1;
    }
    if( MobY1 == 20 )
    {
        MobY1 = rand() % 10 - 10;
        MobX1 = rand() % 59 + 1;
    }
    if( MobY2 == 20 )
    {
        MobY2 = rand() % 10 - 10;
        MobX2 = rand() % 59 + 1;
    }
    if( MobY3 == 20 )
    {
        MobY3 = rand() % 10 - 10;
        MobX3 = rand() % 59 + 1;
    }
    if( MobY4 == 20 )
    {
        MobY4 = rand() % 10 - 10;
        MobX4 = rand() % 59 + 1;
    }
    // Moj Problem
   
    if(( MobX0 == FireX ) &&( MobY0 == FireY ) )
    {
        Score = Score + 10;
        MobX0 = rand() % 59 + 1;
        MobY0 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
    if(( MobX1 == FireX ) &&( MobY1 == FireY ) )
    {
        Score = Score + 10;
        MobX1 = rand() % 59 + 1;
        MobY1 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
    if(( MobX2 == FireX ) &&( MobY2 == FireY ) )
    {
        Score = Score + 10;
        MobX2 = rand() % 58 + 1;
        MobY2 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
    if(( MobX3 == FireX ) &&( MobY3 == FireY ) )
    {
        Score = Score + 10;
        MobX3 = rand() % 58 + 1;
        MobY3 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
    if( MobX4 == FireX && MobY4 == FireY )
    {
        Score = Score + 10;
        MobX4 = rand() % 58 + 1;
        MobY4 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
   
    // Moj Problem
   
    if( MobX0 == GraczX && MobY0 == GraczY ||
    MobX1 == GraczX && MobY1 == GraczY ||
    MobX2 == GraczX && MobY2 == GraczY ||
    MobX3 == GraczX && MobY3 == GraczY ||
    MobX4 == GraczX && MobY4 == GraczY )
    {
        HP = HP - 20;
    }
    if( HP == 0 ) GameOver = true;
   
   
   
}

int main()
{
    srand( time( NULL ) );
   
    Setup();
    for(;; )
    {
       
        Rysuj();
        Klawiatura();
        Mechanika();
    }
    return 0;
   
}
/[ cpp ]
P-140795
michal11
» 2015-11-25 19:46:54
Musisz bardziej naświetlić problem bo kompilowałem i debugowałem ten twój program ale dalej nie wiem co jest z nim nie tak. Poza tym to nie są identyczne warunki w tych ifach.
P-140808
KIM_PEEK
Temat założony przez niniejszego użytkownika
» 2015-11-25 19:58:39
Okej, jezeli odpaliles moj program(mam nadzieje ze dzialal) to gdy strzelasz do przeciwnika pocisk przez niego przechodzi znaczy po za jednym czyli pierwszym Mob0.

A teraz tak bardziej precyzyjnie

Instrukcja warunkowa = Jezeli X i Y Moba sa rowne X i Y pocisku to:

Za pomoca funcki rand() wygeneruj nowa pozycje dla Moba.
Dodaj 10 punktow.
Dodaj 2 amunicji.

i tak 5 razy dla kazdego moba.

tylko ze warunek spelnia sie tylko dla 1 if tj. if(Mob0X == FireX && Mob0Y == FireY)
reszta jest  poprostu pomijana a ja nie rozumiem dlaczego.

kombinowalem juz else if.
P-140814
michal11
» 2015-11-25 20:23:32
U mnie działa chyba tak jak chcesz żeby działało, trochę spowolniłem tą grę (to był prawdopodobnie powód przez który nie widziałeś zmian), sprawdź czy jest ok:
C/C++
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <cstdlib>
#include <time.h>

using namespace std;

//Zmienne Globalne
COORD coord = { 0, 0 };
bool GameOver;

//Mapa
const int wysokosc = 20;
const int szerokosc = 60;

int GraczX, GraczY;
int HP, Ammo, Score;
int BoxY, BoxX;
int FireX, FireY;

//Przeciwnicy

int MobX0, MobY0;
int MobX1, MobY1;
int MobX2, MobY2;
int MobX3, MobY3;
int MobX4, MobY4;

int counter = 0;

enum ekierunek { FIRE, LEFT, RIGHT, NONE };
ekierunek dir;


void gotoxy( int x, int y )
{
    coord.X = x; coord.Y = y; // X and Y coordinates
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}

void Setup()
{
    GameOver = false;
    GraczX = szerokosc / 2;
    GraczY = 18;
    HP = 100;
    Ammo = 20;
    Score = 0;
   
    MobX0 = 5;
    MobX1 = 10;
    MobX2 = 15;
    MobX3 = 20;
    MobX4 = 25;
}


void Klawiatura()
{
    if( _kbhit() )
    {
        switch( _getch() )
        {
        case 'a':
            dir = LEFT;
            break;
        case 'd':
            dir = RIGHT;
            break;
        case 'k':
            if( Ammo != 0 )
            {
                FireX = GraczX;
                FireY = GraczY - 1;
                Ammo--;
            }
            break;
        }
    }
}
void Rysuj()
{
    gotoxy( 0, 0 );
    for( int i = 0; i < szerokosc + 2; i++ ) // gorna belka
    {
        cout << "#";
    }
    cout << endl;
   
    for( int i = 0; i < wysokosc; i++ )
    {
       
        for( int j = 0; j < szerokosc; j++ )
        {
            if( j == 0 ) cout << "#";
           
            if( i == MobY0 && j == MobX0 ) { cout << "V"; j++; }
            if( i == MobY1 && j == MobX1 ) { cout << "V"; j++; }
            if( i == MobY2 && j == MobX2 ) { cout << "V"; j++; }
            if( i == MobY3 && j == MobX3 ) { cout << "V"; j++; }
            if( i == MobY4 && j == MobX4 ) { cout << "V"; j++; }
            if( i == FireY && j == FireX ) { cout << "."; j++; }
            if( i == GraczY && j == GraczX ) cout << "^";
            else cout << " ";
           
            if( j == szerokosc - 1 ) cout << "#";
           
        }
        cout << endl;
    }
    for( int i = 0; i < szerokosc + 2; i++ )
    {
        cout << "#";
    } // DOLNA BELKA
    cout << MobX0;
    cout << MobY0;
    cout << endl;
    cout << "  Amunicja: " << Ammo << "     " << "Punkty: " << Score << "    " << "HP" << HP << "%" << endl;
} // rysuj()

void Mechanika()
{
    switch( dir )
    {
    case LEFT:
        GraczX--;
        if( GraczX == 0 )
             GraczX++;
       
        break;
    case RIGHT:
        GraczX++;
        if( GraczX == szerokosc - 1 )
             GraczX--;
       
        break;
    }
    dir = NONE;
   
   
   
    FireY--;
    Score++;
    if( counter == 50 )
    {
        MobY0++;
        MobY1++;
        MobY2++;
        MobY3++;
        MobY4++;
        counter = 0;
    }
    ++counter;
   
    if( MobY0 == 20 )
    {
        //MobY0 = rand() % 10 - 10;
        //MobX0 = rand() % 59 + 1;
        MobY0 = 2;
    }
    if( MobY1 == 20 )
    {
        //MobY1 = rand() % 10 - 10;
        //MobX1 = rand() % 59 + 1;
        MobY1 = 2;
    }
    if( MobY2 == 20 )
    {
        //MobY2 = rand() % 10 - 10;
        //MobX2 = rand() % 59 + 1;
        MobY2 = 2;
    }
    if( MobY3 == 20 )
    {
        //MobY3 = rand() % 10 - 10;
        //MobX3 = rand() % 59 + 1;
        MobY3 = 2;
    }
    if( MobY4 == 20 )
    {
        //MobY4 = rand() % 10 - 10;
        //MobX4 = rand() % 59 + 1;
        MobY4 = 2;
    }
    // Moj Problem
   
    if(( MobX0 == FireX ) &&( MobY0 == FireY ) )
    {
        Score = Score + 10;
        MobX0 = rand() % 59 + 1;
        MobY0 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
    if(( MobX1 == FireX ) &&( MobY1 == FireY ) )
    {
        Score = Score + 10;
        MobX1 = rand() % 59 + 1;
        MobY1 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
    if(( MobX2 == FireX ) &&( MobY2 == FireY ) )
    {
        Score = Score + 10;
        MobX2 = rand() % 58 + 1;
        MobY2 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
    if(( MobX3 == FireX ) &&( MobY3 == FireY ) )
    {
        Score = Score + 10;
        MobX3 = rand() % 58 + 1;
        MobY3 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
    if( MobX4 == FireX && MobY4 == FireY )
    {
        Score = Score + 10;
        MobX4 = rand() % 58 + 1;
        MobY4 = rand() % 10 - 10;
        Ammo = Ammo + 2;
    }
   
    // Moj Problem
   
    if( MobX0 == GraczX && MobY0 == GraczY ||
    MobX1 == GraczX && MobY1 == GraczY ||
    MobX2 == GraczX && MobY2 == GraczY ||
    MobX3 == GraczX && MobY3 == GraczY ||
    MobX4 == GraczX && MobY4 == GraczY )
    {
        HP = HP - 20;
    }
    if( HP == 0 ) GameOver = true;
   
   
   
}

int main()
{
    srand( time( NULL ) );
   
    Setup();
    for(;; )
    {
       
        Rysuj();
        Klawiatura();
        Mechanika();
    }
    return 0;
   
}
P-140817
KIM_PEEK
Temat założony przez niniejszego użytkownika
» 2015-11-25 20:32:36
Dziekuje ci bardzo przeanalizuje kod pozniej i napisze jezeli mialbym jakies watpliwosci , tak dokladnie o to mi chodzilo.
P-140820
michal11
» 2015-11-25 20:40:18
To może napisze tylko, że dodałem zmienną counter która zlicza ilość klatek i co 50 przesuwa potwory(spowolnienie), dodałem enuma na kierunek żeby przesuwał się powoli a nie blokował się na jednym kierunku, za komentowałem losowe pozycje potworów żeby poruszały się bardziej przewidywalnie.

W ogóle to powinieneś stworzyć sobie jakąś tablicę tych potworów, dopisać więcej funkcji (np. losowanie pozycji żeby nie trzeba było w 5 miejscach zmieniać wartości) i przede wszystkim przepisać kod na klasy to by sporo ułatwiło i sprawiło, że kod byłby łatwiejszy do czytania.
P-140822
KIM_PEEK
Temat założony przez niniejszego użytkownika
» 2015-11-25 23:33:11
Przeanalizowałem kod i moge powiedziec tyle:

1. dzieki za mozliwosc regulacji predkosci mobkow (

2. co do poruszania sie zastanawialem sie nad tym
moze wprowadze opcje wyboru trybu poruszania sie

3.co do losowych pozycji mobkow przy zejsciu do 20 osi Y
boje sie tylko ze ktos moze oszukiwac i poprostu stanac
w jedenj pozycji i odejsc od komputera

(ale to tylko moje dalekie wyobrazenia)

4.Gra powstala 3 dni temu spontanicznie w ramach przypomnienia
i od razu miala powstac obietkowo, ale napewno zostanie skonczona z uzyciem klas.

5.Dzieki wielkie za pomoc, problem byl trywialny a jednak zablokowal mnie na kilka dobrych godzin
Ten projekt jest dla mnie swietnym przykladem jak wielka prace i wiedze wkladaja programisci
w tworzeniu swoich gier/aplikacji/programow

Kiedy dokoncze gre w ktorej miales bardzo znaczacy udzial pochwale sie tym na forum.

Jezeli masz pomysl co moglbym tam dorzucic zmienic lub poprawic wszystkie propozycje mile widziane .

Dzieki, powodzenia !

 
P-140830
« 1 »
  Strona 1 z 1