之前的兩篇文章:Java實現(xiàn)兩人五子棋游戲(二) 畫出棋盤;Java實現(xiàn)兩人五子棋游戲(三) 畫出棋子
我們提供的服務(wù)有:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、花溪ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的花溪網(wǎng)站制作公司
前面,我們已經(jīng)畫好的棋盤和棋子,接下來,我們要通過鼠標點擊屏幕獲取落子位置并落子(先不考慮行棋方和勝負判斷)。
步驟:
1)捕捉鼠標按下的位置
2)經(jīng)過坐標變換(由像素位置->0-19的棋盤位置)
3)更新記錄棋盤狀態(tài)的二維數(shù)組
4)重新渲染繪制棋盤。
-------------落子動作代碼示例如下--------------
一個棋子類Chessman.java
package xchen.test.simpleGobang; public class Chessman { private int color;//1-white,0-black private boolean placed = false; public Chessman(int color,boolean placed){ this.color=color; this.placed=placed; } public boolean getPlaced() { return placed; } public void setPlaced(boolean placed) { this.placed = placed; } public int getColor() { return color; } public void setColor(int color) { this.color = color; } }
DrawChessBoard.java
package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RadialGradientPaint; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.Color; import javax.swing.JPanel; public class DrawChessBoard extends JPanel implements MouseListener{ final static int BLACK=0; final static int WHITE=1; public int chessColor = BLACK; int chessman_width=30; public Image boardImg; final private int ROWS = 19; Chessman[][] chessStatus=new Chessman[ROWS+1][ROWS+1]; public DrawChessBoard() { boardImg = Toolkit.getDefaultToolkit().getImage("res/drawable/chessboard2.png"); if(boardImg == null) System.err.println("png do not exist"); addMouseListener(this); } @Override protected void paintComponent(Graphics g) { // TODO Auto-generated method stub System.out.println("DRAW!!"); super.paintComponent(g); int imgWidth = boardImg.getHeight(this); int imgHeight = boardImg.getWidth(this); int FWidth = getWidth(); int FHeight= getHeight(); int x=(FWidth-imgWidth)/2; int y=(FHeight-imgHeight)/2; int span_x=imgWidth/ROWS; int span_y=imgHeight/ROWS; g.drawImage(boardImg, x, y, null); //畫橫線 for(int i=0;i<ROWS;i++) { g.drawLine(x, y+i*span_y, FWidth-x,y+i*span_y); } //畫豎線 for(int i=0;i<ROWS;i++) { g.drawLine(x+i*span_x, y, x+i*span_x,FHeight-y); } //畫棋子 for(int i=0;i<ROWS+1;i++) { for(int j=0;j<ROWS+1;j++) { if(chessStatus[i][j]!=null&&chessStatus[i][j].getPlaced()==true) { System.out.println("draw chessman "+i+" "+j); int pos_x=x+i*span_x; int pos_y=y+j*span_y; float radius_b=40; float radius_w=80; float[] fractions = new float[]{0f,1f}; java.awt.Color[] colors_b = new java.awt.Color[]{Color.BLACK,Color.WHITE}; Color[] colors_w = new Color[]{Color.WHITE,Color.BLACK}; RadialGradientPaint paint; if(chessStatus[i][j].getColor()==1) { System.out.println("draw white chess"); paint = new RadialGradientPaint(pos_x-chessman_width/2f, pos_y-chessman_width/2f, radius_w*2, fractions, colors_w); }else{ System.out.println("draw black chess"); paint = new RadialGradientPaint(pos_x-chessman_width/2f, pos_y-chessman_width/2f, radius_b*2, fractions, colors_b); } ((Graphics2D)g).setPaint(paint); ((Graphics2D)g).fillOval(pos_x-chessman_width/2,pos_y-chessman_width/2,chessman_width,chessman_width); } } } } @Override //當(dāng)用戶按下鼠標按鈕時發(fā)生 public void mousePressed(MouseEvent e) { int point_x=e.getX(); int point_y=e.getY(); int imgWidth = boardImg.getHeight(this); int imgHeight = boardImg.getWidth(this); int FWidth = getWidth(); int FHeight= getHeight(); int x=(FWidth-imgWidth)/2; int y=(FHeight-imgHeight)/2; int span_x=imgWidth/ROWS; int span_y=imgHeight/ROWS; System.out.println("press"); int status_x = 0; int status_y = 0; if(point_x>=x && point_x<=x+imgWidth && point_y>=y && point_y <= y+imgHeight) { System.out.println("合法"); for(int i=0;i<ROWS+1;i++) { if(point_x>=x-chessman_width/2+1+i*span_x) { if(point_x<=x+chessman_width/2-1+i*span_x)//如果是width/2會在中間點出現(xiàn)兩個匹配值 { System.out.println("point x "+i+" "+point_x+" "+(x-chessman_width/2+i*span_x)+" "+(x+chessman_width/2+i*span_x)); status_x = i; } } } for(int i=0;i<ROWS+1;i++) { if(point_y>=y-chessman_width/2+1+i*span_y) { if(point_y <= y+chessman_width/2-1+i*span_y) { System.out.println("point y "+i+" "+point_y+" "+(y-chessman_width/2+1+i*span_y)+" "+(y+chessman_width/2-1+i*span_y)); status_y = i; } } } Chessman chessman = new Chessman(BLACK, true); chessStatus[status_x][status_y]=chessman; repaint(); } System.out.println(status_x+" "+status_y+" "+chessStatus[status_x][status_y].getColor()+" "+chessStatus[status_x][status_y].getPlaced()); } @Override //當(dāng)用戶按下并松開鼠標按鈕時發(fā)生 public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } }
主模塊代碼不變
package xchen.test.simpleGobang; import java.awt.Container; import javax.swing.JFrame; import xchen.test.simpleGobang.DrawChessBoard; public class Main extends JFrame{ private DrawChessBoard drawChessBoard; public Main() { drawChessBoard = new DrawChessBoard(); //Frame標題 setTitle("單機五子棋"); Container containerPane =getContentPane(); containerPane.add(drawChessBoard); } public static void main(String[] args) { Main m = new Main(); m.setSize(800, 800); m.setVisible(true); } }
運行一下
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
新聞標題:Java實現(xiàn)兩人五子棋游戲(四)落子動作的實現(xiàn)
本文來源:http://aaarwkj.com/article18/ipopdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站設(shè)計、品牌網(wǎng)站制作、網(wǎng)頁設(shè)計公司、外貿(mào)建站、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)