小记:老早之前写的程序,今天发现之前在 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:这两张图是我用画图工具花的,太丑了,哈哈。程序可以直接运行的,如果你不知道怎么运行,那我就帮不了你了。由于比较简单,我就不附送源码了。

java打字游戏的更多相关文章

  1. Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)

    当java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue 和 AWT-Windows. AWT-EventQ ...

  2. 用JS写了一个打字游戏,反正我是通不了关

    今天想写个简单的游戏, 打字游戏好像都没写过, 那么就写打字游戏吧, gamePad包含了关卡的信息, 可以用来调整给个关卡字符下落的速度: getRandom函数会返回一个字符对象, 这个对象包含了 ...

  3. java俄罗斯方块游戏代码

    java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ...

  4. java围棋游戏源代码

    //李雨泽源代码,不可随意修改.//时间:2017年9月22号.//地点:北京周末约科技有限公司.//package com.bao; /*围棋*/ /*import java.awt.*; impo ...

  5. Java迷宫游戏

    缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...

  6. Java小游戏贪吃蛇

    package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...

  7. JAVA开发--游戏24点

    也比较简单,写的不好,代码里用到了LOOKANDFELL,QUAQUA8.0的包 package com.Game24; import java.awt.Container; import java. ...

  8. Java Sudoku游戏

    这几天尝试用Java的swing写图形程序,边学习边摸索写了个简单的数独游戏,在编写的过程中学到了不少关于swing的东西,而且对于图形化程序的编写也有了一点简单的认识: 善其事先利其器,既然写图形化 ...

  9. Effective Java设定游戏 - 就是爱Java

    首先,我们先设定游戏,一个网页游戏的基本场景,主角拥有各种能力,但一开始数值都只有系统初始,随着故事的发展,会接触到各种不同的场景,获得提升角色的道具与装备,来参与更高难度的任务. 阅读全文>& ...

随机推荐

  1. Atitit.报名模块的管理

    Atitit.报名模块的管理 1.1. 统计报名数据1 1.2. 存储1 1.3. 报名1 1.4. 查看报名数据3 1.1. 统计报名数据 select count(*) as nums from ...

  2. delphi中break,continue, exit,abort, halt, runerror的异同

    delphi中表示跳出的有break,continue, exit,abort, halt, runerror. 1.break 强制退出循环(只能放在循环中),用于从For语句,while语句或re ...

  3. XCode 7.3.1(dmg) 官方直接下载地址

    xcode7.3.1下载 https://idmsa.apple.com/IDMSWebAuth/login?appIdKey=891bd3417a7776362562d2197f89480a8547 ...

  4. tfs 删除工作区

    公司员工离职后,有部分文件迁出,有没有tfs密码的情况下,考虑删除工作区,在网上找到方法实践有效,在次记录下. 在命令提示行下进入 “...\Microsoft Visual Studio 8\Com ...

  5. MYSQL 解锁与锁表

    解锁 第一种 show processlist; 找到锁进程,kill id ; 第二种 mysql>UNLOCK TABLES; 锁表 锁定数据表,避免在备份过程中,表被更新 mysql> ...

  6. [android] 手机卫士设置向导页面

    设置向导页面,通过SharedPreferences来判断是否已经设置过了,跳转到不同的页面 自定义样式 在res/values/styles.xml中 添加节点<style name=””&g ...

  7. 关于delphi PAServer 远程调试DLL文件

    用PAServer调试的话会产生一个默认user-connectionname的文件夹,且这个文件夹不能自定义.因此无法使调试的dll文件生成到host主程序所在的文件夹下而导致无法调试. 变通方法: ...

  8. &amp;&amp;队友最近一周水水

    100130 练习5 5 hr ago 15.2 days Private qwerqqq 100093 DP2 16 hr ago 50.2 days Private qwerqqq 100092 ...

  9. 响应式布局设置--@media only screen and

    @media only screen and  only(限定某种设备) screen 是媒体类型里的一种 and 被称为关键字,其他关键字还包括 not(排除某种设备) /* 常用类型 */类型 解 ...

  10. hihocoder 1082 然而沼跃鱼早就看穿了一切(字符串替换)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼(“marshtomp”,不区 ...