Red de conocimiento informático - Conocimiento sistemático - Tutorial de programación de juegos en Java

Tutorial de programación de juegos en Java

Hay un programa de serpiente codiciosa escrito por nuestro profesor para su referencia:

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:

}

//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)) {

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

{

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