?? mytt.java
字號(hào):
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; //狀態(tài)變量,初始變量為菜單
String[] menus = { "開始游戲", "關(guān)于游戲", "退出游戲" };
final static int STATE_MENU = 1; //游戲的三種主要狀態(tài)
final static int STATE_ABOUT = 2;
final static int STATE_GAME = 3;
static int width, height; //屏幕寬度和高度,設(shè)置為靜態(tài)變量的目的是便于在該類之外使用
int curMenu; //當(dāng)前菜單選項(xiàng)
Vector v = new Vector(); //用于存儲(chǔ)字符對(duì)象
int x; //字符對(duì)象的X坐標(biāo)值
int sorce; //得分
int life; //生命值
int charcount; //屏幕上的字符個(gè)數(shù)
int downspeed; //下落的速度
int pass1=1; //關(guān)卡狀態(tài)
int p1=0; //用于控制刷屏,很奇怪,但是這個(gè)地方我還不清楚為什么,僅僅是為了解決問(wèn)題引入的變量
int dis; //控制下落字符之間的距離
int sleeptime; //線程的睡眠時(shí)間
playmusic pm=new playmusic();//背景音樂(lè)播放線程
MIDlet midlet;
public mytt(MIDlet midlet) {
this.midlet=midlet;
setFullScreenMode(true);
width = this.getWidth(); //獲取屏幕寬度
height = this.getHeight(); //設(shè)置初始值
life=10; //設(shè)置初始生命值
new Thread(this).start();
pm.start();
}
protected void paint(Graphics g) {
// TODO Auto-generated method stub
switch (state) {
case STATE_MENU: //當(dāng)前狀態(tài)為“菜單”狀態(tài)
g.setColor(0); //設(shè)置前景色為黑色
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)); //設(shè)置文字所用字體樣式
g.setColor(0xff1010);
g.drawString("手機(jī)版打字游戲",width/2 ,height/3-20,Graphics.TOP|Graphics.HCENTER);
for (int i = 0; i < menus.length; i++) { //創(chuàng)建一個(gè)循環(huán)菜單
if (i == curMenu) { //設(shè)置當(dāng)前菜單選項(xiàng)的顯示樣式
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: //當(dāng)前狀態(tài)如果是“關(guān)于游戲”
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("這是一款簡(jiǎn)單手機(jī)打字練習(xí)游戲,", 5,10, Graphics.TOP|Graphics.LEFT);
g.drawString("如果你玩過(guò)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: //當(dāng)前狀態(tài)是“開始游戲”
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+"關(guān)", 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, //設(shè)置字符變換的顏色
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) //當(dāng)分?jǐn)?shù)達(dá)到50的時(shí)候升級(jí),在屏幕上進(jìn)行提示玩家已經(jīng)升級(jí)
{
p1++;
v.removeAllElements(); //把第一關(guān)中的所有對(duì)象清除
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("恭喜你進(jìn)入第二關(guān)",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) //當(dāng)生命值小于0時(shí),清屏,顯示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; //線程的睡眠時(shí)間用于控制重繪頻率,表現(xiàn)為字符的下落速度
}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) //當(dāng)字符的y坐標(biāo)超出下面的橫線時(shí),生命減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 { // 這是一個(gè)內(nèi)部類,因?yàn)樗玫剿乃拗黝愔械淖兞? 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坐標(biāo)
int i = Math.abs(r.nextInt()) % s.length; //數(shù)組隨機(jī)下標(biāo)
zms = s[i];
x = Math.abs(r.nextInt()) % (width-20); // 字符的初始x坐標(biāo)
}
}
}
class playmusic extends Thread{
Player player; //音樂(lè)播放器
InputStream is; //音樂(lè)輸入流
public void run()
{
try
{
is=getClass().getResourceAsStream("/town.mid"); //創(chuàng)建音樂(lè)播放器
player=Manager.createPlayer(is,"audio/midi");
player.realize();
player.setLoopCount(-1); //循環(huán)播放背景音樂(lè)
player.start();
}
catch (MediaException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -