Tutorial de programación de juegos en Java
GreedSnake.java (también la entrada del programa):
Importar Java awt;
Importar Java . awt .
Importar Java . ;
Importar evento de clave Java .
Importar evento de clave Java . /p>
Importar Java .util .lista enlazada
Importar javax .jframe
Importar javax . javax . swing . jpanel;
La clase pública GreedSnake implementa KeyListener {
JFrame host;
Canvas paintCanvas
JLabel labelScore//Score Tarjeta
SnakeModel SnakeModel = null//snake
public static final int canvas width = 200;
public static final int canvasHeight = 300;
Ancho de nodo int final estático público = 10;
Altura de nodo int final estático público = 10;
// -
//greedsnake(): Inicializa la interfaz del juego.
// -
Public GreedSnake() {
//Establecer elementos de la interfaz
mainFrame = new JFrame(" GreedSnake ") ;
contenedor CP = mainframe . getcontentpane();
labelScore = new JLabel(" Puntuación:");
cp.add(labelScore, BorderLayout. Norte);
paintCanvas = new canvas();
pintar lienzo. setsize(ancho del lienzo+1, alto del lienzo+1);
pintar lienzo. addkey oyente(este);
cp.add(paintCanvas, BorderLayout. center);
Botón del panel JPanel = new JPanel();
botón del panel. set layout(new BorderLayout());
JLabel labelHelp//Información de ayuda
labelHelp = new JLabel("PageUp, PageDown representa velocidad;, JLabel. Center);
botón del panel . agregar(ayuda de etiqueta,BorderLayout.
Norte);
labelHelp = new JLabel("ENTER o R o S significa inicio;", JLabel. Center
botón del panel agregar(ayuda de etiqueta, BorderLayout. Center) ;
labelHelp = new JLabel("Espacio o P significa pausa", JLabel. Center
botón del panel .
CP .add(botón del panel, BorderLayout. Sur);
mainframe addkey listener(this); mainframe . setresizable(false);
mainframe setdefaultcloseoperation(JFrame. EXIT _ ON _ CLOSE);
mainframe set visible(true); ();
}
// -
// keyPressed(): detección de pulsación de tecla
// -
Clave de anulación pública (evento clave e) {
int key code = e. get key code();
if (snakeModel.running)
Cambiar(código clave){
Evento clave de caso. VK_UP:
modelo de serpiente. cambio de dirección (modelo de serpiente.UP);
Pausa;
Evento clave del caso. VK_Tang:
modelo de serpiente. cambio de dirección (modelo de serpiente.down);
Pausa;
Evento clave del caso. VK_Left:
modelo de serpiente.cambiar dirección(modelo de serpiente.izquierda);
Pausa;
Eventos clave del caso. VK derecha:
modelo de serpiente. cambio de dirección(modelo de serpiente. derecha);
Pausa;
Eventos clave del caso. VK_ADD:
Eventos clave del caso. VK _page_start:
modelo de serpiente. speedup(); //Acelerar
Descanso;
Evento clave del caso. VK menos:
Eventos clave del caso. VK _Página siguiente:
modelo de serpiente. speeddown(); //Reducir la velocidad
Pausa;
Evento clave del caso. VK_Space:
Eventos clave del caso. VK_P:
modelo de serpiente. changepousestate(); // Pausar o continuar
Pausa;
Valor predeterminado:
} p>
//Comenzar de nuevo
if (keyCode == KeyEvent. VK_R || keyCode == KeyEvent. VK_S
|| keyCode == KeyEvent.
VK_Enter){
snakeModel.running = false
begin();
}
}
/ / -
// keyReleased(): función vacía
// -
clave pública vacía liberada (evento clave e){
}
// -
// keyTyped(): función vacía
// -
Clave de anulación pública de (KeyEvent e) {
}
// -
// repaint(): dibuja la interfaz del juego (incluidas serpientes y comida)
// -
void repaint() {
gráficos g = pintar lienzo . obtener gráficos();
//Dibujar el fondo
g.setColor(color.white);
g.fillRect(0, 0, canvasWidth, canvas height);
//Dibuja una serpiente
g.setColor(color.black);
lista enlazada na = modelo de serpiente. matriz de nodos;
Iterador it = iterador();
mientras (it.hasNext()) {
Nodo n = (Nodo)it . }
//Dibujar comida
g.setColor(color.red);
Nodo n = SnakeModel.food
drawNode( g, n);
actualizar puntuación();
}
// -
// drawNode(): Dibuja un nodo (serpiente o comida)
// -
DrawNode vacío privado(gráfico g, nodo n) {
g.fillRect(n.x *ancho del nodo, n.y * altura del nodo, ancho del nodo - 1,
nodeHeight-1
}
// -
/ / updateScore); (): Cambiar el cuadro de mando.
// -
public void updateScore() {
cadena s = " Puntuación: "+ modelo de serpiente
labelScore.setText
}
// -
// comenzar(): El juego comienza, suelta la serpiente.
Como referencia, es muy inconveniente pedir ayuda cada vez que te encuentras con algo que no sabes cómo hacer.
Si quieres aprender más conocimientos de programación JAVA y convertirte en un auténtico maestro de JAVA, puedes echarle un vistazo a esta falda. Los primeros tres números son cuatro, dos y seis, los números del medio son tres, nueve y seis, y los siguientes números son dos, ocho y cuatro.
Simplemente conecta estos números.
Esta es la falda de aprendizaje del maestro. Aquí puedes aprender conocimientos que no se pueden aprender en los libros. ¡Los expertos discutirán entre sí y te guiarán para responder!
// -
void comenzar() {
if (snakeModel == null ||! SnakeModel.running) {
SnakeModel = new SnakeModel(this, canvasWidth/nodeWidth,
this . canvasheight/nodeHeight
(new thread(snakeModel)); start();
}
}
// -
// main(): función principal
// -
Public static void main(String[] args) {
GreedSnake GS = new GreedSnake();
}
}
Nodo.java:
Nodo de clase pública{
int x;
int y;
Nodo(int x, int y) {
this.x = x
this.y = y
}
}
SnakeModel.java:
Importar Java . util . Java.util.random;
Importar javax.swing.joptionpane;
La clase pública SnakeModel implementa Runnable {
GreedSnake gs
Booleano [][]Matriz; // Los datos de la interfaz se almacenan en la matriz.
matriz de nodos de lista vinculada = nueva lista vinculada();
Alimento del nodo;
int maxX//ancho máximo
int maxY //Longitud máxima
int direction = 2; //Dirección
Boolean run = false;
int timeInterval = 200 //Tiempo de intervalo (velocidad)
double speedChangeRate = 0.75 //Tasa de cambio de velocidad
Pausa booleana = false //Estado del juego
int score = 0;
int count move = 0;
//Arriba y abajo son números pares, izquierda y derecha son números impares.
int final estático público ARRIBA = 2;
int final estático público ABAJO = 4;
int final estático público IZQUIERDA = 1; p>public static final int RIGHT = 3;
// -
// GreedModel(): interfaz de inicialización
// -
public SnakeModel(GreedSnake gs, int maxX, int maxY) {
this.gs = gs
this.maxX = maxX
this.maxY = maxY
matriz = new boolean[maxX][];
for(int I = 0;i<maxX++i) {
matriz[I ]= new boolean[maxY];
Arrays.fill(matrix[i], false); //Establece falso en áreas sin serpientes ni comida.
}
//Inicializar Snake
int initArrayLength = maxX & gt20 ?10:maxX/2;
for(int I = 0;i<initArrayLength++i) {
int x = maxX/2+I;
int y = maxY/2;
nodeArray( new node(x,y));
matrix[x][y]= true; //la serpiente maneja true
}
comida = crear comida ();
matrix[food . x][food . y]= true; //Procesamiento de alimentos true
}
// -
// changeDirection(): Cambia la dirección del movimiento.
// -
cambio de dirección público vacío (int nueva dirección){
If (dirección% 2! = nuevaDirección% 2)//Evita conflictos
{
dirección = nuevaDirección
}
}
// -
// moveOn(): función de movimiento de serpiente
// -
movimiento booleano público() {
Nodo n = (Nodo)Matriz de nodos obtener primero. ();
int x = n.x
int y = n.y
cambiar(dirección){
caso arriba:
p>y-;
Rotura;
Caso cerrado:
y++;
Rotura;
Lado izquierdo del caso:
x-;
Pausa;
Derecho del caso:
x++;
break;
}
if ((0 & lt= x & amp& ampx & ltmaxX) y amp& amp(0 & lty & amp& ampy & ltmaxY)) { p>
Si (matrix[x][y])//Come comida o golpea el cuerpo.
{
if(x == comida . x & & ampY == comida.y)//Amante de la gastronomía.
{
nodeArray.addFirst(food); //Agrega un nodo en el encabezado.
//Las reglas de puntuación están relacionadas con la longitud y la velocidad del movimiento.
int puntuación obtener =(10000-200 * recuento de movimiento)/intervalo de tiempo
puntuación+= puntuación obtener & gt; >contar movimiento = 0;
comida = crear comida();
matriz[comida . x][comida ]= verdadero;
Devuelve verdadero.
} De lo contrario
Devuelve falso//golpeé el cuerpo
} else//No toqué nada
{ p >
nodeArray.addFirst(new node(x,y)); //Agregar encabezado
matriz[x][y]= true;
n =(Nodo )Matriz de nodos. eliminar último(); //Eliminar la cola
matriz[n . x][n ]= false;
contar movimiento++;
Devuelve verdadero
}
}
Devuelve falso//Cruzando la línea (golpeando la pared)
}
// -
// run(): Hilo de movimiento de serpiente
// -
Public void run(){
Running=True;
(Mientras se ejecuta){
Prueba {
Thread.sleep(intervalo de tiempo);
} catch (Excepción e) {
Romper;
}
Si (! Pausa) {
Si (moveOn()) // Sin terminar
{
GS . repaint();
} else//Juego terminado
{
JOptionPane.showMessageDialog(null, "Juego terminado",
"Juego terminado", JOptionPane.Message_Message);
Break; >
}
}
En ejecución=false;
}
// -
/ /createFood(): Genera comida y la coloca.
// -
Nodo privado createFood() {
int x = 0
int y =
Hacer {
Aleatorio r = new Aleatorio();
x = r nextint(maxX);
y = r nextint(. maxY);
} while(matrix[x][y]);
Devolver nuevo nodo (x, y);
}
// -
// speedUp(): Acelera el movimiento de la serpiente.
// -
Aceleración de anulación pública(){
timeInterval * = speedChangeRate
}
/ / -
// speedDown(): ralentiza la serpiente.
// -
Desaceleración del vacío público(){
intervalo de tiempo/= tasa de cambio de velocidad;
}
// -
// changePauseState(): cambia el estado del juego (pausar o continuar)
// -
public void changePauseState() {
Pausado=! Suspendido;
}
}
Si está satisfecho, adopte