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)
}
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:
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.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 ... ]
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");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