Ich bin Anfänger in Java und erstelle gerade ein Kartenspiel wie Gin Rommé für Android. Ich möchte wissen, was die beste Implementierung für die Erstellung der Handklasse ist? Wie kann man die von Deck.dealt () zurückgegebene Karte am besten speichern?
Außerdem würde ich mich freuen, wenn jemand einen Gin Rommé Open-Source-Link zur Verfügung stellen könnte.
Ich denke, eine gute Idee wäre, eine Schnittstelle zu verwenden (Liste, wenn Elemente geordnet sind, oder Setzen, wenn Elemente nicht geordnet sind. Sie können die gewünschte Implementierung verwenden, zum Beispiel:
%Vor%oder
%Vor%Speichern Sie sie in %code% .
Karten in einer Hand sind in einer bestimmten Reihenfolge, nicht in einem ungeordneten Haufen. Diese Reihenfolge wird in %code% über %code% beibehalten.
%code% gibt Ihnen auch die Möglichkeit, eine bestimmte Karte nach Index auszuwählen, was bei der Implementierung des Spiels hilfreich ist.
Beachten Sie, dass Sie diese Datenstruktur jederzeit problemlos ändern können, solange Sie Ihre %code% -Klasse ordnungsgemäß erstellen. Solange Sie dies bei jeder von Ihnen entworfenen Klasse berücksichtigen, können Sie sie jederzeit ändern, wenn Sie merken, dass Sie etwas anderes brauchen.
Nun, ein %code% ist schneller (soweit ich weiß), aber wenn du ein Kartenspiel machen willst, dann wirst du vielleicht die Karten sortieren wollen. Deshalb würde ich vorschlagen, eine Liste zu verwenden. Wenn Sie ein Anfänger sind, dann wäre vielleicht das Beste, ein %code% zu verwenden. Es ist einfach zu bedienen und zu verstehen. Zumindest würde ich das tun. Wenn Sie mehr erfahren möchten, empfehle ich, über die einzigartigen Eigenschaften jedes einzelnen zu lesen, damit Sie selbst entscheiden können. Und ja, wie Greuze schon sagte, sollten Sie eine Schnittstelle für mehr Flexibilität verwenden.
Erstens wird von der Verwendung von Vector in den neuesten Versionen von Java abgeraten, so dass Sie diese wahrscheinlich ignorieren können.
Zweitens, wie Sie wissen werden, wenn Sie das Javadoc auf diesen restlichen Klassen lesen, haben sie alle Vorteile oder Nachteile. Manche haben eine Bestellung, manche können doppelte Werte annehmen, manche nicht und so weiter. Daher denke ich, der beste Ansatz ist es, einen Pseudo-Code für Ihre Anwendung zu schreiben, der nicht auf einer bestimmten Klasse basiert (schreiben Sie einfach Dinge wie "Karte zu Hand hinzufügen", "Karte aus der Hand entfernen"). Sobald Sie etwas von diesem Pseudo-Code haben, werden Sie in der Lage sein, Ihre Anforderungen klarer zu sehen; Wollen Sie die Karten in einer bestimmten Reihenfolge in der Hand behalten? Willst du Karten mit einem Schlüssel aus der Hand holen?
Dann wird Ihre Wahl klarer sein.
Es ist sinnvoll, das Deck in einer Liste zu behalten, da es die Reihenfolge aufrechterhält. Ich verwende standardmäßig Lists.newArrayList (), um eine Liste zu erstellen. Listen ist ein Teil von Guava. Ich empfehle sehr, Guava zu verwenden und kennen zu lernen, da es viele nützliche Angebote hat.
Es wäre sinnvoll, die Hand in einer leicht sortierbaren Datenstruktur zu halten, um den Vergleich der Hände zu erleichtern. OTOH, IIRC, Gin Rummy Hände sind nicht allzu groß.
Wenn Sie die Nuancen zwischen den Sammlungsarten wirklich verstehen wollen, gehen Sie hier.
%code% ist technisch nicht angemessen, außer wenn das Spiel Bohnanza ist (was, ähm, ist einer der größte Kartenspiele aller Zeiten, aber ich lasse mich fertig machen).
%code% sagt unter anderem, dass eine Hand, die das Ass und den König der Vereine enthält, und eine andere Hand, die den König und das Kreuz enthält, grundsätzlich nicht dieselbe Hand sind. Das ist eine viel stärkere Abhängigkeit von der Ordnung als einfach "Nun, ich möchte mich an die Reihenfolge erinnern, in der der Benutzer seine Karten sehen möchte", was eine Eigenschaft ist, die Tonnen von Nicht-Listen-Sammlungen haben, wie %code% und Guavas %code% .
%code% impliziert auch, dass der Karte im Index N eine besondere Bedeutung beigemessen wird. Dies gilt für kein Kartenspiel, das ich kenne.
%code% ist im Allgemeinen nicht für Kartenspiele geeignet - nur für diejenigen, die ein einziges Kartenspiel mit völlig einzigartigen Karten verwenden.
Um Duplikate zu erlauben, aber trotzdem eine gruppenunabhängige Gleichheit zu haben, ist der zu verwendende Typ Guavas %code% . Zum Beispiel %code% oder %code% . Beachten Sie, dass die meisten Multiset-Implementierungen mehrere "gleiche" Karten darstellen, indem Sie nur die Karte und eine Zählung speichern. Wenn Sie über sie iterieren, müssen Duplikate einer Karte, die Sie auf der Hand haben, immer zusammen erscheinen. Wenn es wichtig ist, dass der Benutzer die Reihenfolge der Karten in seiner Hand frei steuern kann, benötigen Sie %code% .
Jetzt ist die Unterrichtszeit vorbei ... nun, seien wir ehrlich. % Co_de% aufzurufen, oder eine ganze Hand als Schlüssel in %code% zu verwenden, ist nicht wirklich was du jemals tun wirst ... also mach weiter und benutze %code% , du Mir geht es gut. : -)
Als Diagnose möchte ich die Anzahl der Zyklen pro Sekunde in meiner App anzeigen. (Denken Sie pro Sekunde in einem Ego-Shooter.)
Aber ich möchte nicht den neuesten Wert oder den Durchschnitt seit dem Start anzeigen. Was ich berechnen möchte, ist der Mittelwert der letzten X-Werte.
Meine Frage ist vermutlich die beste Möglichkeit, diese Werte zu speichern. Mein erster Gedanke war, ein Array fester Größe zu erstellen, so dass jeder neue Wert den ältesten ersetzen würde. Ist das der beste Weg? Wenn ja, wie würde ich es umsetzen?
BEARBEITEN: Hier ist die Klasse, die ich geschrieben habe: RRQueue . Es erbt die Warteschlange, erzwingt jedoch die Kapazität und entfernt bei Bedarf die Warteschlange.
EDIT 2: Pastebin ist so passé. Jetzt auf einem GitHub-Repo .
Vielleicht einen Filter verwenden:
Durchschnitt = 0,9 * Durchschnitt + 0,1 * Wert wo "Wert" die letzte Messung ist
Variiere mit 0,9 und 0,1 (solange die Summe dieser beiden 1 ist)
Dies ist nicht genau ein Durchschnitt, aber es filtert Spikes, Transienten usw. heraus, benötigt aber keine Arrays für die Speicherung.
Grüße, Karel
Sie sollten sich die in Windows integrierte Leistungsüberwachung ansehen: D.
Die API wird sich ein bisschen wackelig anfühlen, wenn Sie noch nicht damit gespielt haben, aber sie ist schnell, leistungsfähig, erweiterbar und macht es schnell möglich, brauchbare Ergebnisse zu erzielen.
Die einfachste Option hierfür ist wahrscheinlich die Verwendung einer %code% , die dies bietet das First-In-First-Out-Verhalten, nach dem Sie suchen. Just Enqueue () Ihre Elemente, und wenn Sie mehr als X Elemente haben, Entfernen Sie die zusätzlichen Elemente ().
meine Implementierung:
%Vor%Verwendung:
%Vor%Eine einfache aber schnelle Implementierung:
%Vor%