StartenSteuern:
HTML-Code:
package programm;
import javax.swing.JFrame;
import java.awt.event.*;
import javax.swing.JOptionPane;
/**
* @author Max
* @version 1.6
* @date 16.06.2013
*/
public class StartenSteuern {
public static void main(String[] args){
anfangsnachrichten();
fenster();
}//end main
public static void anfangsnachrichten(){ //Die Willkommens-Popups am Anfang. Die Möglichkeit hab ich im Internet gefunden.
JOptionPane.showMessageDialog(null, "Hallo und Herzlichst Willkommen bei unserem kleinen \"Vier Gewinnt\" Projekt\n mit der Programmiersprache Java in ITS Anwendungsentwicklung.", "Willkommen", JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null, "Die Regeln von \"Vier Gewinnt\" sollten eigenltich klar sein, hier aber nochmal zur Sicherheit:\n- Ziel des Spieles ist es, vier (4) Steine einer Farbe entweder horizontal, vertikal oder diagonal\n in eine Reihe zu bekommen.\n- Die Spieler setzen abwechselnd jeweils einen Stein an die gewünschte Stelle, indem sie\n auf die gewünschte Spalte klicken. Anmerkung: Die Steine können natürlich\n nur von oben nach unten runterrollen :) \n- In diesem Programm beginnt als erstes die Farbe \"gelb\".", "Regeln", JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null, "Gelb beginnt!", "Viel Spaß", JOptionPane.INFORMATION_MESSAGE);
//JOptionPane.showConfirmDialog(null, "U CAN HAS PHFUN WIF DIS =)");
}//end Anfangsnachrichten
public static void fenster(){
Ansicht a = new Ansicht(new Spielfeld());
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter(){ //eigene kleine Klasse extra fürs Beenden des Spiels.
public void windowClosing(WindowEvent e){
System.exit(0);
}//end wClosing
}); //end wAdapter
frame.setSize(708, 630);
frame.setResizable(false);
frame.getContentPane().add(a);
frame.setVisible(true);
}//end fenster
}//end class
Spielfeld:
HTML-Code:
package programm;
/**
* @author Max
* @version 1.6
* @date 16.06.2013
*/
public class Spielfeld {
public Spielfeld(){
ruecksetzen();
}//end Spielfeld
public enum Stein{ //Enum im Internet gefunden, soll mir werte (0,1) als Name (rot, gelb) erstellen (einfacher zu merken für mich)
kein, //Kein Stein
rot, //Roter ~
gelb //gelber ~
}//end enum
public void ruecksetzen(){ //erklärt sich unten von selbst
for(int x=0;x<7;x++){ //spielfeld auf x-achse durchgehen
for(int y=0;y<6;y++){ //spielfeld auf y-achse durchgehen
Steine[x][y] = Stein.kein; //evtl. vorhandene Steine werden entfernt
}//end forY
}//end forX
}//end ruecksetzung
public int SteinSetzen(int x, Stein s){ //Überprüfung des Setzens eines Steines
if(x>6){ //darf nicht rechts der X-Achse sein
return -1;
}else if(s == Stein.kein){ //darf nicht keinStein gesetzt werden
return -1;
}else if(Steine[x][0]!= Stein.kein){ //darf nicht setzen wo Spalte voll ist
return -1;
}//end if
int y;
for(y=0;y<6;y++){ //Überprüfe solange ob Feld leer....
if(Steine[x][y] != Stein.kein){ //...bis Feld nichtmehr leer...
break; //...und unterbreche die Schleife...
}//end if
}//end for
y = y-1; //...dann erniedrige den Wert y um 1 => Y-Koordinate von letztem freien Feld von oben
Steine[x][y] = s; //Stein wird gesetzt.
return y; //Stein erfolgreich gesetzt :)
}//end SteinSetzen
public Stein SteinLesen(int x, int y){ //Hilfsroutine für die Überprüfung ob gesetzer Stein des Spielers das Spiel gewinnt
if(x<0){ //Stein links außerhalb des Spielfeldes
return Stein.kein;
}else if(x>6){ //Stein rechts außerhalb des Spielfeldes
return Stein.kein;
}else if(y<0){ //Stein oben außerhalb des Spielfeldes
return Stein.kein;
}else if(y>5){ //Stein unten außerhalb des Spielfeldes
return Stein.kein;
} //end if
return Steine[x][y];
}//end SteinLesen
public boolean gewonnen(int x, int y, Stein s){ //Überprüfung ob gewonnen und Ausgabe einer Benachrichtigung
//======horizontale Überprüfung auf Gewinn
int zaehler = 1; //Stein ist gesetzt => zaehler=1
for(int zx=x+1;zx<x+4;zx++){ //Überprüfung nach rechts
if(SteinLesen(zx,y) == s){
zaehler = zaehler + 1;
}else{
break;
}//end if
}//end for
for(int zx=x-1;zx>x-4;zx--){ //Überprüfung nach links
if(SteinLesen(zx,y) == s){
zaehler = zaehler + 1;
}else{
break;
}//end if
}//end for
if(zaehler>=4){ //Wenn zaehler >=4 => gewonnen
return true;
} //end if
//=======vertikale Überprüfung
zaehler = 1;
for(int zy=y+1;zy<y+4;zy++){ //Überprüfung nach unten. "Oben" ist nicht notwendig, da unlogisch in Vier Gewinnt (Steine fallen von oben runter).
if(SteinLesen(x,zy) == s){
zaehler = zaehler + 1;
}else{
break;
}//end if
}//end for
if(zaehler>=4){ //Wenn zaehler >=4 => ebenfalls gewonnen
return true;
} //end if
//=======diagonale Überprüfung
zaehler = 1;
for(int zx=(x+1), zy=(y+1);zx<(x+4);zx++,zy++){ //Diagonal nach unten rechts, ergibt sich dadurch, dass Y und X Wert jeweils um 1 erhöht wird
if(SteinLesen(zx,zy) == s){
zaehler = zaehler + 1;
}else{
break;
}//end if
}//enf for
for(int zx=(x-1), zy=(y-1);zx>(x-4);zx--,zy--){ //Diagonal nach oben links
if(SteinLesen(zx,zy) == s){
zaehler = zaehler + 1;
}else{
break;
}//end if
}//enf for
if(zaehler>=4){ //Wenn zaehler >=4 => gewonnen
return true;
}//end if
zaehler = 1;
for(int zx=(x+1), zy=(y-1);zx<(x+4);zx++,zy--){ //Diagonal nach oben rechts
if(SteinLesen(zx,zy) == s){
zaehler = zaehler + 1;
}else{
break;
}//end if
}//enf for
for(int zx=(x-1), zy=(y+1);zx>(x-4);zx--,zy++){ //Diagonal nach unten links
if(SteinLesen(zx,zy) == s){
zaehler = zaehler + 1;
}else{
break;
}//end if
}//enf for
if(zaehler>=4){ //Wenn zaehler >=4 => gewonnen
return true;
}//end if
return false;
}//end boolean
public Stein[][] Steine = new Stein[7][6]; //[X][Y]-"Achsen"
}
Ansicht:
HTML-Code:
package programm;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.*;
import javax.swing.JOptionPane;
import programm.Spielfeld.Stein;
/**
* @author Max Gembe und Evan Arnold
* @version 1.6
* @date 16.06.2013
*/
class Ansicht extends Canvas implements MouseListener { //MouseListener hab ich im Internet gefunden und erm�glicht es der Klasse, Mausereignisse aufzuzeichnen & zu verarbeiten.
//private static Color farbe = new Color(red, green, blue);
private static Color schwarz = new Color(0, 0, 5); //Definierung der Farben aus dem RGB Farbraum
private static Color rot = new Color(240, 10, 1);
private static Color gelb = new Color(230, 180, 0);
private static Color blau = new Color(0, 0, 90);
public Ansicht(Spielfeld sf){
spielfeld = sf;
setBackground(blau);
this.addMouseListener(this); //'Ansicht' kann hiermit die eigenen MouseEvents empfangen |Quelle: Cousin
}//end Ansicht
public void paint(Graphics g){
zeichnen(g);
}//end paint
public void zeichnen(Graphics g){
g.setColor(schwarz);
for(int x=100;x<700;x+=100){ //Linienzeichnen mit 100Px Abstand für waagrechte Trennlinien
g.drawLine(x, 0, x, 600);
g.drawLine((x+1), 0, (x+1), 600); //2Px-Linie, sieht geiler aus ;)
}//end waagrechte Linien
for(int y=0;y<600;y+=100){ //for-schleife für senkrechte Trennlinien ebenfalls mit 100Px Abstand
g.drawLine(0, y, 700, y);
g.drawLine(0, (y+1), 700, (y+1)); //erneut 2Px-Linie
}//end senkrechte Linien
for(int x=0;x<7;x++){
for(int y=0;y<6;y++){
g.setColor(schwarz);
g.fillOval((x*100)+2, (y*100)+2, 96, 96); //Schwarze Kreise = Hintergrund
if(spielfeld.Steine[x][y] == Spielfeld.Stein.rot){ //Wenn Spieler "rot" dran is...
g.setColor(rot); //...setze ROT als Farbe
g.fillOval((x*100)+2, (y*100)+2, 96, 96);
}else if(spielfeld.Steine[x][y] == Spielfeld.Stein.gelb){ //und andersrum
g.setColor(gelb);
g.fillOval((x*100)+2, (y*100)+2, 96, 96);
}//end if
}//end forY
}//end forX
}//end zeichnen
public Spielfeld spielfeld;
Spielfeld.Stein aktuellerStein = Spielfeld.Stein.gelb;
public void mouseClicked(MouseEvent e){ //Durch Klicken weiß das Programm die X-Koordinaten des gesetzten Steines. Y-Koordinate ist egal, da die Steine immer nur von oben eingeworfen werden können
int xP = e.getX(); //X-Koordinate der Maus in Pixeln
int x = xP/100; //Spielfeldkoordinate des Steines: Stein ist 100Px breit
int y = spielfeld.SteinSetzen(x, aktuellerStein);
if(y != -1){ //Steinwechsel passiert nur, wenn Stein erfolgreich gesetzt werden konnte
zeichnen(this.getGraphics()); //Stein gesetzt => Neuzeichnung des Spielfeldes
if(spielfeld.gewonnen(x, y, aktuellerStein)){
JOptionPane.showMessageDialog(null, ""+aktuellerStein + " hat gewonnen!", "Gewonnen!", JOptionPane.PLAIN_MESSAGE);
spielfeld.ruecksetzen(); //Nach "Gewonnen" wird das Spielfeld zurückgesetzt
aktuellerStein = Spielfeld.Stein.gelb; //und Gelb beginnt wieder
zeichnen(this.getGraphics()); //Neuzeichnung again
return;
}//end if gewonnen
if (aktuellerStein == Spielfeld.Stein.gelb){ //Wenn gelb dran war...
aktuellerStein = Spielfeld.Stein.rot; //...ist jetzt Rot dran
}else{
aktuellerStein = Spielfeld.Stein.gelb; //Wenn nicht (also Rot dran war), dann ist jetzt Gelb dran.
} //end if
JOptionPane.showMessageDialog(null, "Jetzt ist wieder " +aktuellerStein + " dran.", "" +aktuellerStein, JOptionPane.PLAIN_MESSAGE); //Benachrichtigung, wer dran ist
} //end if
} //end mouseClicked
//===================
//Das nachfolgende hat Java von mir regelrecht verlangt und spielt sonst keine große Rolle:
public void mouseEntered(MouseEvent e){
} //end mouseEntered
public void mouseExited(MouseEvent e){
} //end mouseExited
public void mousePressed(MouseEvent e){
} //end mousePressed
public void mouseReleased(MouseEvent e){
} //end mouseReleased
}//end class Ansicht