Una versión Java del juego de serpiente que escribí muy en serio, con una interfaz gráfica, admite la operación del menú, el monitoreo del teclado, puede acelerar, desacelerar, contar puntajes, establecer la velocidad de movimiento, establecer el color de fondo del juego, etc.! No debe haber errores, porque los he modificado por completo.
La siguiente es la relación jerárquica entre los diversos paquetes y clases del proyecto:
La interfaz principal de ejecución del juego se muestra a continuación:
Los siguientes son algunos códigos. Consulte este enlace para el código fuente detallado: Descargue el código fuente de la serpiente codiciosa
Clase de serpiente:
paquete com.huowolf.Entities; import java.awt.color; import java.awt.graphics; import java.awt.point; import java.util.hashset; import java.util.linkedlist; import java.util.set; import com.huowolf.listener.snakelistener; import com.huowolf.util.global; Snake de clase pública {// constante representando la dirección public static final int up = 1; público estático final int down = -1; Public estática final int izquierda = 2; Public estática final int right = -2; // Liser Group Set private <Snakelistener> oyentes = new Hashset <SnakElistener> (); // Estructura de la lista de almacenamiento Private LinkedList <Point> Body = new LinkedList <Point> (); vida booleana privada; // es una pausa privada booleana vivo; // ¿El juego privado int OldDirection, newDirection; // Introducción de instrucciones nuevas y antiguas (evite instrucciones no válidas dentro de un tiempo de movimiento) Punto privado antiguo; // cola vieja (usada al comer alimentos) private int foodCount = 0; // La cantidad de alimentos comió Headcolor de color privado; Color de color privado BodyColor; privado int sleeptime; Public boolean islife () {return Life; } public int getSleepTime () {return sleeptime; } public void setSleepTime (int sleeptime) {this.sleeptime = sleeptime; } public void setheadColor (color headcolor) {this.headcolor = headcolor; } public void setBodyColor (Color BodyColor) {this.bodyColor = BodyColor; } public void init () {int x = global.width/2; int y = global.Height/2; para (int i = 0; i <3; i ++) {body.addlast (nuevo punto (x-, y)); } OldDirection = newDirection = Right; FoodCount = 0; vida = verdadero; pausa = falso; if (sleeptime == 0) {sleeptime = 300; }} // método para borrar los nodos de la serpiente (utilizados para iniciar un nuevo juego) public void clear () {body.clear (); } public void setLife (vida booleana) {this.life = life; } public boolean getPause () {return pausa; } public void setPause (pausa boolean) {this.Pause = pause; } // Método para cambiar el estado de las constantes de pausa public void ChangePause () {pausa =! Pausa; } // Método para morir por serpiente public void die () {vida = falso; } // método para moverse public void Move () {if (! (OldDirection + newDirection == 0)) {OldDirection = newDirection; } // detalle oldtail = body.removelast (); int x = body.getFirst (). x; int y = body.getFirst (). Y; Switch (OldDirection) {Case Up: Y--; if (y <0) {y = global.height -1; } romper; Caso hacia abajo: y ++; if (y> = global.height) {y = 0; } romper; Caso izquierdo: x--; if (x <0) {x = global.width-1; } romper; Caso derecho: x ++; if (x> = global.width) {x = 0; } romper; } Punto newhead = nuevo punto (x, y); // Agregar cabeza de cabeza.addfirst (newhead); } // Dirección de cambio public void cambiadirection (int dirección) {newDirection = direction; } // comer comida public void eatfood () {body.addlast (Oldtail); FoodCount ++; } // Obtenga la cantidad de comida que come public int getFoodCount () {return foodCount; } // La serpiente come su propio cuerpo público boolean iseatbody () {para (int i = 1; i <body.size (); i ++) {if (body.get (i) .equals (this.gethead ())) return true; } return false; } // Obtenga el nodo que representa el punto público de cabeza de la serpiente gethead () {return body.getFirst (); } // Mostrarse en público Void Drawme (Graphics g) {if (BodyColor == NULL) {G.SetColor (nuevo color (0x3333ff)); } else {G.SetColor (BodyColor); } para (Point P: Body) {G.FillRoundrect (PX*Global.Cell_Size, Py*Global.Cell_Size, Global.Cell_Size, Global.Cell_Size, Global.Cell_Size, 15,12); } Drawhead (g); } // Dibuja Snakehead public void Drawhead (Graphics G) {if (HeadColor == NULL) G.SetColor (color.yellow); else {G.SetColor (HeadColor); } G.FillRoundRect (gethead (). X * Global.Cell_Size, Gethead (). Y * Global.Cell_Size, Global.Cell_Size, Global.Cell_Size, Global.Cell_Size, Global.Cell_Size, 15,12); } // La clase interna de la clase privada implementa runnable {public void run () {while (life) {if (pause == false) {Move (); para (Snakelistener l: oyentes) L.Snakemoved (Snake.This); } try {thread.sleep (sleeptime); } catch (InterruptedException e) {E.PrintStackTrace (); }}}}} // método para iniciar el hilo public void begin () {new Thread (new SnakedRiver ()). Start (); } // Agregar escucha public void addsnakelistener (Snakelistener l) {if (l! = Null) {oyentes.add (l); }} // acelera public void speedup () {if (sleeptime> 50) {sleeptime- = 20; }} // ralentizar public void speeddown () {if (sleeptime <700) {sleeptime+= 20; }}}Clase de comida:
paquete com.huowolf.Entities; import java.awt.color; import java.awt.graphics; import java.awt.point; import com.huowolf.util.global; El alimento de la clase pública extiende el punto {privado estático final long SerialVersionUid = 1l; Color privado Foodcolor; public void setfoodColor (color foodcolor) {this.foodColor = foodColor; } public Color getFoodColor () {return FoodColor; } public void newfood (punto p) {setLocation (p); } public boolean isFoodeated (serpiente de serpiente) {return this.equals (snake.gethead ()); } public void drawme (Graphics g) {if (FoodColor == Null) {G.SetColor (color.red); } else {G.SetColor (FoodColor); } g.fill3drect (x*global.cell_size, y*global.cell_size, global.cell_size, global.cell_size, true); }}Clase de tierra
paquete com.huowolf.Entities; import java.awt.color; import java.awt.graphics; import java.awt.point; import java.util.random; import com.huowolf.util.global; Public Class Ground {private boolean [] [] rocks = new Boolean [Global.Width] [Global.Height]; private int maptype = 1; public int getMapType () {return mapType; } public void setMapType (int maptype) {this.mapType = maptype; } // Inicializar el terreno (Clear the Stone) public void Clear () {for (int x = 0; x <global.width; x ++) para (int y = 0; y <global.height; y ++) rocas [x] [y] = false; } / *** Generar piedra* / public void generocks1 () {for (int x = 0; x <global.width; x ++) rocas [x] [0] = rocks [x] [global.height - 1] = true; para (int y = 0; y <global.height; y ++) rocas [0] [y] = rocks [global.width - 1] [y] = true; } public void generatocks2 () {para (int y = 0; y <6; y ++) {rocks [0] [y] = true; Rocas [Global.Width - 1] [y] = True; Rocas [0] [Global.Height - 1 - y] = True; Rocas [Global.Width - 1] [Global.Height - 1 - Y] = True; } para (int y = 6; y <global.height - 6; y ++) {rocks [6] [y] = true; Rocas [Global.Width - 7] [y] = True; }} public void generatocks3 () {for (int x = 4; x <14; x ++) rocas [x] [5] = true; para (int j = 5; j <15; j ++) rocas [21] [j] = true; para (int y = 13; y <20; y ++) rocas [14] [y] = true; para (int x = 2; x <10; x ++) rocas [x] [17] = true; para (int i = 10; i <global.width-3; i ++) rocas [i] [global.height-3] = true; } // ¿La serpiente come la piedra pública boolean isgroundated (serpiente de serpiente) {para (int x = 0; x <global.width; x ++) {for (int y = 0; y <global.height; y ++) {if (rocks [x] [y] == true && (x == Snake.gethead (). X && Y == SNAKE (). verdadero; }} return false; } public Point getPoint () {Random Random = new Random (); int x = 0, y = 0; do {x = random.nextint (global.width); y = Random.NextInt (Global.Height); } while (rocas [x] [y] == true); devolver nuevo punto (x, y); } // Método de visualización public void Drawme (Graphics g) {G.SetColor (color.Dark_Gray); for (int x = 0; x <global.width; x ++) {for (int y = 0; y <global.height; y ++) {if (rocks [x] [y] == true) {g.fill3drect (x*global.cell_size, y*global.cell_size, global.cell_size, global.cell_size, true);; }}}}}}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.