Uma versão Java do jogo de cobras que escrevi muito seriamente, com uma interface gráfica, suporta operação de menu, monitoramento do teclado, pode acelerar, desacelerar, contar as pontuações, definir a velocidade de movimento, definir a cor do jogo, etc.! Não deve haver bugs, porque eu os modifiquei completamente.
A seguir, é apresentada a relação hierárquica entre os vários pacotes e classes do projeto:
A principal interface em execução do jogo é mostrada abaixo:
A seguir, alguns códigos. Consulte este link para o código fonte detalhado: Baixe o código -fonte de cobra gananciosa
Classe de cobra:
pacote com.huowolf.entities; importar java.awt.color; importar java.awt.graphics; importar java.awt.point; importar java.util.hashset; importar java.util.LinkedList; importar java.util.set; importação com.huowolf.listener.snakelistener; importação com.huowolf.util.global; classe pública Snake {// constante representando direção public static final int up = 1; public static final int down = -1; public static final int esquerd = 2; public static final int direito = -2; // Liser Group Set Private Set <Snakelistener> ouvintes = novo hashset <Snakelistener> (); // Estrutura da lista de armazenamento Private LinkedList <Ponto> Body = new LinkedList <Point> (); vida booleana privada; // é uma pausa booleana privada viva; // O jogo Private int OldDirection, NewDirection; // Introdução de direções novas e antigas (evite direções inválidas dentro de um tempo de movimentação) Private Point Oldtail; // cauda velha (usada ao comer alimentos) privado int foodcount = 0; // a quantidade de alimentos consumidos por Headcolor de cor privado; Corpo corporal de cores privado; private INT SleepTime; public boolean islife () {retornar vida; } public int getSleeptime () {return sleepTime; } public void SetSleepTime (Int SleepTime) {this.sleeptime = SleepTime; } public void setheadColor (colorida headcolor) {this.headcolor = headcolor; } public void setBodyColor (cor bodyColor) {this.BodyColor = BodyColor; } public void init () {int x = global.width/2; int y = global.Height/2; for (int i = 0; i <3; i ++) {body.addlast (novo ponto (x-, y)); } OldDirection = newDirection = Right; foodcount = 0; vida = verdadeira; pausa = false; if (SleepTime == 0) {SleepTime = 300; }} // Método para limpar os nós da cobra (usados para iniciar um novo jogo) public void clear () {body.clear (); } public void setLife (vida booleana) {this.life = Life; } public boolean getPause () {return pause; } public void setPause (pausa booleana) {this.pause = pausa; } // Método para alterar o estado das constantes de pausa Public void mudepause () {pausa =! Pause; } // Método para morrer por cobra public void Die () {Life = false; } // Método para mover public void move () {if (! (OldDirection + newDirection == 0)) {OldDirection = newDirection; } // Detalhe Oldtail = body.removelt (); int x = body.getfirst (). x; int y = body.getfirst (). y; Switch (OldDirection) {case up: y--; if (y <0) {y = global.Height -1; } quebrar; Case para baixo: y ++; if (y> = global.Height) {y = 0; } quebrar; Caso esquerdo: x--; if (x <0) {x = global.width-1; } quebrar; Caso direito: x ++; if (x> = global.width) {x = 0; } quebrar; } Point Newhead = new Point (x, y); // Adicione o corpo da cabeça.Addfirst (Newhead); } // altere a direção public void alterado (int direção) {newDirection = direção; } // coma alimento public void eatfood () {body.addlast (Oldtail); FoodCount ++; } // Obtenha a quantidade de comida que você come public int getFoodCount () {return FoodCount; } // A cobra come seu próprio corpo público booleano iseatbody () {for (int i = 1; i <body.size (); i ++) {if (body.get (i) .equals (this.gethead ())) retorna verdadeiro; } retornar false; } // Obtenha o nó que representa a cabeça da cobra Point Point GETHEAD () {return body.getfirst (); } // mostra -se public void drawMe (gráficos g) {if (bodyColor == null) {g.setColor (nova cor (0x3333ff)); } else {g.setColor (BodyColor); } para (ponto P: corpo) {g.fillRoundRect (px*global.cell_size, py*global.cell_size, global.cell_size, global.cell_size, global.cell_size, 15,12); } drawhead (g); } // desenhe Snakehead public void drawhead (gráficos g) {if (headcolor == null) g.setColor (color.yellow); else {g.setColor (headcolor); } G.FillRoundRect (GETHEAD (). X * GLOBAL.CELL_SIZE, GETHEAD (). } // A classe interna private Snakedriver implementa Runnable {public void run () {while (Life) {if (pause == false) {move (); for (snakelistener l: ouvintes) L.Snakemoved (Snake.Este); } tente {thread.sleep (SleepTime); } catch (interruptedException e) {e.printStackTrace (); }}}}} // Método para iniciar o thread public void BEGN () {new Thread (new Snakedriver ()). Start (); } // Adicione o ouvinte public void Addsnakelistener (snakelistener l) {if (l! = Null) {ouvintes.add (l); }} // Acelerar o público vazio de velocidade () {if (SleepTime> 50) {SleepTime- = 20; }} // desacelerar o público void speeddown () {if (sonoptime <700) {sleeptime+= 20; }}}Aula de comida:
pacote com.huowolf.entities; importar java.awt.color; importar java.awt.graphics; importar java.awt.point; importação com.huowolf.util.global; classe pública alimentos estende o ponto {private estático final serialversionUid = 1L; Foodcolor de cores privadas; public void setFoodColor (color FoodColor) {this.foodColor = FoodColor; } public color getfoodColor () {return FoodColor; } public void newfood (ponto p) {setLocation (p); } public boolean isoFoodEed (cobra cobra) {return this.equals (snake.gethead ()); } public void drawMe (gráficos 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); }}Classe de terra
pacote com.huowolf.entities; importar java.awt.color; importar java.awt.graphics; importar java.awt.point; importar java.util.random; importação com.huowolf.util.global; classe pública 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; } // inicialize o solo (limpe a pedra) public void clear () {for (int x = 0; x <global.width; x ++) para (int y = 0; y <global.Height; y ++) rochas [x] [y] = false; } / *** Gere pedra* / public void generaterocks1 () {for (int x = 0; x <global.width; x ++) rochas [x] [0] = rochas [x] [global.Height - 1] = true; for (int y = 0; y <global.Height; y ++) rochas [0] [y] = rochas [global.width - 1] [y] = true; } public void generaterocks2 () {for (int y = 0; y <6; y ++) {rochas [0] [y] = true; rochas [global.width - 1] [y] = true; rochas [0] [global.Height - 1 - y] = true; rochas [global.width - 1] [global.Height - 1 - y] = true; } for (int y = 6; y <global.Height - 6; y ++) {rochas [6] [y] = true; rochas [global.width - 7] [y] = true; }} public void generaterocks3 () {for (int x = 4; x <14; x ++) rochas [x] [5] = true; for (int j = 5; j <15; j ++) rochas [21] [j] = true; for (int y = 13; y <20; y ++) rochas [14] [y] = true; for (int x = 2; x <10; x ++) rochas [x] [17] = true; for (int i = 10; i <global.width-3; i ++) rochas [i] [global.Height-3] = true; } // A cobra come a pedra pública booleana é ardilada (cobra de cobra) {for (int x = 0; x <global.width; x ++) {for (int y = 0; y <global.Height; y ++) {if (rochas [x] [y] == == && (x == Snake.gethead (). }} retornar false; } public Point getPoint () {aleatório = new Random (); int x = 0, y = 0; do {x = random.nextInt (global.width); y = random.nextint (global.Height); } while (rochas [x] [y] == true); retornar novo ponto (x, y); } // Método de exibição public void drawMe (gráficos g) {g.setColor (color.dark_gray); para (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,; }}}}}}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.