Algorithmus zu einem bekannten spiel

hi leute
ich möchte einen spiel als applikation in java programmieren.
die oberfläche hat(3x3)buttons.der spieler gewinnt wenn er 3 button nebeneinander clickt (vertical,horizental oder qwer).
ich kann erkennen welche button gecklickt ist aber es fällt mir schwer zu wissen welche button mein programm anclicken soll um zu verhindern dass der spieler gewinnt und auch zu erkennen dass der spieler gewonnen hat, damit ich das spiel beende und eine meldung rausgebe.
ich hoffe dass ihr meine idee vesteht.
hat jemand schon so was gemacht oder kennt jemand das algorithmus.

danke

youssef

Moin

die oberfläche hat(3x3)buttons.der spieler gewinnt wenn er 3
button nebeneinander clickt (vertical,horizental oder qwer).

Tic-Tac-Toe ?

aber es fällt
mir schwer zu wissen welche button mein programm anclicken
soll um zu verhindern dass der spieler gewinnt und auch zu
erkennen dass der spieler gewonnen hat, damit ich das spiel
beende und eine meldung rausgebe.

Erkennen: per for-schleife brue-force durchtesten. Geht auch eleganter: testen vom letzten gesetzten Stein aus.

Zug auswählen: naja, soll der Spieler das Spiel auch gewinnen können ? wenn nein wäre eine DB mit allen möglichen Spielständen und den entsprechenden Antwort-zügen das beste.

wenn man dem Spieler eine Chance lassen will:
Man kann einen lernenden Algo. implementieren: welche Spiele wurden gewonnen, welche verloren ? War die Situation schonmal da ? Wer hat damals gewonnen ? mit welchem Zug ? …

Oder ein Min-Max-Baum aufbauen. Da kann man die Schwierigkeit festlegen. Klappt bei vielen Spielen. Nachteil: Man braucht eine heuristische Bewertungsfunktion (oder unbeschränkte Suchtiefe).

hat jemand schon so was gemacht

klar.

oder kennt jemand das
algorithmus.

so direkt fallen mir ausser den 3 angerissenen noch 2 ein (NN, B-Baum). Aber ich schätze mal insgesamt gibts ein gutes Dutzend.

Wenn du’s genauer wissen willst poste nochmal. (Und beschreib deine Datenstrukturen)

Wenn du’s mit etwas mehr Teifgang machen willst: http://www.gamedev.net Die halten sich allerdings nicht mit Tic-Tac-Toe auf.

cu

hi!
hier ist mein ganzes code:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Spiel extends JFrame implements ActionListener
{
//menu
JMenuBar menuBar;
JMenu spielMenu;
JMenu optionenMenu;
JMenu infoMenu;
JMenuItem infoItem;
JMenuItem neueItem;
JMenuItem beendenItem;
JMenuItem vollbildItem;
JMenuItem farbeItem;
//JMenuItem ProfiItem;
JMenuItem menuItem;

//zwei dimentional button-array
JButton[][] buttonGroup;

Color buttoncolor = Color.green;

//anzeigefeld
JTextField anzeigefeld;

Container contentpane;

static Spiel mainFrame;

public Spiel()
{
init();

}

public void init()
{

Dimension d = new Dimension(60,60);//dimenstion für buttons

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(3,3));

//anzeigefeld
anzeigefeld = new JTextField("");
anzeigefeld.setBackground(Color.white);
anzeigefeld.setEditable(false);

//button_array erzeugen und panel aufnehmen
buttonGroup = new JButton[3][3];
for(int i=0;i

Moin

Zur besseren übersicht: verlagere den Actionlistener in eine andere Klasse.

> public class Spiel extends JFrame implements ActionListener  
> {

Das ist schonmal ein sehr guter Ansatz.

> //zwei dimentional button-array  
> JButton[][] buttonGroup;

Allerdings wird der noch besser wenn du in:

 int[][] SpielStand

die Werte speicherts, so in der Art: 0 = Feld ist frei, 1 = Feld von „Gegener“ besetzt, 2 = Feld vom PC besetzt. Die Werte müssen dann in der actionperformed-Methode gesetzt werden.

> public void actionPerformed(ActionEvent event)



    
    (...)
    
    
    
        
        
        
        > JButton button = (JButton)source;  
        > button.setBackground(buttoncolor);  
        > button.setText(""+i+j);  
        > button.setEnabled(false);  
        > if(i != 2 && j != 2)  
        > buttonGroup[i+1][j+1].setBackground(Color.red);  
        > else if(j == 2)  
        > buttonGroup[i][j-1].setBackground(Color.red);  
        > else  
        > buttonGroup[i-1][j].setBackground(Color.red);
        
    
    
    
    
    Was ist das für ein Spiel / was soll das tun ? in Tic-Tac-Toe müsste der entsprechende Button markiert werden, nicht einer weiter links/rechts... ?
    
    Ausserdem speicherts du nicht wer am Zug ist. (oder ist das da das "ziehen" des PC's ?)
    
    (...)
    
    An sich sauberer Code, aber da fehlt noch ein bisschen was bevor man an's lösen und berrechnen gehen kann.
    
    
    
    > aber ich brauche bitte einen einfaches alogorihmus ,das ich  
    > auch verstehen kann.
    
    
    naja... ich hol mal ein bisschen aus:
    
    Das Spielfeld (3x3) sollte man nicht in den Button's speichern. Man sollte es separat in einem 2. array halten. (Wenn's richtiges OO-Programm werden soll muss eine neue Klasse her). Das Array muss mit den neuen Werten gefüttert werden.
    
    Also brauchts du eine zusätzliche Variable:
    
    
    
        
        int[][] SpielStand
    
    
    
    
    Die muss in der actionperformed gesetzt werden. Da actionperformed nur aufgeruen wird wenn der Spieler etwas anklickt: (0 = frei, 1= Gegener, 2 = PC, siehe oben)
    
    
    
        
        SpielStand[i][j] = 1
    
    
    
    
    anstellen von dem Code den ich nicht verstanden hab.
    
    Dann muss man erkennen können ob jemand gewonnen hat oder nicht. (Es soll doch Tic-Tac-Toe werden, ja ?). Also etwas im Style:
    
    
    
        
        public boolean PChasWon (int[][] SpielStand)
    
    
    
    
    und
    
    
    
        
        public boolean PlayerhasWon (int[][] SpielStand)
    
    
    
    
    Die 2 Methoden sind so gleich dass ich hier nur eine beschreibe:
    
    
    
        
        //horizontal:
        for (int i =0;i
        
        Wie die andere auszusehen hat ist klar ?
        
        PlayerhasWon (SpielStand) muss also nach dem setzten von Spielstand in Actionperformed aufgerufen werden. Nun ist der PC dran: (brute-force-Methode, nicht klever aber einfach):
        
        Erstmal machen wir eine Kopie des Spielfeldes:
        
        
            
            public int[][] Copy (int[][] SpielStand){
             int[][] TEST = new int[3][3];
             for (int i=0;i
            
            Dann testen wir einfach was passiert wenn der PC an einer Stelle einen Stein setzt:
            
            
            
                
                for (int i=0;i
                
                Falls es keine Position gibt in der der PC gewinnt den Stein einfach "random" irgendwo setzen. In jedem Fall danach SpielStand ändern und ANZEIGEN.
                
                (für später: wenn man keine gewinn-position findet kann man einfach alle möglichen nehmen und kucken ob der Gegner dann gewinnen kann (indem man wieder alle Möglichkeiten durchgeht). Wenn er gewinnen kann nimmt man die Position schonmal nicht.)
                
                (für viel später: Man kann dieses Testen solange durchziehen bis das Spielfeld voll ist. Bei Tic-Tac-Toe dauert das keine 2 sek. Dann kann man sich anschauen wer in welchem Baum wie oft gewinnt und den Baum nehmen in dem der PC am häufigsten gewinnt...)
                
                
                
                > danke für deine mühe
                
                bitte (der Code ist eh unvollständig, da muss noch eine Abfrage rein ob überhaupt noch ein Feld frei ist... + tippfehler )
                
                cu
1 „Gefällt mir“

hi!
vilen dank.
ich werde es probieren und sage ich dir bescheid.

youssef