Problem z losowaniem "mapy"

0

Witam. Mam plik .bmp z zielonym kwadratem w lewym górnym rogu i czerwonym w prawym dolnym. Chcę "połączyć" je losową, czarną linią.
Zaczynam od punktu x=0, y=5.
Losuję liczbę 0-2, gdzie 0 to pixel rysowany o jeden punkt w dół w stosunku do poprzedniego, 1-w lewo, 2-w prawo.
Niestety, generowane są dziwne linie - np. nagle rysowany jest pixel na ukos od poprzedniego, linia nie dochodzi do czerwonego kwadratu...
Proszę o pomoc :/

#include "obraz.h"
#include <QImage>
#include <QMessageBox>
#include <QPoint>
#include <QTime>

obraz::obraz(QWidget *parent) :
    QGraphicsView(parent)
{
    this->setMouseTracking(true);
    this->setVisible(true);
    this->setGeometry(0, 80, 353, 493);
    this->gra=false; //nie rozpoczeto gry
    QTime czas = QTime::currentTime();
    qsrand((uint)czas.msec());
    this->generujObraz();
}

void obraz::mouseMoveEvent(QMouseEvent *event)
{
    this->piksel = this->image.pixel(event->x(), event->y());
    QColor kolor(this->piksel); //kolor piksela na ktorym jest kursor myszy
    int r, g, b, a; //skladowe
    kolor.getRgb(&r, &g, &b, &a); //pobieranie skladowych z koloru piksela

    if (r==0 && g==255 && b==0) { //zielony - rozpoczecie gry
        if (this->gra==false) {
            this->gra=true;
            emit naStarcie();
        }
    } else if (r==255 && g==0 && b==0 && gra==true) { //czerwony - wygrana
        this->gra=false;
        this->koniecGry();
        emit koniec();
    } else if (!(r==0 && g==0 && b==0) && gra==true) { //inny niz zielony, czerwony, lub czarny - przegrana
        gra=false;
        emit pozaMapa();
    }
}

void obraz::koniecGry()
{
    QMessageBox *wiadomosc = new QMessageBox;
    wiadomosc->setText("Wygrales");
    wiadomosc->setInformativeText("Projekt");
    wiadomosc->show();
}

int obraz::losuj()
{
    return qrand() % 3;
}

void obraz::generujObraz()
{
    QRgb kolor; //kolor piksela
    QPoint punkt; //aktualnie rysowany piksel

    this->gra=false;
    image.load("c:/j.bmp");

    kolor = qRgb(0, 0, 0); //kolor czarny
    punkt.setX(0);
    punkt.setY(5); //zaczynamy od pierwszego piksela pod zielonym kwadratem
    //ktory ma wymiary 5x5 i znajduje sie w punkcie 0.0 obrazka

    //wymiary wczytywanego obrazka: 50x80 pikseli
    while (punkt.x()<44 && punkt.y()<74) {
        image.setPixel(punkt, kolor);

        //0-dol, 1-lewo, 2-prawo
        if ((losuj()==0) && (punkt.y()<75))
            punkt.setY(punkt.y()+1);
        if ((losuj()==1) && (punkt.x()>0))
            punkt.setX(punkt.x()-1);
        if ((losuj()==2) && (punkt.x()<45))
            punkt.setX(punkt.x()+1);
    }

    //powiekszenie obrazka i wyrownanie do lewego gornego rogu
    image = image.scaled(350, 490, Qt::IgnoreAspectRatio);
    this->setAlignment(Qt::AlignLeft | Qt::AlignTop);

    //dodanie obrazka do pixmapy i ustawienie sceny
    scena.addPixmap(QPixmap::fromImage(image));
    this->setScene(&scena);
}
1

Rysuje Ci po przekątnej bo funkcja losuj() za każdym razem losuje inną liczbę. Ify są od siebie niezależne i możesz w jednym przejściu pętli zwiększyć zarówno x oraz y o 1. Powinieneś użyć zmiennej którą wylosujesz, a potem sprawdzisz np switchem jaką ma wartość.

0

Dzięki. Pozostaje problem nie dochodzenia linii do prawego dolnego rogu. Nie przekracza pewnych igreków, mimo, że w kodzie dałem losowanie aż do momentu wylosowania piksela obok czerwonego kwadratu, w prawym dolnym rogu.

1

Pętla while przerywa się, jak jeden z warunków jest niespełniony, chyba nie o to Ci chodzi.

0

Dzięki.

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