Karten ziehen

Asgar13

Bekanntes Mitglied
Hallo,

habe den Quellcode selbst geschrieben, damit man auf einer Datei "deck.txt" sich Karten ziehen kann, ohne dass doppelte Zahlen kommen.

Kann man diesen so lassen, oder soll man den noch ändern?

Java:
		zufall.addListener(SWT.Selection, new Listener() {
		      public void handleEvent(Event e) {
		        switch (e.type) {
		        case SWT.Selection:
		    		String[] deck = new String[100];
		    		int[] doppelt = new int[5];
		    		int i=0,karte=0,a=0,g=0;
		        	
		    		ausgabe.removeAll();
		        	 try{
		        		 
		    			BufferedReader in = new BufferedReader(new FileReader(file));
		    			

		    			if (!file.exists()){
		    				ausgabe.add("Die angegbene Datei existiert nicht");
		    			}
		    				
		    			if (!file.isFile()){
		    				ausgabe.add("Der angegebene Pfad ist keine Datei");
		    			}
		    				
		    			if(!file.canRead()) {
		    				ausgabe.add("Die angegebene Datei kann nicht gelesen werden");
		    			}
		    			for (String deckbuffer;(deckbuffer = in.readLine()) != null;)
		        		 {
		        			 deck[i]=deckbuffer.toString();
		        			 i++;
		        		 }
		    			in.close();
		        	 }
	                    catch(IOException ioexp){
	                    ausgabe.add("Fehler bei dem IOExecption");
	                    }
	                    catch(Exception exp){
	                    ausgabe.add("Fehler bei dem Execption");}
	                    
		    				for(karte=0;karte<5;karte++){
		    					int random = (int) (Math.random()*i); //Erzeugt Zufallszahl
		    					doppelt[karte]=random; //Speichert die Zufallszahlen in einen Array
		    					for(g=0;g<5;g++){
		    						if(doppelt[karte] != doppelt[g] && karte != g){//Wenn Zahl nicht da war, dann ... 
		    							a++;
		    						}
		    					}
		    					if(a==4){
			    					ausgabe.add(deck[random]);//Fehler x, dann 1,1,1,1
		    					}
		    					else{
		    						karte=0;
		    					}
		    					a=0;
	                    }
		          break;
		        }
		      }
		    });
 
Kann man diesen so lassen, oder soll man den noch ändern?
Lassen kann man das schon, nur funktioniert das dann nicht so wie gewünscht ;-) (Ausser ich hab die "Sollfunktion" nicht verstanden)
Hier mal ein paar Anmerkungen:
- Zunächst mal die drei
Code:
if(!file....
Was nutzt es wenn ausgegeben wird, dass die Datei nicht existiert usw. wenn danach der Code normal weiter läuft?
- Mal abgesehen davon, dass - falls eine der drei Bedingungen zutreffen würde - vorher schon eine Exception beim Erzeugen des BufferedReaders geworfen werden würde.
- Dann in Zeile 28 deckbuffer ist ein String warum noch das toString()
- Ist denn sichergestellt, dass die Datei nicht mehr als 100 Zeilen hat? Falls nein, kann Dir da eine ArrayOutOfBoundsException fliegen.
- Deine Ziehen Methode funktioniert nicht. Der Index 0 kann nicht gezogen werden
- Wenn eine bereits "gezogene" Karte bzw. deren Index nochmal gezogen wird, wird keine neue Karte in ausgabe hinzugefügt, die for-Schleife aber weiter fortgesetzt (oder müssen nicht immer fünf Karten gezogen werden?)

Denke das sollte für's erste mal reichen.
 
Danke für die Antwort, die ersten 3 Punkte werde ich bearbeiten.

Zu Punkt 4, ich kenne keine Kartenspiele, wo man ohne Doppeldecks über 100 Karten hat.
(Lasse den User in seiner eigenen Dummheit sterben) vorgesehen sind zwischen 40-60 Karten

Punkt 5 und 6 teste ich erst mal.
(Müssen immer 5 Karten sein).
 
Das ist grauenvoll. Und davon abgesehen: Warum das Rad nochmal erfinden?

Karten in eine Liste einlesen, [c]Collections.shuffle(list);[/c] aufrufen und dann einfach mit [c]String karte = list.remove(0)[/c] von vorn Karten "ziehen".
 
Zu Punkt 4, ich kenne keine Kartenspiele, wo man ohne Doppeldecks über 100 Karten hat.
(Lasse den User in seiner eigenen Dummheit sterben) vorgesehen sind zwischen 40-60 Karten
Der Hintergrund der Anmerkung war eigentlich, dass es z.B. findige User gibt, die solche Dateien editieren und eh man sich versieht sind da ein paar leere Zeilenumbrüche usw. drin. Sowas könnte man ja abfangen - ohne, dass das komplette Programm abstürtzt.
 
Ich weiß nicht, was für Spiele Du damit spielen willst. Munchkin hat zum Beispiel fast 200 Karten in einem Set, aber um sowas geht es Dir wohl nicht.
Trotzdem wäre es doch gut, wenn die Größe dynamisch wäre.
 
So sieht der Quellcode jetzt aus:

Problem: String karte = list.remove(0) gibt keinen String zurück sondern ein void.


COMMIT: muss noch die Exceptions abfangen!
Code:
type mismatch: cannot convert from void to int

Irgendwelche Ideen?
Java:
	//Events
		zufall.addListener(SWT.Selection, new Listener() {
		      public void handleEvent(Event e) {
		        switch (e.type) {
		        case SWT.Selection:
		    		int a=0;
		    		String karte;
		    		List intern = new List(shell, SWT.NONE);
		        	
		    		ausgabe.removeAll();
		        	 try{
		        		 
		    			BufferedReader in = new BufferedReader(new FileReader(file));
		    			

		    			if (!file.exists()){
		    				ausgabe.add("Die angegbene Datei existiert nicht");
		    			}
		    			
		    			else{	
		    			
		    				if (!file.isFile()){
		    					ausgabe.add("Der angegebene Pfad ist keine Datei");
		    				}
		    			
		    				else{	
		    					if(!file.canRead()) {
		    						ausgabe.add("Die angegebene Datei kann nicht gelesen werden");
		    					}
		    					else{
		    						for (String deckbuffer;(deckbuffer = in.readLine()) != null;)
		    						{
		    							intern.add(deckbuffer);
		    						}
		    						in.close();
	                    
		    						Collections.shuffle((java.util.List<?>) intern);
	                    
		    						for(a=0;a<5;a++)
		    						{
		    							karte = intern.remove(a);//Fehler void to String
		    							ausgabe.add(karte);
		    						}
		    					}
		    				}
		    			}
		    		}
		        	catch(IOException ioexp){
		        		 ausgabe.add("Fehler bei dem IOExecption");
	                }
	                catch(Exception exp){
	                	ausgabe.add("Fehler bei dem Execption");
	                }
	                break;
		        }
		      }
		    });
 
Zuletzt bearbeitet:
Der Code sieht immer noch grauenhaft aus. Mal ein Formatierungs-Tipp: Statt...

Java:
if (gruen) {
   fahre();
} else {
   if (gelb) {
       fahreSchneller();
   } else {
      if (rot) {
          bremse();
      } else { 
          ampelIstAus();
      }
   }
}
...kannst du viel übersichtlicher schreiben:
Java:
if (gruen) {
   fahre();
} else if (gelb) {
    fahreSchneller();
} else if (rot) {
    bremse();
} else {
    ampelIstAus();
}
 
Ok, werde ich machen 🙂

Das Kartenziehen gebe ich nur in kleinen Kreis weiter und denen erkläre ich auch das mit der Textdatei.

Weißt du auch wie man das Problem von oben Lösen kann, Landei?
 
Ich gehe mal davon aus, dass es sich nicht um java.util.List handelt, da würde der Code nämlich funktionieren...

Wenn es eine SWT-Liste ist, musst du in die API schauen, ich kenne mich mit SWT nicht aus. Außerdem funktioniert dann Collections.shuffle nicht, weil es eine java.util.List erwartet.
 
Die "List" die du da verwendest, ist eine SWT List - für das "shuffle" braucht man eine java.util.List. Soll diese "intern"-Liste irgendwo auf dem Bildschirm angezeicht werden? Wenn nicht, sollte es keine SWT List sein.

Und Noch was generelles
Java:
zufall.addListener(SWT.Selection, new Listener() {
    public void handleEvent(Event e) {
        if (e.type == SWT.Selection) { 
            // Kann hier überhaupt was anderes ankommen? 
            // (Kenn' mich mit SWT nicht aus...)
            takeRandomCards();
        }
}

private void takeRandomCards()
{
    List<Card> cards = readCardsFromFile();

    if (cards == null || exceptionWurdeGeworfenOderSo) print("Fehlermeldung");

    Collections.shuffle(cards);
    for(a=0;a<5;a++)
    {
        karte = intern.remove(0);
        ausgabe.add(karte);
    }
}

Darauf hin arbeitend, zu trennen zwischen GUI-Code (SWT Listener zeug), Dateiverarbeitung (readCardsFromFile) und der eigentlichen "Logik" (shuffle+remove).
 

Zurück
Oben