Bondesjakk.java [Last ned]

/* 
 * Brukergrensesnitt for bondesjakkprogrammet.
 * 
 */
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class Bondesjakk extends JPanel implements MouseListener {
 
  private static final int MARG       = 50;
  private static final int BOKS       = 50;
  private static final int ANT_BOKSER = 10;
  private static final int ANT_PÅ_RAD =  5;
  private static final int BREDDE     = MARG*2 + BOKS*ANT_BOKSER;
  private static final int HØYDE      = MARG*3 + BOKS*ANT_BOKSER;
 
  private Brett            B;
  private MaskinSpiller    M;
 
 
  public static void main(String[] args) {
    JFrame app = new JFrame();
    app.setTitle("Bondesjakk");
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
    Bondesjakk panel = new Bondesjakk();
    app.add(panel, BorderLayout.CENTER);
 
    app.setSize(BREDDE, HØYDE);
    app.setResizable(false);
    app.setLocationRelativeTo(null);
    app.setVisible(true);
  }
 
 
  public Bondesjakk() {
    B = new Brett(ANT_BOKSER, ANT_PÅ_RAD);
    M = new MaskinSpiller(B);
    addMouseListener(this);
  }
 
 
  // Tegner spillbrettet på nytt
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
 
    for (int r=0; r<B.sidelengde(); r++)
      for (int k=0; k<B.sidelengde(); k++) {
        int x = xKoord(k);
        int y = yKoord(r);
        tegnRute(g, x, y);
        boolean uthevet = B.sisteTrekk(r, k) || B.påSeiersRekke(r, k);
 
        if (B.spillerRute(r, k, Brett.SPILLER1))
          tegnRunding(g, x, y, uthevet);
        else if (B.spillerRute(r, k, Brett.SPILLER2))
          tegnKryss(g, x, y, uthevet);
      }
 
    if (B.avgjort())
      skrivMelding(g);
  }
 
 
  // Brukeren har gjort et trekk
  public void mouseClicked(MouseEvent e) {
    if (B.avgjort())
      B.nullstill();
    else {
      int r = rad(e.getY());
      int k = kol(e.getX());
      if (B.ledigRute(r, k)) {
        B.trekk(r, k, Brett.SPILLER1);
        if (!B.avgjort())
          M.trekk();
      }
    }
 
    repaint();
  }
 
 
  public void mouseEntered(MouseEvent e)  { }
  public void mouseExited(MouseEvent e)   { }
  public void mousePressed(MouseEvent e)  { }
  public void mouseReleased(MouseEvent e) { }
 
 
 
  // Omregning mellom skjermkoordinater og indekser i spillbrettet.
 
  private int kol(int x) {
    return (x-MARG) / BOKS;
  }
 
  private int rad(int y) {
    return (y-MARG) / BOKS;
  }
 
  private int xKoord(int kol) {
    return MARG + (kol*BOKS);
  }
 
  private int yKoord(int rad) {
    return MARG + (rad*BOKS);
  }
 
 
 
  // Tegne ruter, "kryss" og "rundinger"
 
  private void tegnRute(Graphics g, int x, int y) {
    g.drawRect(x, y, BOKS, BOKS);
  }
 
 
  private void tegnRunding(Graphics g, int x, int y, boolean skalMarkeres) {
    int luft = Math.max(2, BOKS/20);
    x = x+luft;
    y = y+luft;
    int lengde = BOKS-luft*2;
 
    int tykkelse = Math.max(2, BOKS/10);
    if (skalMarkeres)
      g.setColor(Color.red);
    else
      g.setColor(Color.green);
 
    g.fillOval(x, y, lengde, lengde);
    g.setColor(this.getBackground());
    g.fillOval(x+tykkelse, y+tykkelse, lengde-tykkelse*2, lengde-tykkelse*2);
    g.setColor(Color.black);
  }
 
 
  private void tegnKryss(Graphics g, int x, int y, boolean skalMarkeres) {
    int luft = Math.max(2, BOKS/20);
    x = x+luft; 
    y = y+luft; 
    int lengde = BOKS-luft*2;
 
    int tykkelse  = Math.max(2, BOKS/10);
    int[] xKoord  = {x, x+tykkelse, x+lengde, x+lengde-tykkelse};
    int[] yKoord  = {y+tykkelse, y, y+lengde-tykkelse, y+lengde};
    int[] xKoord2 = {x+lengde, x+lengde-tykkelse, x, x+tykkelse};
 
    if (skalMarkeres)
      g.setColor(Color.red);
    else
      g.setColor(Color.blue);
 
    g.fillPolygon(xKoord,  yKoord, yKoord.length);
    g.fillPolygon(xKoord2, yKoord, yKoord.length);
    g.setColor(Color.black);
  }
 
 
  // Skriver kvittering på skjermen når spillet er avgjort.
  private void skrivMelding(Graphics g) {
    String melding = "";
    if (B.spillerVant(B.SPILLER1)) {
      melding = "Gratulerer, du vant!";
    }
    else if (B.spillerVant(B.SPILLER2)) {
      melding = "Bedre lykke neste gang!";
    }
    else if (B.uavgjort())
      melding = "Det ble uavgjort. Takk for spillet!";
 
    melding += " Klikk for nytt spill...";
 
    g.setColor(Color.red);
    g.setFont(new Font("TimesRoman", Font.BOLD, Math.max(14, BOKS/3)));
    g.drawString(melding, MARG, MARG/2+((ANT_BOKSER+1)*BOKS));
    g.setColor(Color.black);
  }
 
}
 
Kildekode blir vist ved hjelp av GeSHi.