From c53ff75ea4bf0674982162ce66a1fc4584637dac Mon Sep 17 00:00:00 2001 From: Woody Folsom Date: Sun, 29 Apr 2012 10:18:15 -0400 Subject: [PATCH] Added configurable computer player - use 'com=random', 'com=minimax' etc as cmd-line args. Default is AlphaBeta. Updated ActionListener for UserChooserFrame so that selecting from the list (or typing a new name and pressing RETURN) also triggers the action. Added the player and computer algorithm names to the title bar e.g. "Bob vs. Alpha-Beta". --- src/model/Referee.java | 6 +- src/model/comPlayer/AlphaBetaComPlayer.java | 5 ++ src/model/comPlayer/MinimaxComPlayer.java | 9 +++ src/model/comPlayer/MonteCarloComPlayer.java | 5 ++ src/model/comPlayer/RandomComPlayer.java | 5 ++ src/view/ArgParser.java | 17 ++++++ src/view/MainFrame.java | 9 +-- src/view/ParsedArgs.java | 32 ++++++++++ src/view/PlayerSelectActionListener.java | 18 ++++++ src/view/UserChooserFrame.java | 64 +++++++++++--------- 10 files changed, 132 insertions(+), 38 deletions(-) create mode 100644 src/view/ArgParser.java create mode 100644 src/view/ParsedArgs.java create mode 100644 src/view/PlayerSelectActionListener.java diff --git a/src/model/Referee.java b/src/model/Referee.java index 3bdf546..48a0bcf 100644 --- a/src/model/Referee.java +++ b/src/model/Referee.java @@ -1,7 +1,6 @@ package model; import model.Board.TileColor; -import model.comPlayer.AlphaBetaComPlayer; import model.comPlayer.HumanPlayer; import model.comPlayer.Player; import model.playerModel.PlayerModel; @@ -14,7 +13,6 @@ import view.MainFrame; import view.ScorePanel; public class Referee implements Runnable { - public static final String COM_TURN = "Waiting for the computer's move."; public static final String GAME_OVER = "Game over!"; public static final Logger LOGGER = Logger.getLogger(Referee.class @@ -30,7 +28,7 @@ public class Referee implements Runnable { private final MainFrame mf; private PlayerModel playerModel = null; - public Referee(MainFrame mnFrm, String player) { + public Referee(MainFrame mnFrm, String player, Player computerPlayer) { if (PlayerModel.exists(player)) { PlayerModel.getPlayerPath(player); playerModel = PlayerModel.load(PlayerModel.getPlayerPath(player)); @@ -41,6 +39,7 @@ public class Referee implements Runnable { } mf = mnFrm; + this.computerPlayer = computerPlayer; initGame(); } @@ -144,7 +143,6 @@ public class Referee implements Runnable { private void initGame() { board = new Board(); - computerPlayer = new AlphaBetaComPlayer(); } private void play() { diff --git a/src/model/comPlayer/AlphaBetaComPlayer.java b/src/model/comPlayer/AlphaBetaComPlayer.java index 5289fa6..9850684 100644 --- a/src/model/comPlayer/AlphaBetaComPlayer.java +++ b/src/model/comPlayer/AlphaBetaComPlayer.java @@ -22,4 +22,9 @@ public class AlphaBetaComPlayer implements Player { public boolean isReady() { return true; // always ready to play a random valid move } + + @Override + public String toString() { + return "Alpha-Beta ComPlayer"; + } } \ No newline at end of file diff --git a/src/model/comPlayer/MinimaxComPlayer.java b/src/model/comPlayer/MinimaxComPlayer.java index 520132c..82fa55a 100644 --- a/src/model/comPlayer/MinimaxComPlayer.java +++ b/src/model/comPlayer/MinimaxComPlayer.java @@ -8,6 +8,10 @@ import model.comPlayer.generator.MoveGenerator; public class MinimaxComPlayer implements Player{ private MoveGenerator moveGenerator = new MinimaxMoveGenerator(); + public MinimaxComPlayer() { + super(); + } + @Override public Move getMove(Board board) { return moveGenerator.genMove(board, false); @@ -22,4 +26,9 @@ public class MinimaxComPlayer implements Player{ public boolean isReady() { return true; // always ready to play a random valid move } + + @Override + public String toString() { + return "Minimax ComPlayer"; + } } diff --git a/src/model/comPlayer/MonteCarloComPlayer.java b/src/model/comPlayer/MonteCarloComPlayer.java index 44a216c..013f150 100644 --- a/src/model/comPlayer/MonteCarloComPlayer.java +++ b/src/model/comPlayer/MonteCarloComPlayer.java @@ -54,4 +54,9 @@ public class MonteCarloComPlayer implements Player { public boolean isReady() { return true; // always ready to play a random valid move } + + @Override + public String toString() { + return "Monte Carlo ComPlayer"; + } } diff --git a/src/model/comPlayer/RandomComPlayer.java b/src/model/comPlayer/RandomComPlayer.java index db769ff..5ae1561 100644 --- a/src/model/comPlayer/RandomComPlayer.java +++ b/src/model/comPlayer/RandomComPlayer.java @@ -50,4 +50,9 @@ public class RandomComPlayer implements Player { public boolean isReady() { return true; // always ready to play a random valid move } + + @Override + public String toString() { + return "Random ComPlayer"; + } } diff --git a/src/view/ArgParser.java b/src/view/ArgParser.java new file mode 100644 index 0000000..08d908a --- /dev/null +++ b/src/view/ArgParser.java @@ -0,0 +1,17 @@ +package view; + +public class ArgParser { + public static ParsedArgs parse(String[] cmdLineArgs) { + ParsedArgs parsedArgs = new ParsedArgs(); + for (int i = 0; i < cmdLineArgs.length; i++) { + if (cmdLineArgs[i].toUpperCase().startsWith("COM=")) { + String comPlayer = cmdLineArgs[i].split("=")[1]; + parsedArgs.setComPlayer(comPlayer); + System.out.println("ComPlayer set to: " + comPlayer); + } else { + System.out.println("Ignoring unrecognized argument: " + cmdLineArgs[i]); + } + } + return parsedArgs; + } +} diff --git a/src/view/MainFrame.java b/src/view/MainFrame.java index 80c2344..27f68f1 100644 --- a/src/view/MainFrame.java +++ b/src/view/MainFrame.java @@ -8,13 +8,14 @@ import javax.swing.JFrame; import javax.swing.JPanel; import model.Referee; +import model.comPlayer.Player; public class MainFrame extends JFrame { private static final long serialVersionUID = 1L; public static void main(String[] args) { - new UserChooserFrame(); + new UserChooserFrame(ArgParser.parse(args)); } private BoardPanel bp; @@ -23,10 +24,10 @@ public class MainFrame extends JFrame { private TileSelectionPanel tp; ScorePanel sp; - public MainFrame(String name) { - super("CS8803 Project 4"); + public MainFrame(String name, Player comPlayer) { + super("CS8803 Project 4 : " + name + " vs. " + comPlayer); - referee = new Referee(this, name); + referee = new Referee(this, name, comPlayer); init(); diff --git a/src/view/ParsedArgs.java b/src/view/ParsedArgs.java new file mode 100644 index 0000000..ead0c9b --- /dev/null +++ b/src/view/ParsedArgs.java @@ -0,0 +1,32 @@ +package view; + +import model.comPlayer.AlphaBetaComPlayer; +import model.comPlayer.MinimaxComPlayer; +import model.comPlayer.Player; +import model.comPlayer.RandomComPlayer; + +public class ParsedArgs { + public static final String COM_RANDOM = "RANDOM"; + public static final String COM_MINIMAX = "MINIMAX"; + public static final String COM_ALPHABETA = "ALPHABETA"; + public static final String COM_DEFAULT = COM_ALPHABETA; + + private String comPlayer = COM_DEFAULT; + + public Player getComPlayer() { + if (COM_RANDOM.equalsIgnoreCase(comPlayer)) { + return new RandomComPlayer(); + } else if (COM_MINIMAX.equalsIgnoreCase(comPlayer)) { + return new MinimaxComPlayer(); + } else if (COM_ALPHABETA.equalsIgnoreCase(comPlayer)) { + return new AlphaBetaComPlayer(); + } else { + System.out.println("Unrecognized comPlayer '" + comPlayer +"', using default: " + COM_DEFAULT); + return new AlphaBetaComPlayer(); + } + } + + public void setComPlayer(String comPlayer) { + this.comPlayer = comPlayer; + } +} \ No newline at end of file diff --git a/src/view/PlayerSelectActionListener.java b/src/view/PlayerSelectActionListener.java new file mode 100644 index 0000000..03c0fee --- /dev/null +++ b/src/view/PlayerSelectActionListener.java @@ -0,0 +1,18 @@ +package view; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + + +public class PlayerSelectActionListener implements ActionListener { + private UserChooserFrame ucFrame; + + public PlayerSelectActionListener(UserChooserFrame ucFrame) { + this.ucFrame = ucFrame; + } + + @Override + public void actionPerformed(ActionEvent arg0) { + ucFrame.launchSelectedPlayer(); + } +} diff --git a/src/view/UserChooserFrame.java b/src/view/UserChooserFrame.java index 5375080..0753f32 100644 --- a/src/view/UserChooserFrame.java +++ b/src/view/UserChooserFrame.java @@ -19,20 +19,23 @@ import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; +import model.comPlayer.Player; import model.playerModel.PlayerModel; public class UserChooserFrame extends JFrame { public static final String PLAYER_LIST_FILE = "players.dat"; public static final JLabel RULES_TEXT = new JLabel( - "Here should go some rules text. Lorem ipsum and blah blah blah."); + "Here should go some rules text. Lorem ipsum dolor sit amet, consectetur adipiscing elit..."); private static final long serialVersionUID = 1L; private final JButton playButton = new JButton("Play!"); private final JComboBox userNameBox = new JComboBox(); private ArrayList users; - - public UserChooserFrame() { + private final Player comPlayer; + + public UserChooserFrame(ParsedArgs parsedArgs) { + this.comPlayer = parsedArgs.getComPlayer(); initLayout(); initActions(); @@ -75,35 +78,36 @@ public class UserChooserFrame extends JFrame { for (int i = 0; i < users.size(); i++) { userNameBox.addItem(users.get(i)); } - - playButton.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - String name = ((String) userNameBox.getSelectedItem()); - name = name == null ? name : name.trim().toLowerCase(); - - if (name != null && name.compareTo("") != 0) { - UserChooserFrame.this.setVisible(false); - - boolean found = false; - for (int i = 0; !found && i < users.size(); i++) { - if (name.compareTo(users.get(i)) == 0) { - found = true; - } - } - - if (!found) { - users.add(name); - } - - saveUserList(); - new MainFrame(name); - } - } - }); + + ActionListener psActionListener = new PlayerSelectActionListener(this); + + userNameBox.addActionListener(psActionListener); + playButton.addActionListener(psActionListener); } + void launchSelectedPlayer() { + String name = ((String) userNameBox.getSelectedItem()); + name = name == null ? name : name.trim().toLowerCase(); + + if (name != null && name.compareTo("") != 0) { + UserChooserFrame.this.setVisible(false); + + boolean found = false; + for (int i = 0; !found && i < users.size(); i++) { + if (name.compareTo(users.get(i)) == 0) { + found = true; + } + } + + if (!found) { + users.add(name); + } + + saveUserList(); + new MainFrame(name, comPlayer); + } + } + private void initLayout() { GridBagLayout gbl = new GridBagLayout();