小记:老早之前写的程序,今天发现之前在 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. ARM CPU大小端

    ARM CPU大小端: 大端模式:低位字节存在高地址上,高位字节存在低地址上 小端模式:高位字节存在高地址上,低位字节存在低地址上 STM32属于小端模式,简单的说,比如u32 temp=0X1234 ...

  2. nodejs querystring参数处理

    在node js z中,用querystring来进行客户端与服务器的数据交换时序列化数据,是数据处理的小利器. 如:在node中执行这个命令:querystring.stringify({numbe ...

  3. 封装jdbc 单例模式的应用

    实现增删该查的jdbc封装 import java.io.IOException; import java.io.InputStream; import java.sql.Connection; im ...

  4. MVC框架

    MVC (Modal View Controler)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用 ...

  5. Visual Studio中安装viemu后,vim vax 快捷键大全

    高效率移动 在插入模式之外 基本上来说,你应该尽可能少的呆在插入模式里面,因为在插入模式里面VIM就像一个“哑巴”编辑器一样.很多新手都会一直呆在插入模式里面,因为这样易于使用.但VIM的强大之处在于 ...

  6. Http的Get/Post请求区别

    1.HTTP请求格式: <request line> <headers> <blank line> [<request-body>] 在HTTP请求中, ...

  7. Python通用序列操作

    1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...

  8. java中获取接口(方法)中的参数名字(eclipse设置编译参数)(java8 javac -parameters)

    interface接口参数 jdk1.7及以前使用spring功能实现的: 注意: 1.该功能只能获取类的方法的参数名,不能获取接口的方法的参数名. public static void test() ...

  9. SQL游标应用

    自己整了半天才弄好,写成博客纪念下: 这个是sql上写的测试用: ) ) ) ) declare @sql varchar(max) set @sql='' SET @type='index_02' ...

  10. mahout中kmeans算法和Canopy算法实现原理

    本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...