• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Symulator walki-problem

Object Storage Arubacloud
0 głosów
410 wizyt
pytanie zadane 15 listopada 2015 w C i C++ przez Erimer Nowicjusz (140 p.)

Zaczałem pisać mały symulator walki między 2 bohaterami. Stworzyłem object wojownik i na tej podstawie przypisywało się cechy poprzez wpisanie jakichkolwiek wartości.

#include <iostream>
#include <fstream>
#include "wojownik.h"
#include <cstdlib>
#include <time.h>

using namespace std;

int main()
{
    cout << "Witaj w symulatorze walki!" << endl;


    Wojownik w1;
    w1.dodaj_wojownika();
    w1.oblicz_atak();
    //int akt_zycie1;
    Wojownik w2;
    w2.dodaj_wojownika();
    w2.oblicz_atak();
    //int akt_zycie2;

    //while ((w1.zycie<=0) || (w2.zycie<=0))
    {


    int los;

    srand(time(NULL));
    los=rand()%2+1;
    if(los==1)
    {
        cout<<"Tura wojownika: "<<w1.imie<<endl;
        cout<<"Wojownik: "<<w1.imie<<"Zadal: "<<w1.cios<<" obrazen."<<endl;
        w2.zycie=w2.zycie-w1.cios;
        cout<<"Wojownikowi: "<<w2.imie<<" zostalo: "<<w2.zycie<<endl;
    }
    else if (los==2)
    {
        cout<<"Tura wojownika: "<<w2.imie<<endl;
        cout<<"Wojownik: "<<w2.imie<<"Zadal: "<<w2.cios<<" obrazen."<<endl;
        w1.zycie=w1.zycie-w2.cios;
        cout<<"Wojownikowi: "<<w1.imie<<" zostalo: "<<w1.zycie<<endl;
    }



    }


    return 0;
}

Nie wiem jak zrobić by wojownicy zadawali sobie obrażenia do momentu, gdy któryś z nich będzie miał 0 życia. Napisałem pętle, ale spełnia się tylko dla jednego warunku, nie wiem jak wykonać resztę.

Myślałem, żeby napisać dodatkową funkcję typu:

void aktualne_zycie();

ale nie wiem jak pobierać aktualne życie po zadaniu ciosu. Mam nadzieję, że nie namieszałem za bardzo.

2 odpowiedzi

0 głosów
odpowiedź 15 listopada 2015 przez criss Mędrzec (172,590 p.)
W warunku powinno być && zamiast ||. W końcu chcesz, żeby pojedynek trwał dopóki oboje żyją :P
komentarz 15 listopada 2015 przez Erimer Nowicjusz (140 p.)
No właśnie nic się nie kompiluje, wpisuję odpowiednio imie, sile i zycie 1 i 2 wojownika, ale dalsze polecenia się nie wykonują...
komentarz 15 listopada 2015 przez criss Mędrzec (172,590 p.)
Pokaż cały kod. Gdzie wpisujesz?
komentarz 16 listopada 2015 przez Erimer Nowicjusz (140 p.)

To jedena część kodu z opisem classy "wojownika"

 

#include <iostream>
#include <fstream>

using namespace std;

class Wojownik
{
public:

    string imie;
    int sila;
    int zycie;
    int cios;
    //int aktualne_zyc;

    void dodaj_wojownika();
    void oblicz_atak();
    //void akt_zyc();
};

A tu opisane metody

#include <iostream>
#include <fstream>
#include "wojownik.h"
#include <cstdlib>
#include <time.h>

using namespace std;

void Wojownik::dodaj_wojownika()
{
    cout<<"Podaj imie wojownika:"<<endl;
    cin>>imie;
    cout<<"Podaj sile wojownika:"<<endl;
    cin>>sila;
    cout<<"Podaj zycie wojownika:"<<endl;
    cin>>zycie;

}

void Wojownik::oblicz_atak()
{


    srand(time(NULL));
    cios=rand()%sila+1;


}
I wszystko pięknie, tylko nie chce się wykonywać symulacja walki do momentu, w którym jednemu z "wojowników" zostanie 0 życia.










 

 

 

komentarz 16 listopada 2015 przez criss Mędrzec (172,590 p.)

O kuuuurde nie zauwazyłem wczesniej :DD Masz zupełnie bezsensowny warunek. Petla się wykonuje dopóki życie wojowników jest mniejsze lub rowne 0. Po prstu zmien na >=. A wlasciwie wiekszy sens miałoby >.

I pamiętaj o && zamiast ||.

komentarz 16 listopada 2015 przez Erimer Nowicjusz (140 p.)
Dzięki, rzeczywiście coś zaczeło się dziać, aż dziwne że tego nie zauważyłem. Co prawda jeszcze losowanie jest jakieś mało dokładne bo w losowaniu często powtarza się tyko wojownik1 i potrafi przez całą kolejkę tylko on zadać uderzenia. Muszę coś pokombinować z warunkiem.
komentarz 16 listopada 2015 przez criss Mędrzec (172,590 p.)
A, właśnie. srand() powinieneś wywoływać TYLKO na poczatku maina. Wtedy zaiarno zostaje zainicjalizowane dla wszystkiego co stanie sie po wywołaniu, czyli dla całego programu. Usuń tego sranda z oblicz_atak(), a tego w mainie najlepiej wrzuć na początek. To powinno rozwiązać problemy z losowością.
komentarz 16 listopada 2015 przez Erimer Nowicjusz (140 p.)

Zrobiłem tak jak napisałeś. Kod wygląda tak

#include <iostream>
#include <fstream>
#include "wojownik.h"
#include <cstdlib>
#include <time.h>


using namespace std;

int main()
{
    int los;

    srand(time(NULL));

    cout << "Witaj w symulatorze walki!" << endl;


    Wojownik w1;
    w1.dodaj_wojownika();

    Wojownik w2;
    w2.dodaj_wojownika();


    while ((w1.zycie>0) && (w2.zycie>0))
    {
        los=rand()%2+1;
        if(los==1)
            {
                w1.oblicz_atak();
                cout<<"Tura wojownika: "<<w1.imie<<endl;
                cout<<"Wojownik: "<<w1.imie<<"Zadal: "<<w1.cios<<" obrazen."<<endl;
                w2.zycie=w2.zycie-w1.cios;
                cout<<"Wojownikowi: "<<w2.imie<<" zostalo: "<<w2.zycie<<endl;
            }
        else if (los==2)
            {
                w2.oblicz_atak();
                cout<<"Tura wojownika: "<<w2.imie<<endl;
                cout<<"Wojownik: "<<w2.imie<<"Zadal: "<<w2.cios<<" obrazen."<<endl;
                w1.zycie=w1.zycie-w2.cios;
                cout<<"Wojownikowi: "<<w1.imie<<" zostalo: "<<w1.zycie<<endl;
            }



    }
    if (w1.zycie>0)
    {
        cout<<"Wygrał wojownik: "<<w1.imie<<endl;
    }
    else if (w2.zycie>0)
    {
        cout<<"Wygrał wojownik: "<<w2.imie<<endl;
    }

    return 0;
}

 

 

 

Dodałem jeszcze oblicz_atak() do while i teraz rzeczywiście losuje "cios" wojownika :)

0 głosów
odpowiedź 16 listopada 2015 przez katolik6 Dyskutant (8,140 p.)
rada: pisz cos-=dmg; zamiast cos=cos-dmg; jest krócej.
komentarz 16 listopada 2015 przez draghan VIP (106,230 p.)
Jest również mniej przejrzyście.
komentarz 16 listopada 2015 przez criss Mędrzec (172,590 p.)
Bez przesady, każdy kto siedzi w programowaniu dłużej niż tydzień nie będzie miał problemu z odczytaniem += ,-= itd

Podobne pytania

+2 głosów
1 odpowiedź 240 wizyt
0 głosów
1 odpowiedź 654 wizyt
0 głosów
2 odpowiedzi 1,306 wizyt
pytanie zadane 4 lipca 2016 w C i C++ przez pixel06 Nowicjusz (150 p.)

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...