快速提问,我已经开发了3个A.I,每个都有不同的深度。
目前要选择你想要玩的A.I你必须进入名为Main.java的java文件并将其更改为你想要的任何一个。要改变的路线是:
chessGame.setPlayer(Piece.COLOR_BLACK, ai3);//Here A.I is assigned
我想让用户在游戏开始时有一个选项来选择A.I.我希望对界面有一些帮助,我在想像JOptionpane这样的东西可能有用。
(我只是不确定如何为A.I选择做一个)
目前A.I&#39>
AI1 AI2 AI3
package chess;
import chess.ai.SimpleAiPlayerHandler;
import chess.gui.ChessGui;
import chess.logic.ChessGame;
import chess.logic.Piece;
public class Main {
public static void main(String[] args) {
// Creating the Game
ChessGame chessGame = new ChessGame();
// Creating the Human Player
//Human Player is the Object chessGui
ChessGui chessGui = new ChessGui(chessGame);
//Creating the A.I's
SimpleAiPlayerHandler ai1 = new SimpleAiPlayerHandler(chessGame);//Super Dumb
SimpleAiPlayerHandler ai2 = new SimpleAiPlayerHandler(chessGame);//Dumb
SimpleAiPlayerHandler ai3 = new SimpleAiPlayerHandler(chessGame);//Not So Dumb
// Set strength of AI, how far they can see ahead
ai1.maxDepth = 1;
ai1.maxDepth = 2;
ai3.maxDepth = 3;
//Assign the Human to White
chessGame.setPlayer(Piece.COLOR_WHITE, chessGui);
//Assign the not so dumb A.I to black
chessGame.setPlayer(Piece.COLOR_BLACK, ai3);
// in the end we start the game
new Thread(chessGame).start();
}
}
感谢您的帮助。
答案 0 :(得分:1)
您应该使用JComboBox来允许用户从3个可用选项中进行选择。如果您使用此JComboBox制作启动JFrame,则可以在之后创建主游戏帧并将其传递给JComboBox中的值。
例如,您可以让JComboBox提供设置Easy,Medium和Hard的难度选项。在JButton上使用动作侦听器从JComboBox获取所选值,并将其转换为适合您的minimax算法的int值。也就是说,传递1表示简单,2表示中等,3表示硬。
接下来更改你的ai类,使maxDepth在构造函数中。然后,当你实例化你的ai时,只需给它从前一帧向前传递的值,你就可以在正确的难度设置下创建你需要的唯一ai。
编辑:
看起来你设法得到类似的工作,这很棒!如果它对你有所帮助,我已经包含了一个简短的例子,说明我将如何在下面完成此操作。请注意,我还将其设置为使得SimpleAiPlayerHandler构造函数也采用int值来实例化maxDepth变量。你需要添加它。因为它使用我没有的类,所以我无法编译它。但是,如果其他人需要做类似的事情,只需删除DifficultyListener中的所有内容,除了print语句和从JComboBox中获得困难的行,你会看到它工作(和编译)。
import javax.swing.*;
import java.awt.event.*;
public class ChessSplash extends JFrame {
private final JComboBox<Difficulty> difficultySetting;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ChessSplash gui = new ChessSplash();
gui.setVisible(true);
}
});
}
public enum Difficulty {
EASY(1, "Easy"), MEDIUM(2, "Medium"), HARD(3, "Hard");
private final int intValue;
private final String stringValue;
private Difficulty(int intValue, String stringValue) {
this.intValue = intValue;
this.stringValue = stringValue;
}
@Override
public String toString() {
return stringValue;
}
};
public ChessSplash() {
super("Chess Game");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
difficultySetting = new JComboBox<>(Difficulty.values());
JButton startButton = new JButton("Start Game");
startButton.addActionListener(new DifficultyListener());
JPanel mainPanel = new JPanel();
add(mainPanel);
mainPanel.add(difficultySetting);
mainPanel.add(startButton);
pack();
}
private class DifficultyListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//Declare AI
SimpleAiPlayerHandler ai;
//Declare and Instantiate Chess Game
ChessGame chessGame = new ChessGame();
//Human Player is the Object chessGui
ChessGui chessGui = new ChessGui(chessGame);
//Assign Human Player to White
chessGame.setPlayer(Piece.COLOR_WHITE, chessGui);
//Get the selected difficulty setting
Difficulty difficulty = (Difficulty)difficultySetting.getSelectedItem();
//Instantiate Computer AI pass it the maxDepth for use in the constructor
ai = new SimpleAiPlayerHandler(difficulty.intValue, chessGame);
//Assign Computer Player to Black
chessGame.setPlayer(Piece.COLOR_BLACK, ai);
//Demonstrate the enum combobox works
System.out.println(difficulty.intValue);
//Dispose of the splash JFrame
ChessSplash.this.dispose();
//Start your game thread (I would probably do something to move this
//onto the EDT if you're doing this is swing personally
new Thread(chessGame).start();
}
}
}