Skatblatt darstellen durch Random?

Status
Nicht offen für weitere Antworten.

sicLotus

Bekanntes Mitglied
Hi, ich habe eine Aufgabe bekommen, wo ich scheinbar irgendwie auf dem Schlauch stehe.

Über Math.random werden mir Zahlen zwischen 0,0 und 1,0 (als double) geliefert. Ich soll nun durch diese Zahlen ein Skatblatt simulieren.
Das bedeutet, 32 Karten bzw. Zahlen, wobei
• 4 x 7
• 4 x 8
• 4 x 9
• 4 x 10
• 4 x Bube
• 4 x Dame
• 4 x König
• 4 x As

An sich haette ich jetzt gesagt, da das 8 unterschiedliche Karten sind, nehme ich einfach den Randomwert und schau ob der >0,125 ; > 0,25 ....

Also immer im Abstand von 0,125, da 1,0/8
Allerdings haette ich damit totalen Zufall, was die Karten im Stapel angeht und nicht vorhergesagt, das nur 4x 7 drin is etc..
Wie kann ich das umsetzen?
Evtl könnte ich ja das ganze in einem Zaehler speichern, und immer schauen, ob die Zahl schon 4x vorhanden ist, wenn ja, dann soll neu gewürfelt werden? Habt ihr ne bessere Idee?
 
Java:
int cards[] = new int[32];
cards[0] = HERZ_ASS; // Alle als public static final ints definiert....
cards[1] = PIK_BUBE; 
...

Random random = new Random();
int cardIndex = random.nextInt(32);
int card = cards[cardIndex];

EDIT: Nur für das Auswählen an sich - es gäbe ggf. günstigere Arten, die Karten darzustellen als ints - enums vielleicht - das ändert aber nichts an dem random.nextInt(32)....
 
An sich haette ich jetzt gesagt, da das 8 unterschiedliche Karten sind
Ein Satz Skatkarten besteht aus 32 unterschiedlichen Karten (sonst hätte sich ja keiner die Mühe gemacht und da noch Kreuz, Pik... draufzumalen)
Was genau hast Du vor? Willst Du einzelne Karten ziehen ?
Zufallszahlen zwischen 1 und 8 kann man so
Java:
(int)(Math.random() * 8) +1
oder mit
Code:
Random#nextInt(8) + 1
ermitteln
 
nehme ich einfach den Randomwert und schau ob der >0,125 ; > 0,25 ....

Also immer im Abstand von 0,125, da 1,0/8
Hääh! 😱

Und was wäre, wenn der Random-Wert zwischen 0,125 und 0,25 läge?

Woher weißt du dann, welcher Karte dieser Wert entspricht?

Also einfach alle Karten in ein Array der Länge 32 speichern als
"Kreuz Bube"... "Karo Bube"..."Herz Sieben"

und über einen Randomwert zwischen 0 und 31 darauf zugreifen.
 
Hääh! 😱

Und was wäre, wenn der Random-Wert zwischen 0,125 und 0,25 läge?

Woher weißt du dann, welcher Karte dieser Wert entspricht?

Also einfach alle Karten in ein Array der Länge 32 speichern als
"Kreuz Bube"... "Karo Bube"..."Herz Sieben"

und über einen Randomwert zwischen 0 und 31 darauf zugreifen.

Genau so häddichs nu auch mal gemacht , is das einfachste 😉

MfG Nicer
 
Also, soweit ich weiß, ist in der Random funktion nicht gesagt, das jede Zahl von 0-31 nur 1x vorkommen kann. Und genau da liegt das Problem.
An sich hab ich ein Skatblatt, wobei die Farbe (Karo, Herz ...) vernachlässigt wird. Es geht lediglich um den "Wert" der Karte, darum gibts auch nur 8 "Arten" (stehen oben)

Klar kann ich die alle in nem Array speichern und dann per Index drauf zugreifen, aber es geht gerade darum, das wenn die Karte 1x gezogen wurde, nur noch 3x im Array bzw. im Stapel ist! Und wenn ich eine Karte, z.B. die 8 4x gezogen habe, dann darf keine weitere 8 gezogen werden und dieses Problem ist nicht automatisch durch random(8) oder random(31) gelöst!

Über shuffle darf ich nicht gehen, da das ganze über Random organisiert werden soll.


@Leroy42
0 bis 0,125 entspricht der 7
0,125 bis 0,25 entspricht der 8
usw..


Grob betrachtet ist es auch logisch das eine Karte nur 4x vorkommen darf, sonst würden Spiele wie Poker oder Skat keinen Sinn ergeben! Das weiß der Computer bzw. die Math.random leider nicht 😉 Und das will ich lediglich mit einbauen.
 
Dann pack das ganze nicht in ein Array sondern in ne liste und lösch die gezogenen Karten wieder raus

dann nocht vergessen , dass du dann aber nicht mehr 32 karten sondern nur mehr 31 hast.

1 karte weniger pro runde.
 
hm, klingt aber umstaendlich 32 karten in ne liste zu packen, wenn ich lediglich 4x8 karten angeben könnte.. gibts nicht ne andere variante?
 
hm, klingt aber umstaendlich 32 karten in ne liste zu packen
Ohne Fleiss kein Preis
Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class CardTest {
	public static void main(String[] args) {
		String[] card = new String[] { "As", "As", "K", "K", "D", "D", "B", "B" };
		List<String> cardList = new ArrayList<String>();
		for (int i = 0; i < card.length; i++)
			cardList.add(card[i]);

		int anzahlDerZuZiehendenKarten = 8;

		Random rnd = new Random();

		for (int i = 0; i < anzahlDerZuZiehendenKarten; i++) {
			int cardIndex = rnd.nextInt(cardList.size());
			System.out.print(cardList.get(cardIndex) + " gezogen. ");
			cardList.remove(cardIndex);
			System.out.println("Noch im Deck: "
					+ Arrays.toString(cardList.toArray()));
		}
	}
}
 
darf ich fragen warum du 2x AS 2x K 2x D und 2x B in der Zeile:

String[] card = new String[] { "As", "As", "K", "K", "D", "D", "B", "B" };

stehn hast?
 
weil er dir nur ein beispiel geschreiben hat und nicht das ganze Prog

du musst da natürlich jeweils 4 reinschreiben und auch die fehlenden KArten ergänzen
 
also ohne if-Abfragen zu benützen gibt es keine schönere Alternative und das mit listen ist auch wirklich einfach und kurz also such nicht länger rum, außer du hast einen Grund gegen Listen
 
ich lern die sprache erst neu, und listen haben wir noch nicht gelernt, aber diese aufgabe bekommen.. von daher muss man es wohl auch anders lösen können 😉 deswegen fragte ich nur..
haette ja sein können, das man in nem array das ganze auch irgendwie lösen könnte

edit:
if abfragen darf ich aber benutzen
 
Klar, du kannst entweder das Array immer verkleinern und alle nicht gebrauchten Elemente kopieren, oder einen boolean setzen, welcher festlegt, ob die Karte bereits gezogen wurde, oder nicht. Macht beides aber nicht viel Sinn und ist je nach dem code- oder rechenaufwändiger.
 
zu der lösung von michael..
hab gerade noch gesehn, das du wohl über import java.util.Random;
gegangen bist, wir müssen allerdings das problem mit Math.random lösen..
 
Mit nem Array und if könntest du es auch so
machen.

Du nimmst zwie Arrays der länge 8
Java:
int[] arr= new int[8];
String[] names = {"aS" , "KÖNIG", "DAME", .....}



for (int i=0;i<arr.length;i++){
    arr[i]=4
}


wenn du jetzt eine Zufallszahl zwischen 0 und 7 jeweils inklusive
schaust du nach ob die Zahl an der indexposition nicht 0 ist.
Java:
Random rand= new Random();
int r= rand.nextInt(8);
if (arr[r]!=0){
arr[r]--;
System.out.println("Die Karte die du gezogen hast ist:"+ names[r];)

Wenn nein, setzt du den Wert um eins herunter
 
ja und was passiert dann, wenn der wert im array[as] auf 0 is? wird dann einfach neu random gemacht und gehofft das nicht mehr [as] kommt oder wie?
 
Da kannst du dir was überlegen du kannst z.B nachschaun ob im Feld darüber oder darunter noch eine "Karte liegt"

oder wie du gesagt hast einfach wieder Random und hoffen. kann dan aber zu ner fiesen Dauerschleife werden. vor allem zum Schluss

bin aber trotzdem noch immer für Listen
aber ich wollte zumindest noch eine alternative posten.
 
okay, das finde ich aber gut! danke für diese alternative, evtl werde ich beide programmieren.. mal schauen was wir am donnerstag noch lernen! werde evtl nochmal bei fragen auf euch zurück kommen, danke aber erstmal schon fpr eure hilfe
 
keine Ahnung von Skat.

Mach ne Klasse Card. Mach ne Klasse Suit. Mach ne Klasse Rank.
Definiere in der klasse Card Suit und Rank.
Pack alle Karten in ne Liste und mach Collection.shuffle()

EDIT:
hier:
http://www.java-forum.org/java-basics-anfaenger-themen/84302-kartenspiel-programmieren.html

so, ich fand deine programmierung super und wollte das jetzt so aehnlich wie du machen, allerdings hab ich ein paar fragen!

ganz oben steh immer
Java:
package card;

ist das sowas aehnliches wie der import befehl? bzw. stellt die java api dieses package von alleine bereit?

2te frage ist, wozu brauch ich das
Java:
implements Comparable<Card>
?
 
>ist das sowas aehnliches wie der import befehl? bzw. stellt die java api dieses package von alleine bereit?

Naja. Den Code hab ich aus einem meiner Spiele rauskopiert (Texas Holdem Poker). Um das Spiel zu Gliedern gabs da halt mal ein package card. Wie die Java API brauchen meine Programme auch eine Gliederung in verschiedenen Bereiche. So findet man in java.util. verschiedene Collections Listen.. und in javax.swing Gui Dinge.

>2te frage ist, wozu brauch ich das

Comparable (Java Platform SE 6)

Um die Karten zu ordnene. Wenn ich 2 Karten vergelichen will, imlementiere ich dieses Interface. Wenn ich eine 2 mit einer 3 vergleiche, bekomme ich -1 zurück. Somit ist die 2te grösser. Hilft auch beim Sortieren nach der grösse.
EDIT: siehe auch link post 5
 
Zuletzt bearbeitet:
okay, also heisst das ich brauche das package nicht und könnte das weglassen?

an sich brauch ich die karten weder ordnen noch vergleichen, könnte ich dementsprechend also auch weglassen oder?
 
Ja. kannste auch weglassen (package).

Ich kenne mich leider mit Skat überhaupt nicht aus (Habs mal auf DSF gesehen aber fands nach ca 10s..). Vielleicht auch weil ich einfach die Regeln nicht kenn.

Du kannst die klasse auch anpassen wie du sie benötigst. Wie ich gelesen hab 32 Karten. Also enum verkleinern. Spiel nur die Kartenhöhe eine Rolle? Lass Comparable drin. Vergleich eine 3C mit einer 3S -> sind gleich. Hast eine Liste der Handkarten -> Collections.sort --> Alle Karten der höhe nach sortiert.
 
naja ich will kein skat, sondern blackjack, bei uns auch 17+4 genannt schreiben ,)
ja nur ein skatblatt, 32 karten.. von 7+8+9+10+B+D+K+AS
farbe spielt hierbei keine rolle

naja und die liste soll nich sortiert, sondern gerade gemischt werden 😉
diese collection.shuffle.. von welcher api aus wird die gesteuert?
 
>diese collection.shuffle.. von welcher api aus wird die gesteuert?

Standard API von Sun

>blackjack

Na dann brauchst du aber alle Karten 52. Sind es nun 3 Decks normalerweise? Willst ja den Kartenzählen zeigen ob nun alle Farben Asse schon weg sind ;-)

EDIT:
Black Jack wird mit sechs Paketen französischer Spielkarten zu 52 Blatt, also 312 Karten, WIKI
 
Zuletzt bearbeitet:
ich bin ja kein spielcasino 😉 das is ne einfache aufgabe mit weit vereinfachten regeln..
jede karte, die ich oben genannt habe tritt 4x auf

bei deinem code, was passiert wenn ich eine karte ziehe? wird die aus der liste gelöscht?
 
>bei deinem code, was passiert wenn ich eine karte ziehe? wird die aus der liste gelöscht?

Klar. Sehe grad das ne LinkedList besser wäre als eine ArrayList.
 
>ohje.. was is jetzt ne linkedlist?

Ne lass nur die ArrayList im Deck. War grad so ein Gedanke.
(Bei einer ArrayList bei remove(0) muss das ganze interne Array um eins verschoben werden. Bei einer LinkedList kann man schön ein remove() (oder ein remove(0)) machen und es muss lediglich die 2 Links (previous next) umgebaut werden (ist ne Double Linked List ;-) )

EDIT:
Ist nur ein performance gedanke der hier wohl kaum eine Rolle spielt
 
ah.. das hab ich jetzt aber verstanden 🙂
ich kantne das ganze nur unter array und liste, wusste nich das das bei java arraylist und linkedlist heisst 🙂
 
>arraylist und linkedlist

Sind beides Listen. Nur ArrayList benutzt intern ein Array und LinkedList Entrys mit referenzen auf den vorherigen und nächsten entry ;-)
(Wenn du in der AL in der Mitte ein Element entfernst, werden alle nachfolgenden Element eins nach vorn kopiert im Array --> aufwändig
In der LL higegen nur die Referenzen des vorherigen und des nächsten umgebogen -> einfach)

EDIT:

Ums klar zu stellen. Davon kriegst du nichts mit. Das passiert intern in der Klasse wen du remove oder insertAt oder so machst. Ist auch kein aufwand bei 10 Elementen. Aber bei 10000 das erste entfernen schon ;-)
 
Zuletzt bearbeitet:
Java:
        Card c = new Card(Rank.TWO, Suit.HEART);
        Card c2 = new Card(Rank.TEN,Suit.HEART);

was genau wolltest du damit erreichen? waren das lediglich 2 beispeil karten oder was?
 
ich wollt nochmal nachfragen, du hast fast ganz oben folgendes deklariert:

private final Rank rank;

private dürfte das gegenteil von public sein und somit kann man auf diese variable wohl nur in dieser class drauf zugreifen
final steht dafür das man sie nicht verändern kann
Rank is jetzt die art der variable? definieren wir die selber mit enum? oder gibts die schon vordefiniert?
rank is der name
 
Hallo Alle in diese Forum , ich habe eine grosse probleme bei JAVA programming und ich muss bis 1 Dec.2009 meinem Testate Abgeben und dieses Testate lauft ueber “
• Ein Skatblatt hat 32 Karten.
ich brauche alle hilfe . ich habe nicht ahnung von JAVA programming und ich brauche eure Hilfe. .ich kann die testate per e-mail zu euch schicken . bitte meldet jemand wenn ueber dieses programm ahnung hat
danke schon
Peyman
 
hi man Danke wegen nachricht . ich kann dir die Testate hochladen und euch koennen lesen . ich versuche auch mit allem e-book etwas ahnung bekommen aber das ist nicht so einfach

wenn du eine mail mir gibt dann kann ich die testate dir schicken
meinem E-mail lautet : gentleman.lion@yahoo.com

Ciao Man
Peyman
 
kp, scheint so, aber meins is jetzt fertig 🙂

eine frage haette ich noch zu random..
soweit ich weiss gibt math.random() eine zufallszahl zwischen 0 und 1,0 aus.. kann man aber wenn man der random funktion einen wert uebergibt auch eine "ganze" zahl zurueck bekommen? quasi so:

math.random(32) --> diese liefer mir dann ne ganzzahlige loesung zwischen 0 und 32?

bins von delphi gewoehnt, da ging sowas naemlich
 
Nein. nicht ohne multiplikation...
aber normalerweise mach man das so:
Java:
Random random = new Random();
int zahl = random.nextInt(32)+1 // Zahl zwischen 32 und 1
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben