# Objekte dynamisch erzeugen



## Zero (8. Feb 2006)

Hallo Leute,
Ich mache mir gerade ein Poker Programm, nun möchte ich die Karten erzeugen. 

momentan erzeuge ich die Karten so:

```
CKarten k1 = new CKarten(farbe, wert);
CKarten k2 = new CKarten(farbe, wert);
CKarten k3 = new CKarten(farbe, wert);
......
```


ich dachte mir aber das es sicher auch irgenwie möglich sein muss die Karten in einer Schleife zu erzeugen, so dass die Karte immer k+i also einen variablen namen hatt damit ich sie in einer for-schleife hochzählen kann. Doch habe ich auch selber gemerkt das ich dem Objekt CKarte nicht mit einem String oder integer erzeugen kann. Hat jemand eine Lösung für mein Problem?

meine Vorstellung Karten zu generieren (geht nicht!):

```
for(int i=0; i<7; i++){
	CKarten "k"+i = new CKarten(farbe, wert);
}
```


----------



## Bleiglanz (8. Feb 2006)

nimm ein Array


```
CKarten[] cKarten = new CKarten[7];
for(int i=0; i<7; i++){
   cKarten[i] = new CKarten(farbe, wert);
}
```

für das k kannst du eventuell ein doppeltes Array CKarten[][] nehmen...


----------



## Zero (8. Feb 2006)

Danke, das ging aber schnell   

Kannst du auch mein zweites Problem lösen? Nämlich muss ich jetzt noch herausfinden ob  k1.wert  2x im aaray forhanden ist. Macht man das in 2 verschachtelten for schleifen? oder wie muss ich da forgehen?


----------



## AlArenal (8. Feb 2006)

Wie gut, dass wir dieses Thema so selten haben!

Der nächste, der dafür nen neuen Thread aufmacht, zahlt 50 Cent in die Kaffeekasse....


----------



## SlaterB (8. Feb 2006)

alternativ zu den doppelten Schleifen:
1. Array sortieren nach dem Wert 
(Arrays.sort()-Operation, CKarten muss Interface Comparable implementieren, bei Fragen schaue in ein Lehrbuch zu diesem Stichwort  ) 
und dann einmal durchlaufen und schauen ob zwei benachbarte Felder gleichen Wert haben

2.
die Schleife einmal durchlaufen und alle Werte merken,
z.B. in einem anderen int-Array jeweils das werte Feld um 1 erhöhen (Karte 5 -> 5. Feld anschauen und um 1 erhöhen)

am Ende muss im Array überall 2 stehen oder wie auch immer du das genau haben möchtest
(


----------



## Zero (8. Feb 2006)

Ah ich bin schon halb am verzweifeln  :?  kann mir niemand kurtz ein konkretes beispiel geben oder einen Link zu einem änlichen post?

Ich möchte gerne meine Objekte vergleichen und festellen wieviele den gleichen wert beinhalten. Nämlich aus:  CKarten_.m_wert       und eben diesen "m_wert " möchte ich vergleichen._


----------



## norman (8. Feb 2006)

```
for (int i=0; i<CKarten.length(); i++) {
   if (CKarten[i].m_wert == deinIrgendwas) 
      deinZaehler++;
}
```
 :?:


----------



## Zero (8. Feb 2006)

Ja so ähnlich habe ich es auch versucht, ich sehe auch keinen Fehler und es zeigt auch keinen an, doch wenn ich das Programm ausführe und die Werte vergleichen lasse bekomme ich immer eine "Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException" und ich habe keine ahnung warum dies nicht funktioniert.


```
private void functionPair() {
		int samecards = 0;
		
		for (int i=0; i<7; i++) {
			if(mycards[i]!=null && mycards[i+1]!=null){
				
				for(int j = i + 1; j<7; j++){
					if (mycards[i].m_wert == mycards[j].m_wert){
						samecards++;
					}
			   
				}
			}
		}
		System.out.println("samecards:  " + samecards);
		
	}
```


----------



## norman (8. Feb 2006)

gib doch mal die ganze fehlermeldung. (Zeile in der der Fehler auftritt?)

btw: 





> public class NullPointerException extends RuntimeException
> 
> Thrown when an application attempts to use null in a case where an object is required.


----------



## Zero (8. Feb 2006)

Es ist mir wirklich rätzelhaft warum mein code nicht funzt...

hier die ganze fehlermeldung (aber ich glaube nicht das die weiterhilft):


> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> at CPanelEingabe.functionPair(CPanelEingabe.java:187)
> at CPanelEingabe.actionPerformed(CPanelEingabe.java:168)
> at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
> ...


----------



## norman (8. Feb 2006)

> at CPanelEingabe.functionPair(CPanelEingabe.java:187)
> at CPanelEingabe.actionPerformed(CPanelEingabe.java:168)


welche zeile ist zeile 187?
evtl noch actionPerformed() mit markierter zeile 168 posten


----------



## Zero (8. Feb 2006)

die Zeile 168 ist nur der aufruf der Funktion:          *functionPair();*
und die Zeile 187 ist die in meiner for-schleife die oben abgebildet ist:  * if (mycards.m_wert == mycards[j].m_wert){*


----------



## SamHotte (8. Feb 2006)

Wo instantiierst du denn dein Array?


----------



## SlaterB (8. Feb 2006)

wieso ist dir rätselhaft dass dein Code funktioniert wenn du gar nicht so genau weißt was in deinem Code passiert?
z.B. weißt du gar nicht was dieses sieben Karten sind

die einzige Möglichkeiten in der Operation functionPair() eine NullPointerException zu erzeugen ist ein null-Array oder
ein Array das null-Objekte erhält

das prüfst du gar nicht ab und wie gesagt weißt du sonst wohl auch nicht was in den Karten so drin ist,
dabei sind das sehr einfache und überhaupt nicht rätselhafte Schritte

nimm stattdessen folgendende Operation und es kann praktisch nix mehr schiefgehen
(sofern ich es nicht vergessen habe , dass Problem dass Karten fehlen ist damit natürlich noch nicht gelöst)


```
private void functionPair() {
		int samecards = 0;

		if (mycards == null) {
			System.out.println("mycards ist null");
			return;
		}

		if (mycards.length < 7) {
			System.out.println("mycards hat eine Länge von: "+mycards.length+", nicht 7 wie angenommen..");
			return;
		}
		
		
		for (int i = 0; i < 7; i++) {
			if (mycards[i] == null) {
				System.out.println("mycards["+i+"] ist null");
			}

			if (mycards[i] != null) {
				for (int j = i + 1; j < 7; j++) {
					if (mycards[j] == null) {
						System.out.println("mycards["+j+"] ist null");
					} else {
						if (mycards[i].m_wert == mycards[j].m_wert) {
							samecards++;
						}
					}
				}
			}
		}
		System.out.println("samecards:  " + samecards);

	}
```
wenn du 4 gleiche Karten hast wird der Wert von samecards übrigens 3 + 2+ 1 = 6 sein, keine Ahnung ob das so gedacht ist..


----------



## Zero (8. Feb 2006)

Danke !!!   

meine Karten gibt es schon und ich hatte ja auch nur einen kleinen Fehler drinnen... es geht jetzt alles, ausser wie du es angetönt hast ich habe jetzt bei 4 gleichen karten den wert 6 in samecards. wie kommt das denn?

Code vorher:

```
for (int i=0; i<7; i++) {
			if(mycards[i]!=null && mycards[i+1]!=null){
				
				for(int j = i + 1; j<7; j++){
					if (mycards[i].m_wert == mycards[j].m_wert){
						samecards++;
					}
			   
				}
			}
		}
```

code jetzt:

```
for (int i=0; i<7; i++) {
			if(mycards[i]!=null){

				for(int j = i + 1; j<7; j++){
					if(mycards[j]!=null){
						if (mycards[i].m_wert == mycards[j].m_wert){
								samecards++;
						}
					}
					   
				}
			}
}
				System.out.println("samecards:  " + samecards);
```


----------



## Zero (8. Feb 2006)

ok ich habe das 3+2+1 = 6 verstanden, jetzt muss ich mir nur noch etwas für dieses problem überlegen, ausser jemand weis daruaf gerade eine schnelle Lösung. ansonsten Danke für alles

Gruss Zero


----------



## SlaterB (8. Feb 2006)

was möchtest du denn überhaupt haben?
angenommen zwei Karten sind gleich, 
dann würde ein Vergleich true ergeben (z.B. bei i=1 und j=5 wenn 1. und 5. Karte gleich sind) und samecards wäre dann 1,
ist das wenigstens richtig oder soll dann 2 der Wert sein?

gibt es mehrere Doppelte, also zwei Zweierpärchen oder kann das ausgeschlossen werden?
du musst schon genauer sagen worum es überhaupt geht..

allgemein rate ich immer noch zu einer von den bereits vorgeschlagenen Lösungen, z.B.


```
int maxWert = 32;
		int[] anzahlVonKarte = new int[maxWert];
		
		for (int i = 0; i < 7; i++) {
			if (mycards[i] != null) {
				if (anzahlVonKarte[mycards[i].m_wert] > 0) {
					// mindestens eine Karte mit diesem Wert schon vorhanden
					if (anzahlVonKarte[mycards[i].m_wert] == 1) {
						// ein Paar gefunden
						samecards += 2;
					} else {
						// eine weitere Karte zu einem vorhandenen Paar/ Dreier/ ..
						samecards++;
					}
				}
				anzahlVonKarte[mycards[i].m_wert]++;
			}
		}

		System.out.println("samecards:  " + samecards);
```

da musst du das Array nur einmal durchlaufen und hast am Ende nochmal eine Übersicht (ein Array) wieviele Karten von jedem Wert da sind


----------



## Zero (9. Feb 2006)

ja das war genau das was ich brauchte...

Zur nachfollziheung: das array: mycards sind meine karten die ich auf der hand habe die gehen am anfang von 0 und bis am schluss 7.  In der Funktion: funktionPair() möchte ich auf alle vorhandenen paare prüfen... So wie du es jetzt gelöst hast ist es ganau richtig, DANKE

Später Brauche ich noch eine Funktion für die Strasse die alle karten nebeneinader prüft und eine funktion die auf die farbengleichcheit prüft..

Ich mache mir ein programm das die Wahrscheinlichkeit im Pokern ausrechnet und dir eine Hilfestellung gibt. es prüft die Wahrscheinlichkeit auf eine gute Hand im verhälniss zum Wetteinsatz.. wenn du möchtest kann ich es dir (SlaterB) mal schicken sobald ich fertig bin, als dank für die hilfestellung.


----------



## SlaterB (9. Feb 2006)

nene, nicht nötig


----------



## Leroy42 (9. Feb 2006)

Zero hat gesagt.:
			
		

> Ich mache mir ein programm das die Wahrscheinlichkeit im Pokern ausrechnet und dir eine Hilfestellung gibt.



und das Programm überträgst du dann auf dein Handy und
klapperst die Spielkasinos ab :shock: 

 :noe: Schäm dich! :noe:


----------

