⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mytt.java

📁 用j2me做的打字练习手机游戏
💻 JAVA
字号:
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import java.util.Vector;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.midlet.MIDlet;

public class mytt extends Canvas implements Runnable {
	int state = STATE_MENU;      //状态变量,初始变量为菜单

	String[] menus = { "开始游戏", "关于游戏", "退出游戏" };

	final static int STATE_MENU = 1;      //游戏的三种主要状态
	final static int STATE_ABOUT = 2;
	final static int STATE_GAME = 3;

	static int width, height;    //屏幕宽度和高度,设置为静态变量的目的是便于在该类之外使用
	int curMenu;                 //当前菜单选项

	Vector v = new Vector();     //用于存储字符对象

	int x;                       //字符对象的X坐标值
	int sorce;                   //得分
	int life;                    //生命值
	int charcount;               //屏幕上的字符个数
	int downspeed;               //下落的速度
	int pass1=1;                 //关卡状态
	int p1=0;                    //用于控制刷屏,很奇怪,但是这个地方我还不清楚为什么,仅仅是为了解决问题引入的变量
	int dis;                     //控制下落字符之间的距离
	int sleeptime;               //线程的睡眠时间
	playmusic pm=new playmusic();//背景音乐播放线程
	MIDlet midlet;

	public mytt(MIDlet midlet) {
		this.midlet=midlet;
		setFullScreenMode(true);
		width = this.getWidth();        //获取屏幕宽度
		height = this.getHeight();      //设置初始值
		life=10;                        //设置初始生命值
		new Thread(this).start();
		pm.start();
	}

	protected void paint(Graphics g) {
		// TODO Auto-generated method stub
		switch (state) {
		case STATE_MENU:                       //当前状态为“菜单”状态
			g.setColor(0);                     //设置前景色为黑色
			g.fillRect(0, 0, width, height);   //用前景色绘制矩形,作用是清屏

			int y0 = 150;                     
			g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD| Font.STYLE_ITALIC, Font.SIZE_LARGE));  //设置文字所用字体样式
			g.setColor(0xff1010);             
			g.drawString("手机版打字游戏",width/2 ,height/3-20,Graphics.TOP|Graphics.HCENTER);
		
			for (int i = 0; i < menus.length; i++) {         //创建一个循环菜单
				if (i == curMenu) {                          //设置当前菜单选项的显示样式   
					g.setColor(0xff00ff00);
					g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD
							| Font.STYLE_ITALIC, Font.SIZE_LARGE));
					g.drawString(menus[i], width / 2, y0 + 30 * i,
							Graphics.HCENTER | Graphics.TOP);
				} else {
					g.setColor(0xff00ff00);
					g.setFont(Font.getDefaultFont());
					g.drawString(menus[i], width / 2, y0 + 30 * i,
							Graphics.HCENTER | Graphics.TOP);
				}
			}
			g.setColor(0xff0000ff);
			g.setFont(Font.getDefaultFont());
			
			break;
		case STATE_ABOUT:     //当前状态如果是“关于游戏”
			g.setColor(150);
			g.fillRect(0, 0, width,height);
			g.setColor(0xffffeeee);
			g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD| Font.STYLE_PLAIN, Font.SIZE_MEDIUM));
			g.drawString("这是一款简单手机打字练习游戏,", 5,10, Graphics.TOP|Graphics.LEFT);
			g.drawString("如果你玩过PC上的tt游戏,", 5,40, Graphics.TOP|Graphics.LEFT);
			g.drawString("相信你很快可以上手!", 5,70, Graphics.TOP|Graphics.LEFT);
			g.drawString("按“*”返回主菜单", width/2,height/4+180, Graphics.TOP|Graphics.HCENTER);
			break;
		case STATE_GAME:        //当前状态是“开始游戏”
				g.setColor(255, 255, 255);
				g.fillRect(0, 0, width, height);
				g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE));
				g.setColor(0xff0000ff);
				g.drawString("疯 狂 打 字 游 戏", width/2,5,Graphics.TOP|Graphics.HCENTER);
				g.drawLine(0, 26, 390,26);
				g.drawLine(0, 30, 390,30);
				g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_MEDIUM));
				g.setColor(0xffff0000);
				g.drawLine(0,height-25, 395,height-25);
				g.drawLine(0,height-27, 395,height-27);
				g.drawString("得分是:"+sorce+"     生命:"+life +"     第"+pass1+"关", 20,height-20,Graphics.TOP|Graphics.LEFT);
				
				Random r = new Random();
				for (int i = 0; i < v.size(); i++) {

					g.setColor(Math.abs(r.nextInt()) % 255,    //设置字符变换的颜色
							Math.abs(r.nextInt()) % 255,
							Math.abs(r.nextInt()) % 255);
					
					zm z = (zm) v.elementAt(i);
					g.drawChar(z.zms, z.x, z.y, Graphics.TOP | Graphics.LEFT);

				}
				
				if(sorce==50 && p1<2)    //当分数达到50的时候升级,在屏幕上进行提示玩家已经升级
				{
					p1++;
					v.removeAllElements();   //把第一关中的所有对象清除
					g.setColor(100,100,100);
					g.fillRect(0, 0, width, height);
					g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE));
					g.setColor(0xffff0000);
					g.drawString("恭喜你进入第二关",width/2,height/2, Graphics.TOP | Graphics.HCENTER);
					try {
						Thread.sleep(3000);
						
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
			
						
			if(life<=0)    //当生命值小于0时,清屏,显示Game Over字样三秒钟,然后销毁midlet
			{
				g.setColor(100,100,100);
				g.fillRect(0, 0, width, height);
				g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE));
				g.setColor(0xffff0000);
				g.drawString("GAME  OVER",width/2,height/2, Graphics.TOP | Graphics.HCENTER);
				try {
					Thread.sleep(3000);
					
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				//midlet.notifyPaused();
				midlet.notifyDestroyed();
			}
			
			
			break;

		}
	}




	protected void keyPressed(int keyCode) {
		// TODO Auto-generated method stub
		int ga = getGameAction(keyCode);

		switch (state) {

		case STATE_MENU:
			switch (ga) {
			case Canvas.UP:
				if(curMenu==0)curMenu=menus.length;
				curMenu = (curMenu - 1) % menus.length;
				break;
			case Canvas.DOWN:
				curMenu = (curMenu + 1) % menus.length;
				break;

			case Canvas.FIRE:
				switch (curMenu) {
				case 0:
					state = STATE_GAME;
					break;
				case 1:
					state = STATE_ABOUT;
					break;

				case 2:
					 midlet.notifyDestroyed();
					break;

				}

				break;
			}
			break;
		case STATE_ABOUT:
			if (keyCode == Canvas.KEY_STAR) 
				state = STATE_MENU;
			break;
		case STATE_GAME:

			if (keyCode == Canvas.KEY_STAR) {
				state = STATE_MENU;
			} else {
				if(keyCode==Canvas.KEY_NUM0)
				{
					for(int i=0;i<v.size();i++)
					{
						zm z=(zm)v.elementAt(i);
						if(z.zms=='0')
						{	sorce++;
							v.removeElementAt(i);
							break;
						}
					}
				}
				if(keyCode==Canvas.KEY_NUM1)
				{
					for(int i=0;i<v.size();i++)
					{
						zm z=(zm)v.elementAt(i);
						if(z.zms=='1')
						{	sorce++;
							v.removeElementAt(i);
							break;
						}
					}
				}
				if(keyCode==Canvas.KEY_NUM2)
				{
					for(int i=0;i<v.size();i++)
					{
						zm z=(zm)v.elementAt(i);
						if(z.zms=='2')
						{	sorce++;
							v.removeElementAt(i);
							break;
						}
					}
				}
				if(keyCode==Canvas.KEY_NUM3)
				{
					for(int i=0;i<v.size();i++)
					{
						zm z=(zm)v.elementAt(i);
						if(z.zms=='3')
						{	sorce++;
							v.removeElementAt(i);
							break;
						}
					}
				}
				if(keyCode==Canvas.KEY_NUM4)
				{
					for(int i=0;i<v.size();i++)
					{
						zm z=(zm)v.elementAt(i);
						if(z.zms=='4')
						{	sorce++;
							v.removeElementAt(i);
							break;
						}
					}
				}
				if(keyCode==Canvas.KEY_NUM5)
				{
					for(int i=0;i<v.size();i++)
					{
						zm z=(zm)v.elementAt(i);
						if(z.zms=='5')
						{	sorce++;
							v.removeElementAt(i);
							break;
						}
					}
				}
				if(keyCode==Canvas.KEY_NUM6)
				{
					for(int i=0;i<v.size();i++)
					{
						zm z=(zm)v.elementAt(i);
						if(z.zms=='6')
						{
							v.removeElementAt(i);
							break;
						}
					}
				}
				if(keyCode==Canvas.KEY_NUM7)
				{
					for(int i=0;i<v.size();i++)
					{	
						zm z=(zm)v.elementAt(i);
						if(z.zms=='7')
						{	sorce++;
							v.removeElementAt(i);
							break;
						}
					}
				}
				if(keyCode==Canvas.KEY_NUM8)
				{
					for(int i=0;i<v.size();i++)
					{
						zm z=(zm)v.elementAt(i);
						if(z.zms=='8')
						{	sorce++;
							v.removeElementAt(i);
							break;
						}
					}
				}
				if(keyCode==Canvas.KEY_NUM9)
				{
					for(int i=0;i<v.size();i++)
					{
						zm z=(zm)v.elementAt(i);
						if(z.zms=='9')
						{	sorce++;
							v.removeElementAt(i);
							break;
						}
					}
				}
				
			}
			break;
		}

		repaint();   //重绘屏幕

	}

	public void run() {
		// TODO Auto-generated method stub

		while (true) {
			
			
			
			
			if(sorce==50){
				pass1=2;
								
			}
			
			if(state == STATE_GAME){
				dis=5;
				charcount=10;
				downspeed=5;
			
			if(pass1==1){
				sleeptime=200;               //线程的睡眠时间用于控制重绘频率,表现为字符的下落速度
			}else{
				sleeptime=130;
			}
				
			}
			
			if (v.size() < charcount) {
				zm z = new zm();
				v.addElement(z);
			}
			
				
			for(int j=0;j<dis;j++){                   //从纵向拉开字符之间的间距
			for (int i = 0; i < v.size(); i++) {
				zm z = (zm) v.elementAt(i);
				z.y += downspeed;
				if(z.y>=height-40)                  //当字符的y坐标超出下面的横线时,生命减1,并将字符从V中移除
				{
					life--;
					v.removeElementAt(i);
				}
			}
			this.repaint();                          //重绘屏幕
			System.out.println(sleeptime);
			try {
				Thread.sleep(sleeptime);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
		}
	}
	
	
	class zm {   // 这是一个内部类,因为它要用到它的宿主类中的变量
		int x;

		char zms;

		char s[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

		int y;
		Random r = new Random();
		public zm() {
			y = 30;            //字符的初始y坐标
			int i = Math.abs(r.nextInt()) % s.length;   //数组随机下标
			zms = s[i];
			x = Math.abs(r.nextInt()) % (width-20);  // 字符的初始x坐标
		}

	}


}

class playmusic extends Thread{
	Player player;			     //音乐播放器
	InputStream is;			     //音乐输入流
	public void run()
	{
		try 
		{
			is=getClass().getResourceAsStream("/town.mid");			//创建音乐播放器
			player=Manager.createPlayer(is,"audio/midi");
			player.realize();
			player.setLoopCount(-1);		//循环播放背景音乐
			player.start();
		} 
		catch (MediaException e) 
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
	}
	}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -