Dame

Ihr kennt ja sicherlich alle das beliebte Brettspiel Dame.
Die Aufgabe ist dieses Spiel zu programmieren.
Indi schlug vor ein Subprogramm zu schreiben, sodass zwei Subprogramme gegeneinander oder eines gegen einen menschlichen Spieler spielen können.

Wenn ihr natürlich erstmal nur zwei menschliche Spieler umsetzen könnt ist das auch schonmal ein Anfang. ;)

Hier nochmal die Regeln:
Gespielt wird auf einem Schachbrett (8x8 Felder).
Jeder Spieler hat zwölf Spielsteine, die auf den schwarzen Feldern der ersten drei Reihen des Bretts platziert werden.
Die Steine können sich vorwärts auf den schwarzen Feldern bewegen(genaugenommen diagonal vorwärts :) ).
Wenn ein Stein vor einem Stein des Gegners steht, kann der des Gegners übersprungen und dgeschlagen werden, wenn das Feld hinter dem gegnerischen Stein frei ist, so können auch mehrere gegnerische Steine geschlagen werden.
Wenn ein Stein die hinterste Reihe erreicht wird er zur Dame. Diese kann diagonal beliebig weit rücken und dabei gegnerische Steine überspringen, wenn das jeweilige Feld dahinter frei ist.
Springen ist Pflicht, wenn ein Spieler es versäumt zu springen, hat der Gegner das Recht den jeweiligen Stein im nächsten Zug zu nehmen.

also dann viel Spaß beim coden! :)
mfg
Nornagest
 
Hi @ll,

hab ein kleines Probelem bei der Arrayzuweiseung!!
Mein Compiler(Borland 6), meckert von "Zeile1[8]" bis "Zeile8[8]", das ein Ausdruckssyntax-Fehler vorliegt!??
Habe aber keine Ahnung, was falsch sein soll!!

Code:
#include "DameHeader.h"

void Dame::Brett(void)
{ //standart Brett erzeugen!
  Zeile1[8]={1, 0, 1, 0, 1, 0, 1, 0, '\0'};//Ausdruckssyntax
  Zeile2[8]={0, 1, 0, 1, 1, 1, 0, 1, '\0'};//Ausdruckssyntax
  Zeile3[8]={1, 0, 1, 0, 1, 0, 1, 0, '\0'};//Ausdruckssyntax
  Zeile4[8]={0, 1, 0, 1, 1, 1, 0, 1, '\0'};//Ausdruckssyntax
  Zeile5[8]={1, 0, 1, 0, 1, 0, 1, 0, '\0'};//Ausdruckssyntax
  Zeile6[8]={0, 1, 0, 1, 1, 1, 0, 1, '\0'};//Ausdruckssyntax
  Zeile7[8]={1, 0, 1, 0, 1, 0, 1, 0, '\0'};//Ausdruckssyntax
  Zeile8[8]={0, 1, 0, 1, 1, 1, 0, 1, '\0'};//Ausdruckssyntax

  cout<<Zeile1<<endl;
  cout<<Zeile2<<endl;
  cout<<Zeile3<<endl;
  cout<<Zeile4<<endl;
  cout<<Zeile5<<endl;
  cout<<Zeile6<<endl;
  cout<<Zeile7<<endl;
  cout<<Zeile8<<endl;
 
}

Habt ihr eine Eingebung??? Hoffe doch!

mfg Shark85
 
Ich nehm mal schon an, dass die Variabeln in DameHeader.h deklariert sind, oder nicht? *fg*
 
Ja, die sind in der DameHeader.h deklariert, es wurden aber vorher keine Werte zugewiesen!!
Und wenn ich mit "class" arbeite geht das ja auch schlecht, in der Header!!!

Code:
#ifndef _DameHeader_
#define _DameHeader_

#include <iostream>
#include <conio>
using namespace std;
//--------------------------------------------------------------------

class Dame
{
private:
  char Zeile1[8], Zeile2[8], Zeile3[8], Zeile4[8], Zeile5[8], Zeile6[8], Zeile7[8], Zeile8[8];

public:
  void Dame::Brett(void);
  void Dame::setBrett(void);
};
#endif

mfg Shark85

PS: bin aus deiner Antwort nicht wirklich schlau geworden!! :(
 
nein nookie:
die Header der Standardbibliothek haben kein Endung, es gibt sie normalerweise auch mit Endung.h, aber dann sind die entsprechenden Deklarationen nicht im Namensraum std
Das ist schon richtig so ;)

@shark:
1. Versuch mal die Zahlen in '' zu setzen, das sie ja vom Typ char sind, denn so weist du nicht die Zahlen sondern die ASCII Zeichen mit der entdprechenden Nummer zu.
2. Wenn du dem ganzen eine \0 anhängst, dann sollten die arrays die Länge 9 haben (irgendwo muss die \0 ja auch hin)

Falls weitere Probleme auftreten melde dich wieder.
mfg
Nornagest
 
Auch wenn die Aufgabe ziemlich alt ist: hier mein Loesungsvorschlag in Java

Code:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.event.*;

class DAME extends JFrame
{
	/* Die Feldtypen:
	 * 0 - weisses Feld
	 * 1 - schwarzes Feld, leer
	 * 2 - Feld belegt, Spieler 1
	 * 3 - Feld belegt, Spieler 2
	 * 4 - Dame, Spieler 1
	 * 5 - Dame, Spieler 2
	 */
	short[][] position = new short[8][8];
	FELDER[][] feld = new FELDER[8][8];
	boolean klick = false;
	boolean klick_dame = false;
	int horizontal;
	int vertikal;
	int horizontal_1 = 0;
	int vertikal_1 = 0;
	int spieler = 1;
	int steine_spieler1 = 12;
	int steine_spieler2 = 12;
	ANZAHL anzahl_spieler1;
	ANZAHL anzahl_spieler2;

	JLabel lblSpieler;
	JLabel lblSpieler1;
	JLabel lblSpieler2;
	
	DAME()
	{
		setTitle("Dame in Java Version 0.1");
		setLocation(50,50);
		setResizable(false);
		setSize(600,520);
		getContentPane().setLayout(null);
		getContentPane().setBackground(new java.awt.Color(200,200,0));
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		lblSpieler1 = new JLabel("Spieler 1");
		lblSpieler2 = new JLabel("Spieler 2");

		lblSpieler = new JLabel("Spieler 1: Welcher Stein?");

		lblSpieler.setBounds(30,440,280,25);
		lblSpieler1.setBounds(480,40,70,25);
		lblSpieler2.setBounds(480,350,70,25);

		getContentPane().add(lblSpieler);
		getContentPane().add(lblSpieler1);
		getContentPane().add(lblSpieler2);

		startpositionen();
		for(int i=0; i<8;i++)
		{
			for(int j=0; j<8;j++)
			{
				feld[i][j] = new FELDER(position[i][j]);
				feld[i][j].setBounds(30+(i*50),30+(j*50),50,50);
				getContentPane().add(feld[i][j]);
				if(position[i][j] != 0)
				{
					feld[i][j].addMouseListener(new KLICK(i,j));
				}
			}
		}

		anzahl_spieler1 = new ANZAHL(1);
		anzahl_spieler2 = new ANZAHL(2);

		anzahl_spieler1.setBounds(480,60,50,50);
		anzahl_spieler2.setBounds(480,370,50,50);

		getContentPane().add(anzahl_spieler1);
		getContentPane().add(anzahl_spieler2);
		
		show();
	}

	/* Funktion zum Setzen der Ausgangspositionen
	 * 0 = weisses Feld (nicht nutzbar)
	 * 1 = schwarzes Feld ohne Stein
	 * 2 = schwarzes Feld belegt von Spieler 1
	 * 3 = schwarzes Feld belegt von Spieler 2 */
	void startpositionen()
	{
		/* Setze alle Felder auf weiss */
		for(int i = 0; i < 8; i++)
		{
			for(int j=0; j<8; j++)
			{
				position[i][j] = 0;
			}
		}

		/* Setzen der schwarzen Felder */
		for(int i=1; i<8; i=i+2)
		{
			position[i][3] = 1;
		}
		for(int i=0; i<8; i=i+2)
		{
			position[i][4] = 1;
		}

		/* Spieler 1 Positionieren */
		for(int i=0; i<8;i=i+2)
		{
			for(int j=0; j<3;j=j+2)
			{
				position[i][j] = 2;
			}
		}
		for(int i=1; i<8; i=i+2)
		{
			position[i][1] = 2;
		}

		/* Spieler 2 Positionieren */
		for(int i=1; i<8; i=i+2)
		{
			for(int j=5; j<8; j=j+2)
			{
				position[i][j] = 3;
			}
		}
		for(int i=0; i<8; i=i+2)
		{
			position[i][6] = 3;
		}
	}

	public static void main(String[] args)
	{
		new DAME();
	}

	/* Das Spieler - Panel */
	class ANZAHL extends JPanel
	{
		int typ;
		
		ANZAHL(int u_typ)
		{
			setBackground(new java.awt.Color(200,200,0));
			typ = u_typ;
		}

		public void paint(java.awt.Graphics g)
		{
			if(typ == 1)
			{
				g.setColor(new java.awt.Color(200,200,0));
				g.fillRect(0,0,50,50);
				g.setColor(new java.awt.Color(255,255,255));
				g.fillOval(10,10,30,30);
				g.setColor(new java.awt.Color(0,0,0));
				Integer wrapper = new Integer(steine_spieler1);
				g.drawString(wrapper.toString(),20,29);
			}

			if(typ == 2)
			{
				g.setColor(new java.awt.Color(200,200,0));
				g.fillRect(0,0,50,50);
				g.setColor(new java.awt.Color(250,0,0));
				g.fillOval(10,10,30,30);
				g.setColor(new java.awt.Color(0,0,0));
				Integer wrapper = new Integer(steine_spieler2);
				g.drawString(wrapper.toString(),20,29);
			}
		}
	}

	/* Das Felder - Panel */
	class FELDER extends JPanel
	{
		int typ;
		
		FELDER(int u_typ)
		{
			typ = u_typ;

		}
		public void paint(java.awt.Graphics g)
		{
			if(typ == 0)
			{
				g.setColor(new java.awt.Color(200,200,200));
				g.fillRect(0,0,50,50);
			}
			if(typ == 1)
			{
				g.setColor(new java.awt.Color(80,80,80));
				g.fillRect(0,0,50,50);
			}
			if(typ == 2)
			{
				g.setColor(new java.awt.Color(80,80,80));
				g.fillRect(0,0,50,50);
				g.setColor(new java.awt.Color(255,255,255));
				g.fillOval(10,10,30,30);
			}
			if(typ == 3)
			{
				g.setColor(new java.awt.Color(80,80,80));
				g.fillRect(0,0,50,50);
				g.setColor(new java.awt.Color(250,0,0));
				g.fillOval(10,10,30,30);
			}
			if(typ == 4)
			{
				g.setColor(new java.awt.Color(80,80,80));
				g.fillRect(0,0,50,50);
				g.setColor(new java.awt.Color(255,255,255));
				g.fillOval(10,10,30,30);
				g.setColor(new java.awt.Color(0,0,255));
				g.fillOval(15,15,20,20);
			}
			if(typ == 5)
			{
				g.setColor(new java.awt.Color(80,80,80));
				g.fillRect(0,0,50,50);
				g.setColor(new java.awt.Color(250,0,0));
				g.fillOval(10,10,30,30);
				g.setColor(new java.awt.Color(0,0,255));
				g.fillOval(15,15,20,20);
			}
		}
	}

	/* Aktion */
	class KLICK implements MouseListener
	{
		int horizontal_2;
		int vertikal_2;

		KLICK(int u_i, int u_j)
		{
			horizontal_2=u_i;
			vertikal_2=u_j;
		}
		public void mousePressed(MouseEvent e)
		{
			horizontal = horizontal_2;
			vertikal = vertikal_2;
			if(klick_dame)
			{
				if(korrekt_dame())
				{
					feld[horizontal][vertikal].typ = position[horizontal_1][vertikal_1];
					position[horizontal][vertikal] = position[horizontal_1][vertikal_1];
					feld[horizontal][vertikal].repaint();
					feld[horizontal_1][vertikal_1].typ = 1;
					feld[horizontal_1][vertikal_1].repaint();
					position[horizontal_1][vertikal_1] = 1;
					klick_dame=false;
					klick=false;
					anzahl_spieler1.repaint();
					anzahl_spieler2.repaint();
					if(spieler == 1)
					{
						spieler = 2;
						lblSpieler.setText("Spieler 2: Welcher Stein?");
					}
					else
					{
						spieler = 1;
						lblSpieler.setText("Spieler 1: Welcher Stein?");
					}
				}
				else
				{
					if(spieler == 1) lblSpieler.setText("Spieler 1: Ungueltig! Welcher Stein?");
					if(spieler == 2) lblSpieler.setText("Spieler 2: Ungueltig! Welcher Stein?");
					klick=false;
					klick_dame=false;
				}
			}
			
			if(klick)
			{
				if((spieler == 1 && vertikal_1 < vertikal) || (spieler == 2 && vertikal_1 > vertikal))
				{
					if(korrekt())
					{
						feld[horizontal][vertikal].typ = position[horizontal_1][vertikal_1];
						position[horizontal][vertikal] = position[horizontal_1][vertikal_1];
						feld[horizontal][vertikal].repaint();
						feld[horizontal_1][vertikal_1].typ = 1;
						position[horizontal_1][vertikal_1] = 1;
						feld[horizontal_1][vertikal_1].repaint();
						klick = false;
						anzahl_spieler1.repaint();
						anzahl_spieler2.repaint();
						
						if(spieler == 1 && vertikal == 7)
						{
							position[horizontal][vertikal] = 4;
							feld[horizontal][vertikal].typ = 4;
							feld[horizontal][vertikal].repaint();
						}
						if(spieler == 2 && vertikal == 0)
						{
							position[horizontal][vertikal] = 5;
							feld[horizontal][vertikal].typ = 5;
							feld[horizontal][vertikal].repaint();
						}
						
						horizontal=0;
						vertikal = 0;
						horizontal_1=0;
						vertikal_1=0;

										
						if(spieler == 1)
						{
							spieler = 2;
							lblSpieler.setText("Spieler 2: Welcher Stein?");
						}
	
						else
						{
							spieler = 1;
							lblSpieler.setText("Spieler 1: Welcher Stein?");
						}
					}
					else
					{
						klick = false;
						horizontal=0;
						vertikal = 0;
						horizontal_1=0;
						vertikal_1=0;
						if(spieler == 1) lblSpieler.setText("Spieler 1: Ungueltig! Welcher Stein?");
						if(spieler == 2) lblSpieler.setText("Spieler 2: Ungueltig! Welcher Stein?");
					}
				}
			}
			else
			{
				if((spieler ==1 && (position[horizontal][vertikal] == 2)) || (spieler == 2 && (position[horizontal][vertikal] == 3)))
				{
					horizontal_1 = horizontal;
					vertikal_1 = vertikal;
					klick = true;
					if(spieler == 1) lblSpieler.setText("Spieler 1: Wohin?");
					if(spieler == 2) lblSpieler.setText("Spieler 2: Wohin?");
				}
				if((spieler == 1 && (position[horizontal][vertikal] == 4)) || (spieler == 2 && (position[horizontal][vertikal] == 5)))
				{
					horizontal_1 = horizontal;
					vertikal_1 = vertikal;
					if(spieler == 1) lblSpieler.setText("Spieler 1: Dame wohin?");
					if(spieler == 2) lblSpieler.setText("Spieler 2: Dame wohin?");
					klick_dame = true;
				}
			}
		}
		public void mouseClicked(MouseEvent e)	{ }
		public void mouseReleased(MouseEvent e) { }
		public void mouseEntered(MouseEvent e) { }
		public void mouseExited(MouseEvent e) {	}

		/* Ueberprueft, ob in Zug korrekt war */
		boolean korrekt()
		{
			if(position[horizontal][vertikal] != 1) return false;
			if(spieler == 1)
			{
				if(vertikal - vertikal_1 == 2)
				{
					if(horizontal > horizontal_1)
					{
						if(position[horizontal_1+1][vertikal_1+1] == 3 || position[horizontal_1+1][vertikal_1+1] == 5)
						{
							position[horizontal_1+1][vertikal_1+1] = 1;
							feld[horizontal_1+1][vertikal_1+1].typ = 1;
							feld[horizontal_1+1][vertikal_1+1].repaint();
							steine_spieler2--;
							return true;
						}
						else
						{
							return false;
						}
					}
			
					if(horizontal < horizontal_1)
					{
						if(position[horizontal_1-1][vertikal_1+1] == 3 || position[horizontal_1-1][vertikal_1+1] == 5)
						{
							position[horizontal_1-1][vertikal_1+1] = 1;
							feld[horizontal_1-1][vertikal_1+1].typ = 1;
							feld[horizontal_1-1][vertikal_1+1].repaint();
							steine_spieler2--;
							return true;
						}
						else
						{
							return false;
						}
					}
				}			
			}

			if(spieler == 2)
			{
				if(vertikal_1 - vertikal == 2)
				{
					if(horizontal > horizontal_1)
					{
						if(position[horizontal_1+1][vertikal_1-1] == 2 || position[horizontal_1+1][vertikal_1-1] == 4)
						{
							position[horizontal_1+1][vertikal_1-1] = 1;
							feld[horizontal_1+1][vertikal_1-1].typ = 1;
							feld[horizontal_1+1][vertikal_1-1].repaint();
							steine_spieler1--;
							return true;
						}
						else
						{
							return false;
						}
					}
			
					if(horizontal < horizontal_1)
					{
						if(position[horizontal_1-1][vertikal_1-1] == 2 || position[horizontal_1-1][vertikal_1-1] == 4)
						{
							position[horizontal_1-1][vertikal_1-1] = 1;
							feld[horizontal_1-1][vertikal_1-1].typ = 1;
							feld[horizontal_1-1][vertikal_1-1].repaint();
							steine_spieler1--;
							return true;
						}
						else
						{
							return false;
						}
					}
				}			
			}
			return true;
		}

		boolean korrekt_dame()
		{
			int differenz1 = horizontal_1 - horizontal;;
			int differenz2 = vertikal_1 - vertikal;
			
			if(position[horizontal][vertikal] != 1) return false;

			if((horizontal_1 - horizontal) < 0) differenz1 = -1*(horizontal_1-horizontal);
			if((vertikal_1 - vertikal) < 0) differenz2 = -1*(vertikal_1 - vertikal);
			
			if(differenz1 == differenz2)
			{
				if((horizontal < horizontal_1) && (vertikal < vertikal_1))
				{
					if(spieler == 1)
					{
						if(position[horizontal+1][vertikal+1] == 3 || position[horizontal+1][vertikal+1] == 5)
						{
							feld[horizontal+1][vertikal+1].typ = 1;
							feld[horizontal+1][vertikal+1].repaint();
							position[horizontal+1][vertikal+1] = 1;
							steine_spieler2--;
						}
						
					}
					if(spieler == 2)
					{
						if(position[horizontal+1][vertikal+1] == 2 || position[horizontal+1][vertikal+1] == 4)
						{
							feld[horizontal+1][vertikal+1].typ = 1;
							feld[horizontal+1][vertikal+1].repaint();
							position[horizontal+1][vertikal+1] = 1;
							steine_spieler1--;
						}
					}

				}
				
				if((horizontal > horizontal_1) && (vertikal < vertikal_1))
				{
					if(spieler == 1)
					{
						if(position[horizontal-1][vertikal+1] == 3 || position[horizontal-1][vertikal+1] == 5)
						{
							feld[horizontal-1][vertikal+1].typ = 1;
							feld[horizontal-1][vertikal+1].repaint();
							position[horizontal-1][vertikal+1] = 1;
							steine_spieler2--;
						}
						
					}
					if(spieler == 2)
					{
						if(position[horizontal-1][vertikal+1] == 2 || position[horizontal-1][vertikal+1] == 4)
						{
							feld[horizontal-1][vertikal+1].typ = 1;
							feld[horizontal-1][vertikal+1].repaint();
							position[horizontal-1][vertikal+1] = 1;
							steine_spieler1--;
						}
					}

				}

				if((horizontal < horizontal_1) && (vertikal > vertikal_1))
				{
					if(spieler == 1)
					{
						if(position[horizontal+1][vertikal-1] == 3 || position[horizontal+1][vertikal-1] == 5)
						{
							feld[horizontal+1][vertikal-1].typ = 1;
							feld[horizontal+1][vertikal-1].repaint();
							position[horizontal+1][vertikal-1] = 1;
							steine_spieler2--;
						}
						
					}
					if(spieler == 2)
					{
						if(position[horizontal+1][vertikal-1] == 2 || position[horizontal+1][vertikal-1] == 4)
						{
							feld[horizontal+1][vertikal-1].typ = 1;
							feld[horizontal+1][vertikal-1].repaint();
							position[horizontal+1][vertikal-1] = 1;
							steine_spieler1--;
						}
					}

				}

				if((horizontal > horizontal_1) && (vertikal > vertikal_1))
				{
					if(spieler == 1)
					{
						if(position[horizontal-1][vertikal-1] == 3 || position[horizontal-1][vertikal-1] == 5)
						{
							feld[horizontal-1][vertikal-1].typ = 1;
							feld[horizontal-1][vertikal-1].repaint();
							position[horizontal-1][vertikal-1] = 1;
							steine_spieler2--;
						}
						
					}
					if(spieler == 2)
					{
						if(position[horizontal-1][vertikal-1] == 2 || position[horizontal-1][vertikal-1] == 4)
						{
							feld[horizontal-1][vertikal-1].typ = 1;
							feld[horizontal-1][vertikal-1].repaint();
							position[horizontal-1][vertikal-1] = 1;
							steine_spieler1--;
						}
					}
				}


				
				return true;
			}
			

			
			return false;
		}
	}
}

Fuer ne KI hats bisher nicht gereicht, dazu muesst ich auch vollkommen neu anfangen .. wie man sicher am Code erkennt, hab ich ziemlich Planlos drauflosgeschrieben :D
 
ein kleiner tip, Shark85:

dieses konstrukt aus

Code:
#ifndef _DameHeader_  
#define _DameHeader_ 
 ...  
#endif

benutzt man in c++ nicht mehr. das sind noch so dirty tricks aus c. anstelle davon, benutzt man nun

Code:
#pragma once

einfach die zeile in jede header-datei einfügen und den rest macht der compiler bzw. der präprozessor, um genau zu sein

EDIT: und vielleicht wäre es schlauer das brett nicht in 8 arrays zu unterteilen, sondern in ein 2-dimensionales array. macht eigenltich keinen unterschied, is aber irgendwie logischer

mfg,
pacman
 
Ich habs mir nie angetan die ganzen C++ classen und namespaces zu lernen! Ich benutz immernoch printf.
Der C-Stil gefällt mit besser :D
 
hehe, naja, jeder wie er's mag. aber 'ganzen C++ classen und namespaces' beschränken sich, wenn man nicht zu hoch hinaus will, auf eine hand voll :D

mfg,
pacman
 
ich hab mir jetzt mal ein buch ausgeliehen über C++
da hab ich erst bemerkt dass es so was wie cmap schon gibt! X(
Ich hab mir immer ein TChain template selbst gemacht, was add, del, end, start ... functions hatte.
 
so was müste doch auch in visual basic realisierbar sein oder?
aber ich hab nicht den geringsten ansatz dafür!!!
kann mir vielleciht jemand nen tipp geben`? wäre echt dankbar dafür, weil ich bin noch ziemlicher anfänger in visual basic
 
Zurück
Oben