Ich habe ein Programm geschrieben, das eine Reihe von Namen von Musikdateien aufnehmen und abspielen wird. Das ist mir gelungen, aber ich wollte etwas auffrischen und es ein bisschen schöner machen. Ich versuche, die Musik in zufälliger Reihenfolge abzuspielen, aber keine Titel zu wiederholen, bevor die gesamte Liste abgespielt wurde. Ich war fast in der Lage, es zu tun, aber ich denke, dass etwas mit meiner Do-While-Schleife nicht stimmt. Das Programm läuft wie vorgesehen für ungefähr acht Songs, aber dann hört es auf, die Musik abzuspielen und die JVM läuft weiter. Ich benutze BlueJ, weil ich immer noch ein AP Comp Sci Student bin, also merke ich, dass ich diese Aufgabe vielleicht nicht erfüllen kann, aber jede Hilfe wäre sehr willkommen. Ich habe einen Treiber, "MusicDriver", der eine Beziehung mit zwei anderen Klassen hat: "MP3" und "Musik".
meine MP3-Klasse:
%Vor%meine Musikklasse:
%Vor%meine MusicDriver-Klasse:
%Vor%Ich habe viel darüber recherchiert, warum mein Programm einfach aufhört, meine Songs zu spielen, aber ich habe nichts gefunden. Ich habe festgestellt, dass BlueJ-Programme nicht öffnen das Terminal-Fenster (die Sache, die kommt, wenn Sie eine "System.out.print ()"), wenn Sie nach Eingabe fragen, bevor Sie eine Ausgabe haben, aber ich denke nicht das kommt für dieses Programm in Betracht. Ich habe auch sichergestellt, dass ich einen String "n" eingegeben habe, wenn ich den nächsten Song spielen möchte und für die ersten paar Songs funktioniert es, aber nach dem achten Song hört es einfach auf. Ich bin völlig verwirrt.
Ich denke, das einzige Problem liegt in der Logik, die Sie zum Mischen der Liste verwenden.
%Vor%Wenn die generierte Zufallszahl bereits in der Liste songNums vorhanden ist, erzeugen Sie eine neue Zufallszahl. Diese neue Zufallszahl wird nicht mit allen Nummern der songNums-Liste überprüft. Die folgende Änderung sollte Ihr Problem lösen.
%Vor%Alternativ können Sie Sasha in den Kommentaren zum Mischen der Liste (Sammlungen) verwenden .shuffle ()).
Das eigentliche Problem mit Ihrem bestehenden Algorithmus ist, dass Sie counter
nicht zurücksetzen, wenn Sie einen bereits gespielten Song entdecken. Sobald Sie also eine Wiederholung anschlagen, bleiben Sie in einer Endlosschleife stecken - done
wird niemals wahr sein.
(Eigentlich wird es nicht unendlich sein - sobald counter
Integer.MAX_VALUE
erreicht hat, wird es zu Integer.MIN_VALUE
und schließlich wieder zu 0
umlaufen. Wenn du es also lange genug belässt, würde es irgendwann ein anderes Lied spielen )
Es gibt hier einige nützliche Vorschläge zu Verbesserungen am Code und ich wiederhole sie hier nicht, aber die minimale Änderung, die das beheben wird, ist, die Initialisierung von counter
auf 0
innerhalb der Schleife zu verschieben :
Sasha sagte es in den Kommentaren: Verwenden Sie Collections.shuffle (). In der Praxis würde das in etwa so aussehen:
In der Musikklasse haben Sie eine Methode, um alle Lieder zu erhalten:
%Vor%Die Schleife in MusicDriver würde wie folgt aussehen:
%Vor%Bei einer Notiz mit variabler Benennung ist die Benennung der Instanz Ihrer Musikklasse als "Song" (Singular) etwas verwirrend. Vielleicht "Musik" oder zumindest "Lieder".