java打字游戲


 

小記:老早之前寫的程序,今天發現之前在 csdn上寫的東西的圖片不顯示了,搞得人好郁悶,所以把之前零星的幾篇文章搬個家

游戲運行截圖:

字母實體類

package com.git.game;  
  
import java.awt.Color;  
  
public class Letter {  
    private String num;  
    private Color color;  
    private int x;  
    private int y;  
    private int speed = 1;  
  
    public Letter() {  
    }  
  
    public Letter(String num, Color color, int x, int y) {  
        super();  
        this.num = num;  
        this.color = color;  
        this.x = x;  
        this.y = y;  
    }  
  
    /** 
     * 判斷字母是否出界 
     *  
     * @time 2016年6月29日 下午12:27:38 
     * @author Lichao 
     * @return 出界為true,未出界為false 
     */  
    public boolean outOfBound() {  
        return this.y > LetterGame.HEIGTH;  
    }  
  
    public void step() {  
        this.y += speed;  
    }  
  
    /* getter setter方法 */  
    public String getNum() {  
        return num;  
    }  
  
    public void setNum(String num) {  
        this.num = num;  
    }  
  
    public Color getColor() {  
        return color;  
    }  
  
    public void setColor(Color color) {  
        this.color = color;  
    }  
  
    public int getX() {  
        return x;  
    }  
  
    public void setX(int x) {  
        this.x = x;  
    }  
  
    public int getY() {  
        return y;  
    }  
  
    public void setY(int y) {  
        this.y = y;  
    }  
  
}  

 

游戲主運行類

package com.git.game;  
  
import java.awt.Color;  
import java.awt.Font;  
import java.awt.Graphics;  
import java.awt.event.KeyAdapter;  
import java.awt.event.KeyEvent;  
import java.awt.event.MouseAdapter;  
import java.awt.event.MouseEvent;  
import java.awt.image.BufferedImage;  
import java.util.Arrays;  
import java.util.Random;  
import java.util.Timer;  
import java.util.TimerTask;  
  
import javax.imageio.ImageIO;  
import javax.swing.JFrame;  
import javax.swing.JPanel;  
  
public class LetterGame extends JPanel {  
  
    private static final long serialVersionUID = 1L;  
    public static final int WIDTH = 654;// 界面寬度  
    public static final int HEIGTH = 600;// 界面高度  
    private Timer timer; // 定時器  
    private int interVal = 1000 / 100;// 時間間隔,10毫秒  
    private Letter[] letters = {}; // 存放的字母  
    private int outOfBoundNumber;// 記錄丟掉的字母個數  
    private int hitNumbers = 0; // 按中的字母個數  
    public static BufferedImage background; // 背景圖  
    public static BufferedImage gameover; // 背景圖  
    // 游戲狀態  
    private int state;  
    public static final int RUNNING = 0;// 運行狀態  
    public static final int GAME_OVER = 1; // 結束狀態  
  
    static { // 加載靜態資源  
        try {  
            background = ImageIO.read(LetterGame.class  
                    .getResource("background.bmp"));  
            gameover = ImageIO.read(LetterGame.class  
                    .getResource("gameover.bmp"));  
        } catch (Exception e) {  
            System.err.println("圖片加載失敗!");  
            e.printStackTrace();  
        }  
    }  
  
    public LetterGame() {  
    }  
  
    // 進數索引  
    int enterIndex = 0;  
  
    /** 
     * 字母進入面板的方法 
     *  
     * @time 2016年6月29日 上午10:38:51 
     * @author Lichao 
     */  
    public void enterAction() {  
        enterIndex++;  
        if (enterIndex % 30 == 0) {  
            Letter letter = nextOne();// 每300毫秒執行一次  
            letters = Arrays.copyOf(letters, letters.length + 1);  
            letters[letters.length - 1] = letter;  
        }  
    }  
  
    /** 
     * 步進方法 
     *  
     * @time 2016年6月29日 上午10:40:58 
     * @author Lichao 
     */  
    public void stepAction() {  
        for (int i = 0; i < letters.length; i++) {  
            letters[i].step();  
        }  
    }  
  
    /** 
     * 定時運行方法 
     *  
     * @time 2016年6月29日 上午11:12:35 
     * @author Lichao 
     */  
    public void action() {  
  
        state = RUNNING;  
        this.repaint();  
        /** 
         * 鍵盤監聽事件 
         */  
        KeyAdapter keyAdapter = new KeyAdapter() {  
  
            public void keyPressed(KeyEvent e) {  
                int index = -1;  
                String keyPressed = e.getKeyChar() + "";  
                for (int i = 0; i < letters.length; i++) {  
                    Letter letter = letters[i];  
                    if (keyPressed.equalsIgnoreCase(letter.getNum())) {  
                        hitNumbers++;  
                        index = i;  
                        break;  
                    }  
                }  
  
                if (index != -1) {  
                    Letter temp = letters[index];  
                    letters[index] = letters[letters.length - 1];  
                    letters[letters.length - 1] = temp;  
                    letters = Arrays.copyOf(letters, letters.length - 1);  
                }  
            }  
  
        };  
        /** 添加鼠標事件 */  
        this.addKeyListener(keyAdapter);  
        // 這兩句用來監聽鍵盤  
        this.setFocusable(true);  
        this.requestFocus();  
        mouseAction();  
  
        timer = new Timer();  
        timer.schedule(new TimerTask() {  
  
            @Override  
            public void run() {  
                if (state == RUNNING) {  
                    enterAction();  
                    stepAction();  
                    outOfBoundAction();  
                }  
                checkGameOverAction();  
  
                repaint();  
            }  
        }, interVal, interVal);  
  
    }  
  
    /** 
     * 出界操作 
     *  
     * @time 2016年6月29日 下午12:30:17 
     * @author Lichao 
     */  
    public void outOfBoundAction() {  
        int index = 0;  
        Letter[] lettersInPanel = new Letter[letters.length];  
        for (int i = 0; i < letters.length; i++) {  
            Letter letter = letters[i];  
            if (!letter.outOfBound()) {  
                lettersInPanel[index++] = letter;  
            } else {  
                outOfBoundNumber++;  
            }  
        }  
  
        letters = Arrays.copyOf(lettersInPanel, index);  
    }  
  
    /** 
     * 判斷游戲是否結束 
     *  
     * @time 2016年6月29日 下午1:38:24 
     * @author Lichao 
     */  
    private void checkGameOverAction() {  
        if (isGameOver()) {  
            state = GAME_OVER;  
        }  
    }  
  
    /** 
     * 隨機生成字母 
     *  
     * @time 2016年6月29日 上午10:35:46 
     * @author Lichao 
     * @return 
     */  
    protected Letter nextOne() {  
        Random random = new Random();  
        Letter letter = new Letter();  
        letter.setNum(String.valueOf((char) (random.nextInt(26) + 'A')));  
  
        letter.setX(random.nextInt(WIDTH - 25));  
        letter.setY(10);  
        letter.setColor(getRandColor());  
        return letter;  
    }  
  
    /** 
     * 生成隨機顏色 
     *  
     * @time 2016年6月29日 上午10:13:06 
     * @author Lichao 
     * @return 
     */  
    public static Color getRandColor() {  
        Random random = new Random();  
        Color color = new Color(random.nextInt(255), random.nextInt(255),  
                random.nextInt(255));  
        return color;  
    }  
  
    /** 
     * 重寫父類方法 
     */  
    @Override  
    public void paint(Graphics g) {  
        g.drawImage(background, 0, 0, null);  
        paintNumber(g);  
        paintState(g);  
        paintScore(g);  
    }  
  
    /** 
     * 畫圖形 
     *  
     * @time 2016年6月29日 上午9:10:08 
     * @author Lichao 
     * @param g 
     */  
    private void paintNumber(Graphics g) {  
        g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 25));  
        for (int i = 0; i < letters.length; i++) {  
            Letter letter = letters[i];  
            g.setColor(letter.getColor());  
            g.drawString(letter.getNum(), letter.getX(), letter.getY());  
        }  
  
    }  
  
    /** 
     * 畫狀態 
     *  
     * @time 2016年6月29日 下午1:17:46 
     * @author Lichao 
     * @param g 
     */  
    private void paintState(Graphics g) {  
        switch (state) {  
        case GAME_OVER:  
            g.drawImage(gameover, 0, 0, null);  
            break;  
        }  
    }  
  
    /** 
     * 添加鼠標事件 
     *  
     * @time 2016年6月29日 下午2:05:00 
     * @author Lichao 
     */  
    private void mouseAction() {  
        /** 鼠標監聽事件 */  
        MouseAdapter mouse = new MouseAdapter() {  
            @Override  
            public void mouseClicked(MouseEvent event) {  
                // 單擊右鍵退出  
                if (event.getButton() == MouseEvent.BUTTON3  
                        && state == GAME_OVER) {  
                    System.exit(0);  
  
                }  
                // 單擊左鍵重新開始  
                if (event.getButton() == MouseEvent.BUTTON1  
                        && state == GAME_OVER) {  
                    init();  
                }  
            }  
        };  
  
        this.addMouseListener(mouse);  
    }  
  
    /** 
     * 初始化游戲 
     *  
     * @time 2016年6月29日 下午2:09:10 
     * @author Lichao 
     */  
    protected void init() {  
  
        this.state = RUNNING;  
        this.outOfBoundNumber = 0;  
        this.letters = new Letter[] {};  
        this.repaint();  
    }  
  
    /** 
     * 判斷游戲是否結束 
     *  
     * @time 2016年6月29日 下午1:19:07 
     * @author Lichao 
     * @return 
     */  
    private boolean isGameOver() {  
        return this.outOfBoundNumber > 5;  
    }  
  
    private void paintScore(Graphics g) {  
        g.setColor(new Color(0xFF0000)); // 設置顏色(0xFF0000為純紅)  
        g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20)); // 設置字體(Font.SANS_SERIF為字體,Font.BOLD為字體樣式,20為字號)  
        g.drawString("SCORE: " + hitNumbers, 10, 25); // 畫分  
        g.drawString("MISS: " + outOfBoundNumber, 10, 45); // 畫丟失數  
    }  
  
    /** 主方法 */  
    public static void main(String[] args) {  
        JFrame frame = new JFrame("傻逼打字游戲");  
        LetterGame game = new LetterGame();  
        frame.add(game);  
        frame.setBackground(new Color(111, 168, 220));  
        frame.setSize(WIDTH, HEIGTH); // 設置窗口的大小  
        frame.setAlwaysOnTop(true); // 設置窗口總在最上面  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 設置默認關閉操作(窗口關閉時退出程序)  
        frame.setLocationRelativeTo(null); // 設置窗口起始位置(居中)  
        frame.setVisible(true); // 1.設置窗口可見 2.盡快調用paint()方法  
        frame.setResizable(false);  
        game.action();  
    }  
  
}  

背景圖片

游戲結束圖片

ps:這兩張圖是我用畫圖工具花的,太丑了,哈哈。程序可以直接運行的,如果你不知道怎么運行,那我就幫不了你了。由於比較簡單,我就不附送源碼了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM