간단한 타자 게임

8623 단어 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;
}

좋은 웹페이지 즐겨찾기