?? canvas.java
字號(hào):
package ball;
import javax.swing.JPanel;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.Color;
import javax.swing.JOptionPane;
import java.io.InputStream;
import sun.audio.*;
import java.awt.event.MouseMotionAdapter;
/**
* <p>Title: 類說明</p>
*
* <p>Description: 棋盤面板</p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author goodboy
* @version 2.1
*/
public class Canvas extends JPanel {
int size=16; //棋盤大小
int[][] board=new int[size][size]; //棋盤數(shù)據(jù) 0:無棋子 1:用戶棋子 2:AI棋子
Color aiColor, userColor; //棋子顏色
int userX, userY; //用戶落子位置
int lastX=-1, lastY=-1; //AI最后落子位置
int endX1,endY1,endX2,endY2; //結(jié)束成線繪制
int[] forbidX=new int[5]; //禁手位置橫坐標(biāo)
int[] forbidY=new int[5]; //禁手位置縱坐標(biāo)
String tipText="<html>";
boolean avail=false; //繪制標(biāo)志
boolean drawEndLine=false; //繪制結(jié)束直線標(biāo)志
boolean forbidStyle=false; //禁手提示標(biāo)記
boolean lastAvail=false; //AI最后落子標(biāo)記
boolean[] forbidAvail={false,false,false,false,false}; //禁手標(biāo)記
public Canvas(){
try{
jbInit();
}
catch(Exception exception){
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
this.setLayout(null);
this.addMouseListener(new Canvas_this_mouseAdapter(this));
this.addMouseMotionListener(new Canvas_this_mouseMotionAdapter(this));
}
//繪圖方法
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D draw = (Graphics2D) g;
drawBoard(draw); //繪制棋盤
if(avail){ //繪制圖形
//繪制棋子
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
if(board[i][j]==1){ //用戶棋子
drawChessman(draw,i*40,j*40,userColor);
}
else if(board[i][j]==2){ //AI棋子
drawChessman(draw,i*40,j*40,aiColor);
}
}
}
//突出AI上一個(gè)落子位置
if(lastAvail){
draw.setColor(Color.lightGray);
draw.fillOval(lastX*40,lastY*40,30,30);
}
//繪制禁手提示位置
for(int i=0;i<5;i++){
if(forbidAvail[i]){
draw.setColor(Color.magenta);
draw.drawOval(forbidX[i]*40,forbidY[i]*40,30,30);
draw.drawString("禁手",forbidX[i]*40+5,forbidY[i]*40+20);
}
}
//顯示結(jié)束直線
if(drawEndLine){
draw.setColor(Color.magenta);
draw.drawLine(endX1*40+15,endY1*40+15,endX2*40+15,endY2*40+15);
}
}
}
/**
* <p>Description: 初始化數(shù)據(jù)</p>
*/
public void initData(){
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
board[i][j]=0;
}
}
for(int i=0;i<5;i++){
forbidAvail[i]=false;
}
userColor=Color.black;
aiColor=Color.white;
lastX=-1;
lastY=-1;
drawEndLine=false;
forbidStyle=false;
lastAvail=false;
}
/**
* <p>Description: 繪制棋盤</p>
* @param g Graphics2D對(duì)象
*/
public void drawBoard(Graphics2D g){
for(int i=0;i<size;i++){
//繪制邊框
g.setColor(Color.blue);
g.drawLine(15,15+i*40,15+(size-1)*40,15+i*40);
g.drawLine(15+i*40,15,15+i*40,15+(size-1)*40);
//繪制標(biāo)記
g.setColor(Color.black);
g.drawString(i+"", 12+i*40, 10);
g.drawString(i+"", 2, 18+i*40);
}
}
/**
* <p>Description: 繪制棋子</p>
* @param g Graphics2D對(duì)象
* @param i 棋子橫坐標(biāo)
* @param j 棋子縱坐標(biāo)
* @param c 棋子顏色
*/
public void drawChessman(Graphics2D g, int i, int j, Color c){
g.setColor(c);
g.fillOval(i,j,30,30);
}
/**
* <p>Description: 設(shè)置AI最后落子坐標(biāo)</p>
* @param i AI最后落子橫坐標(biāo)
* @param j AI最后落子縱坐標(biāo)
*/
public void setLast(int i, int j){
lastAvail=true;
lastX=i;
lastY=j;
}
/**
* <p>Description: 設(shè)置結(jié)束成線標(biāo)記</p>
* @param x1 起點(diǎn)橫坐標(biāo)
* @param y1 起點(diǎn)縱坐標(biāo)
* @param x2 終點(diǎn)橫坐標(biāo)
* @param y2 終點(diǎn)縱坐標(biāo)
*/
public void setLine(int x1, int y1, int x2, int y2){
drawEndLine=true;
endX1=x1;
endY1=y1;
endX2=x2;
endY2=y2;
}
/**
* <p>Description: 設(shè)置禁手提示位置</p>
* @param x 提示位置橫坐標(biāo)
* @param y 提示位置縱坐標(biāo)
*/
public void setForbidLocation(int x,int y){
for(int i=0;i<5;i++){
if(!forbidAvail[i]){
forbidX[i]=x;
forbidY[i]=y;
forbidAvail[i]=true;
break;
}
}
}
/**
* <p>Description: 設(shè)置禁手位置繪制標(biāo)記</p>
* @param n 繪制禁手位置標(biāo)記
*/
public void setForbid(boolean n){
for(int i=0;i<5;i++){
forbidAvail[i]=n;
}
}
/**
* <p>Description: 播放聲音</p>
* @param index 播放音頻文件序號(hào)(0-2)
*/
public void playSound(int index){
try{
InputStream stream;
AudioStream audio;
switch(index){
case 1:{ //落子聲
stream=this.getClass().getResourceAsStream("sound/waveUp.wav");
break;
}
case 2:{ //游戲結(jié)束聲
stream=this.getClass().getResourceAsStream("sound/waveEnd.wav");
break;
}
case 3:{ //游戲結(jié)束聲
stream=this.getClass().getResourceAsStream("sound/waveDrop.wav");
break;
}
default:{ //落子聲
stream=this.getClass().getResourceAsStream("sound/waveUp.wav");
break;
}
}
audio=new AudioStream(stream);
AudioPlayer.player.start(audio);
}
catch(Exception e1){
e1.printStackTrace();
JOptionPane.showMessageDialog(null, e1.toString(), "播放音頻文件產(chǎn)生異常", JOptionPane.ERROR_MESSAGE);
}
}
//鼠標(biāo)點(diǎn)擊事件
public void this_mousePressed(MouseEvent e) {
int tempX=e.getX();
int tempY=e.getY();
//設(shè)置邊界
if(tempX<15){
tempX=15;
}
if(tempY<15){
tempY=15;
}
if(tempX>15+(size-1)*40){
tempX=15+(size-1)*40;
}
if(tempY>15+(size-1)*40){
tempY=15+(size-1)*40;
}
if(e.getButton()==e.BUTTON1){ //鼠標(biāo)左鍵點(diǎn)擊
if(Frame1.turn==0&&avail&&board[(int)(tempX+5)/40][(int)(tempY+5)/40]==0){ //輪到用戶下子
for(int i=0;i<5;i++){
if(forbidAvail[i]){
if(forbidX[i]==(int)(tempX+5)/40&&forbidY[i]==(int)(tempY+5)/40){
forbidStyle=true;
}
}
}
if(forbidStyle){ //檢測(cè)到禁手
Frame1.forbidStyle++;
forbidStyle=false;
playSound(3);
JOptionPane.showMessageDialog(null, "<html><b>該點(diǎn)為<font color=blue>禁手</font>位"
+",<font color=blue>游戲規(guī)則</font>可以查看<font color=purple>幫助</font>", "落子無效", JOptionPane.INFORMATION_MESSAGE);
}
else{
userX=(int)(tempX+5)/40;
userY=(int)(tempY+5)/40;
playSound(1);
Frame1.turn=1;
}
}
else if(!avail){ //未選擇開始
playSound(3);
JOptionPane.showMessageDialog(null, "<html><b>請(qǐng)?jiān)诓藛沃袉螕?lt;font color=purple>開始</font>進(jìn)行游戲", "開始游戲", JOptionPane.INFORMATION_MESSAGE);
}
else if(board[(int)(tempX+5)/40][(int)(tempY+5)/40]!=0){
playSound(3);
}
}
else if(e.getButton()==e.BUTTON3){ //鼠標(biāo)右鍵點(diǎn)擊
}
}
//用戶鼠標(biāo)移動(dòng)
public void this_mouseMoved(MouseEvent e) {
}
}
class Canvas_this_mouseAdapter extends MouseAdapter {
private Canvas adaptee;
Canvas_this_mouseAdapter(Canvas adaptee) {
this.adaptee = adaptee;
}
public void mousePressed(MouseEvent e) {
adaptee.this_mousePressed(e);
}
}
class Canvas_this_mouseMotionAdapter extends MouseMotionAdapter {
private Canvas adaptee;
Canvas_this_mouseMotionAdapter(Canvas adaptee) {
this.adaptee = adaptee;
}
public void mouseMoved(MouseEvent e) {
adaptee.this_mouseMoved(e);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -