跳到主要內容

java打磚塊


一、設計心得

1.首先定義出磚塊、球、拍子的長與寬(藉由icon大小取得)。
2.繪出磚塊數量及位置
3.滑鼠移動時拍子隨著移動(滑鼠事件、注意邊界)。
4.以Thread或Timer及移動距離來控制球的速度。
5.每次的移動便判斷球是否碰撞磚塊或者超出邊界,並進行對應動作(反彈、消掉磚塊)。
6.當球移動到拍子以下則結束。

二、遊戲Demo





三、原始碼


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.*;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.Timer;
public class Block extends JApplet implements ActionListener,MouseListener,MouseMotionListener{
    private Image imBorad = new ImageIcon(getClass().getResource("picture/bar.gif")).getImage();
    private Image imBall = new ImageIcon(getClass().getResource("picture/ball.gif")).getImage();
    private Image imBar = new ImageIcon(getClass().getResource("picture/bar1.gif")).getImage();
    private int xBorad = 0,yBorad = 0,xBall = 0,yBall = 0,xMove = 5,yMove = 5,iWidth,iHeight;
    private int iBallWidth,iBallHeight,iBoradWidth,iBoradHeight,iBarWidth,iBarHeight,iScore = 0,iScorex,iScorey;
    private boolean b;
    private Timer t;
    private Image imBuffer;//緩衝區
    private Graphics back;
    boolean bCheckbar[][];
    public void init(){
//        super("打磚塊");
        this.setSize(480, 620);
        this.setVisible(true);
        iWidth = this.getWidth();
        iHeight = this.getHeight();
        iBallWidth = imBall.getWidth(this);//球寬
        iBallHeight = imBall.getHeight(this);//球高
        iBoradWidth = imBorad.getWidth(this);//拍寬
        iBoradHeight = imBorad.getHeight(this);//拍高
        iBarWidth = imBar.getWidth(this);//磚塊寬
        iBarHeight = imBar.getHeight(this);//磚塊高
        iScorex = iWidth/6*5;
        iScorey = iHeight/2;
        bCheckbar = new boolean[13][15];//磚塊數量
        initial();        
        this.addMouseMotionListener(this);
        this.addMouseListener(this);      
        t=new Timer(15,this);   
                   
    }
     private void initial() {//初始化
        xBorad = iWidth/2;
        yBorad = iHeight-iBoradHeight-5;
        xBall = xBorad+iBoradWidth/2-iBallWidth/2;
        yBall = yBorad- iBallHeight;
        b = false; 
         for (int i = 0; i < bCheckbar.length; i++) {
              for (int j = 0; j < bCheckbar[i].length; j++) {
                 bCheckbar[i][j] = true;                 
             }             
         }
        repaint();
    }
    public void paint(Graphics g) {
//        super.paintComponents(g);//畫出元件
        imBuffer = createImage(iWidth,iHeight);
        back = imBuffer.getGraphics();
        back.drawImage(imBall,xBall , yBall, this);
        back.drawImage(imBorad,xBorad , yBorad, this);
         for (int i = 0; i < bCheckbar.length; i++) {//尋訪所有磚塊
            for (int j = 0; j < bCheckbar[i].length; j++) {
                if (!bCheckbar[i][j]) continue;//已打到則跳過不繪出
                int iBarX = (i+1)*iBarWidth;
                int iBarY = (j+1)*iBarHeight;
                int iBarAreaX = iBarX + iBarWidth;
                int iBarAreaY = iBarY+iBarHeight;
                if (xBall >= iBarX && xBall <= iBarAreaX && yBall > iBarY && yBall <= iBarAreaY) {//已打中   
                    if ((xBall >= iBarX && xBall <= (iBarX + iBallWidth))||(xBall <= iBarAreaX && xBall >= (iBarAreaX - xMove)))  {xMove = -xMove;}
                    else   yMove = -yMove;
                    bCheckbar[i][j] = false;
                    iScore += 100;
                    break;
                } 
                back.drawImage(imBar, iBarX, iBarY, this);       
            }
        }
        back.setColor(Color.red);
        back.drawString("Score:" + iScore, iScorex, iScorey);
        g.drawImage(imBuffer, 0, 0, this);
        if (xBall <= 0 || xBall >= iWidth-iBallWidth) xMove = -xMove;//左右邊界
        if (yBall <= 20) yMove = -yMove;//上邊界
        if (xBall >= xBorad && xBall <= xBorad+iBoradWidth-iBallWidth && yBall > yBorad - iBallHeight){//拍子高度
            yMove = -yMove;
        }else if (yBall >= iHeight) {//下邊界
            t.stop();
            initial();
        }        
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        xBall -= xMove;
        yBall -= yMove;
        repaint(); 
    }
    public void mouseClicked(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {t.start();b=true;}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mouseDragged(MouseEvent e) {}
    public void mouseMoved(MouseEvent e) {
        int mx = e.getX() - iBoradWidth/2;
        if (mx + iBoradWidth >= iWidth || mx <= 0) return;
        xBorad = mx;
        if (!b) {//未開始移動
            xBall = mx + iBoradWidth /2 ;
            repaint();           
        }
    }   
//    public static void main(String[] args) {
//        Block b = new Block();
//        b.setDefaultCloseOperation(EXIT_ON_CLOSE);
//    }
}

留言

這個網誌中的熱門文章

java西元民國轉換_各種不同格式

C#資料庫操作(新增、修改、刪除、查詢)

【Excel好好玩】 自己的資產自己管!善用Google Sheet來幫我們評估貸款

這次介紹的主題是關於Excel的貸款還款計畫試算,我們人生中總會遇到需要大筆金額的花費,但當資金不夠時就得進行貸款,而貸款之前如果我們能夠審慎評估,並分析自己的還款能力之後在進行凍作,相信風險會小很多,因此就自己動動手來使用Google Sheet進行試算吧! 基本資料 ● 貸款總額: 1000000 ● 貸款期數: 84月 ● 年利率: 2.11% ● 月利率: 0.18% P.S 月利率 = 年利率 / 12 重要函式 PMT : 這是Google Sheet內建的重要年金計算公式,我們可以善用這個公式來計算固定利率及期數的固定攤還本息。因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 動手做 首先我們在Excel表上列出我們的基本資料 圖片來源 其中月利率的部分就使用公式「=B4/12」 接著我們填上第一列的期數跟餘額 圖片來源 =B2 =B3 使用關鍵PMT函數來計算本息的部分 因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 -PMT(貸款利率(月利率), 貸款期數, 貸款總額) =-PMT($B$5,$B$3,$B$2) 圖片來源 計算利息 利息 = 貸款餘額 x 月利率 =B8*$B$5 圖片來源 計算本金 本金 = 本息 - 利息 =C8-D8 圖片來源 製作第二列餘額的部分 餘額的部分 = 上一期的餘額 - 上一期的本金 圖片來源 接著拖曳該兩列往下拉,即可查看每一期的利息與本金 圖片來源 結語 雖然市面上已經有很多貸款銀行都提供了試算功能,但如果我們想要進一步管理自己的資產時,就需要將每一期的金額給計算出來,因此才會將公式運用在Excel表,讓我們的資產管理表能夠結合負債,進一步評估我們理財行動的下一步,希望這樣的經驗可以幫助到正在理財道路上打拼的夥伴,讓我們透過有效的管理,幫助荷包長大吧! 喜歡撰寫文章的你,不妨來了解一下: Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入? 歡迎加入一起練習寫作,賺取知識,累積財富!