做五子棋小遊戲分兩個步驟
一、首先實現畫棋盤,下棋子,悔棋,判斷輸贏。
二、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);
}