第一天實作界面(棋盤,棋子,下棋)功能
構思:
- 如何繪制棋盤:可以把棋盤看作橫豎交叉的線段,參照之前的繪制直線教程,繪制15??15條橫豎交叉的線段來構造棋盤
- 如何繪制棋子:每個棋子其實就是繪制一個圓 具體畫法可以參照前面畫圓教程
- 黑白雙方輪流下棋,注意棋子一定要下在交點上 具體操作看后面代碼
- 個性化功能:添加背景圖
public static final Image bgimg = new ImageIcon("img/bg1.jpg").getImage();
易錯點:
-
一定要記得重寫paint方法,為什么?
因為每次拖動表單,縮放表單等操作會重新呼叫paint方法,導致你之前下的棋子被抹去,重寫paint放大的目的就是為了在重新呼叫paint方法是重下棋子 -
如何將棋子繪制在交點:
首先我們先通過滑鼠監聽器獲得當前點擊的坐標,然后我們知道在兩點之前的前1/2應該下在前一個交點,若在后二分之一則應該在后一個交點,規則確定以后我們就可以去寫演算法了: chessX=(x+SIZE/2-X)/SIZE;
chessY=(y+SIZE/2-Y)/SIZE;
這個SIZE指的是棋盤間距 兼 棋子直徑 -
如何實作黑白輪流下棋
這個很簡單,我們首先定義一個chessflag =0; 然后每次下棋完以后改一下這個值,判斷一下即可
具體代碼實作:
- 繪制表單
public void initGoBangMainUI(){
//this指的是當前類的物件
this.setTitle("簡易五子棋V1.0"); //名稱
this.setSize(1200,1000); //表單大小
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setVisible(true); //可視化
//加上滑鼠監聽器
this.addMouseListener(gl);
this.addMouseMotionListener(gl);
//獲取 Graphics 畫筆 傳給監聽器物件
Graphics g =this.getGraphics();
gl.setGraphics(g);
}
- 繪制棋子,以及黑白輪流下棋
@Override
@Override
public void mousePressed(MouseEvent e) {
int x=e.getX();
int y=e.getY();// 這邊中轉一下是因為可能會加一些條件,x,y不一定就是這個x,y
chessX=(x+SIZE/2-X)/SIZE;
chessY=(y+SIZE/2-Y)/SIZE; //算出你的棋子在第幾行第幾列
if(chessflag==0){
g.setColor(Color.WHITE);
chessArr[chessX][chessY]=1; //保存棋子
chessflag++;
}else{
g.setColor(Color.BLACK);
chessArr[chessX][chessY]=2; //保存棋子
chessflag=0;
} //黑白輪流下棋
g.fillOval(chessX*SIZE+X-SIZE/2,chessY*SIZE+Y-SIZE/2,SIZE,SIZE);
System.out.println("按下滑鼠按鍵");
}
- 重寫paint方法 paint方法中包含了繪制棋盤以及棋子
@Override
public void paint(Graphics g){
super.paint(g); //super指的是當前類的父類物件
//繪制背景圖
g.drawImage(bgimg,X,Y,ROW*SIZE,CLOUM*SIZE,null);
//繪制棋盤
for (int i =0; i<=15;i++){
g.drawLine(X,Y+i*SIZE,X+ROW*SIZE,Y+i*SIZE);
g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+CLOUM*SIZE);
}
//繪制棋子
for (int i=0;i<chessArr.length;i++){
for (int j=0;j<chessArr[0].length;j++){
if(chessArr[i][j]==1){
g.setColor(Color.WHITE);
g.fillOval(i*SIZE+X-SIZE/2,j*SIZE+Y-SIZE/2,SIZE,SIZE);
System.out.println("白棋");
}else if(chessArr[i][j]==2){
g.setColor(Color.BLACK);
g.fillOval(i*SIZE+X-SIZE/2,j*SIZE+Y-SIZE/2,SIZE,SIZE);
System.out.println("黑棋");
}else{
System.out.println("空白");
continue;
}
}
}
}
}
大概代碼就是以上部分:
效果展示

第一天的功能大概就是這樣,下一步我們繼續完善功能(判斷輸贏,悔棋功能)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/296571.html
標籤:java
