Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java n尺寸Tic Tac Toe图的解决方案(策略)_Java_Tic Tac Toe_Strategy Pattern - Fatal编程技术网

Java n尺寸Tic Tac Toe图的解决方案(策略)

Java n尺寸Tic Tac Toe图的解决方案(策略),java,tic-tac-toe,strategy-pattern,Java,Tic Tac Toe,Strategy Pattern,据我所知,蒂克塔克托是一个解决了的游戏。我想为电脑玩家制定一个策略,在这个策略的基础上,他将决定在哪里(在哪个基础上)传球 在我的游戏中,游戏板是: Field[][] fields; //which has size n x n, definition on fields is at the bottom: n值可能为3,4,5。我发现一些策略只适用于3x3版本 计算机应该使用什么策略来获胜 字段可以有状态:空、交叉或圆 import java.awt.BasicStroke; import

据我所知,蒂克塔克托是一个解决了的游戏。我想为电脑玩家制定一个策略,在这个策略的基础上,他将决定在哪里(在哪个基础上)传球

在我的游戏中,游戏板是:

Field[][] fields; //which has size n x n, definition on fields is at the bottom:
n值可能为3,4,5。我发现一些策略只适用于3x3版本

计算机应该使用什么策略来获胜

字段可以有状态:空、交叉或圆

import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JButton;

public class Field extends JButton {
    public final static int PREFERRED_SIZE = 100;
    public final static int EMPTY = 1, CROSS = 2, CIRCLE = 4;
    private int state;

    public Field() {
        state = EMPTY;
    }

    public void setState(int state) {
        if(state != EMPTY) {
            this.state = state;
            setEnabled(false);
        }
    }
    public void getState(){return state;}
    public Dimension getPreferredSize() {
        return new Dimension(PREFERRED_SIZE, PREFERRED_SIZE);
    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(4));
        int shorterEdge = (int) (Math.min(getWidth(), getHeight()));
        int startXY = (int) (1d / 5d * shorterEdge);
        if(state == CIRCLE) {
            int ovalSize = (int) (3d / 5d * shorterEdge);
            g2d.drawOval(startXY, startXY, ovalSize, ovalSize);
            System.out.println(getWidth() + " x " + getHeight());
        } else if(state == CROSS) {
            g2d.drawLine(startXY, startXY, shorterEdge - startXY, shorterEdge - startXY);
            g2d.drawLine(shorterEdge - startXY, startXY, startXY, shorterEdge - startXY);
        }
    }
}

由于Stack Overflow是一个编程帮助台,而不是一个游戏策略站点,因此以下是一种以编程方式生成策略的方法:

步骤1:将可能的游戏状态建模为

步骤2:将游戏树的叶子节点标记为赢、输或平

第3步:每当轮到计算机时,使用a沿游戏树向下移动,选择对计算机有益的选项,同时假设其他玩家也使用最小轴(胜利比平局好,平局比失败好)


一切都结束了。这就是为一个像tic-tac-toe这样简单的游戏创建人工智能所需要的全部。只要看看这棵树,哪根树枝肯定是胜利的,哪根树枝肯定是失败的,就选最好的。为了额外的练习和效率,使minimax部分更快一些,尽管使用小的tic-tac-toe板,这在实践中并不重要。

我是否误解了什么,或者你是在要求tic-tac-toe策略?@kviiri是的,我知道,已经有一个标签tic-tac-toe了。我应该在哪里问这个问题?我不知道,但是堆栈溢出并不是要求游戏策略的地方。然而,我可以帮助你制定策略——见我的答案。使用它很容易创建一个工作tic-tac-toe AI。