Java五子棋(1)

做五子棋小遊戲分兩個步驟
一、首先實現畫棋盤,下棋子,悔棋,判斷輸贏。
二、AI(權值算法)

本篇先介紹第一個步驟。
那麼我們可以分幾個步驟走(我是按照我的思路來製作的)
1.加窗體,棋盤可以畫在一個容器裏,然後添加到窗體,然後按鈕就分佈在窗體北部。
2.棋盤的一些參數,比如X,Y值,棋盤的行和列等,這些可以放在一個類,都是定義爲常量,因爲後面還會有其他類,所以作爲接口類便好。
3.加監聽器,這時候我們引入一個新的東西,因爲鼠標監聽器的那些方法,有些事我們不需要的,所以我們不需要所以,我們就只需要一兩個方法就好啦。

MouseAdapter

4.畫棋子,我們就要找到點擊的點是要畫在棋盤的哪個交點,這裏先討論手動下棋,獲取點擊的X,Y座標,通過計算就可以找到在哪個交點啦,因爲我們不能保證點擊的地方一定會在交點的地方,所以我們劃分範圍,靠近交點的1/2size的時候那就爲此交點。
5.重繪,跟畫圖形很相似的點就是,需要存儲響應的數據,比如棋子的位置,棋子的顏色,因爲只有黑白棋,所以我們可以把下標分類爲奇數或者偶數,這樣,另外可以用二維數組存儲交點值,從而重繪。
6.做悔棋,我們畫棋子時,可以用一個計數count,用來作爲存儲畫的交點值的矩形的下標,當悔棋的時候,只用去除最後面的交點的位置,從而讓棋盤相應的交點爲0,0即不畫。最後重繪;
7.判斷輸贏,只有四種情況,橫豎左斜右斜;
8.判斷出輸贏之後彈出一個窗體,是我表示白子還是黑子贏。

理論的知識就差不多啦,其實實現起來還是比較簡單了,但是對於新手來說,記得慢慢閱讀上面的步驟。下面主要展示我的代碼。
1.這是我放主函數的類

public class GameUI extends JPanel{
 public void showBorder()
 {
  JFrame jf=new JFrame();
  jf.setTitle("五子棋2.0");
  jf.setSize(750, 700);
  //窗體不可變
  jf.setResizable(false);
  jf.setLocationRelativeTo(null);
  jf.setDefaultCloseOperation(3); 
  
  Listener listener=new Listener();
  
  JPanel jp=new JPanel();
  jp.setPreferredSize(new Dimension(0,50));
  jf.add(jp, BorderLayout.NORTH);
  String [] bu={"開始","認輸","悔棋","人機對戰","人人對戰"};
  for(int i=0;i<bu.length;i++)
  {
   JButton but=new JButton(bu[i]);
   jp.add(but);
   but.addActionListener(listener);
  }
  ChessJPanel cp=new ChessJPanel();
  jf.add(cp, BorderLayout.CENTER);
  cp.addMouseListener(listener);
  jf.setVisible(true);
  Graphics g=cp.getGraphics();
  listener.setGr(g);
  listener.setCp(cp); 
 }
 public static void main(String[] args)
 {
  GameUI cb=new GameUI();
  cb.showBorder();
 }
}

2.棋盤參數

public interface Config {
 public static final int X0=80;
 public static final int Y0=40;
 public static final int SIZE=40;
 public static final int LINE=15;
 public static final int [][] chessArray=new int[LINE][LINE];
}

3.添加監聽器

public class Listener extends MouseAdapter implements ActionListener,Config
 public int[][] chessArray()
 {
  return chessArray;
 }
 public void setGr(Graphics g)
 {
  gr=g;
 }
 public void setCp(ChessJPanel cp1)
 {
  this.cp=cp1;
 }

這些是必寫方法
4.畫棋子

gr.fillOval(a*SIZE+X0-SIZE/2, b*SIZE+Y0-SIZE/2, SIZE-5, SIZE-5);

其中a,b是我們算出來的數組棋盤的位置。
5.重繪

public class ChessJPanel extends JPanel implements Config{
 private ImageIcon image;
 
 public ChessJPanel(){
  image = new ImageIcon("E:\\五子棋4.jpg");
 }
 
 public void paint(Graphics g)
 {
  super.paint(g);
//  g.setColor(new Color(104,162,129));
//  g.fillRect(X0, Y0, (LINE-1)*SIZE, (LINE-1)*SIZE);
  
  //畫圖片
  g.drawImage(image.getImage(), 0, 0, this.getWidth(),this.getHeight(),null);
  g.setColor(Color.DARK_GRAY);
  for(int i=0;i<LINE;i++)
  {
   g.drawLine(X0, Y0+i*SIZE, (LINE-1)*SIZE+X0, Y0+i*SIZE);
   g.drawLine(X0+i*SIZE, Y0, X0+i*SIZE, (LINE-1)*SIZE+Y0);
  }
  Repaint(g);
 }
 private void Repaint(Graphics g)
 {
  
  for(int i=0;i<LINE;i++)
  {
   for(int j=0;j<LINE;j++)
   {
    if(chessArray[i][j]==1)
    {
     g.setColor(Color.BLACK);
     g.fillOval(i*SIZE+X0-SIZE/2, j*SIZE+Y0-SIZE/2, SIZE-5, SIZE-5);
    }
    if(chessArray[i][j]==2)
    {
     g.setColor(Color.WHITE);
     g.fillOval(i*SIZE+X0-SIZE/2, j*SIZE+Y0-SIZE/2, SIZE-5, SIZE-5);
    }
   }
  }
 }
}

6.悔棋

 //悔棋方法
 public void huiqi()
 {
  System.out.println();
  if(Ai==1)
  {
   count--;
   int a=order[count][0];
   int b=order[count][1];
   
   chessArray[a][b]=0;
   System.out.println(name+" "+count+" "+a+" "+b);
   count--;
   int a1=order[count][0];
   int b1=order[count][1];
   chessArray[a1][b1]=0;
   System.out.println(name+" "+count+" "+a1+" "+b1);
   
  }
  else if(Ai!=1)
  {
   count--;
   int a=order[count][0];
   int b=order[count][1];
   chessArray[a][b]=0;
  }
  cp.paint(gr);
 }

7.判斷輸贏

 public void checkwin()
 {
  for(int i=0;i<LINE;i++)
  {
   for(int j=0;j<LINE;j++)
   {
    if(chessArray[i][j]==flag)
    {
     c1++;
     if(c1==5)
     {
      vector=1;
      cout();
      break;
     }
    }
    else
     c1=0;
    if(chessArray[j][i]==flag&&vector!=1)
    {
     c2++;
     if(c2==5)
     {
      vector=1;
      cout();
      break;
     }
    }
    else
     c2=0;
   }
   if(vector==1)
    break;
  }
  if(vector==0)
  {
   c1=0;
   for(int i=0;i<LINE-5;i++)
   {
    for(int j=0;j<LINE-5;j++)
    {
     for(int z=0;z<5;z++)
     {
      if(chessArray[i+z][j+z]==flag)
      {
       c1++;
      }
      else if(chessArray[i+z][j+z]!=flag)
      {
       c1=0;
       break;
      }
     }
     if(c1==5)
     {
      vector=1;
      cout();
      break;
     }
    }
    if(c1==5)
     break;
   }
  }
  if(vector==0)
  {
   c1=0;
   for(int i=LINE-1;i>=5;i--)
   {
    for(int j=LINE-5;j>=0;j--)
    {
     for(int z=0;z<5;z++)
     {
      if(chessArray[i-z][j+z]==flag)
      {
       c1++;
      }
      else if(chessArray[i-z][j+z]!=flag)
      {
       c1=0;
       break;
      }
     }
     if(c1==5)
     {
      vector=1;
      cout();
      break;
     }
    }
    if(c1==5)
     break;
   }
  }
 }

8.輸出

 public void cout()
 {
  if(flag==2)
   Win();//System.out.println("白棋勝");
  else
   Win();//System.out.println("黑棋勝");
 }
 //贏就會跳出的界面
 public void Win()
 {
  JFrame jf2 = new JFrame();
  jf2.setSize(400, 300);   
  jf2.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  jf2.setLocationRelativeTo(null);
  java.awt.FlowLayout flow = new java.awt.FlowLayout();
  jf2.setLayout(flow);
  if(flag==1)
  {
   ImageIcon Page = new ImageIcon("E:\\black.png");
   JLabel jla = new JLabel(Page);
   Dimension du = new Dimension(400, 300);
   jla.setPreferredSize(du);
   jf2.add(jla);
  }
  else if(flag==2)
  {
   ImageIcon Page = new ImageIcon("E:\\white.png");
   JLabel jla = new JLabel(Page);
   Dimension du = new Dimension(400, 300);
   jla.setPreferredSize(du);
   jf2.add(jla);
  }
  jf2.setVisible(true);   
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章