# Hilfe bei Kalaha-Spiel



## method360 (9. Apr 2006)

Hy ... hab hier ein Problem mit nem Kalaha - Spiel , aufgrund von zu wenig kentnissen.
Die grafische Oberfläche hab ich fertig, aber ich weiß nicht wie ich die Spielregeln und den CPU-Gegner implementieren soll.

Hier erstmal die Regeln zum Spiel(Wer die schon kennt kann sie ja überlesen):
*Kalaha*


*Spielfeld*

Die Grundform des Brettes besteht aus 2 Reihen von 6 Spielmulden (für jeden Spieler eine Reihe) und - am Ende der beiden Reihen - 2 Gewinnmulden(Kalaha) zum Ablegen der Bohnen, die erobert worden sind.

*Spielverlauf*

Jede der zwölf Mulden wird mit vier Bohnen gefüllt. Die Kalaha( bei mir sind das die Gewinnmulden ) bleiben leer, dort werden später die eroberten Bohnen abgelegt. Ein Spielzug besteht darin, alle Bohnen einer eigenen Spielfeldmulde aufzunehmen und entgegen dem Uhrzeigersinn einzeln auf die anderen Spielfeldmulden zu verteilen, eigene und gegnerische. Die Kalaha werden ausgelassen. Danach ist der Mitspieler an der Reihe.
Erobert werden können gegnerische Steine wenn

    * die letzte Bohne des Spielzuges in eine gefüllte gegnerische Mulde fällt, in der sich nur eine oder zwei Bohnen befinden. Diese Mulde wird also auf zwei oder drei Bohnen aufgefüllt. Die eroberten Bohnen werden in der eigenen Kalaha abgelegt.
    * liegen in der davorliegenden gegnerischen Mulde auch nur zwei oder drei Bohnen, dann darf diese Mulde ebenfalls geleert werden. Anschließend ist der Mitspieler am Zug. 

Als Besonderheit ist zu beachten: enthält die ausgewählte Mulde mehr als zwölf Bohnen, so dass ein vollständiger Umlauf möglich ist, wird bei der zweiten Runde die soeben geleerte übersprungen.
Spielende
Hat ein Spieler keine Bohnen mehr in seinen Mulden, ist der Mitspieler verpflichtet, ihm Bohnen herüberzuspielen. Das Spiel endet, wenn ein Spieler keine Bohnen mehr in seinen Mulden hat. Die in den Mulden liegenden Bohnen gehören dem Spieler, auf dessen Seite sie sich befinden.

*Spielende*

Hat ein Spieler keine Bohnen mehr in seinen Mulden, ist der Mitspieler verpflichtet, ihm Bohnen herüberzuspielen. Das Spiel endet, wenn ein Spieler keine Bohnen mehr in seinen Mulden hat. Die in den Mulden liegenden Bohnen gehören dem Spieler, auf dessen Seite sie sich befinden.


Wer mal ne runde spielen will kann sich mal dieses Kalaha spiel ansehen :Kalahaspiel zum Ausprobieren


Hier jetzt mein Quelltext:

Kalaha.java

```
public class Kalaha
{
	
	public static void main (String[]args)
    {
    
	 Graf test = new Graf();
	 test.setSize(900,200);
	 test.setVisible(true);


    } 
	
}
```

Graf.java


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.reflect.*;

public class Graf extends JFrame implements ActionListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5520439391198523898L;

	private JButton mulde1, mulde2, mulde3, mulde4, mulde5, mulde6;

	private JButton sm1, sm2, sm3, sm4, sm5, sm6, spielermulde, cpumulde;

	private JButton cm1, cm2, cm3, cm4, cm5, cm6;

	private JButton start;

	public Graf() {

		// Spiel-Fenster
		String title = "Kalaha";
		setTitle(title);

		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		Container spielfeld = this.getContentPane();
		spielfeld.setLayout(null);

		// Aktions-Knoepfe fuer die Spieler-Mulden
		start = new JButton("Start");
		start.setBounds(780, 140, 100, 30);
		start.addActionListener(this);
		start.setBackground(Color.BLACK);
		start.setForeground(Color.WHITE);
		spielfeld.add(start);

		mulde1 = new JButton("Mulde 1");
		mulde1.setBounds(120, 100, 100, 30);
		mulde1.addActionListener(this);
		spielfeld.add(mulde1);

		mulde2 = new JButton("Mulde 2");
		mulde2.setBounds(230, 100, 100, 30);
		mulde2.addActionListener(this);
		spielfeld.add(mulde2);

		mulde3 = new JButton("Mulde 3");
		mulde3.setBounds(340, 100, 100, 30);
		mulde3.addActionListener(this);
		spielfeld.add(mulde3);

		mulde4 = new JButton("Mulde 4");
		mulde4.setBounds(450, 100, 100, 30);
		mulde4.addActionListener(this);
		spielfeld.add(mulde4);

		mulde5 = new JButton("Mulde 5");
		mulde5.setBounds(560, 100, 100, 30);
		mulde5.addActionListener(this);
		spielfeld.add(mulde5);

		mulde6 = new JButton("Mulde 6");
		mulde6.setBounds(670, 100, 100, 30);
		mulde6.addActionListener(this);
		spielfeld.add(mulde6);

		// Spielermulden

		sm1 = new JButton();
		sm1.setBounds(120, 60, 100, 30);
		sm1.addActionListener(this);
		sm1.setBackground(Color.GREEN);
		spielfeld.add(sm1);

		sm2 = new JButton();
		sm2.setBounds(230, 60, 100, 30);
		sm2.addActionListener(this);
		sm2.setBackground(Color.GREEN);
		spielfeld.add(sm2);

		sm3 = new JButton();
		sm3.setBounds(340, 60, 100, 30);
		sm3.addActionListener(this);
		sm3.setBackground(Color.GREEN);
		spielfeld.add(sm3);

		sm4 = new JButton();
		sm4.setBounds(450, 60, 100, 30);
		sm4.addActionListener(this);
		sm4.setBackground(Color.GREEN);
		spielfeld.add(sm4);

		sm5 = new JButton();
		sm5.setBounds(560, 60, 100, 30);
		sm5.addActionListener(this);
		sm5.setBackground(Color.GREEN);
		spielfeld.add(sm5);

		sm6 = new JButton();
		sm6.setBounds(670, 60, 100, 30);
		sm6.addActionListener(this);
		sm6.setBackground(Color.GREEN);
		spielfeld.add(sm6);

		// Computer-Mulden

		cm6 = new JButton();
		cm6.setBounds(120, 20, 100, 30);
		cm6.addActionListener(this);
		cm6.setBackground(Color.RED);
		spielfeld.add(cm6);

		cm5 = new JButton();
		cm5.setBounds(230, 20, 100, 30);
		cm5.addActionListener(this);
		cm5.setBackground(Color.RED);
		spielfeld.add(cm5);

		cm4 = new JButton();
		cm4.setBounds(340, 20, 100, 30);
		cm4.addActionListener(this);
		cm4.setBackground(Color.RED);
		spielfeld.add(cm4);

		cm3 = new JButton();
		cm3.setBounds(450, 20, 100, 30);
		cm3.addActionListener(this);
		cm3.setBackground(Color.RED);
		spielfeld.add(cm3);

		cm2 = new JButton();
		cm2.setBounds(560, 20, 100, 30);
		cm2.addActionListener(this);
		cm2.setBackground(Color.RED);
		spielfeld.add(cm2);

		cm1 = new JButton();
		cm1.setBounds(670, 20, 100, 30);
		cm1.addActionListener(this);
		cm1.setBackground(Color.RED);
		spielfeld.add(cm1);

		// Gewinn-Mulden
		cpumulde = new JButton();
		cpumulde.setBounds(20, 20, 90, 70);
		cpumulde.setBackground(Color.RED);
		cpumulde.addActionListener(this);
		spielfeld.add(cpumulde);

		spielermulde = new JButton();
		spielermulde.setBounds(780, 20, 90, 70);
		spielermulde.setBackground(Color.GREEN);
		spielermulde.addActionListener(this);
		spielfeld.add(spielermulde);

	}

	// Methode um die Buttons zu initialisieren
	public void resetVar(final int initwert) {
		spielermulde.setText("0");
		cpumulde.setText("0");
		try {

			Field[] fieldArray = getClass().getDeclaredFields();
			for (int i = 0; i < fieldArray.length; i++) {
				String fieldName = (fieldArray[i]).getName();
				if ((fieldName.startsWith("sm") || fieldName.startsWith("cm"))
						&& fieldName.length() == 3) {
					((JButton) fieldArray[i].get(this)).setText("" + initwert);
				}
			}
		} catch (IllegalAccessException ex) {
			ex.printStackTrace();
		}
	}

	public void actionPerformed(ActionEvent ereignis) {
		Object objekt = ereignis.getSource();
		if (objekt == start) {
			resetVar(4);
		}

	}

}
```

Kann mir bitte jemand erklären wie ich die Regeln und einen CPU-Gegner implementieren?

Ich hatte dieses Spiel schonmal hier im Forum rein gestellt , mir wurde auch geholfen, aber ich hab den Quelltext später nicht mehr verstanden und konnte deshalb nicht weiter schreiben.
Nun bitte ich die jenigen die mir Antworten ; die schritte ausführlich zu dokumentieren.

Ich bedank mich schon mal im voraus.


----------



## bygones (9. Apr 2006)

tsja dann mal viel spaß... einfach so aufgaben werden hier nicht gelöst... 

aber wünsche viel glück


----------



## method360 (10. Apr 2006)

Es soll mir ja keiner die ganze Aufgabe loesen , ich brauch nur eine Hilfestellung.

Ich brauch z.B eine einfache Methode um die die Steine aufzunehmen und dann gegen den Uhrzeigersinn abzulegen.... bzw einen vorschlag wie ich das realisiere...., das gleiche beim CPU Gegner , wie realisiere ich einfache zuege????


Ich bitte nochmals um Hilfe


----------



## André Uhres (10. Apr 2006)

method360 hat gesagt.:
			
		

> Ich hatte dieses Spiel schonmal hier im Forum rein gestellt , mir wurde auch geholfen, aber ich hab den Quelltext später nicht mehr verstanden und konnte deshalb nicht weiter schreiben.


Hättest um Erklärungen bitten können. Schade um die Zeit die ich für dich eingesetzt habe.
Aber das Risiko muss man hier wohl einkalkulieren.


----------



## method360 (12. Apr 2006)

Als ich es hier das erste mal gepostet habe... dachte ich auch dass ich das programm verstanden habe. Dann habe ich aber ne weile an dem programm gearbeitet ... und hab mich dann nicht mehr reingefunden. Die andere version von dem programm hab ich auch noch... bloß habe ich große Probleme den CPU gegner zu implementieren. wäre deshalb sehr dankbar, wenn mir jemand zeigt wie ich dort einfache zuege vom cpu - gegner implementiere.

Hier nochmal der zweite teil vom code...


```
import java.lang.reflect.*; 
... 
    public void resetVar(int initwert) { 
        spielermulde.setText("0"); 
        cpumulde.setText("0"); 
        try{ 
            Field [] fieldArray = getClass().getDeclaredFields(); 
            for (int i = 0; i < fieldArray.length; i++) { 
                String fieldName = (fieldArray[i]).getName(); 
                if( (fieldName.startsWith("sm")||fieldName.startsWith("cm") ) 
                       && fieldName.length() == 3 ){ 
                    ((JButton)fieldArray[i].get(this)).setText(""+initwert); 
                } 
            } 
        }catch(IllegalAccessException ex){ 
            ex.printStackTrace(); 
        } 
    }


public void actionPerformed(ActionEvent ereignis) { 
        //siehe Beitrag weiter unten 
    } 
    
    //Diese Methode addiert "increment" auf die "sm"-Buttons oder die "cm"-Buttons, 
    //ab "position" für "number" Buttons. 
    //Gibt die verbleibende Buttonanzahl zurück 
    private int setMx(final String type, final int position, final int number, final int increment) { 
        int pos = position; 
        int anzahl = number; 
        if(anzahl == 0) return 0; 
        try{ 
            Field [] fieldArray = getClass().getDeclaredFields(); 
            for (int i = 0; i < fieldArray.length; i++) { 
                String fieldName = (fieldArray[i]).getName(); 
                if( fieldName.startsWith(type+"m") && fieldName.length() == 3 
                        && Integer.parseInt(fieldName.substring(2)) > pos ){ 
                    JButton mX = (JButton)fieldArray[i].get(this); 
                    int alteZahl = Integer.parseInt(mX.getText()); 
                    mX.setText("" + (alteZahl + increment)); 
                    anzahl--; 
                    if(anzahl == 0) return 0; 
                } 
            } 
        }catch(IllegalAccessException ex){ 
            ex.printStackTrace(); 
        } 
        return anzahl; 
    } 
    
    //Diese Methode gibt den "sm"-Button oder "cm"-Button für eine bestimmte Position zurück: 
    private JButton getMx(final String type, final int position) { 
        JButton button = null; 
        int pos = position; 
        if(type.equals("c")){ 
            pos = (pos-7)*-1; 
        } 
        try{ 
            Field [] fieldArray = getClass().getDeclaredFields(); 
            for (int i = 0; i < fieldArray.length; i++) { 
                String fieldName = (fieldArray[i]).getName(); 
                if( fieldName.startsWith(type+"m") && fieldName.length() == 3 
                        && Integer.parseInt(fieldName.substring(2)) == pos ){ 
                    button = (JButton)fieldArray[i].get(this); 
                } 
            } 
        }catch(IllegalAccessException ex){ 
            ex.printStackTrace(); 
        } 
        return button; 
    }
```


----------



## André Uhres (14. Apr 2006)

method360 hat gesagt.:
			
		

> Als ich es hier das erste mal gepostet habe... dachte ich auch dass ich das programm verstanden habe...


..ich hab das dort mal ein wenig kommentiert.


----------



## method360 (14. Apr 2006)

Danke für deine Anstrengungen, diesmal verstehe ich den Quelltext besser und ich bin auch schon dabei den CPU-Gegner zu erstellen.

Ich hätte jetzt noch mal eine Frage, aber  die die hat nix direkt mit dem spiel zu tun...

was macht z.B. diese Zeile

```
String gegnerMuldeName = seite.equals("s")?"cm":"sm";
```

...genauer gesagt ,was machen das "?" und der ":" ?

Habe ich vorher noch nicht gesehen und auch noch nichts in der UNI davon gehört.


----------



## André Uhres (14. Apr 2006)

Der Bedingungsoperator A ? B : C ist der einzige Operator, der drei Operanden verarbeitet.
Ist der Ausdruck A true, dann wird B zurückgegeben, andernfalls C.


----------



## method360 (15. Apr 2006)

Alles klar ... und wieder mal was dazugelernt.

Danke nochmal und bis zum nächsten mal


----------

