`

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;
}
分享到:
评论

相关推荐

    练习--java实现的打字游戏

    【Java实现的打字游戏】是一款简单而有趣的编程练习,旨在帮助用户提高打字速度和准确性。游戏的核心机制是通过模拟文字显示并检测用户的输入,与预设的文字进行比较,以此来评估用户打字的效率。这个项目采用了两种...

    Java简单英文打字游戏

    【Java简单英文打字游戏】是一款专为Java初学者设计的源码实例,它通过一个简单的打字游戏帮助用户提高英文打字速度和准确性。这个项目仅包含一个JAVA文件,因此非常适合初学者阅读和理解,可以快速入门Java编程。 ...

    软件工程面向对象开发课程设计2022-打字游戏-本地GUI 学习资料 项目源码

    在打字游戏中,可以有`Keyboard`类来表示虚拟键盘,`Timer`类来跟踪游戏时间,以及`TypingSession`类来管理单次打字练习。 接下来,我们将关注本地GUI的实现。通常,这将涉及使用如Java的Swing或JavaFX,Python的...

    java课设-打字练习AWT版

    本项目是一款基于Java语言开发的简单打字练习程序,利用了AWT(Abstract Window Toolkit)来构建用户界面。该程序适合Java初学者,尤其是大学二年级的学生用来实践和提升编程技能。该项目的主要功能包括打字速度统计...

    Java+GUI字母打字练习小游戏.rar

    【Java GUI】 Java GUI(图形用户界面)...总的来说,这个Java GUI打字练习小游戏展示了多种Java编程技术的综合运用,从基础的GUI组件创建到复杂的多线程游戏逻辑,为学习和提升Java编程技能提供了一个实用的实践平台。

    BGUI字母打字练习小游戏

    【标题】:“BGUI字母打字练习小游戏” 这个项目是一个基于Java编程语言开发的图形用户界面(GUI)应用,主要用于帮助用户进行字母打字练习。它设计得简单易用,旨在提升初学者的键盘输入速度和准确性。对于初学者...

    练习打字的字母游戏代码

    在本项目中,我们关注的是一个使用Java编程语言编写的练习打字的字母游戏。这个游戏旨在帮助用户提高他们的打字速度和准确性,通过互动和趣味性的方式让学习过程更加愉快。下面将详细介绍这个项目的相关知识点。 1....

    Java练手_ABC打字游戏

    Java练手_ABC打字游戏是一款基于Java编程技术的练习项目,旨在帮助初学者熟悉和巩固Java Swing、类的继承、接口实现、线程管理和键盘事件处理等核心概念。在这个项目中,开发者创建了一个互动的游戏,玩家需要通过...

    小蜜蜂打字游戏

    【小蜜蜂打字游戏】是一款基于Java编程语言开发的打字练习软件,旨在通过游戏化的方式提高用户打字的速度和准确性。在这个游戏中,用户需要在限定时间内正确输入屏幕上显示的文字,以此来提升打字技巧。下面我们将...

    JAVA编写的打字游戏

    总的来说,这个Java打字游戏是一个很好的学习示例,它涵盖了GUI编程、事件处理、数据结构、多线程、文件操作等多个Java核心概念。通过阅读和分析源码,开发者不仅可以提升Java编程技能,还能了解游戏开发的基本流程...

    北大青鸟打字游戏

    【北大青鸟打字游戏】是一款基于Java编程语言开发的教育软件,主要目的是为了帮助学习者提高打字速度和准确性,特别适用于北大青鸟ACCP课程的学员进行实践操作。这款打字游戏在原有的教材基础上进行了优化和完善,...

    java打字小游戏

    【Java打字小游戏】是一款基于Java编程语言开发的简单打字练习应用,旨在帮助用户提高打字速度和准确性。此项目对于初学者来说是一个很好的实践案例,它展示了如何利用Java进行基本的游戏开发,同时也可以作为熟悉...

    打字游戏java

    【打字游戏java】是一个基于Java编程语言开发的简单打字练习应用。在这个游戏中,用户可以通过键盘输入来模拟真实的打字体验,提升打字速度和准确性。以下将详细阐述Java编程语言在创建打字游戏中的关键知识点。 1....

    Java单文件英文打字游戏.rar

    【Java单文件英文打字游戏】是一个基于Java编程语言实现的简单打字练习程序,它旨在帮助用户提高英文打字速度和准确性。由于整个游戏仅用一个Java代码文件完成,因此它展示了Java语言的简洁性和高效性。在这个游戏中...

    java打字游戏源代码

    【Java打字游戏源代码】是一款使用Java编程语言编写的打字练习软件,它通过游戏化的方式帮助用户提高打字速度和准确性。源代码详细、结构清晰,适合初学者学习和理解,同时也可供有一定Java基础的开发者参考和改进。...

    用java编写的打字练习,绝对可用后端- Java

    - **Swing或JavaFX**:打字练习软件需要用户界面,Java提供了Swing和JavaFX两个库来创建桌面应用的GUI。这两个库包含了许多组件,如JLabel(显示文本)、JTextArea(用户输入)和JButton(操作按钮)等。 ### 3. ...

    Java打字软件游戏

    Java打字软件游戏是一款利用Java编程语言开发的教育软件,主要目标是帮助用户提升打字速度和准确性。在这款软件中,用户不仅可以进行基础的打字训练,还可以通过各种打字游戏来增加学习的趣味性,使打字变得更加轻松...

    java打字游戏源码+可执行程序

    通过模拟真实的打字环境,用户可以在游戏中学习和练习打字技巧,使其成为一种寓教于乐的方式。本资源包含游戏的可执行程序和源代码,对于Java初学者或者想要了解游戏开发的人来说,这是一个很好的学习材料。 首先,...

    java打字练习

    在Java编程领域,打字练习程序是一个常见的项目,旨在帮助用户提高打字速度和准确性。这个项目由三个`.java`源文件组成,很可能是作者独立完成的。通过分析和理解这些源代码,我们可以深入探讨一些Java编程的关键...

    英文打字测试.doc

    打字测试系统的发展可以追溯到计算机早期,当时的打字训练主要依赖于物理键盘和简单的文本输入。随着互联网和多媒体技术的进步,现代的打字测试系统已经演变为包含各种功能的互动软件,例如实时速度显示、错误统计...

Global site tag (gtag.js) - Google Analytics