目标:


在一个窗体上随机掉落字母,通过键盘输入,敲对后消除并且累计积分,否则扣除一定积分。


具体内容:


画一个窗体——》产生随机字母——》接受键盘输入——》显示分数


代码:

package chapter01;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; public class MyChar {
public static void main(String[] args) {
Frame w = new Frame() ;
w.setSize(300 , 400) ; MyPanel mp = new MyPanel() ;
w.add(mp) ; Thread t = new Thread(mp) ;
t.start() ; w.addKeyListener(mp) ;
mp.addKeyListener(mp) ; w.show() ;
//响应程序关闭按钮
w.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
} ); }
} class MyPanel extends Panel implements Runnable , KeyListener{
int x[] = new int[10] ;
int y[] = new int[10] ;
char c[] = new char[10] ;
int score = 1000 ;
MyPanel() {
for (int i = 0; i < 10; i++) {
x[i] = (int)(Math.random()*300) ;
y[i] = (int)(Math.random()*300) ;
c[i] = (char)(Math.random()*26+97) ;
}
}
@Override
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, 5, 15) ;
}
@Override
public void run() {
while(true){
for (int i = 0; i < 10; i++) {
y[i] ++ ;
if(y[i]>400){
y[i] = 0 ;
x[i] = (int)(Math.random()*300) ;
c[i] = (char)(Math.random()*26+97) ;
score -= 100 ;
}
}
try{
Thread.sleep(30) ;
}catch(Exception e)
{
e.printStackTrace();
}
repaint() ;
}
}
@Override
public void keyPressed(KeyEvent arg0) {
char keyC = arg0.getKeyChar() ;
int nowY = -1 ;
int nowIndex = -1 ;
for(int i = 0 ; i < 10 ; i ++){
if(keyC==c[i] && y[i]>nowY){ nowY = y[i] ;
nowIndex = i ; }
} if(nowIndex!=-1){
y[nowIndex] = 0 ;
x[nowIndex] = (int)(Math.random()*300) ;
c[nowIndex] = (char)(Math.random()*26+97) ;
score += 10 ;
}else {
score -= 100 ;
} }
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub }
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub }
} 运行截图:
 

注意事项:

(1)用的是最初的窗体类Frame,因为想比较一下和Jframe的区别,好吧,效果很明显

(2)里面用到了JAVA Frame 响应窗口关闭事件,响应了监听事件。如果是JFrame  只需要加一句话: setDefaultCloseOperation

(3)随机产生字母,考虑到了ASCII(97a-123z),具体方法是(char)(Math.random()*26+27)

(4)画字符的时候用到了drawString方法,但是它的第一个参数是字符串,怎么办呢,之前是用字符数组存储起来的,解决办法是new Character(c[i]).toString()

(5)如果字符落到屏幕下方,需要随机产生字母,并且位置还不能和以前一样,所以加了一个判断if(y[i]>400){y[i]=0;x[i]=(int)(Math.random()*300;)}用来生成随机位置

(6)有一个逻辑上需要考虑的点,那就是输入匹配的字母需要是最靠下的,用到了两个变量nowy和nowIndex,在字符数组中查找时先找到y值最大的数,然后记录下它的下标,再然后是重画


总结:

这是java入门的第一个小程序,关于基础语法和写代码的逻辑都有了更深一层的认识,特别是敲20遍之后,真的是头脑异常兴奋。

记得刚开始接触编程的时候,是c语言入门的,讲课的老师是一位上了年龄的老师,听的第一节课真的是枯燥无味,当时就想,天呐,编程难道就是这样的吗?!

后来又学的C++,讲课的女老师也只是在课堂上堆砌知识点,当时还没有真正入门。

后来有幸在图书馆看到了达内集团王洋老师写的《java就该这样学》,对于他推崇的构建主义学习法甚是震撼,颠覆了之前的学习观念,在跟着他实现一个又一个小的游戏或项目的时候,真心感觉到了编程逻辑之美。

 

打字母的游戏&Java入门的更多相关文章

  1. Java 入门课程视频实战-0基础 上线了,猜拳游戏,ATM实战,欢迎围观

    Java 入门课程视频实战-0基础 已经上传完了.欢迎小伙伴们过来围观 直接进入: http://edu.csdn.net/course/detail/196 课程文件夹例如以下: 1 初识Java  ...

  2. Java入门第一章

    后天就是十一长假了,亲们准备好了去哪儿玩了吗? 今天有点空,就来聊聊Java吧,当然是一些Java入门知识了,网上有很多,这里我只是列举一些我自己学到的,感谢大家关注喵的博客这么久,也为大家带来点新知 ...

  3. 第1章Java入门体验

    第1章Java入门体验 1.java简介和平台应用 Java是sun公司开发出来,现在属于ORACLE公司java分为几个部分:首先是最基础的Java SE部分,这部分是Java的基础知识,主要包括: ...

  4. Java入门(二)——果然断更的都是要受惩罚的。。。

    断更了一个多月,阅读量立马从100+跌落至10-,虽说不是很看重这个,毕竟只是当这个是自己的学习笔记,但有人看,有人评论,有人认同和批评的感觉还是很巴适的,尤其以前有过却又被剥夺的,惨兮兮的. 好好写 ...

  5. Java入门学习知识点汇总

    Java入门重要知识点在这里总结一下,以方便日后复习,这部分内容主要有:变量和常量,常用的运算符,流程控制语句,数组,方法这些内容 一.变量和常量 1.Java关键字 先贴张图: 所有关键字区分大小写 ...

  6. JAVA入门第一季(mooc-笔记)

    笔记相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第一季 ...

  7. Java入门——(1)Java编程基础

    Java入门--(1)Java编程基础 第二章 Java编程基础   JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 }   2.1关键字:赋予了特殊含义的单词.   2.2标识符: ...

  8. Java入门篇(六)——类和对象

    写到这里终于写到了入门篇的最后一个知识点了.类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语 ...

  9. Java入门1

    一.eclipse的简单使用 1.新建项目 在package explorer的空白处点击右键,新建一个项目(new->Java Project)或者点击菜单栏的File->JavaPro ...

随机推荐

  1. docker部署 自动测试脚本记录

    1 首先配置virtualenv, 并启动之,source py3env/bin/activate 2 安装各种必备包 ,如simplejson,chardet, configparser等 3 注意 ...

  2. bmp,jpg,png,tif,wmf,emf与eps图片格式转换

    wmf/emf是两种Microsoft Windows的图形文件格式.它是一个矢量图格式,但是也允许包含位图.本质上,一个WMF文件保存一系列可以用来重建图片的Windows GDI命令.在某种程度上 ...

  3. Delphi之过程与函数

    过程以保留字procedure开始,没有返回值:函数以保留字function开始,有返回值. 参数位于括号里面,多个参数之间以分号分隔,例如: procedure SetDate(Year: Inte ...

  4. 修改Tomcat标题栏内容

    你是否遇到过在一个OS任务栏中同时打开多个Tomcat启动程序窗口,这种情况下你会无法区分具体是哪个窗口启动哪个程序,以下方式可以实现Bat启动程序标题栏自定义. 打开Tomcat的Bin目录中,打开 ...

  5. oracle闪回flashback_transaction_query知识点

    查询更新记录: select t.start_timestamp, t.commit_timestamp, t.logon_user, t.operation, t.table_name, t.tab ...

  6. 使navicat可以通过SSH连接MySQL数据库

    1.编辑/etc/ssh/sshd_config,在最下面添加如下语句 KexAlgorithms diffie-hellman-group1-sha1,curve25519-sha256@libss ...

  7. 【HTML 元素】嵌入另一张HTML文档、通过插件嵌入内容、嵌入数字表现形式

    1.嵌入另一张HTML文档 iframe 元素允许在现有的HTML文档中嵌入另一张文档.下面代码展示了iframe元素的用法: <!DOCTYPE html> <html lang= ...

  8. Angular 学习笔记——ng-Resource1

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  9. Mybatis 存在多个日志时设置日志

    mybatis默认使用log4j,当有self4j这个日志jar包存在时会无法打印sql,请移除或者在工程启动时显示设置mybatis使用的日志类 log4j.logger.org.apache.ib ...

  10. UINavigationbar/UINavigationItem/UITabBar/UITabButton/UITabBarItem粑粑粑粑~

    看着标题是不是乱的一塌糊涂...... . 在开发中,你非常可能就理不清这些关系,刚好闲的蛋疼,来整理一下吧. 一.UINavigationBar.UINavigationItem.UIBarButt ...