Fragen zu: blockSignals() | TextEdit autoscroll | srand |...

Alles rund um die Programmierung mit Qt
Antworten
Mystique
Beiträge: 6
Registriert: 18. Juni 2006 20:55

Fragen zu: blockSignals() | TextEdit autoscroll | srand |...

Beitrag von Mystique »

Hallo,

ich schreibe gerade als Projektarbeit eine einfache Version von Schiffe versenken (siehe Bild). Für das, dass ich mich zum ersten mal mit Qt beschäftige, bin ich eigentlich ganz zufrieden, bis auf folgende Kleinigkeiten noch:

1) srand()
Der Computer soll ziemlich billig per Zufallsgenerator ein Feld auswählen und darauf feuern.

Code: Alles auswählen

void AI::slotFire()
{
	int row, col;
	srand(time(NULL));
	row=rand()%10;
	col=rand()%10;
	std::cout << "AI: row=" << row << " col=" << col << std::endl; //DEBUG
	emit sigShotAtHuman(row, col);	//to: humanPlayer.slotShotAt(row, col)
}
Er leitet dieses Ergebnis über das Signal an den anderen Spieler weiter, welcher sein Feld überprüft und bei Treffer oder auf ein bereits beschossenes Feld die CPU nochmals schiessen lässt.

Im Normalfall funktioniert das auch ganz gut, nur manchmal habe ich das Problem, dass seltsamerweise bei wiederholtem Schießen einige Mal die gleichen Koordinaten aufgerufen werden:
AI: row=3 col=4
AI: row=8 col=1
AI: row=2 col=7
AI: row=2 col=1
AI: row=2 col=1
AI: row=2 col=1
AI: row=2 col=1
AI: row=2 col=1
AI: row=2 col=1
AI: row=2 col=1
[... einige Mal mehr ... ]
Zwischen dem wiederholten Aufruf liegt ja einiges an Zeit, und ich habe sogar eine kleine leere Schleife eingebaut um mehr Zeitverzögerung zu haben, weil sonst bricht er irgendwann sogar ab mit Segmentation fault.
Aber wenn ich z.B. mit srand() und rand() eine ganz normale Ausgabe mache, kommen da lauter verschiedene Zahlen.

2) blockSignals()
Ich würde ganz gerne, solange der andere Spieler am Zug ist, das Feld für den menschlichen Spieler sperren. Das funktioniert auch indem ich auf den einzelnen Buttons einfach die Signale blockiere. Allerdings wenn ich schnell mehrmals darauf klicke und sobald ich wieder am Zug bin die Signale wieder freigeschaltet werden, werden diese Klicks nachträglich ausgeführt. Als wären sie in irgendeiner Queue.
Weiß jemand was dagegen zu tun ist?

3) TextEdit autoscroll
Ich habe ein TextEdit Feld als Ausgabe, wie z.B. Schiff versenkt.

Code: Alles auswählen

console->insertPlainText("Ausgabetext");
Die neueste Ausgabe erscheint nun immer ganz unten. Wie bekomme ich die TextEdit Box dazu automatisch mitzuscrollen und den neuesten Eintrag anzuzeigen?

4) Ausrichtung der Schiffe
Ich würde gerne die Ausrichtung der Schiffe (Horizontal/Vertikal) was bisher über einen Button realisiert wird, einfach per Rechtsklick realisieren.
Gibt es die Möglichkeit das auf das ganze Programm (MainWindow) zu beziehen? Also egal wo ich einen Rechtsklick mache?

Hab im Web schon gesucht, aber nichts wirklich brauchbares gefunden.

Vielen Dank schonmal für Eure Tipps und Lösungen :)
Dateianhänge
battle.jpeg
battle.jpeg (15.56 KiB) 1528 mal betrachtet
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

1.) Wenn es sogar einen Absturz gibt würde ich es nicht aus srand schieben... einfach mal debuggen

2.) Du kannst auch in den einzelnen Funktionen testen ob er gerade was machen dar foder nicht - ist zwar nicht soo schön wie evtl. blockSignals, aber es geht

3.) evtl. http://doc.trolltech.com/4.1/qtextedit. ... sorVisible ?

4.) evtl. ein http://doc.trolltech.com/4.1/qobject.ht ... ventFilter für das MainWidget / alle Widgets wo du das erlauben möchtest. Evtl. ist das auch eine Idee für 2.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten