Hi,
ich habe ein Programm dass aus mehreren public Klassen besteht. In der RevSpielfeldx Klasse gibt es ein Array das mit Werten von 0-3 befüllt ist. In dieser Klasse habe ich auch eine public int Methode ermittleFeldwert(int i,int j) die den Status jeden Feldes angeben soll. Wenn ich diese Methode mit "Objekt dieser Klasse".ermittleFeldwert(int,int) aus der FileChooserReversi Klasse aufrufe, es sei gesagt sie sind im gleichen Package, dann wird eine NullPointerException geworfen. Beide Klassen sind public, und meiner Meinung müßte es funktionieren, aber....
Bin für jeden Tip dankbar
ich habe ein Programm dass aus mehreren public Klassen besteht. In der RevSpielfeldx Klasse gibt es ein Array das mit Werten von 0-3 befüllt ist. In dieser Klasse habe ich auch eine public int Methode ermittleFeldwert(int i,int j) die den Status jeden Feldes angeben soll. Wenn ich diese Methode mit "Objekt dieser Klasse".ermittleFeldwert(int,int) aus der FileChooserReversi Klasse aufrufe, es sei gesagt sie sind im gleichen Package, dann wird eine NullPointerException geworfen. Beide Klassen sind public, und meiner Meinung müßte es funktionieren, aber....
Bin für jeden Tip dankbar
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class RevSpielfeldx extends JInternalFrame implements MouseListener,
Serializable{// JInternalFrame
//Instanzvariablen
int zähler = 0;
int Höhe = 14;//RevStartx.tse;
int Breite =Höhe;
Felder[][] SFeld = new Felder[Höhe][Breite];
//JButton[][] SFeld = new JButton[Höhe][Breite];
JTextField zug;
JTextField test;
JTextField test2;
//Gasis Änderung 1
JTextField spielerdran;
ReversiMaster des;
JTextField steine1;
JTextField steine2;
int aktspieler=0;
int FeldKoordinate;
boolean gegenComputer;
//static Felder[][] UndoFeld=new Felder[Höhe][Breite];
int[][] UndoFeld=new int[Höhe][Breite];
//static int undoX;
//static int undoY;
int xx;
int yy;
int[][] SpeichernFeld=new int[Höhe][Breite];
Spiellogik loki;
static String pname1;
static String pname2;
static Color sfarbe1, sfarbe2;
static String farbstr1, farbstr2;
//---Init-Methode---------------------------------------------------------------
public RevSpielfeldx(){}
public RevSpielfeldx(ReversiMaster df,String x,String y,boolean z, int größe,Color farbe1,Color farbe2,
String fawahl, String fawahl2){//ReversiMaster df) {
super(""+x+" vs "+y,true,true);
final int[][] SpeiFeld=new int[Höhe][Breite];
des = df;
pname1=x;
pname2=y;
gegenComputer=z;
Höhe=größe;
sfarbe1=farbe1;
sfarbe2=farbe2;
farbstr1=fawahl;
farbstr2=fawahl2;
Breite=größe;
setSize(600,400);
setIconifiable(true);
setResizable(false);
setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
loki =new Spiellogik(Höhe,Breite,gegenComputer,SFeld,zähler);
JSplitPane main =new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); //Das Fenster wird durch eine
//JSplitPane geteilt
JPanel spielfeld = new JPanel(); //Die linke Seite zeigt das
spielfeld.setMinimumSize(new Dimension(400,400)); //Spielfeld
spielfeld.setPreferredSize(new Dimension(400,400));
spielfeld.setLayout(new BorderLayout(1,1));
JPanel center = new JPanel();
center.setLayout(new GridLayout(Höhe,Breite));
center.setSize(400,400);
//SFeld[Höhe-1][Breite-1]=new Felder();
for (int i=0; i<Höhe; i++){ //Baut Spielfeld
for(int j =0; j<Breite; j++){ //mit Hilfe der Klasse
//"Felder" auf
SFeld[i][j] = new Felder(i,j);
SFeld[i][j].addMouseListener(this);
center.add(SFeld[i][j]);
}
}
SFeld[Höhe/2][Breite/2].setState(1); //Baut Startaufstellung
SFeld[Höhe/2][Breite/2-1].setState(1); //auf
SFeld[Höhe/2-1][Breite/2].setState(0);
SFeld[Höhe/2-1][Breite/2-1].setState(0);
//sucheZüge();
spielfeld.add(center);
JPanel status =new JPanel(); //Die rechte Seite ist für
status.setMinimumSize(new Dimension(200,400)); //Statusanzeigen vorgesehen
status.setPreferredSize(new Dimension(200,400));
zug =new JTextField("Spielzug: "+(zähler+1),13);
zug.setEditable(false);
test =new JTextField("Feld: ",13);
test.setEditable(false);
test2 =new JTextField("State: ",13);
test2.setEditable(false);
spielerdran=new JTextField(zähler%2==0?""+pname1+" ist am Zug":""+pname2+" ist am Zug",13);
spielerdran.setEditable(false);
steine1=new JTextField(""+farbstr2+"e Steine: "+loki.zähleWeisseSpielsteine(),13);
steine1.setEditable(false);
steine2=new JTextField(""+farbstr1+"e Steine: "+loki.zähleSchwarzeSpielsteine(),13);
steine2.setEditable(false);
status.add(zug);
status.add(test);
status.add(test2);
status.add(spielerdran);
status.add(steine1);
status.add(steine2);
main.setLeftComponent(spielfeld);
main.setRightComponent(status);
Container ois=getContentPane();
ois.add(main);
JMenuBar mb = new JMenuBar(); //Hier wird das Menu gebaut
JMenu datei = new JMenu("Datei");
datei.setMnemonic('D');
JMenuItem neu = new JMenuItem("Neues Spiel");
neu.setMnemonic('N');
neu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
des.addChild(new RevStartx(des),600,400);
}});
JMenuItem save= new JMenuItem("Speichern");
save.setMnemonic('S');
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
//System.out.println("speichern");
//SpeichernUndLaden.speichern();
Konsole.run (new FileChooserReversi(Höhe,Höhe,SpeiFeld),400,200);
}});
JMenuItem load= new JMenuItem("Laden");
load.setMnemonic('L');
load.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
Konsole.run (new FileChooserReversi(),400,200);
//laden();
}});
JMenuItem quit= new JMenuItem("Beenden");
quit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
setVisible(false);
}});
datei.add(neu);
datei.addSeparator();
datei.add(save);
datei.add(load);
datei.addSeparator();
datei.add(quit);
JMenu option = new JMenu("Optionen");
option.setMnemonic('p');
JMenuItem undo = new JMenuItem("Undo");
undo.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//System.out.println("Undo");
undo_aufrufen();
}});
undo.setMnemonic('U');
/* JMenu stauf= new JMenu("Startaufstellung");
stauf.setMnemonic('t');
JMenuItem kla =new JMenuItem("klassisch");
JMenuItem mod =new JMenuItem("modern");
stauf.add(kla);
stauf.add(mod);*/
option.add(undo);
option.addSeparator();
// option.add(stauf);
/* JMenu frage = new JMenu ("?");
JMenuItem about = new JMenuItem("About");
JMenuItem zusp = new JMenuItem("Über das Spiel");
frage.add(zusp);
frage.addSeparator();
frage.add(about);*/
mb.add(datei);
mb.add(option);
// mb.add(frage);
setJMenuBar(mb);
setVisible(true);
sucheNachSetzbarenFeldern();
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
SpeiFeld[i][j]=SFeld[i][j].getState();
System.out.println(SpeiFeld[i][j]);
}
}
}
//---Main-Methode---------------------------------------------------------------
public static void main(String[] args) {
//Konsole.run(new RevSpielfeldx(),600,400);
}
//---Methoden-------------------------------------------------------------------
public void mouseExited(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
}
public void mousePressed(MouseEvent e){
}
public void mouseClicked(MouseEvent e){
Felder eld = (Felder)e.getSource();
int x = eld.getIDx();
int y = eld.getIDy();
try{
if((gegenComputer)&&(zähler%2==0)){
spielroutine(x,y);
spielroutine(loki.xKoordinate,loki.yKoordinate);
}
else{
spielroutine(x,y);
}
}catch(StackOverflowError overflow){
System.out.println("Sie haben ein falsches Feld gewählt");
}
}
//Gasis krasse Funktionen
public void sucheNachSetzbarenFeldern(){
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
//Prüfe ob das Feld leer ist
if(SFeld[i][j].getState()==2){
//Wenn zähler%2==0 dann ist Spieler1 dran ansonsten Spieler2
if(zähler%2==0){
//System.out.println("hallo");
//Wenn unter dem leeren Feld ein Feld mit dem Status 1 ist
loki.überprüfenachunten(0,1);
loki.überprüfenachoben(0,1);
loki.überprüfenachlinks(0,1);
loki.überprüfenachrechts(0,1);
loki.überprüfediagonallinksoben(0,1);
loki.überprüfediagonallinksunten(0,1);
loki.überprüfediagonalrechtsoben(0,1);
loki.überprüfediagonalrechtsunten(0,1);
}
//Spieler 2 ist dran
else if(zähler%2==1){
loki.überprüfenachunten(1,0);
loki.überprüfenachoben(1,0);
loki.überprüfenachlinks(1,0);
loki.überprüfenachrechts(1,0);
loki.überprüfediagonallinksoben(1,0);
loki.überprüfediagonallinksunten(1,0);
loki.überprüfediagonalrechtsoben(1,0);
loki.überprüfediagonalrechtsunten(1,0);
}
}
}
}
}
public void setzeStein(int x,int y,int zähler){
if(zähler%2==0){
SFeld[x][y].setState(0);
}
else{
SFeld[x][y].setState(1);
}
}
public void hintergrundAufGrünSetzen(){
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
SFeld[i][j].setBackground(Color.GREEN);
}
}
}
public void alleLeerenFelderAuf2Setzen(){
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
if(SFeld[i][j].getState()==3){
SFeld[i][j].setState(2);
}
}
}
}
public void keineSetzbarenFelder(){
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
if(SFeld[i][j].getState()==3){
return;
}
}
}
System.out.println("Das Spiel ist zu Ende da kein Stein mehr gesetzt werden kann");
if(loki.zähleWeisseSpielsteine()>loki.zähleSchwarzeSpielsteine()){
System.out.println(""+pname1+" hat das Spiel gewonnen");
dialogbox_erzeugen();
}
else if(loki.zähleWeisseSpielsteine()<loki.zähleSchwarzeSpielsteine()){
System.out.println(""+pname2+" hat das Spiel gewonnen");
dialogbox_erzeugen();
}
else{
System.out.println("Remis-Die Spieler waren ebenbürtige Gegner");
dialogbox_erzeugen();
}
}
public void spielroutine(int x,int y){
undo();
zug.setText("Spielzug: "+(zähler+1));
test.setText("Feld: "+x+", "+y);//FeldKoordinate);
test2.setText("State: "+SFeld[x][y].getState());
//Beim Wert 3 kann ein Stein gesetzt werden
// loki.spielerWechseln();
if(SFeld[x][y].getState()==3){
setzeStein(x,y,zähler);
dreheSteineUm(x,y);
zähler++;
sucheNachSetzbarenFeldern();
}
else{
spielroutine(x,y);
}
zug.setText("Spielzug: "+(zähler+1));
spielerdran.setText(zähler%2==0?""+pname1+" ist am Zug":""+pname2+" ist am Zug");
steine1.setText(""+farbstr2+"e Steine: "+loki.zähleWeisseSpielsteine());
steine2.setText(""+farbstr1+"e Steine: "+loki.zähleSchwarzeSpielsteine());
hintergrundAufGrünSetzen();
alleLeerenFelderAuf2Setzen();
sucheNachSetzbarenFeldern();
keineSetzbarenFelder();
}
//Parameterlose Spielroutine für KI
public void spielroutine(){
int xx=0;
int yy=0;
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
if(SFeld[i][j].getState()==3){
xx=i;
yy=j;
break;
}
}
}
setzeStein(xx,yy,zähler);
dreheSteineUm(xx,yy);
try{
if((gegenComputer)&&(zähler%2==0)){
Thread.sleep(1000);
}
}
catch(Exception e){
}
zähler++;
}
public void dreheSteineUm(int x,int y){
if(zähler%2==0){
loki.dreheSteineUmNachUnten(x,y,1,0);
loki.dreheSteineUmNachOben(x,y,1,0);
loki.dreheSteineUmNachRechts(x,y,1,0);
loki.dreheSteineUmNachLinks(x,y,1,0);
loki.dreheSteineUmNachLinksOben(x,y,1,0);
loki.dreheSteineUmNachLinksUnten(x,y,1,0);
loki.dreheSteineUmNachRechtsOben(x,y,1,0);
loki.dreheSteineUmNachRechtsUnten(x,y,1,0);
}
else{
loki.dreheSteineUmNachUnten(x,y,0,1);
loki.dreheSteineUmNachOben(x,y,0,1);
loki.dreheSteineUmNachRechts(x,y,0,1);
loki.dreheSteineUmNachLinks(x,y,0,1);
loki.dreheSteineUmNachLinksOben(x,y,0,1);
loki.dreheSteineUmNachLinksUnten(x,y,0,1);
loki.dreheSteineUmNachRechtsOben(x,y,0,1);
loki.dreheSteineUmNachRechtsUnten(x,y,0,1);
}
}
public void undo(){
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
UndoFeld[i][j]=SFeld[i][j].getState();
}
}
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
if(SFeld[i][j].getState()==3){
UndoFeld[i][j]=2;
}
}
}
}
public void undo_aufrufen(){
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
int kkk=UndoFeld[i][j];
SFeld[i][j].setState(kkk);
SFeld[i][j].setBackground(Color.GREEN);
}
}
zähler--;
zug.setText("Spielzug: "+(zähler+1));
spielerdran.setText(zähler%2==0?""+pname1+" ist am Zug":""+pname2+" ist am Zug");
steine1.setText(""+farbstr2+"e Steine: "+loki.zähleWeisseSpielsteine());
steine2.setText(""+farbstr1+"e Steine: "+loki.zähleSchwarzeSpielsteine());
alleLeerenFelderAuf2Setzen();
sucheNachSetzbarenFeldern();
}
public void speichern(){
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
SpeichernFeld[i][j]=SFeld[i][j].getState();
}
}
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
if(SFeld[i][j].getState()==3){
SpeichernFeld[i][j]=2;
}
}
}
}
public void laden(String File){
try{
FileInputStream fs=new FileInputStream(File);
ObjectInputStream is=new ObjectInputStream(fs);
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
int num=is.readInt();
System.out.println(num);
SFeld[i][j].setState(num);
SFeld[i][j].setBackground(Color.GREEN);
}
}
zähler=is.readInt();
pname1=is.readUTF();
pname2=is.readUTF();
is.close();
zug.setText("Spielzug: "+(zähler+1));
spielerdran.setText(zähler%2==0?""+pname2+" ist am Zug":""+pname1+" ist am Zug");
steine1.setText(""+farbstr2+"e Steine: "+loki.zähleWeisseSpielsteine());
steine2.setText(""+farbstr1+"e Steine: "+loki.zähleSchwarzeSpielsteine());
alleLeerenFelderAuf2Setzen();
sucheNachSetzbarenFeldern();
}catch(IOException e){
}
}
public void dialogbox_erzeugen(){
JFrame neuj=new JFrame();
final JDialog jd=new JDialog();
JLabel sieg=new JLabel(" Endergebnis:");
JLabel sieg2=new JLabel(" "+farbstr1+"e Steine: "+loki.zähleSchwarzeSpielsteine());
JLabel sieg3=new JLabel(" "+farbstr2+"e Steine: "+loki.zähleWeisseSpielsteine());
JLabel sieg4=new JLabel();
if(loki.zähleSchwarzeSpielsteine()<loki.zähleWeisseSpielsteine()){
sieg4.setText(" "+pname1+" gewinnt!!");
}
else{
sieg4.setText(" "+pname2+" gewinnt!!");
}
jd.setSize(300,200);
jd.setTitle("Sieg");
jd.setLocation(200,100);
JButton ok=new JButton("OK");
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
jd.setVisible(false);
}
});
jd.setLayout(new GridLayout(5,1));
jd.getContentPane().add(sieg);
jd.getContentPane().add(sieg2);
jd.getContentPane().add(sieg3);
jd.getContentPane().add(sieg4);
jd.getContentPane().add(ok);
jd.setVisible(true);
}
public void erhöheZähler(){
zähler++;
}
public int getZähler(){
return zähler;
}
public int ermittleFeldwert(int i,int j){
int ll=SFeld[i][j].getState();
return ll;
}
}
Code:
/*
* Created on 24.04.2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
/**
* @author Home
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class FileChooserReversi extends JFrame {
SpeichernUndLaden sul=new SpeichernUndLaden();
RevSpielfeldx rev=new RevSpielfeldx();
JTextField
filename=new JTextField(),
dir=new JTextField(),
exists=new JTextField(),
isdir=new JTextField();
JButton
open=new JButton ("Öffnen"),
save=new JButton ("Speichern");
JFileChooser c=new JFileChooser (new File("c://fh/ss05/javaprogrammierung/franzreversi"));
public FileChooserReversi(){}
public FileChooserReversi(int höhe,int breite,int[][] arr) {
int Höhe=höhe;
int Breite=breite;
int[][] spielarray=new int[Höhe][Breite];
setTitle("FileChooserReversi");
System.out.println(Höhe+" x "+Breite);
Container cp=getContentPane();
open.addActionListener (new OpenL());
cp.add( open,BorderLayout.NORTH);
save.addActionListener (new SaveL());
cp.add(save,BorderLayout.SOUTH);
dir.setEditable(false);
filename.setEditable(false);
exists.setEditable(false);
isdir.setEditable(false);
JPanel p=new JPanel();
p.setLayout (new GridLayout(4,1,2,2));
p.add(filename);
p.add(dir);
p.add(exists);
p.add(isdir);
cp.add(p, BorderLayout.CENTER);
c.setFileSelectionMode (JFileChooser.FILES_AND_DIRECTORIES);
for(int i=0;i<Höhe;i++){
for(int j=0;j<Breite;j++){
//System.out.println(spielarray[i][j]);
rev.ermittleFeldwert(i,j);
}
}
}
class OpenL implements ActionListener {
public void actionPerformed(ActionEvent e){
int rVal=c.showOpenDialog(FileChooserReversi.this);
if(rVal==JFileChooser.APPROVE_OPTION){
filename.setText ("Filename: "+c.getSelectedFile().getName());
dir.setText("Akt. Directory: "+c.getCurrentDirectory());
rev.laden(c.getCurrentDirectory()+"/"+c.getSelectedFile().getName());
exists.setText ("Existiert? "+c.getSelectedFile().exists());
isdir.setText ("Ist Directory "+c.getSelectedFile().isDirectory());
}
if(rVal == JFileChooser.CANCEL_OPTION){
filename.setText("Es wurde Abbrechen gedrückt");
dir.setText ("");
exists.setText("");
isdir.setText("");
}
}
}
class SaveL implements ActionListener {
public void actionPerformed(ActionEvent e){
int rVal=c.showSaveDialog (FileChooserReversi.this);
if(rVal == JFileChooser.APPROVE_OPTION) {
filename.setText ("Filename: "+c.getSelectedFile().getName());
dir.setText ("Akt. Directory: "+c.getCurrentDirectory());
sul.speichern(c.getCurrentDirectory()+"/"+c.getSelectedFile().getName());
exists.setText ("Existiert? "+c.getSelectedFile().exists());
isdir.setText ("Ist Directory? "+c.getSelectedFile().isDirectory());
}
if(rVal == JFileChooser.CANCEL_OPTION) {
filename.setText("Es wurde Abbrechen gedrückt");
dir.setText("");
exists.setText("");
isdir.setText("");
}
}
}
public static void main(String[] args){
Konsole.run (new FileChooserReversi(),400,200);
}
}