📄 mytt.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 + -