Hallo,
ich musste als Scheinaufgabe ein Spiel inkl. GUI programmieren. Vielleicht kann das dem ein oder anderem helfen, wenn er mal dieselbe Aufgabe zu lösen hat. Ist allerdings schlecht dokumentiert. Bestimmt kann man es verbessern oder erweitern.
Alles anzeigen
Alles anzeigen
Im Anhang befindet sich das Spiel als ausführbares jar-Archiv in ein ZIP-Packet verpackt. Im Jar-Archiv befinden sich auch die png's.
ps.: es können nur zwei menschliche Spieler gegeneinander spielen.
ich musste als Scheinaufgabe ein Spiel inkl. GUI programmieren. Vielleicht kann das dem ein oder anderem helfen, wenn er mal dieselbe Aufgabe zu lösen hat. Ist allerdings schlecht dokumentiert. Bestimmt kann man es verbessern oder erweitern.
Quellcode
- import java.awt.*;
- import javax.swing.*;
- import java.net.*;
- import java.awt.event.*;
- public class Test extends JFrame
- {
- private Spiel game = new Spiel(this);
- private static final long serialVersionUID = 1L;
- private JButton[] button = new JButton[7];
- private JLabel[] field = new JLabel[42];
- private JLabel display;
- private JPanel centerPanel;
- JMenuItem neu;
- private Icon g;
- private Icon r;
- URL resc = ImageIcon.class.getResource( "/images/unten.png" );
- URL rescGreen = ImageIcon.class.getResource( "/images/apple-green.png" );
- URL rescRed = ImageIcon.class.getResource( "/images/apple-red.png" );
- public Test() throws UnsupportedLookAndFeelException,
- ClassNotFoundException, IllegalAccessException, InstantiationException
- {
- super("Vier Gewinnt");
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- JMenuBar menu = new JMenuBar();
- JMenu option = new JMenu("Spiel");
- neu = new JMenuItem("Neues Spiel starten");
- option.add(neu); menu.add(option); //setJMenuBar(menu);
- UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
- Icon icon = new ImageIcon( resc );
- g = new ImageIcon(rescGreen);
- r = new ImageIcon(rescRed);
- display = new JLabel("Rot beginnt.");
- JPanel menuPanel = new JPanel();
- menuPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
- menuPanel.add(menu);
- centerPanel = new JPanel();
- centerPanel.setLayout(new GridLayout(7,7));
- centerPanel.setBackground(Color.BLACK);
- JPanel labelPanel = new JPanel();
- labelPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
- labelPanel.add(display);
- add(menuPanel, BorderLayout.NORTH);
- add(centerPanel, BorderLayout.CENTER);
- add(labelPanel, BorderLayout.SOUTH);
- for(int i = 0; i<7; i++)
- {
- button[i] = new JButton(icon);
- button[i].addActionListener(this.game);
- centerPanel.add(button[i]);
- }
- for(int i = 0; i<42; i++)
- {
- field[i] = new JLabel();
- field[i].setBorder(BorderFactory
- .createLineBorder(Color.WHITE));
- centerPanel.add(field[i]);
- }
- ActionListener al = new ActionListener()
- {
- public void actionPerformed(ActionEvent ae)
- {
- Object object = ae.getSource();
- if(object == neu)
- {
- for(int i = 0; i<7; i++)
- {
- // falls jemand waehrend des Spiels neu starten will
- button[i].removeActionListener(game);
- game.clean();
- button[i].addActionListener(game);
- }
- for(int i = 0; i<42; i++)
- {
- field[i].setIcon(null);
- }
- }
- }
- };
- neu.addActionListener(al);
- setSize(347, 409);
- }
- public JButton getButton(int i)
- {
- return button[i];
- }
- public void setIcon(int i, int color)
- {
- if(color == 0)
- field[i].setIcon(g);
- if(color==1)
- field[i].setIcon(r);
- }
- public void setDisplay(String s)
- {
- display.setText(s);
- }
- public void gameOver()
- {
- for(int i = 0; i<7; i++)
- button[i].removeActionListener(game);
- }
- public static void main(String[] args)
- {
- try{Test fläche = new Test();
- fläche.setVisible(true);}
- catch(Exception e){}
- System.out.println("FOO");
- }
- }
Quellcode
- import java.awt.event.*;
- import javax.swing.JOptionPane;
- public class Spiel implements ActionListener
- {
- private int[][] board;
- private boolean red = true;
- //private boolean green = false;
- private Test gui;
- // Zeilenindizes werden von 5 bis auf 0 dekrementiert
- private int[] row = {5, 5, 5 ,5 ,5, 5, 5};
- // nummerische Werte der letzten Felder im Swing-Container
- private int[] index = {35, 36, 37, 38, 39, 40, 41};
- public Spiel(Test gui)
- {
- this.gui = gui;
- board = new int[6][7];
- }
- public void setField(int i, int j, int y)
- {
- board[i][j] = y;
- }
- public void actionPerformed(ActionEvent e)
- {
- Object button = e.getSource();
- for(int i = 0; i < 7; i++)
- {
- try
- {
- if(button == gui.getButton(i))
- {
- if(red)
- {
- gui.setIcon(index[i], 1);
- setField(row[i], i, 1);
- red = false; //green = true;
- index[i] -= 7;
- pruefeHorizontal(i, 1);
- pruefeVertikal(row[i], 1);
- pruefeDiagonal(1);
- row[i]--;
- gui.setDisplay("Gruen ist am Zug.");
- break;
- }
- else // (green)
- {
- gui.setIcon(index[i], 0);
- setField(row[i], i, 2);
- red = true; //green = false;
- index[i] -=7;
- pruefeHorizontal(i, 2);
- pruefeVertikal(row[i], 2);
- pruefeDiagonal(2);
- row[i]--;
- gui.setDisplay("Rot ist am Zug.");
- break;
- }
- }
- }
- catch(ArrayIndexOutOfBoundsException ex)
- {
- gui.setDisplay("Spalte ist voll!");
- //ex.printStackTrace();
- break;
- }
- }
- }
- /* Ueberprueft, ob es horizontale Vierer-Reihen
- * von der Farbe f in der Spalte c gibt.
- * */
- public void pruefeHorizontal(int c, int f)
- {
- int win = 0;
- for(int j = 5; j >= 0; j--)
- {
- if(j<5)
- {
- if(board[j][code=c]==f && board[j+1][code=c]==f)
- win++;
- if(win==3)
- {
- gewonnen(f); clean();
- gui.gameOver();
- break;
- }
- }
- }
- }
- /* Ueberprueft, ob es vertikale Vierer-Reihen
- * von der Farbe f in der Zeile r gibt.
- * */
- public void pruefeVertikal(int r, int f)
- {
- int win = 0;
- for(int j = 0; j <= 6; j++)
- {
- if(j<6)
- {
- if(board[r][j]==f && board[r][j+1]==f)
- win++;
- if(win==3)
- {
- gewonnen(f); clean();
- gui.gameOver();
- break;
- }
- }
- }
- }
- /*Ueberprueft alle moglichen Vierer-Diagonalen
- * */
- public void pruefeDiagonal(int f)
- {
- int win = 0;
- /* uebepruefe alle -potenziellen- Vierer-Diagonalen
- von links unten nach rechts oben
- */
- for(int i = 0; i < 4; i++)
- {
- for(int j = 3; j < 6; j++)
- {
- win = 0;
- int tmp = j;
- for(int y = i; y < 6; y++)
- {
- if(tmp>0)
- {
- if(board[tmp][y]==f && board[tmp-1][y+1]==f)
- win++;
- if(win==3)
- {
- gewonnen(f); clean();
- gui.gameOver();
- break;
- }
- }
- tmp--;
- }
- }
- }
- int win2 = 0;
- /* uebepruefe alle -potenziellen- Vierer-Diagonalen
- von rechts unten nach links oben
- */
- for(int i = 6; i > 3; i--)
- {
- for(int j = 3; j < 6; j++)
- {
- win2 = 0;
- int tmp = j;
- for(int y = i; y > 0; y--)
- {
- if(tmp>0)
- {
- if(board[tmp][y]==f && board[tmp-1][y-1]==f)
- {
- win2++;
- }
- if(win2==3)
- {
- gewonnen(f); clean();
- gui.gameOver();
- break;
- }
- }
- tmp--;
- }
- }
- }
- }
- // Arrays saeubern und wiederherstellen für neues Spiel
- public void clean()
- {
- int nI = 35;
- for(int i = 0; i < 7; i++)
- {
- row[i] = 5;
- index[i] = nI; nI++;
- for(int j = 0; j < 6; j++)
- {
- board[j][i] = 0;
- }
- }
- red = true;
- gui.setDisplay("Rot beginnt");
- }
- public void gewonnen(int farbe)
- {
- if(farbe==1)
- JOptionPane.showMessageDialog(null, "Rot hat gewonnen!" );
- if(farbe==2)
- JOptionPane.showMessageDialog(null, "Gruen hat gewonnen!" );
- }
- }
Im Anhang befindet sich das Spiel als ausführbares jar-Archiv in ein ZIP-Packet verpackt. Im Jar-Archiv befinden sich auch die png's.
ps.: es können nur zwei menschliche Spieler gegeneinander spielen.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von muhammad ()