
我實際上寫了這段代碼是為了向我的一位朋友展示Java的一些非常酷的功能,這些朋友也以“ C ++”風格編寫了相同的應用程序。 而且我的那個朋友甚至為計算機播放器開發了代碼。 但是在完成他的代碼后,他可悲地意識到了一個基本事實,即如果你玩的很好,你將無法在井字游戲中獲勝! 呵呵 所以我沒有冒險進入那個領域。 老實說,我對編寫AI應用程序并不感興趣。 但由于我喜歡網絡編程,因此我想到了向該應用程序添加網絡多人游戲功能。 但是很遺憾,我還沒有時間這樣做。
Anywaiz應用程序的工作方式如下-游戲啟動后即自動啟動,狀態欄指示現在輪到哪個玩家,剩下的只是簡單的玩法! 在游戲結束時,該應用程序將自動重置。 進入代碼。
import javax.swing.*;import java.awt.*;
import java.awt.event.*;
import java.util.logging.Logger;/**
* TicTacToe Application
* @author Steve Robinson
* @version 1.0
*/class TicTacToeFrame extends JFrame
{JButton [][] buttons= new JButton[3][3];JTextField statusBar;GamePanel panel;Integer turn;GameListener listener=new GameListener();Integer count;public TicTacToeFrame(){setLayout(new BorderLayout());panel=new GamePanel();add(panel,BorderLayout.CENTER);statusBar=new JTextField("Player1's Turn");statusBar.setEditable(false);add(statusBar,BorderLayout.SOUTH);setTitle("Tic Tac Toe!");setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(400,400,300,300);}class GamePanel extends JPanel{public GamePanel(){setLayout(new GridLayout(3,3));turn =1;count=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++) {buttons[i][j]=new JButton();buttons[i][j].putClientProperty("INDEX", new Integer[]{i,j});buttons[i][j].putClientProperty("OWNER", null);buttons[i][j].addActionListener(listener);add(buttons[i][j]);}}}class GameListener implements ActionListener{public void actionPerformed(ActionEvent e){count++;JButton b=(JButton)e.getSource();Integer[]index=(Integer[]) b.getClientProperty("INDEX");//System.out.println(turn); //turn // //System.out.println("["+index[0]+"]"+"["+index[1]+"]"); //b.putClientProperty("OWNER", turn);Icon ico=new ImageIcon(turn.toString()+".gif");b.setIcon(ico);b.setEnabled(false);boolean result=checkVictoryCondition(index);if(result){JOptionPane.showMessageDialog(null, "Player "+turn.toString()+" Wins");initComponents();}else{if(turn==1){turn=2;statusBar.setText("Player2's Turn");}else{turn=1;statusBar.setText("Player1's Turn");}}if(count==9){JOptionPane.showMessageDialog(null, "Match is a draw!");initComponents();}}Integer getOwner(JButton b){return (Integer)b.getClientProperty("OWNER");}//PrintButtonMap for Diagnosticsvoid printbuttonMap(Integer [][]bMap){for(int i=0;i for(int j=0;j System.out.print(bMap[i][j]+" ");System.out.println("");}}boolean checkVictoryCondition(Integer [] index){/*Integer[][]buttonMap=new Integer[][] {{ getOwner(buttons[0][0]),getOwner(buttons[0][1]),getOwner(buttons[0][2])},{ getOwner(buttons[1][0]),getOwner(buttons[1][1]),getOwner(buttons[1][2])},{ getOwner(buttons[2][0]),getOwner(buttons[2][1]),getOwner(buttons[2][2])}};printbuttonMap(buttonMap); */Integer a=index[0];Integer b=index[1];int i;//check rowfor(i=0;i<3;i++) {if(getOwner(buttons[a][i])!=getOwner(buttons[a][b]))break;}if(i==3)return true;//check columnfor(i=0;i<3;i++) {if(getOwner(buttons[i][b])!=getOwner(buttons[a][b]))break;}if(i==3)return true;//check diagonalif((a==2&&b==2)||(a==0&&b==0)||(a==1&&b==1)||(a==0&&b==2)||(a==2&&b==0)){//left diagonalfor(i=0;i if(getOwner(buttons[i][i])!=getOwner(buttons[a][b]))break;if(i==3)return true;//right diagonalif((getOwner(buttons[0][2])==getOwner(buttons[a][b]))&&(getOwner(buttons[1][1])==getOwner(buttons[a][b]))&&(getOwner(buttons[2][0])==getOwner(buttons[a][b])))return true;}return false;}}void initComponents(){for(int i=0;i<3;i++) for(int j=0;j<3;j++) {buttons[i][j].putClientProperty("INDEX", new Integer[]{i,j});buttons[i][j].putClientProperty("OWNER",null);buttons[i][j].setIcon(null);buttons[i][j].setEnabled(true);turn=1;count=0;statusBar.setText("Player1's Turn");}}}class TicTacToe {public static void main(String[] args) {EventQueue.invokeLater(new Runnable(){public void run(){TicTacToeFrame frame=new TicTacToeFrame();}});}}
該代碼非常簡單。 香港專業教育學院在按鈕中使用兩個屬性來存儲一些信息,用于檢查獲勝條件。 一個是“ OWNER”屬性,它指示哪個用戶當前擁有該正方形,而“ INDEX”屬性則指示該正方形在網格中的索引(即[1,1],[1,2]…等)一個正方形,將更新OWNER屬性,并使用所有按鈕的OWNER屬性檢查victoryCondition。 其余代碼不言自明。
為第二個播放器添加鍵盤支持是一件非常容易的事。 正如他們所說的…“我把它留作練習”! 哈哈哈 好吧,我真的希望我能花些時間,以便可以為該應用程序添加網絡功能。
干杯,
史蒂夫。
-
我忘記附加將由應用程序使用的圖像圖標文件。 你可以在這里下載 http://www.mediafire.com/?d7d93v2342dxind 只需將內容提取到包含代碼的文件夾中即可。 感謝我的朋友“ Gur Png”告訴我這件事。
參考:來自我們JCG合作伙伴的 Java TicTacToe ? Footy'n'Tech博客上的Steve Robinson。
翻譯自: https://www.javacodegeeks.com/2012/02/java-swing-tic-tac-toe.html