Java 編寫九宮格應用(三子棋)

在九宮格里面輪流畫圈或叉,哪一方先在水平、豎直、或對角線上有三個子則勝出。

可在窗體中安排9個按鈕對應每個格子

計算機和人輪流下子。

代碼如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.*;
class ChessDemo extends Panel implements ActionListener{
	char whoTurn = 'O';  //人—O,計算機--X
	Button b[] = new Button[9];  //9個按鈕
	StringBuffer chess = new StringBuffer("KKKKKKKKK");
     //將九宮格用一位數組來表示,用K字符表示空位置
	 
public ChessDemo(){
      setLayout(new GridLayout(3,3,3,3));
      for (int i=0;i<9;i++) {
          b[i] = new Button("");
          add(b[i]);
          b[i].setActionCommand(String.valueOf(i));
          b[i].addActionListener(this);
      }
}

public void actionPerformed(ActionEvent e) {
       Button me = (Button)(e.getSource());//自己
       if (!me.getLabel().equals("")) //不允許在已有棋子位置下棋 
			return;
       me.setLabel("" + whoTurn); //標記下棋
       int row = Integer.parseInt(me.getActionCommand()); //求位置
       chess.setCharAt(row,whoTurn); //記錄下棋     
       gameOver();  //判遊戲是否結束
       whoTurn = (whoTurn=='O') ? 'X' : 'O'; //輪換玩家
       computerTake();  //計算機下
} 

public  int  findplace() { //計算機找下棋位置
       for (int r=0;r<9;r++) 
          if (chess.charAt(r)=='K') {    //找個空位置
             chess.setCharAt(r,whoTurn);     //先填上棋子
             if (isWin(whoTurn))  { //看自己下此位置是否能贏 
                 chess.setCharAt(r,'K');  // 恢復原狀
					return r;
             }
             else
                 chess.setCharAt(r,'K');   // 恢復原狀
         }
     // 沒自己能直接贏得位置再看對方能贏的地方
      char  whoTurn2 = (whoTurn=='O') ? 'X' : 'O'; //換成對方思考
      for (int r=0;r<9;r++) 
			if (chess.charAt(r)=='K') {
             chess.setCharAt(r,whoTurn2);   //在空白處填上對方棋子
             if (isWin(whoTurn2)) {  //看填上棋子後能贏否
                 chess.setCharAt(r,'K');  // 恢復原狀
					return r;
             }
             else
                  chess.setCharAt(r,'K');   //恢復原狀
         }
			if (chess.charAt(4)=='K') {   //優先看中央位置
            return 4;      //佔據中央,返回4
		}
			else  {
				for (int d=1;d<5;d++) {   // 隨機找個空位置
					int rand= (int)(Math.random() * 9);
					if (chess.charAt(rand)=='K')
					return rand;
				}
		}
       return -1;  //特殊返回
}

public void computerTake(){
     int x = findplace();  //根據策略找位置
     chess.setCharAt(x,whoTurn);
     b[x].setLabel(String.valueOf(whoTurn));
     gameOver();    
     whoTurn = (whoTurn=='O') ? 'X' : 'O';
}

public void gameOver() {
   if (isWin(whoTurn)) { //判是否取勝
       JOptionPane.showMessageDialog(null, whoTurn+" win!");
       System.exit(0);
    } else if (isFull()) { //判是否下滿格子
       JOptionPane.showMessageDialog(null, "game is over!");
       System.exit(0);
    }
 }

public boolean isWin(char who){   
   String s3 = "" + who + who + who;
   String sum;   
   String sum1;
   String sum2;//用來拼接一個方向的棋子標識
   for(int k=0;k<3;k++)
   {
	   sum1=""+chess.charAt(k)+chess.charAt(k+3)+chess.charAt(k+6);//垂直方向
	   sum2=""+chess.charAt(k*3+0)+chess.charAt(k*3+1)+chess.charAt(k*3+2);//水平方向
	   if(sum1.equals(s3)||sum2.equals(s3))
	   {
		   return true;
	   }
	   else
	   {
		   sum1="";
		   continue;
	   }
	}
   sum=""+chess.charAt(0)+chess.charAt(4)+chess.charAt(8); //正對角線
   if (sum.equals(s3)) return true;
   sum=""+chess.charAt(2)+chess.charAt(4)+chess.charAt(6); //反對角線
   if (sum.equals(s3)) return true;
   return false;
}

public boolean isFull() {  //判是否棋盤下滿了
   return chess.toString().indexOf("K")== -1;
}

public static void main(String args[]) {
    Frame f = new Frame();
    f.add(new ChessDemo());
    f.setSize(300,300);
    f.setVisible(true); 
}
}

結果如下:

這道題感覺有點像AI。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章