为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Java

前面我写过关于键盘控制小球,以及模仿下雪的代码。此次算是对前一段时间知识的汇总。依旧很肤浅的没有面向对象的概念。还是俩个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开发。那个界面比较好搭
图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消