继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java仿金山打字通打字母游戏《Java就该这样学》

ruigenihao
关注TA
已关注
手记 6
粉丝 3
获赞 54

前面我写过关于键盘控制小球,以及模仿下雪的代码。此次算是对前一段时间知识的汇总。依旧很肤浅的没有面向对象的概念。还是俩个class。
MyChar 为主测试类,MyPanel为功能类。MyPanel已经不能称作画布类了,有些功能应该封装到别的类里面,以后讲解到知识点会逐渐过渡过去。
贴代码MyChar

package myChar;

import java.awt.*;

public class MyChar {
    public static void main(String[] args){
        Frame w = new Frame();
        w.setSize(400, 600);
        MyPanel mp= new MyPanel();
        Thread t =new Thread(mp);
        mp.addKeyListener(mp);
        w.addKeyListener(mp);
        t.start();
        w.add(mp);
        w.show();
    }

}

依旧是老样子 先建一个窗口Frame 指定大小。然后添加进去一个MyPanel 实例。注意进行按键监听器注册addKeyListener。当然为了响应我们的按键操作我们还需要开启一个线程。最后记得将窗口显示show()出来。


MyPanel 代码

package myChar;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class MyPanel extends Panel implements Runnable ,KeyListener{
    int x[] = new int[10];
    int y[] = new int[10];
    char[] c = new char[10];

    int score=10;

    public void paint(Graphics g) {
        for (int i = 0; i < 10; i++) {
            g.drawString(new Character(c[i]).toString(), x[i], y[i]);

        }
        g.setColor(Color.red);
        g.drawString("score:"+score, 5, 17);

    }

    MyPanel() {
        for (int i = 0; i < 10; i++) {
            x[i] = (int) (Math.random() * 400);
            y[i] = (int) (Math.random() * 400);
            c[i] = (char) (Math.random() * 26 + 97);
        }
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

            while(true){

                for(int i=0;i<10;i++){
                    y[i]++;

                if (y[i] > 600){
                    score--;
                    y[i] = 0;
                    x[i] = (int) (Math.random() * 400);
                    c[i] = (char) (Math.random() * 26 + 97);
                }

                }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            repaint();}

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int wantedcy=-1;//匹配的键入值的y
        int wi=0;//匹配的y值的index值
        for(int i=0;i<10;i++){
            //进行十次循环如果匹配则记录下最下面的i值
            if(e.getKeyChar()==c[i]){

                if(wantedcy<y[i]){
                    wantedcy=y[i];
                    wi=i;  }  
                }
            }
        //如果匹配 则消去最下面的那个数 且加分 否则减分
            if(wantedcy>0){
        y[wi]=0;
        x[wi]=(int) (Math.random()*400);
        c[wi]=(char) (Math.random()*26+97);

                score++;}
            else score--;

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }
}

MyPanel类extends了Panel类可以叫做画布类。-->>paint()执行绘图
实现了按键监听器接口 --->>KeyPress()对按下事件的处理
线程Runnable接口 -->>run()线程的功能实现。
首先在paint()方法体里 用循环画出10个随机字母.此处用ASCII指定。
在Ascii里‘a’=97。
在run()方法体里控制字母的y坐标进行自减。对于下降到底部的字母将其y坐标置零。还需要对系统发出重画请求。防止下降的太快 需要执行Thread.sleep()命令。速度自己调整。
对于按键处理则没什么好说的了主要就是循环时进行冒泡排序法排出y最大的相同字母以防止键入字母消去的不是最下面的字母。最后加入了积分制度。这个自己解决。
最后的效果就是这样的,画面感觉不好的可以自己调整或者进行android开发。那个界面比较好搭
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP