swing编程练习----简单的打字游戏

import java.util.List;
import java.util.ArrayList;
import java.util.Timer;

import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Game extends JFrame{

//主方法
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
new Game().setVisible(true);
}
});
}

//默认构造
public Game(){
initComponent();
}

//初始化组件
public void initComponent(){
//设置框架大小
Toolkit kit = Toolkit.getDefaultToolkit();
int x = (kit.getScreenSize().width - WIDTH)/2;
int y = (kit.getScreenSize().height - HEIGHT)/2;
setBounds(x,y,WIDTH,HEIGHT);
//设置主框架关闭后退出系统
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置用户不可更改框架大小
setResizable(false);
//设置标题
setTitle("打字游戏-作者:luoxun");
//设置图标
setIconImage(kit.getImage("icon.png"));
//设置外观
UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
try{
UIManager.setLookAndFeel(infos[1].getClassName());
}catch(Exception e){
e.printStackTrace();
}
SwingUtilities.updateComponentTreeUI(this);

//设置背景图片
ImageIcon backImage = new ImageIcon("background.gif");
JLabel label = new JLabel(backImage);
label.setBounds(0,0,backImage.getIconWidth(),backImage.getIconHeight());
JPanel imagePanel = (JPanel)getContentPane();
imagePanel.setOpaque(false);
getLayeredPane().setLayout(null);
getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
//添加组件
drawPanel = new MyPanel();
add(drawPanel);
}

private class MyPanel extends JPanel{
private List<MyFont> list = null;
private Timer timer;
private int state = 0;//0:开始1:暂停2:结束
private int success = 0;
private int fail = 0;
private Gamer gamer = null;

public MyPanel(){
initComponent();
}

public void initComponent(){
setOpaque(false);
list = new ArrayList<MyFont>();

//添加组件
btnStart = new JButton("开始");
btnStop = new JButton("暂停");
btnEnd = new JButton("结束");
StartHandler start = new StartHandler();
StopHandler stop = new StopHandler();
EndHandler end = new EndHandler();
add(btnStart);
add(btnStop);
add(btnEnd);

//回车:开始、空格:暂停、esc:退出
btnStart.addActionListener(start);
btnStop.addActionListener(stop);
btnEnd.addActionListener(end);

InputMap inmap = getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inmap.put(KeyStroke.getKeyStroke("alt Z"),"Enter");
inmap.put(KeyStroke.getKeyStroke("alt X"),"Space");
inmap.put(KeyStroke.getKeyStroke("alt C"),"Esc");
for(int i='A';i<='Z';i++){
inmap.put(KeyStroke.getKeyStroke(String.valueOf((char)i)),"input");
inmap.put(KeyStroke.getKeyStroke("shift "+String.valueOf((char)i)),"input");
}
ActionMap amap = getActionMap();
amap.put("Enter",start);
amap.put("Space",stop);
amap.put("Esc",end);
amap.put("input",new InputHandler());
}
private class InputHandler extends AbstractAction{
public void actionPerformed(ActionEvent evt){
if(state!=0) return;
char c = evt.getActionCommand().charAt(0);
for(MyFont mf : list){
if(c == mf.getChar()){
gamer.setIcon(Toolkit.getDefaultToolkit().getImage("men.png"));
gamer.getPoint().x = mf.getPoint().x;
remove(mf);
success ++;
return;
}
}
gamer.setIcon(Toolkit.getDefaultToolkit().getImage("icon.png"));
fail ++;
}
}
private class StartHandler extends AbstractAction{
public void actionPerformed(ActionEvent evt){
state = 0;
if(timer == null){
timer = new Timer();
timer.schedule(new TimerTask(){
public void run(){
if(state == 0){
add();
}
}
},new Date(),800);
timer.schedule(new TimerTask(){
public void run(){
if(state == 0){
move();
}
}
},new Date(),10);
}
}
}
private class StopHandler extends AbstractAction{
public void actionPerformed(ActionEvent evt){
state = 1;
}
}
private class EndHandler extends AbstractAction{
public void actionPerformed(ActionEvent evt){
list.clear();
state = 2;
JOptionPane.showMessageDialog(null,String.format("正确:%d 个 错误:%d 个",success,fail));
success = 0;
fail = 0;
}
}

public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
if(gamer == null){
gamer = new Gamer();
}

g2.drawImage(gamer.getIcon(),gamer.getPoint().x,gamer.getPoint().y,gamer.getWidth(),gamer.getHeight(),this);
synchronized(list){
for(MyFont mf : list){
g2.setColor(mf.getColor());
g2.setFont(mf.getFont());
Point p = mf.getPoint();
g2.drawString(String.valueOf(mf.getChar()),(int)p.getX(),(int)p.getY());
}
}
}
public void add(){
synchronized(list){
list.add(new MyFont());
repaint();
}
}
public void remove(MyFont mf){
synchronized(list){
list.remove(mf);
}
}
public void move(){
List<MyFont> temp = new ArrayList<MyFont>();
for(MyFont mf : list){
Point p = mf.getPoint();
p.y = (int)p.getY()+1;
if(p.y+80>Game.HEIGHT){
temp.add(mf);
}
}
if(temp.size() > 0){
fail += temp.size();
list.removeAll(temp);
gamer.setIcon(Toolkit.getDefaultToolkit().getImage("icon.png"));
}
repaint();
}
}
private class Gamer{
private Image icon;
private Point point;
private int width;
private int height;

public Gamer(){
icon = Toolkit.getDefaultToolkit().getImage("men.png");
point = new Point(350,520);
width = 50;
height = 50;
}
public void setIcon(Image icon){
this.icon = icon;
}
public void setPoint(Point point){
this.point = point;
}
public Image getIcon(){
return this.icon;
}
public Point getPoint(){
return this.point;
}
public int getWidth(){
return this.width;
}
public int getHeight(){
return this.height;
}
}
private class MyFont{
private String text = "abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWSYZ";
private Point p;
private Font font;
private Color color;
private char c;

public MyFont(){
initData();
}

private void initData(){
String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
Random rand = new Random(new Date().getTime());
int i = rand.nextInt(52);
this.p = new Point(rand.nextInt(700)+50,80);
this.font = new Font(fontNames[fontNames.length-21+rand.nextInt(21)],Font.BOLD,80);
this.color = new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255));
this.c = text.charAt(i);
}
private Point getPoint(){
return this.p;
}
private Color getColor(){
return this.color;
}
private Font getFont(){
return this.font;
}
private char getChar(){
return this.c;
}
}

//定义变量
private MyPanel drawPanel;
private JButton btnStart;
private JButton btnStop;
private JButton btnEnd;
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值