# Skatblatt darstellen durch Random?



## sicLotus (9. Nov 2009)

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?


----------



## Marco13 (9. Nov 2009)

```
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)....


----------



## Der Müde Joe (9. Nov 2009)

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


----------



## Michael... (9. Nov 2009)

sicLotus hat gesagt.:


> 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

```
(int)(Math.random() * 8) +1
```
oder mit

```
Random#nextInt(8) + 1
```
 ermitteln


----------



## Leroy42 (9. Nov 2009)

sicLotus hat gesagt.:


> 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.


----------



## Marco13 (9. Nov 2009)

Leroy42 hat gesagt.:


> Hääh!


Das, was er angedeutet hat, ist "strukturell" das gleiche wie das mit den ints - nur eben durch 8 geteilt... (so in etwa, zumindest  )


----------



## Nicer (9. Nov 2009)

Leroy42 hat gesagt.:


> Hääh!
> 
> Und was wäre, wenn der Random-Wert zwischen 0,125 und 0,25 läge?
> 
> ...



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

MfG Nicer


----------



## sicLotus (10. Nov 2009)

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.


----------



## AmunRa (10. Nov 2009)

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.


----------



## sicLotus (10. Nov 2009)

hm, klingt aber umstaendlich 32 karten in ne liste zu packen, wenn ich lediglich 4x8 karten angeben könnte.. gibts nicht ne andere variante?


----------



## Michael... (10. Nov 2009)

sicLotus hat gesagt.:


> hm, klingt aber umstaendlich 32 karten in ne liste zu packen


Ohne Fleiss kein Preis

```
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()));
		}
	}
}
```


----------



## sicLotus (10. Nov 2009)

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?


----------



## AmunRa (10. Nov 2009)

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


----------



## sicLotus (10. Nov 2009)

gut, hatte ich mir gedacht, aber fragen zur sicherheit fand ich besser!

gibts noch ne andere möglichkeit außer über eine liste zu gehen?


----------



## faetzminator (10. Nov 2009)

Etwas einfacheres nicht, nein. Wo liegt das Problem?


----------



## Michael... (10. Nov 2009)

sicLotus hat gesagt.:


> gibts noch ne andere möglichkeit außer über eine liste zu gehen?


Irgendwie musst Du Deine "Karten" ja verwalten.


----------



## AmunRa (10. Nov 2009)

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


----------



## sicLotus (10. Nov 2009)

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


----------



## faetzminator (10. Nov 2009)

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.


----------



## Michael... (10. Nov 2009)

sicLotus hat gesagt.:


> haette ja sein können, das man in nem array das ganze auch irgendwie lösen könnte


Kann man ist halt nur nicht so komfortabel


----------



## sicLotus (10. Nov 2009)

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..


----------



## faetzminator (10. Nov 2009)

[c]int rnd = Math.random() * 31;[/c]...


----------



## AmunRa (10. Nov 2009)

Mit nem Array und if könntest du es auch so 
machen.

Du nimmst zwie Arrays der länge 8

```
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. 

```
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


----------



## sicLotus (10. Nov 2009)

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?


----------



## AmunRa (10. Nov 2009)

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.


----------



## sicLotus (10. Nov 2009)

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


----------



## sicLotus (12. Nov 2009)

Der Müde Joe hat gesagt.:


> keine Ahnung von Skat.
> 
> Mach ne Klasse Card. Mach ne Klasse Suit. Mach ne Klasse Rank.
> Definiere in der klasse Card Suit und Rank.
> ...



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 

```
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

```
implements Comparable<Card>
```
?


----------



## Der Müde Joe (12. Nov 2009)

>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


----------



## sicLotus (13. Nov 2009)

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?


----------



## Der Müde Joe (13. Nov 2009)

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.


----------



## sicLotus (13. Nov 2009)

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?


----------



## Der Müde Joe (13. Nov 2009)

>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


----------



## sicLotus (13. Nov 2009)

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?


----------



## Der Müde Joe (13. Nov 2009)

>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.


----------



## sicLotus (13. Nov 2009)

ohje.. was is jetzt ne linkedlist?


----------



## Der Müde Joe (13. Nov 2009)

>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


----------



## sicLotus (13. Nov 2009)

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


----------



## Der Müde Joe (13. Nov 2009)

>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 ;-)


----------



## sicLotus (13. Nov 2009)

```
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?


----------



## Der Müde Joe (13. Nov 2009)

gar nix. war ein kurzer test obs auch ok ist...


----------



## sicLotus (14. Nov 2009)

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


----------



## peymanlion (24. Nov 2009)

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


----------



## Der Müde Joe (24. Nov 2009)

>bitte meldet jemand wenn ueber dieses programm ahnung hat 

lol. ich habs geschrieben,....

>ich habe nicht ahnung von JAVA programming und ich brauche eure Hilfe.

Na dann viel erfolg beim lesen:
Galileo Computing :: Java ist auch eine Insel (8. Auflage)

Hier bist du besser aufgehoben:
Jobbörse - java-forum.org
ohne Marie geht nix...


----------



## peymanlion (24. Nov 2009)

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


----------



## ARadauer (24. Nov 2009)

geht ihr drei eigentlich in die selbe Klasse?
http://www.java-forum.org/hausaufgaben/91674-skat-geber-programmieren.html


----------



## sicLotus (24. Nov 2009)

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


----------



## Der Müde Joe (24. Nov 2009)

Nein. nicht ohne multiplikation...
aber normalerweise mach man das so:

```
Random random = new Random();
int zahl = random.nextInt(32)+1 // Zahl zwischen 32 und 1
```


----------



## sicLotus (24. Nov 2009)

das ist jetzt widersprüchlig.. du sagst *nein* und trotzdem hast du ne lösung?


----------



## Der Müde Joe (24. Nov 2009)

Die Klasse Random bietet diese Möglichkeit (zudem noch float boolean und andere)
Die Klasse Math higegen nicht. Die kennt nur Math.random(), welche einen double zwischen 0 und 1 liefert.

EDIT:
einfach mal reinschauen:
Random (Java Platform SE 6)
Math (Java Platform SE 6)


----------

