@HFOEが言ったように(彼に+1) 、通知と待機Thread
で sを使用したくないので、非常に複雑になります。ゲームのロジックはIMOに歪んでいます。
ゲームを開始する前に、いくつかのフレームワークを設定します。
- 9
JButton
秒 (配列はボタンを保持します)
JPanel
でGridLayout(3,3)
三目並べのグリッドを作成します
重要な部分は次のとおりです。
- プレーヤーがゲームを開始し、その後コンピューターが起動するなど
ActionListener
上記を念頭に置いて、プレーヤーが去った後(ボタンがクリックされ、プレーヤーのシンボルが設定された後)、各ボタンに使用される基本を作成した私の例を参照してください。CPUが再生するメソッドを呼び出します。
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
public class Test {
//declare variables for player and cpu symbol
private String playerSymbol = "X";
private String cpuSymbol = "O";
//used for cpu to select random block
private Random r = new Random();
//create arraylist to hold buttons
ArrayList<JButton> blocks = new ArrayList<>();
//this is the action listner that will be added to each block and will allow player the first turn then cpu goes
private ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
//players turn
playerTurn(ae);
//check for win after player gone
checkForWin();
//cpu turn
cpuTurn();
//check for a win after cpu goes
checkForWin();
}
private void cpuTurn() {
System.out.println("CPU goes");
while (true) {
int blockNumber = r.nextInt(9);
System.out.println(blockNumber + "");
String tmp = blocks.get(blockNumber).getText();
if (tmp.equals("")) {
blocks.get(blockNumber).setText(cpuSymbol);
break;
}
}
}
private void checkForWin() {
System.out.println("Checking for a win...");
}
private void playerTurn(ActionEvent ae) {
System.out.println("Player goes");
JButton block = (JButton) ae.getSource();
block.setText(playerSymbol);
}
};
public Test() {
initComponents();
}
private void initComponents() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel board = new JPanel(new GridLayout(3, 3));//create gridlayput to hold buttons
//create blocks/Jbuttons to hold X and Y
createBlocks(blocks);
//add buttons/blocks to the board
fillBoard(blocks, board);
//add board to JFrame content pane
frame.add(board);
frame.pack();
frame.setVisible(true);
}
private void fillBoard(ArrayList<JButton> blocks, JPanel board) {
for (JButton block : blocks) {
board.add(block);
}
}
private void createBlocks(ArrayList<JButton> blocks) {
for (int i = 0; i < 9; i++) {
//create new button with a size of 50,50
JButton block = new JButton() {
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
};
block.addActionListener(al);//add the actionlistner to the button
blocks.add(block);
}
}
public static void main(String[] args) {
//set L&F and create UI on EDT
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {//set L&F
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
// If Nimbus is not available, you can set the GUI to another look and feel.
}
//create UI
new Test();
}
});
}
}