有菜单,可以设置难度,总共有四个等级,食物和移动速度随等级增加。
只供学习使用,请勿在真手机上试验,如有意外概不负责
作者为本人
效果图
www.stineuro.com
CODE:
/*
* MIDPCanvas.java
*
* Created on 14 janvier 2008, 10:58
*/
package tst;
import java.util.Random;
import javax.microedition.lcdui.*;
/**
*
* @author SKYSEA
* @version 0.9
*il y a 5 niveaux
*/
public class MIDPCanvas extends Canvas implements CommandListener, Runnable {
private int [][]snake = new int [210][2]; //creer le serpent
private int [][]food = new int [20][2]; //creer la nourriture
private boolean isRun = true;
private int sleepTime = 360; //vitesse initiale
private final int CaseSize = 13; //pixel de l'image
private int s; //score du premier niveau
private Random random = new Random(); //les coordonnées aléatoires
private Image img, snake_img;
private Thread t; //Thread
private int score,level; //score et niveau
private int snakeNum; //le nombre de corps
private int foodNum; //nombre de boules
private int direction; //0:up 1:down 2:left 3:right
private int width, height; //width=getWidth(),height=getHeight();
private int keepTime = 0; //le temps de rester en l'image de Gameover
private int food_Init = 5; //pieces de nourriture initiales
private int level_Init = 0; //niveau initial
private String[] menu = null; //menu
private String[] menu_Config = null; //menu du config
private int menuNum; //numero de menu
private int configNum; //numero du menu du config
private Font font = null; //font du menu
private Font font1 = null; //font du menu choisit
private int gameState = 10; //0:start 1:configuration 2:exit 10:menu
private final int GAMESTART = 0;
private final int GAMEMENU = 10;
private final int GAMEEXIT = 2;
private final int GAMECONFIG = 1;
private final int DIRECTION_UP = 0;
private final int DIRECTION_DOWN = 1;
private final int DIRECTION_LEFT = 2;
private final int DIRECTION_RIGHT= 3;
private Command okCommand,exitCommand; //commande de ok, exit
/**
* constructor
*/
public MIDPCanvas() {
try {
// Set up this canvas to listen to command events
setCommandListener(this);
// Add the ok command
okCommand=new Command("OK",Command.OK,1);
addCommand(okCommand);
// Add the Exit command
exitCommand=new Command("Exit", Command.EXIT, 1);
addCommand(exitCommand);
//recharger les images
try {
img = Image.createImage("/res/food.png");
snake_img = Image.createImage("/res/puce.png");
} catch (Exception e) {System.out.println("Failure");}
//obtenir width et height de l'ecran
width=this.getWidth();
height=this.getHeight();
//initialiser le font
font = Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE);
font1 = Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_ITALIC, Font.SIZE_LARGE);
//initialiser le menu
menu = new String[]{"Commencer","Configurer","Fin"};
menu_Config=new String[]{"Niveau"+level_Init,"Nourriture à commencer"+food_Init,"Exit"};
//initialiser le menu default
menuNum=0;
//initialiser le menu du config default
configNum=0;
t = new Thread(this);
t.start();
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* initialiser le niveau et le score
*/
public void initLevel(int lev_init){
//initialiser le score
score=0;
//initialiser le niveau
level=lev_init;
sleepTime=300;
//initialiser le temps de sleep selon le niveau initial
sleepTime-=50*level;
}
/**
* initialiser le serpent
*/
public void initSnake(){
snakeNum=1;
//noter les coordonnées de la tete
for(int i=0;i<snakeNum;i++){
snake[i][0]=0;
snake[i][1]=0;
}
//initialiser la direction
direction=DIRECTION_RIGHT;
}
/**
* initialiser la nouriture
*/
public void initFood(int foodN){
int i,j,k;
foodNum=foodN;
//creer et noter les coordonnées de nouriture aléatoires
//le nombre de nouriture est foodN
for (int r = 0; r < foodN; r++) {
k = java.lang.Math.abs(random.nextInt()) %225;
i = k /15;
j = k %15;
food[r][0]=i;
food[r][1]=j;
}
}
/**
* paint menu
*si le menu est choisit, on change le font
*/
public void paintMenu(Graphics g){
g.setColor(-1);
g.fillRect(0, 0, width, height);
for(int i = 0; i < menu.length; i++)
{
if(menuNum == i)
{
g.setColor(255, 0, 0);
g.setFont(font1);
g.drawString(menu[i], width/2 - 5, 70 + i * 25 - 4, Graphics.BOTTOM | Graphics.HCENTER);
}
else
{
g.setColor(0, 255, 0);
g.setFont(font);
g.drawString(menu[i], width/2, 70 + i * 25, Graphics.BOTTOM | Graphics.HCENTER);
}
}
}
public void paintConfig(Graphics g){
menu_Config=new String[]{"Niveau"+level_Init,"Nourriture à commencer"+food_Init,"Exit"};
g.setColor(-1);
g.fillRect(0, 0, width, height);
for(int i = 0; i < menu_Config.length; i++){
if(configNum == i)
{
g.setColor(255, 0, 0);
g.setFont(font1);
g.drawString(menu_Config[i], width/2 - 5, 70 + i * 25 - 4, Graphics.BOTTOM | Graphics.HCENTER);
}
else
{
g.setColor(0, 255, 0);
g.setFont(font);
g.drawString(menu_Config[i], width/2, 70 + i * 25, Graphics.BOTTOM | Graphics.HCENTER);
}
}
}
/**
* paint
*/
public void paint(Graphics g){
//si jeu n'est pas encore fini
switch(gameState){
case GAMEMENU:{
configNum=0;
paintMenu(g);
//initialiser le niveau
initLevel(level_Init);
//initialiser le serpent
initSnake();
//initialiser la nouriture
initFood(food_Init);
s=food_Init*10;
break;
}
case GAMECONFIG:{
menuNum=0;
paintConfig(g);
break;
}
case GAMESTART:{
if(!isGameOver()&&sleepTime>60){
int i;
g.setColor(0, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(255, 0, 255);
//écrire les coordonnées de la tete, score et niveau
g.drawString(" x: "+snake[0][0]+" y: "+snake[0][1]+" Score:"+score+" Level:"+level,0,height-15,Graphics.TOP|Graphics.LEFT);
//dessiner le serpent
for (i=0;i<snakeNum;i++){
g.drawImage(snake_img,snake[i][0]*CaseSize,snake[i][1]*CaseSize,Graphics.TOP|Graphics.LEFT);
}
//dessiner la nouriture
for (i=0;i<foodNum;i++){
g.drawImage(img,food[i][0]*CaseSize,food[i][1]*CaseSize,Graphics.TOP|Graphics.LEFT);
}
}
//si le niveau est plus haut, le jeu est fini
else if(sleepTime<60){
g.setColor(255,255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(255, 0, 255);
g.drawString("T'as bien réussit",width/2,height/2,Graphics.BASELINE|Graphics.HCENTER);
//rentre au menu
keepTime=1000;
gameState=10;
}
//si le serpent est mort, le jeu est fini
else if(isGameOver()){
g.setColor(255,255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(255, 0, 255);
g.drawString("Game over",width/2,height/2,Graphics.BASELINE|Graphics.HCENTER);
//rentre au menu
gameState=10;
keepTime=1000;
}
break;
}
//exit
case GAMEEXIT:{
isRun=false;
ExlTestKai.instance.quitApp();
}}
}
/**
* move
*/
public void move(int direction){
//donner les coordonnées de la tete du precedent à l'arriere'
for(int i= snakeNum-1;i>0;i--){
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
}
//changer les coordonnées de la tete
switch(direction){
case DIRECTION_UP:
snake[0][1]-=1;
break;
case DIRECTION_DOWN:
snake[0][1]+=1;
break;
case DIRECTION_LEFT:
snake[0][0]-=1;
break;
case DIRECTION_RIGHT:
snake[0][0]+=1;
break;
}
}
/**
* eatFood
*/
public void eatFood(){
//si les coordonnées de la nourriture sont les meme de la tete du serpent,
//effacer la piece de nourriture et le serpent grossit
for(int i=0;i<foodNum;i++){
if(snake[0][0]==food[i][0]&&snake[0][1]==food[i][1]){
food[i][0]=-20;
food[i][1]=-20;
snakeNum++;
score+=10;
}
}
keepTime=0;
}
/**
*is gameover
*/
public boolean isGameOver(){
boolean gm=false;
//si la tete du serpent touche le coté de l'ecran ou il touche soi-meme, il est mort
if(snake[0][0]<0||snake[0][0]>(width-13)/CaseSize||snake[0][1]<0||snake[0][1]>(height-13)/CaseSize){
gm=true;
}
for(int i=1;i<snakeNum;i++){
if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1])
gm=true;
}
return gm;
}
/**
* compterScore
*/
public void compterScore(){
//si toute la nourriture est mangée par le serpent, on initialiser la nourriture, augmente le niveau et les pieces de la nourriture
if(score == s){
sleepTime=300;
foodNum++;
s+=foodNum*10;
initFood(foodNum);
level++;
sleepTime-=50*level;
}
}
/**
* run
*/
public void run() {
while (isRun){
try {
t.sleep(sleepTime);
// Mise à jour des touches
t.sleep(keepTime);
eatFood();
move(direction);
//compter le score
compterScore();
repaint();
//si le jeu est fini, on sort
System.out.println("aaa");
} catch (Exception e) {
}
}
}
[ 本帖最后由 skysea 于 2008-7-20 15:53 编辑 ]

最新回复
CODE:
/**
[ 本帖最后由 skysea 于 2008-7-18 19:20 编辑 ]* key Pressed
*/
protected void keyPressed(int keycode) {
int action = getGameAction(keycode);
switch(gameState){
//controler le mouvement dans le menu
case GAMEMENU:{
switch(action){
case UP:
if(menuNum >0) --menuNum;
break;
case DOWN:
if(menuNum <menu.length -1) ++menuNum;
break;
//changer la condition
case FIRE:{
switch(menuNum){
case GAMESTART:
gameState=0;
break;
case GAMECONFIG:
gameState=1;
break;
case GAMEEXIT:
gameState=2;
break;
}
}
}
}
//changer le niveau et les pieces de nourriture initiales
case GAMECONFIG:{
switch(action){
case UP:
if(configNum >0) configNum--;
break;
case DOWN:
if(configNum <menu_Config.length-1) configNum++;
break;
//changer
case LEFT:{
switch(configNum){
case 0:
if (level_Init<4)
level_Init++;
break;
case 1:
if(food_Init<10)
food_Init++;
}
break;
}
case RIGHT:{
switch(configNum){
case 0:
if (level_Init>0)
level_Init--;
break;
case 1:
if(food_Init>0)
food_Init--;
}
break;
}
case FIRE:{
if (configNum==2){
gameState=10;
}
}
}
}
//controler le mouvement dans le jeu
case GAMESTART:{
switch(action){
case UP:
if(direction!=DIRECTION_DOWN)
direction=DIRECTION_UP;
break;
case DOWN:
if(direction!=DIRECTION_UP)
direction=DIRECTION_DOWN;
break;
case LEFT:
if(direction!=DIRECTION_RIGHT)
direction=DIRECTION_LEFT;
break;
case RIGHT:
if(direction!=DIRECTION_LEFT)
direction=DIRECTION_RIGHT;
}
break;
}
case GAMEEXIT:{
gameState=2;
}
}
}
/**
* Called when a key is released.
*/
protected void keyReleased(int keycode) {
}
/**
* Called when action should be handled
*/
public void commandAction(Command command, Displayable displayable) {
if(command==okCommand){
if (gameState==10)
gameState=menuNum;
}
else if(command==exitCommand){
gameState=2;
}
}
}