# Uni Projekt - Spiel Set



## Timber2205 (5. Jun 2010)

Hallo Community,

meine Gruppe und ich sollen in dem Programmierpraktikum der UNI das Spiel SET! nachbauen:

Das Kartenspiel SET

Bis jetzt ist auch alles schön und gut, aber hier nun das Problem:

Das Spiel besitzt einen Kartenstapel mit 81 Karten. Nun taucht aber folgende Eigenschaft auf (ich formuliere es mal umgangssprachlich:

stack.push(a): Aussehen des Stack: a
stack.push(b): Aussehen des Stack: bb
stack.push(c): Aussehen des Stack: ccc

Das heißt, beim ablegen einer neuen Karte nehmen alle vorhandenen Karte die Eigenschaft der neuen Karte an.
Hier nun der Quelltext:

Die Klasse Cardstack, also der Stapel von Karten im Spiel:

```
package mitStapel;

import java.util.Stack;


public class CardstackS {
	
	private Stack<Card> cStack;									// Array zur Verwaltung der Karten
	private int l;											// l dient als Referenz auf die oberste Karte
	
	public CardstackS(){
		cStack = new Stack();
		shuffle();
	}
	
	public void shuffle(){
		int check [][][][] = new int [3][3][3][3];
		for (int i=0; i<3; i++)								// 4-dim Array mit je 3 Elementen zum Einzelnachweis,
			for (int j=0; j<3; j++)							// das jede mögliche Eigenschaft nur einmal vergeben wurde/wird
				for (int k=0; k<3; k++)
					for (int l=0; l<3; l++)
						check[i][j][k][l]=0;				// 0 = n.v.		1 = vorhanden
		int n=0;											// n als Zähler für die do{}while(); Schleife
		do{	
			int a = (int)Math.round(Math.random()*2);		// 4 Zufallszahlen für die Eigenschaften
			int b = (int)Math.round(Math.random()*2);		
			int c = (int)Math.round(Math.random()*2);
			int d = (int)Math.round(Math.random()*2);
			if (check[a][b][c][d]==0){
				cStack.push(new Card(a,b,c,d));
				check[a][b][c][d]=1;
				n++;								
			}
			if (n==81){
				System.out.println("Kartenstapel erfolgreich gemischt!");
			}
			}while (n<81);
	}
	
	public Card top(){
		if (!cStack.isEmpty()){
			return cStack.peek();
		}
		return null;
	}
	
	public void pop(){
		cStack.pop();
	}
```

Die Karte

```
package mitStapel;

public class Card{
	
	private static int color, shape, number, inlay;
	
	public Card(int c, int s, int n, int i){
		color = c;
		shape = s;
		number = n;
		inlay = i;
	}
	
	/****************SET*****************/
	public static void setColor(int c){
		color=c;
	}
	public static void setShape(int s){
		shape=s;
	}
	public static void setNumber(int n){
		number=n;
	}
	public static void setInlay(int i){
		inlay=i;
	}
	
	/****************GET*****************/
	public int getColor(){
		return color;
	}
	public int getShape(){	
		return shape;
	}
	public int getNumber(){	
		return number;
	}
	public int getInlay(){	
		return inlay;
	}
}
```

Und meine Hauptklasse:

```
package mitStapel;

import java.awt.Color;


public class GameS{
	
	private Card c[];                    //verwaltet die aktuellen Karten auf dem Feld
	private CardstackS cs;
	private int n;
	
	public static void main (String[]args){
		GameS g = new GameS();
		
		g.cs = new CardstackS();
		
		g.n = 12;                     //Anzahl der KArten am Anfang
		g.c = new Card[21];           //21 sind die maximale Anzahl von Karten, damit ein Set vorliegen muss
		for (int i=0; i<21; i++){
			g.c[i] = g.cs.top();
			g.cs.pop();
			
			//System.out.println(i+".  "+g.c[i].getColor()+ " " + g.c[i].getInlay()+ " " + g.c[i].getNumber()+ " " + g.c[i].getShape());
		}
		
	}
}
```


----------



## Landei (5. Jun 2010)

```
public class Card{
    
    private static int color, shape, number, inlay;
    ...
```

Wenn sich alle Karten diese Variablen teilen müssen, ist das Verhalten kein Wunder 

Also sei nicht so geizig und spendiere jeder Karte ihren eigenen Satz Member, indem du das static weglässt!


----------



## Timber2205 (5. Jun 2010)

Sowas tut weh  Man denkt die ganze Zeit "die Karte hat ja nur ein paar Parameter, da kann der Fehler also nicht sein".

Danköööö


----------



## kay73 (5. Jun 2010)

Landei hat gesagt.:


> ```
> public class Card{
> 
> private static int color, shape, number, inlay;
> ...


Das mit dem 
	
	
	
	





```
static
```
 hatte ich vollends aus meiner Wahrnehmung gestrichen. Vielleicht muss ich das Spiel auch mal spielen.

Aber Eure 
	
	
	
	





```
shuffle()
```
-Funktion ist echt zum Fürchten:
	
	
	
	





```
class Card {
		public int color, shape, number, inlay;	
		
		public Card (final Card card) {
			this.color = card.color;
			this.shape = card.shape;
			this.number = card.number;
			this.inlay = card.inlay;
		}
		
		public Card() {}
	}
	
	public Stack<Card> shuffle() {
	       		
		final Stack<Card> cardStack = new Stack<Card>();
		        
		final Card card = new Card();
		for (int i=0 ; i < 3; i++) {			
        	card.color = i;
            for (int j = 0 ; j < 3; j++) {
            	card.shape  = j;
                for (int k = 0 ; k < 3; k++) {
                	card.number= k;
                    for (int l = 0 ; l < 3; l++) {
                    	card.inlay= l;
                    	cardStack.push(new Card(card));
                    }
                }
            }
       }
		
	   Collections.shuffle(cardStack);
	   return cardStack;
	}
```


----------



## Timber2205 (5. Jun 2010)

Meine Shuffle-Funktion ist genial 

Mit deiner Methode würden wir die Karten einfach linear erzeugen, da wäre nichts gemischt, einfach bei jedem Spiel die gleichen Karten, das mach doch keiner


----------



## ice-breaker (5. Jun 2010)

```
List<Card> cards = cstack.subList(0, cstack.size());
Collections.shuffle(cards);
cstack.clear();
cstack.addAll(cards);
```


----------



## kay73 (5. Jun 2010)

Timber2205 hat gesagt.:


> Meine Shuffle-Funktion ist genial


 ...wenn sie denn terminiert...


Timber2205 hat gesagt.:


> da wäre nichts gemischt


Da hast Du eine Kleinigkeit übersehen...

Mischen ist i. A. deterministisch und geht in O(n). Und wenn Ihr schon nichts Fertiges verwenden dürft, nimm Fisher-Yates.


----------



## kay73 (5. Jun 2010)

..


----------



## Landei (5. Jun 2010)

Sollte nicht einfach

```
Collections.shuffle(cstack);
```
gehen? Schließlich erbt Stack von Vector, ist also eine Liste


----------



## Timber2205 (5. Jun 2010)

Also:

Euren Algorithmus werde ich später einbauen. Nun geht es erst einmal darum, dass meine Gruppe bis DO noch eine GUI hin bekommt. Irgendwie machen die alles auf den letzten Drücker ???:L
Aber nochmals danke für die sehr flotte Hilfe :toll:


----------



## ice-breaker (5. Jun 2010)

Landei hat gesagt.:


> Schließlich erbt Stack von Vector, ist also eine Liste


stimmt, ganz vergessen, dass Vector eine Liste ist.


----------



## energy (15. Jun 2010)

hallo an alle,
ich habe ne frage. Wenn man disen Code auf der konsole ausgeben lässt, kommen da nur zahlen raus, für die eigenschaften der karten. wie werden  die karten farbig abgebildet ?
das geht zwar mit java graphics, aber wie macht man denn sowas?


----------



## Timber2205 (15. Jun 2010)

Kennt man sich zufällig aus dem ProPra der HHU ?

Also kommt drauf an, wie du das Spiel realisieren möchtest. Du kannst die Karten selber zeichnen, Icons erstellen lassen oder...oder...oder...


----------



## energy (15. Jun 2010)

kann ja sein vielleicht;-)

es soll nicht so kompliziert sein. Was ist denn einfacher, das mit den Icons oder mit dem Zeichnen. Aber weiss trotzdem nicht wie ich das so genau machen könnte.


----------

