Buscando programación Java Snake con comentarios
Código fuente J2ME Snake: alrededor de 200 líneas, incluido el paquete de comentarios detallados; import javax.microedition.midlet.*
import javax.microedition.lcdui.*; extiende MIDlet {
SnakeCanvas displayable = new SnakeCanvas();
public SnakeMIDlet() {
Display.getDisplay(this).setCurrent(displayable ); /p>
}public void startApp() {}public void pauseApp() {}public void destroyApp(boolean incondicional) {}}// Nombre de archivo: SnakeCanvas.javapackage Snake; import java.util.*; p>
import javax.microedition.lcdui.*;/**
* Snake Game
*/
clase pública SnakeCanvas extiende Canvas implementa Runnable {
/**Almacena las coordenadas del nodo de serpiente, donde el subíndice de la segunda dimensión es 0 representa la coordenada x, y el subíndice de la segunda dimensión es 1 representa la coordenada y*/
int [][] serpiente = new int[200][2];
/**El número de nodos que se han utilizado*/
int SnakeNum;
/**La dirección del movimiento de la serpiente, 0 representa hacia arriba, 1 representa hacia abajo, 2 representa hacia la izquierda, 3 representa hacia la derecha*/
dirección int;
/*Movimiento dirección*/
/**Arriba*/
privado final int DIRECTION_UP = 0;
/**Abajo*/
private final int DIRECTION_DOWN = 1;
/**Izquierda*/
private final int DIRECTION_LEFT = 2;
/* *A la derecha*/
private final int DIRECTION_RIGHT = 3;/**Ancho del área de juego*/
int ancho;
/**Alto del área de juego */
int height; /**Ancho de la unidad del cuerpo de la serpiente*/
byte final privado SNAKEWIDTH = 4; /**Si está en estado de pausa, verdadero significa pausa*/ p>
boolean isPaused = false;
/**Si se está ejecutando, verdadero significa en ejecución*/
boolean isRun = true;/**Intervalo de tiempo*/
private final int SLEEP_TIME = 300;
/**Coordenada X de la comida*/
int foodX;
/**Coordenada Y de la comida */
int
foodY;
/**Control flash de alimentos*/
boolean b = true;
/**Objeto aleatorio*/
Aleatorio aleatorio = new Random();
public SnakeCanvas() {
//Inicialización
init();
ancho = this.getWidth();
height = this.getHeight();
//Iniciar el hilo
new Thread(this).start()
}/**
* Inicializar datos de inicio
*/
private void init(){
>//Inicializa el número de nodos
snakeNum = 7;
//Inicializa los datos del nodo
for(int i = 0; i lt; número de serpiente; i ) {
serpiente[i][0] = 100 - ANCHO DE SERPIENTE * i;
serpiente[i][1] = 40; }
//Inicializa la dirección del movimiento
direction = DIRECTION_RIGHT;
//Inicializa las coordenadas de los alimentos
foodX = 100;
foodY = 100;
}pintura vacía protegida(Gráficos g) {
//Borrar pantalla
g.setColor(0xffffff) ;
g.fillRect(0, 0, ancho, alto);
g.setColor(0); //Dibuja el cuerpo de la serpiente
for( int i = 0; i lt ; número de serpiente; i ){
g.fillRect(serpiente[i][0], serpiente[i][1], ANCHO DE SERPIENTE
<); p>}//Dibujar comida
if(b){
g.fillRect(foodX, foodY, SNAKEWIDTH, SNAKEWIDTH);
}
}movimiento de vacío privado (dirección int){
//movimiento del cuerpo de la serpiente
for(int i = número de serpiente - 1; i gt ; 0; i--) {
serpiente[i][0] = serpiente[i - 1][0];
serpiente[i][1] = serpiente[ i - 1][1] ;
}//La primera celda se mueve
cambiar(dirección){
caso DIRECTION_UP:
serpiente[0] [1] = serpiente[0][1] - SNAKEWIDTH;
romper;
caso DIRECTION_DOWN:
serpiente[0][ 1] = serpiente[ 0][1] ANCHO SERPIENTE;
romper;
caso DIRECTION_LEFT:
serpiente[0][0] = serpiente[0] [0] - SCN
KEWIDTH;
romper;
caso DIRECTION_RIGHT:
serpiente[0][0] = serpiente[0][0] SNAKEWIDTH;
descanso;
}
}
/**
* Come alimentos y crece tú mismo
*/
private void eatFood(){
//Determina si la cabeza de serpiente se superpone con la comida
if(snake[0][0] = = comidaX amp;amp; serpiente[0][1] == comidaY){
NumSerpiente;
generarComida();
}
}
/**
* Generar comida
* Nota: Las coordenadas de la comida deben estar dentro de la pantalla y no pueden coincidir con la serpiente. body
*/
private void generateFood(){
while(true){
foodX = Math.abs(random. nextInt() (ancho - ANCHO SERPIENTE 1))
/ ANCHO SERPIENTE * ANCHO SERPIENTE;
comidaY = Math.abs(random.nextInt() (alto - ANCHO SERPIENTE 1))
/ ANCHO DE SERPIENTE * ANCHO DE SERPIENTE;
booleano b = verdadero;
for(int i = 0; i lt; número de serpiente; i ){
if(comidaX == serpiente[i][0] amp; amp; serpiente[i][1] == comidaY){
b = false
romper; p>
}
}
si(b){
romper;
}
}
}
/**
* Determinar si el juego ha terminado
* Condiciones finales:
* 1. La cabeza de la serpiente excede el límite
* 2. La cabeza de la serpiente se toca a sí misma
*/
private boolean isGameOver(){
//Determinación de límites
if(snake[0][0] lt; 0 || serpiente[0][0] gt; (ancho - SNAKEWIDTH) ||
serpiente[0][1] lt; 0 || serpiente[0][1] gt; (altura - ANCHO DE SERPIENTE)){
return true;
} p>
//se encontró consigo mismo
for(int i = 4; i lt; SnakeNum; i ){
if(snake[0][0] == serpiente [i][0]
amp; serpiente[0][1] == serpiente[i][1]){
devuelve verdadero;
}
}
return false;
}/**
* Manejo de eventos
* /
<p>public void keyPressed(int keyCode){
int action = this.getGameAction(keyCode);
//Cambiar dirección
switch(action){
caso ARRIBA:
if(dirección != DIRECTION_DOWN){
dirección = DIRECTION_UP;
}
romper;
caso ABAJO:
if(dirección != DIRECTION_UP){
dirección = DIRECTION_DOWN;
}
interrupción;
caso IZQUIERDA:
if(dirección != DIRECCION_RIGHT){
dirección = DIRECCION_LEFT;
}
descanso;
caso DERECHA:
if(dirección != DIRECCIÓN_LEFT){
dirección = DIRECCIÓN_DERECHA;
}
interrupción;
caso FUEGO:
//Pausar y continuar
isPaused = !isPaused;
romper;
}
}/**
* Métodos de hilo
* Utilice retrasos precisos
*/
ejecución pública void(){
prueba{
mientras (isRun) {
//Hora de inicio
inicio largo = System.currentTimeMillis();
if(!isPaused){
//Comer comida
eatFood();
//Mover
move(dirección);
//Finalizar el juego
if(isGameOver()){ p>
romper;
}
//Control de parpadeo
b = !b;
}
//Repintar
repintar();
final largo = System.currentTimeMillis();
//Retraso
if(end - start lt; SLEEP_TIME){
Thread.sleep(SLEEP_TIME - (end - start));
}
} p>
}catch(Excepción e){}
}
}