Ich bin bei einem meiner Vorhaben in Java (mal wieder) an einem Punkt angekommen, an dem mir einfach nichtr einfallen will, wie ich es umsetzen könnte.
Bei dem Brettspiel Dame besteht ja so eine Art "Schlagzwang". Bevor der Spieler einen Zug machen kann, muss also überprüft werden, ob er einen gegnerischen Stein überspringen kann, was er dann auch muss.
Hinzu kommt die Möglichkeit mehrer "Schmisse" in einem einzigen Zug.
Im Moment hab ich nur so überhaupt keinen Plan, wie ich das angehen soll.
Ich zeig am besten mal, wie weit ich "schon" bin.
Ich hoffe, ihr könnt mir meine oftmals evtl. etwas merkwürdige Namensgebung verzeihen ... und meine vielleicht etwas chaotische Art zu programmieren .
PS.: Die Farbwahl könnte ich evtl. ja auch nochmal überdenken.
Bei dem Brettspiel Dame besteht ja so eine Art "Schlagzwang". Bevor der Spieler einen Zug machen kann, muss also überprüft werden, ob er einen gegnerischen Stein überspringen kann, was er dann auch muss.
Hinzu kommt die Möglichkeit mehrer "Schmisse" in einem einzigen Zug.
Im Moment hab ich nur so überhaupt keinen Plan, wie ich das angehen soll.
Ich zeig am besten mal, wie weit ich "schon" bin.
Ich hoffe, ihr könnt mir meine oftmals evtl. etwas merkwürdige Namensgebung verzeihen ... und meine vielleicht etwas chaotische Art zu programmieren .
PS.: Die Farbwahl könnte ich evtl. ja auch nochmal überdenken.
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Hauptfenster extends JFrame{
public static Hauptfenster frame;
private JPanel contentPane = (JPanel) getContentPane();
public Hauptfenster(){
contentPane.setLayout(new BorderLayout());
contentPane.add(new Spielbrett(), BorderLayout.CENTER);
// ... etc.
}
public static void main(String[] args) {
frame = new Hauptfenster();
frame.setTitle("Dame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(800,800));
frame.setVisible(true);
}
}
Java:
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;
public class Spielbrett extends JPanel{
private Feld[][] felder=new Feld[8][8];
private int stein,xwert,ywert;
private boolean amZug=true; // true: unterer Spieler am Zug - false: oberer Spieler am Zug
public Spielbrett(){
setLayout(new GridLayout(8,8));
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if((i+j)%2==1){
int a;
if(i<=2){
a=2;
}else if(i>=5){
a=1;
}else{
a=0;
}
felder[j][i]=new Feld(true,a);
final int x = j;
final int y = i;
felder[j][i].addMouseListener(new MouseListener() {
public void mouseReleased(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {
if(felder[x][y].getStein()==1 && amZug){
if(y-1>=0){
demarkieren();
if(x+1<8 && felder[x+1][y-1].getStein()==0){
felder[x+1][y-1].setMarkiert(true);
}
if(x-1>=0 && felder[x-1][y-1].getStein()==0){
felder[x-1][y-1].setMarkiert(true);
}
stein=1;
xwert=x;
ywert=y;
}
}else if(felder[x][y].getStein()==2 && !amZug){
if(y+1<8){
demarkieren();
if(x+1<8 && felder[x+1][y+1].getStein()==0){
felder[x+1][y+1].setMarkiert(true);
}
if(x-1>=0 && felder[x-1][y+1].getStein()==0){
felder[x-1][y+1].setMarkiert(true);
}
stein=2;
xwert=x;
ywert=y;
}
}else if(felder[x][y].getMarkiert()){
felder[x][y].setStein(stein);
felder[xwert][ywert].setStein(0);
demarkieren();
amZug=(amZug ? false:true);
}
}
});
}else{
felder[j][i]=new Feld(false,0);
}
add(felder[j][i]);
}
}
}
/**
* Wahrscheinlich nicht die eleganteste Möglichkeit,
* die Markierung zweier Felder aufzuheben!
* Holzhammermethode eben ;)
*/
private void demarkieren(){
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if(felder[i][j].getMarkiert()){
felder[i][j].setMarkiert(false);
}
}
}
}
}
Java:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
public class Feld extends JComponent{
private boolean schwarz, markiert;
private int stein;
public Feld(boolean schwarz, int stein){
this.schwarz=schwarz;
this.stein=stein;
}
public void paint (Graphics g){
Rectangle2D.Float rechteck = new Rectangle2D.Float(0,0,getWidth(),getHeight());
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke((markiert ? 10:1)));
if(schwarz){
g2.setPaint(new Color(140,140,200));
}else{
g2.setPaint(new Color(200, 200, 220));
}
g2.fill(rechteck);
if(markiert) g2.setPaint(Color.BLACK);
g2.draw(rechteck);
if(stein!=0){
Ellipse2D.Float kreis = new Ellipse2D.Float(getWidth()/10, getHeight()/10,
getWidth()*4/5, getHeight()*4/5);
switch(stein){
case 1:
g2.setPaint(new Color(60,60,60));
break;
case 2:
g2.setPaint(new Color(210, 210, 210));
break;
}
g2.fill(kreis);
g2.draw(kreis);
}
}
public int getStein(){
return stein;
}
public void setStein(int stein){
this.stein=stein;
repaint();
}
public boolean getMarkiert(){
return markiert;
}
public void setMarkiert(boolean markieren){
markiert=markieren;
repaint();
}
}