zoukankan      html  css  js  c++  java
  • 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:这两张图是我用画图工具花的,太丑了,哈哈。程序可以直接运行的,如果你不知道怎么运行,那我就帮不了你了。由于比较简单,我就不附送源码了。

  • 相关阅读:
    正确使用 Volatile 变量
    什么叫持久化?
    大型J2EE项目中的Web容器集群–Nginx+Glasshfish+Memcached+ServletFilter
    REST
    Java多线程设计模式:wait/notify机制
    Java Persistence API (JPA) 的陷阱
    JDK1.5新特性介绍
    用Amazon EC2搭建免费WordPress博客及SSH
    PDF Split and Merge Basic 好用的PDF合并分割工具
    路威机器人
  • 原文地址:https://www.cnblogs.com/rilweic/p/6078372.html
Copyright © 2011-2022 走看看