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

Problem z pętlą for i nie tylko

Ostatnio zmodyfikowano 2015-11-30 15:04
Autor Wiadomość
ludo123
Temat założony przez niniejszego użytkownika
Problem z pętlą for i nie tylko
» 2015-11-29 21:06:22
Ostatnio zabrałem się za projekt z c++. Mianowicie mam zrobić grę i wpadłem na pomysł żeby zrobić coś na kształt quizu. Jako że pierwszy raz mam styczność z biblioteką SFML a i z c++ przygodę zacząłem nie dawno trochę średnio mi to idzie. Mam nadzieję że trafiłem na odpowiednie forum i ktoś chociaż wyhaczy kilka błędów które popełniam.


Więc zacznę od opisania jak to mniej więcej ma działać.
Funkcja "bool klik" zwraca true jak kliknę na sprita(chodzi o wybór odpowiedzi przy pytaniu w quizie)
Metoda wczytaj wczytuje pytania z pliku txt(które są ułożone tak, że najpierw jest treść pytania, potem 4 odpowiedzi i opodwiedź prawidłowa i potem schemat się powtarza, jest w sumie 5 pytań) i zapisuje poszczególne linijki do zmiennych w klasie.
Metoda sprawdz sprawdza czy podana odpowiedź jest zgodna z tą poprawną.
Potem w mainie deklaruję wszystkie potrzebne przyciski.

I problem (tak mi się przynajmniej wydaje) zaczyna się w pętli for, gdzie próbuję wczytać pytania, wyświetlić je i sprawdzić czy wybrana przyciskiem odpowiedź (litera A,B,C,D w spricie) jest zgodna z prawidłową.
Pętla for od razu przelatuje mi 5 razy, nie potrafię jej zatrzymać aż do kliknięcia w przycisk odpowiedzi, tak, żeby tekst z pytaniem i odpowiedziami cały czas był wyświetlony na ekranie. Jeśli ktoś znajdzie jakikolwiek błąd będę naprawdę bardzo wdzięczny, a wiem że błędów może być masa.Jeśli źle sformułowałem jakieś pytanie piszcie, postaram się jak najszybciej doprecyzować o co mi dokładnie chodzi.

C/C++
#include "SFML\Graphics.hpp"
#include <SFML/Audio.hpp>
#include <iostream>
#include <cmath>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;


bool klik( sf::Sprite & av_Sprite, sf::RenderWindow & av_Window )
{
   
    int mouseX = sf::Mouse::getPosition().x;
    int mouseY = sf::Mouse::getPosition().y;
   
    sf::Vector2i windowPosition = av_Window.getPosition();
   
    if( mouseX > av_Sprite.getPosition().x + windowPosition.x && mouseX <( av_Sprite.getPosition().x + av_Sprite.getGlobalBounds().width + windowPosition.x )
    && mouseY > av_Sprite.getPosition().y + windowPosition.y + 30 && mouseY <( av_Sprite.getPosition().y + av_Sprite.getGlobalBounds().height + windowPosition.y + 30 ) )
    {
        if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
        {
            return true;
        }
        return false;
    }
   
    return false;
   
}




class Pytanie
{
public:
    string tresc;
    string a, b, c, d;
    int nr_pytania;
    string poprawna;
    string odpowiedz;
    int punkt;
   
    void wczytaj();
   
    void sprawdz();
};


void Pytanie::wczytaj()
{
    fstream plik;
    plik.open( "quiz.txt", ios::in );
   
    if( plik.good() == false )
    {
        cout << "Blad otwarcia pliku";
        exit( 0 );
    }
    int nr_linii =( nr_pytania - 1 ) * 6 + 1;
    int aktualny_nr = 1;
    string linia;
   
   
    while( getline( plik, linia ) )
    {
        if( aktualny_nr == nr_linii ) tresc = linia;
       
        if( aktualny_nr == nr_linii + 1 ) a = linia;
       
        if( aktualny_nr == nr_linii + 2 ) b = linia;
       
        if( aktualny_nr == nr_linii + 3 ) c = linia;
       
        if( aktualny_nr == nr_linii + 4 ) d = linia;
       
        if( aktualny_nr == nr_linii + 5 ) poprawna = linia;
       
        aktualny_nr++;
    }
    plik.close();
}

void Pytanie::sprawdz()
{
    if( odpowiedz == poprawna )
    {
        punkt = 1;
    }
    else punkt = 0;
   
}




int main()
{
    sf::RenderWindow window( sf::VideoMode( 800, 600 ), "QUIZ v1.0" );
    sf::Font font;
    if( !font.loadFromFile( "UnrealT.ttf" ) ) {
        cout << "nie zaladowano czcionki\n";
    }
   
    //przycisk1
    sf::Texture przycisk1;
    if( !przycisk1.loadFromFile( "A.png" ) ) {
    }
   
    //przycisk2
    sf::Texture przycisk2;
    if( !przycisk2.loadFromFile( "B.png" ) ) {
    }
   
    //przycisk3
    sf::Texture przycisk3;
    if( !przycisk3.loadFromFile( "C.png" ) ) {
    }
   
    //przycisk4
    sf::Texture przycisk4;
    if( !przycisk4.loadFromFile( "D.png" ) ) {
    }
   
    //przycisk1
    //sf::Sprite przycisk1;
    //przycisk1.setTexture(przycisk);
    //przycisk1.setPosition(sf::Vector2f(300, 300));
   
    sf::Sprite przycisk11;
    przycisk11.setTexture( przycisk1 );
    sf::Sprite przycisk22;
    przycisk22.setTexture( przycisk2 );
    sf::Sprite przycisk33;
    przycisk33.setTexture( przycisk3 );
    sf::Sprite przycisk44;
    przycisk44.setTexture( przycisk4 );
   
   
    przycisk11.setPosition( sf::Vector2f( 50, 400 ) );
    przycisk22.setPosition( sf::Vector2f( 200, 400 ) );
    przycisk33.setPosition( sf::Vector2f( 350, 400 ) );
    przycisk44.setPosition( sf::Vector2f( 550, 400 ) );
   
   
    //pytania
   
    sf::String tresc;
    sf::String odpa;
    sf::String odpb;
    sf::String odpc;
    sf::String odpd;
   
   
   
    Pytanie p[ 5 ];
   
    int suma = 0;
   
   
   
    //
    string sumastring;
    sumastring = to_string( suma );
    //wynik
    sf::String wynik;
    sf::Text wynik1( sumastring, font, 30 );
    wynik1.setPosition( sf::Vector2f( 620, 400 ) );
    //
   
    for( int i = 0; i < 5; i++ )
    {
       
       
        while(( klik( przycisk11, window ) == true ) ||( klik( przycisk22, window ) == true ) ||( klik( przycisk33, window ) == true ) ||( klik( przycisk44, window ) == true ) )
        {
           
            p[ i ].nr_pytania = i + 1;
            p[ i ].wczytaj();
           
           
            sf::Text text1( p[ i ].tresc, font, 30 );
            sf::Text text2( p[ i ].a, font, 30 );
            sf::Text text3( p[ i ].b, font, 30 );
            sf::Text text4( p[ i ].c, font, 30 );
            sf::Text text5( p[ i ].d, font, 30 );
           
            text1.setPosition( sf::Vector2f( 20, 20 ) );
            text2.setPosition( sf::Vector2f( 20, 60 ) );
            text3.setPosition( sf::Vector2f( 20, 100 ) );
            text4.setPosition( sf::Vector2f( 20, 140 ) );
            text5.setPosition( sf::Vector2f( 20, 180 ) );
           
            text1.setColor( sf::Color::Black );
            text2.setColor( sf::Color::Black );
            text3.setColor( sf::Color::Black );
            text4.setColor( sf::Color::Black );
            text5.setColor( sf::Color::Black );
           
           
           
            text1.setString( p[ i ].tresc );
            text2.setString( p[ i ].a );
            text3.setString( p[ i ].b );
            text4.setString( p[ i ].c );
            text5.setString( p[ i ].d );
           
           
           
            window.draw( text1 );
            window.draw( text2 );
            window.draw( text3 );
            window.draw( text4 );
            window.draw( text5 );
           
           
           
           
           
           
            if( klik( przycisk11, window ) == true )
            {
                p[ i ].odpowiedz = p[ i ].a;
               
            }
            else if( klik( przycisk22, window ) == true )
            {
                p[ i ].odpowiedz = p[ i ].b;
               
            }
            else if( klik( przycisk33, window ) == true )
            {
                p[ i ].odpowiedz = p[ i ].c;
               
            }
            else if( klik( przycisk44, window ) == true )
            {
                p[ i ].odpowiedz = p[ i ].d;
               
            }
           
           
            p[ i ].sprawdz();
            suma += p[ i ].punkt;
            i++;
        }
    }
   
   
   
   
   
    while( window.isOpen() )
    {
        sf::Event Event;
        while( window.pollEvent( Event ) )
        {
            switch( Event.type )
            {
            case sf::Event::Closed:
                window.close();
                break;
            }
           
        }
       
       
       
       
        window.clear( sf::Color( 200, 200, 200 ) );
        window.draw( przycisk11 );
        window.draw( przycisk22 );
        window.draw( przycisk33 );
        window.draw( przycisk44 );
        window.draw( wynik1 );
        window.display();
       
       
    }
}

P-141125
darko202
» 2015-11-30 10:43:01
1.
zapoznaj się z technika debugowania programu


2.
zastanów się, gdzie program miałoby się zatrzymać

interpretacja
// powtórz 5 razy
for( int i = 0; i < 5; i++ )
    {
...
// jeśli nacisnąłem przycisk 11
 if( klik( przycisk11, window ) == true )
    // zaznaczam, że wybrano odpowiedz a
    p[ i ].odpowiedz = p[ i ].a;
...
itd.
...
}

moim zdaniem działa poprawnie (tzn. tak jak opisujesz),
ale pewnie chciałeś czegoś innego - niestety musisz zmienić coś w programie


3.
może użyj funkcji kbhit()
C/C++
while( kbhit() )
{
    znak = getch();
    std::cout << "*znak: '" << znak << "' kod: " << static_cast < int >( znak ) << std::endl;
}

http://cpp0x.pl/kursy/Kurs-C++​/Obsluga-klawiatury-za-pomoca-c​onio-h​/320
P-141153
michal11
» 2015-11-30 15:04:42
Wstaw tą swoją pętlę for do pętli głównej programu, inaczej ona wykona się tylko raz.
P-141174
« 1 »
  Strona 1 z 1