Ki für Spiel
lima-city → Forum → Programmiersprachen → Java
code
computer
datei
erstellen
feld
http
methode
null
objekt
panel
programm
run
schauen
setter
start
stein
teddy
url
verwenden
zeile
-
Hallo,
ich versuche in einem (tutorial basierten) 4 gewinnt Spiel eine KI einzubauen, habe dazu folgende Methode:
public Stone computerZug() { for (int y=0; y<6; y++) { for (int x=0; x<7; x++) { if (Stone.gameField[x][y] == 1) { if ((Stone.gameField[x+1][y] == 1) && (Stone.gameField[x+2][y] == 1) && (Stone.gameField[x+3][y] == 0) && (Stone.gameField[x+3][y+1] > 0)) { setStoneToField(x,y, null); } } } } return null; }
Die allerdings gar nix macht.. Warum? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Um da überhaupt irgendwas Sinnvolles antworten zu können musst du verraten was Stone.gameField für Bedeutung hat.
-
Hallo kill-a-teddy,
Du prüfst ja nur auf eine ganz bestimmte Konstellation:
1 1 1 0 1 1 1 1
und solange diese nicht vorliegt passiert auch nichts. Desweiteren musst Du mit Deinen Rändern aufpassen. Es kann nämlich sein, dass es die x+1, x+2 bzw. y+1 Felder gar nicht gibt und dann sollte das eigentlich zu einer Index out of Bounds Exception führen.
Edit:
Und wenn die Konstellation vorliegt, dann setzt Du den Stein an eine Stelle, an der bereits einer ist. Es soll wohl eher:
setStoneToField(x+3,y, null);
sein.
Beitrag zuletzt geändert: 29.9.2012 17:48:50 von darkpandemic -
kill-a-teddy schrieb:
Dort kommt:
Download der .JAR DateiFehler 401: Unzulässig
Es wäre sinnvoller den Quellcode am Webspace abzulegen (was du sogar darfst, da es nur Text ist)
Das Download-Volumen ist nicht mehr ausreichend. Bitte neu aufladen. -
hackyourlife schrieb:
kill-a-teddy schrieb:
Dort kommt:
Download der .JAR DateiFehler 401: Unzulässig
Es wäre sinnvoller den Quellcode am Webspace abzulegen (was du sogar darfst, da es nur Text ist)
Das Download-Volumen ist nicht mehr ausreichend. Bitte neu aufladen.
Nun gut, war aber ein langes Tutorial, ist daher etwas mehr ;) Die Stone.java ist am Ende der Datei zu finden...
Text Datei -
darkpandemic schrieb:
Hallo kill-a-teddy,
Du musst wahrscheinlich bei setStoneToField() ein Stone-Objekt als drittes Argument an Stelle von null übergeben. Sonst wird da ja nichts gesetzt.
Dann bekomme ich eine Fehlermeldung...
void setStoneToField(int x, int y, Stone stone) { gameField[x][y] = stone; }
Das funktioniert.. Nur das andere nicht.. Natürlich nicht, weil ich die Methode ja aufrufe, demnach als "Stone" null übergebe.. Trotz dessen bin ich nu ratlos, was ich da übergeben soll?? -
Das "Stone stone" sagt dir, was du übergeben sollst. Das erste Stone ist der erwartete Typ, und das ist ein Stone. Du musst also mittels
einen neuen Stone erstellen und diesen übergeben. Den Konstruktor des Stone Objektes musst du selbst noch raus suchen. Der Konstruktor dürfte der sein:Strone mystone = new Stone();
, aber mein Java ist sehr mieserabel, daher kann ich dir leider keinen zusammenstellen.Stone(byte y, Game game, MousePanel mousePanel, GameFrame frame) {
Liebe Grüße -
ggamee schrieb:
Das "Stone stone" sagt dir, was du übergeben sollst. Das erste Stone ist der erwartete Typ, und das ist ein Stone. Du musst also mittels
einen neuen Stone erstellen und diesen übergeben. Den Konstruktor des Stone Objektes musst du selbst noch raus suchen. Der Konstruktor dürfte der sein:Strone mystone = new Stone();
, aber mein Java ist sehr mieserabel, daher kann ich dir leider keinen zusammenstellen.Stone(byte y, Game game, MousePanel mousePanel, GameFrame frame) {
Liebe Grüße
Das leuchtet mir leider nicht ein. Die Parameter der Methode Stone werden direkt in der Methode angegeben. Demnach kann ich doch kein neuen Stone erstellen, weil ich beim erstellen ja die Parameter angeben muss (was ich nicht tun kann?) -
Hallo kill-a-teddy,
ggamee hat im wesentlichen recht. Das einfachste ist wohl, wenn Du einfach den Code aus dem mousePressed()-Handler der MousePanel-Klasse übernimmst:
Stone stone = new Stone(y, this, <mousePanel>, <gameFrame>); game.setStoneToField(x, y, stone);
Allerdings ist das auch etwas schwierig, da Du mousePanel und gameFrame in der Game-Klasse nicht kennst. Du könntest aber in der Game-Klasse noch Felder für mousePanel und gameFrame einfügen, auf die jeweiligen Objekte festlegen und die Felder dann für den Stone-Konstruktor verwenden.
Insgesamt ist das hier leider etwas schwierig, da das Programm-Design gelinde ausgedrückt etwas ungünstig ist. -
darkpandemic schrieb:
Hallo kill-a-teddy,
ggamee hat im wesentlichen recht. Das einfachste ist wohl, wenn Du einfach den Code aus dem mousePressed()-Handler der MousePanel-Klasse übernimmst:
Stone stone = new Stone(y, this, <mousePanel>, <gameFrame>); game.setStoneToField(x, y, stone);
Allerdings ist das auch etwas schwierig, da Du mousePanel und gameFrame in der Game-Klasse nicht kennst. Du könntest aber in der Game-Klasse noch Felder für mousePanel und gameFrame einfügen, auf die jeweiligen Objekte festlegen und die Felder dann für den Stone-Konstruktor verwenden.
Insgesamt ist das hier leider etwas schwierig, da das Programm-Design gelinde ausgedrückt etwas ungünstig ist.
Soweit so gut
Stone stone = new Stone(y, this, this.mousePanel, this.gameFrame); setStoneToField(x, y, stone);
Keine Fehlermeldung mehr, außerdem musste ich von byte auf int wechseln, was aber nicht so dramatisch ist. Aber: Computer spielt nicht. Ich muss trotzdem immer klicken, was mache ich denn falsch? -
Hallo kill-a-teddy,
vielleicht spielt der Computer aber Du siehst es nicht, weil das Label außerhalb des Panels ist. Du kannst ja mal versuchen folgendes einzufügen:
Stone stone = new Stone(y, this, this.mousePanel, this.gameFrame); stone.setBounds(x * 50 + (x + 1) * 2, y*50, 50, 50); stonePanel.add(stone); stonePanel.repaint(); setStoneToField(x, y, stone);
Allerdings musst Du dafü auch noch das stonePanel durchschleusen. (Genauso wie mousePanel und gameFrame) -
darkpandemic schrieb:
Hallo kill-a-teddy,
vielleicht spielt der Computer aber Du siehst es nicht, weil das Label außerhalb des Panels ist. Du kannst ja mal versuchen folgendes einzufügen:
Stone stone = new Stone(y, this, this.mousePanel, this.gameFrame); stone.setBounds(x * 50 + (x + 1) * 2, y*50, 50, 50); stonePanel.add(stone); stonePanel.repaint(); setStoneToField(x, y, stone);
Allerdings musst Du dafü auch noch das stonePanel durchschleusen. (Genauso wie mousePanel und gameFrame)
Ich hab kein StonePanel, nur ein MousePanel ^^
In der Stone Methode wird lediglich der Stein generiert, habe jetzt dazu noch die Methode run() aufgerufen, wo der stein gesetzt wird. Das Programm tut und und tut und tut und bleibt hängen, ohne sichtbares Ergebnis. Mit Sicherheit, weil ich ein Endlos schleife habe, in dem ich run() aufgerufen habe. Das scheint allerdings aber der Lösungsansatz zu sein. Das ich den Stein noch setzen muss. Allerdings kann ich ja darauf nicht zugreifen, da das in einer anderen klasse ist und kein static sein darf :/ Was nun? -
Hallo kill-a-teddy,
laut static void load() in der CreateGame-Klasse hast Du ein stonePanel und das wird z.B. auch an den Konstruktor des MousePanels übergeben. Im übrigen wird es auch im mousePressed()-Handler benutzt. -
darkpandemic schrieb:
Hallo kill-a-teddy,
laut static void load() in der CreateGame-Klasse hast Du ein stonePanel und das wird z.B. auch an den Konstruktor des MousePanels übergeben. Im übrigen wird es auch im mousePressed()-Handler benutzt.
Hmm das dann wieder zu viel für mich, ich geb auf.. Kann mir das irgendwer fertig machen? <.< -
Hallo kill-a-teddy,
Du musst mit dem stonePanel einfach das gleich machen wie mit dem mousePanel und dem gameFrame. D.h. irgenwo in der Game-Klasse noch
private JPanel stonePanel;
einfügen. Dazu noch einen Setter:
public void setStonePanel(JPanel panel) { stonePanel = panel; }
In der load()-Methode der CreateGame-Klasse fügst Du dann nach
JPanel stonePanel = new JPanel(null); stonePanel.setBounds(0, 0, 366, 314); stonePanel.setOpaque(false); gamePanel.add(stonePanel, 0);
noch folgende Zeile ein:
game.setStonePanel(stonePanel);
Damit sollte vermutlich folgender Code zum Hinzufügen des Steines funktionieren:
Stone stone = new Stone(y, this, this.mousePanel, this.gameFrame); stone.setBounds(x * 50 + (x + 1) * 2, -50, 50, 50); this.stonePanel.add(stone); this.stonePanel.repaint(); stone.start(); game.setStoneToField(x, y, stone);
(Ich hoffe jetzt mal, dass Du das mousePanel und den gameFrame auf ähnliche Weise gesetzt hast. Du kannst naturlich auch einfach public-Felder verwenden.) -
darkpandemic schrieb:
Hallo kill-a-teddy,
Du musst mit dem stonePanel einfach das gleich machen wie mit dem mousePanel und dem gameFrame. D.h. irgenwo in der Game-Klasse noch
private JPanel stonePanel;
einfügen. Dazu noch einen Setter:
public void setStonePanel(JPanel panel) { stonePanel = panel; }
In der load()-Methode der CreateGame-Klasse fügst Du dann nach
JPanel stonePanel = new JPanel(null); stonePanel.setBounds(0, 0, 366, 314); stonePanel.setOpaque(false); gamePanel.add(stonePanel, 0);
noch folgende Zeile ein:
game.setStonePanel(stonePanel);
Damit sollte vermutlich folgender Code zum Hinzufügen des Steines funktionieren:
Stone stone = new Stone(y, this, this.mousePanel, this.gameFrame); stone.setBounds(x * 50 + (x + 1) * 2, -50, 50, 50); this.stonePanel.add(stone); this.stonePanel.repaint(); stone.start(); game.setStoneToField(x, y, stone);
(Ich hoffe jetzt mal, dass Du das mousePanel und den gameFrame auf ähnliche Weise gesetzt hast. Du kannst naturlich auch einfach public-Felder verwenden.)
Das funktioniert nicht.. Bekomme zwar keine Fehlermeldung, aber Computer macht trotzdem nicht von selbst einen Zug <.< -
Hallo kill-a-teddy,
kann es sein, dass Du die Game.computerZug()-Methode nirgends aufrufst?
Füge mal in MousePanel.mousePressed() nach
Stone stone = new Stone(y, game, this, frame); stone.setBounds(clickedOnField * 50 + (clickedOnField + 1) * 2, -50, 50, 50); stonePanel.add(stone); stonePanel.repaint(); listenerBlocked = true; stone.start(); game.setStoneToField(clickedOnField, y, stone);
noch die Zeile
game.computerZug()
ein. -
darkpandemic schrieb:
Hallo kill-a-teddy,
kann es sein, dass Du die Game.computerZug()-Methode nirgends aufrufst?
Füge mal in MousePanel.mousePressed() nach
Stone stone = new Stone(y, game, this, frame); stone.setBounds(clickedOnField * 50 + (clickedOnField + 1) * 2, -50, 50, 50); stonePanel.add(stone); stonePanel.repaint(); listenerBlocked = true; stone.start(); game.setStoneToField(clickedOnField, y, stone);
noch die Zeile
game.computerZug()
ein.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at core.Game.computerZug(Game.java:41) at core.MousePanel.mousePressed(MousePanel.java:58) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$000(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$2.run(Unknown Source) at java.awt.EventQueue$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage