kostenloser Webspace werbefrei: lima-city


Ki für Spiel

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Um da überhaupt irgendwas Sinnvolles antworten zu können musst du verraten was Stone.gameField für Bedeutung hat.
  4. 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
  5. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

  6. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    kill-a-teddy schrieb:
    Download der .JAR Datei
    Dort kommt:
    Fehler 401: Unzulässig

    Das Download-Volumen ist nicht mehr ausreichend. Bitte neu aufladen.
    Es wäre sinnvoller den Quellcode am Webspace abzulegen (was du sogar darfst, da es nur Text ist) ;-)
  7. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    hackyourlife schrieb:
    kill-a-teddy schrieb:
    Download der .JAR Datei
    Dort kommt:
    Fehler 401: Unzulässig

    Das Download-Volumen ist nicht mehr ausreichend. Bitte neu aufladen.
    Es wäre sinnvoller den Quellcode am Webspace abzulegen (was du sogar darfst, da es nur Text ist) ;-)


    Nun gut, war aber ein langes Tutorial, ist daher etwas mehr ;) Die Stone.java ist am Ende der Datei zu finden...

    Text Datei
  8. 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.
  9. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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??
  10. g****e

    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
    Strone mystone = new Stone();
    einen neuen Stone erstellen und diesen übergeben. Den Konstruktor des Stone Objektes musst du selbst noch raus suchen. Der Konstruktor dürfte der sein:
    Stone(byte y, Game game, MousePanel mousePanel, GameFrame frame) {
    , aber mein Java ist sehr mieserabel, daher kann ich dir leider keinen zusammenstellen.

    Liebe Grüße
  11. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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
    Strone mystone = new Stone();
    einen neuen Stone erstellen und diesen übergeben. Den Konstruktor des Stone Objektes musst du selbst noch raus suchen. Der Konstruktor dürfte der sein:
    Stone(byte y, Game game, MousePanel mousePanel, GameFrame frame) {
    , aber mein Java ist sehr mieserabel, daher kann ich dir leider keinen zusammenstellen.

    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?)
  12. 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.
  13. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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?
  14. 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)
  15. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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?
  16. 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.
  17. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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? <.<
  18. 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.)
  19. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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 <.<
  20. 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.
  21. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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)
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!