Está en la página 1de 11

1

Documentación de código Snake Game

Juan Pablo Mosquera Marín


20221020026
Ana Laura Morcote Chacón
20221020036
Jorge Andrés Carvajal
20221020128

Universidad Distrital Francisco José De Caldas


Facultad de ingeniería
Oswaldo Alberto Romero Villalobos
29 de febrero de 2023
2

Tabla de contenidos

• Introducción
• Requerimientos
• Objetivos
• Características
• Funcionalidad del código

Introducción

Esta documentación de código describe los aspectos técnicos y funcionales de un juego


programada en java usando el modelo arquitectural por capas MVC y permite comprender
su estructura y función de cada método en el código. Esta aplicación está basada en el
popular juego Snake y su objetivo es permitir a los usuarios jugar el juego en una interfaz
gráfica de usuario (GUI) utilizando teclas de flecha para controlar la serpiente.

Requerimientos

- Java SE Development Kit (JDK) 8 o superior


- Un entorno de desarrollo integrado (IDE) NetBeans
- Conocimientos básicos del IDE, java y el uso del GUI.

Objetivos

El objetivo principal de este programa es proporcionar una versión sencilla y funcional del
juego Snake recreada en java y en forma arquitectural MVC.

Características

- Diseño de interfaz gráfica de usuario (GUI) fácil de usar y atractiva.


- Control de la serpiente mediante las teclas de flecha.
3

- Puntuación y tiempo de juego.


- Opciones para reiniciar el juego o salir del juego.
- Funciones para pausar y reanudar el juego.

Diagrama UML

Diagrama Casos de Uso


4

Diagrama Dinámico

Diagrama UML
5

Funcionalidad del Código

El programa este hecho en una forma de MVC de tres capas, separado por 3 distintos
paquetes, el launcher, la presentación y la lógica.

Launcher

1 public class Launcher {


2
3 private Vista vista;
4 private Modelo modelo;
5
6 public static void main(String[] args) {
7 new Launcher();
8 }
9
10 public Launcher () {
11 vista = new Vista ();
12 modelo= new Modelo ();
13 vista.setVisible(true);
14 modelo.iniciar();
15 }
16
17 }

Presentación
6

-controlador

public void aumentarPuntaje(){


int pActual;
String sPActual;

pActual=Integer.parseInt(vista.getPuntaje());
pActual=pActual+10;
//FORMULA: nivel^2*10+40

if(pActual==Integer.parseInt(vista.getNivel())*Integer.parseInt(vista.get
Nivel())*10+40){
aumentarNivel();
}
sPActual=Integer.toString(pActual);
vista.setPuntaje(sPActual);
}

public void aumentarNivel(){


int nActual;
String sNActual;

nActual=Integer.parseInt(vista.getNivel());
nActual=nActual+1;
sNActual=Integer.toString(nActual);
vista.setNivel(sNActual);
}

-modelo

public Reproductor getReproductor(){


if(reproductor==null){
reproductor=new Reproductor(this);
}
return reproductor;
}

public void iniciar(){


getReproductor().reproducirMusica();
}
7

-PanelFondo

public PanelFondo(int tammax, int can){


this.tammax=tammax;
this.can=can;
this.tam=tammax/can;
this.residuo= tammax%can;
setVisible(true);
}

@Override
public void paint(Graphics lapiz){
super.paint(lapiz);

for(int i=0;i<can;i++){
for(int j=0;j<can;j++){
lapiz.fillRect(residuo/2 + i*tam, residuo/2
+ j*tam, tam-1, tam-1);
}

}
ImageIcon backgroundImage = new
ImageIcon(getClass().getResource("/Presentacion/hqdefault (3).jpg"));
lapiz.drawImage(backgroundImage.getImage(), 0, 0, 800, 800, null);
}

-Reproductor

public Reproductor(Modelo modelo){


this.modelo=modelo;

this.musica =
Applet.newAudioClip(getClass().getResource("/Presentacion/musica.au"));
}

public void reproducirMusica(){


musica.loop();
if(musica==null){
System.out.println("musica null");
}
else{
System.out.println("REPRODUCIENDO MUSICA");
}
}
8

-Serpiente

public Serpiente(int tammax, int can, Vista v){


vista=v;
this.tammax=tammax;
this.can=can;
this.tam=tammax/can;
this.residuo= tammax%can;
setVisible(true);
int[] a={can/2-1,can/2-1};
int[] b={can/2,can/2-1};
snake.add(a);
snake.add(b);
generarComida();

camino = new Caminar(this);


hilo = new Thread(camino);
hilo.start();

@Override
public void paint(Graphics lapiz){
super.paint(lapiz);
lapiz.setColor(colorsnake);

for(int i=0; i < snake.size(); i++){


lapiz.fillRect(residuo/2 + snake.get(i)[0]*tam,
residuo/2+snake.get(i)[1] *tam, tam-1, tam-1);
}
lapiz.setColor(colorcomida);
lapiz.fillRect(residuo/2 + comida[0]*tam, residuo/2+comida[1]
*tam, tam-1, tam-1);
}

public Vista getVista(){


return vista;
}

public void Avanzar(){


IgualarDireccion();
int [] ultimo = snake.get(snake.size()-1);
int agregarx=0;
int agregary=0;
switch(direccion){
case "de": agregarx=1; break;
case "iz": agregarx=-1; break;
9

case "ar": agregary=-1; break;


case "ab": agregary=1; break;
}

int[] nuevo={Math.floorMod(ultimo[0]+agregarx,can),
Math.floorMod(ultimo[1]+agregary,can)};
boolean existe=false;
for(int i=0; i<snake.size();i++){
if(nuevo[0]==snake.get(i)[0] && nuevo[1]==snake.get(i)[1]){
existe=true;
break;
}
}

if(existe){
JOptionPane.showMessageDialog(this,"has perdido");
}else{
if(nuevo[0]==comida[0]&&nuevo[1]==comida[1]){
snake.add(nuevo);
vista.getControl().aumentarPuntaje();
generarComida();
}else{
snake.add(nuevo);
snake.remove(0);
}
}

public void generarComida(){


boolean existe= false;
int a = (int) (Math.random()*can);
int b = (int) (Math.random()*can);
for(int[] par:snake){
if(par[0]==a && par[1]==b){
existe=true;
generarComida();
break;
}
}
if(!existe){
this.comida[0]=a;
this.comida[1]=b;
}
}

public void CambiarDireccion(String dir){


if((this.direccion.equals("de")||
this.direccion.equals("iz"))&&(dir.equals("ar")||dir.equals("ab"))){
10

this.direccionproxima=dir;
}
if((this.direccion.equals("ar")||
this.direccion.equals("ab"))&&(dir.equals("iz")||dir.equals("de"))){
this.direccionproxima=dir;
}
}

public void IgualarDireccion(){


this.direccion=this.direccionproxima;
}

Lógica

-Caminar

public Caminar(Serpiente serpiente ) {

this.serpiente=serpiente;

@Override
public void run() {
int vel=380;
while(estado){
serpiente.Avanzar();
serpiente.repaint();
try {

Thread.sleep(vel);

vel=(int)(300/Integer.parseInt(serpiente.getVista().getNivel()))+50;
} catch (InterruptedException ex) {

Logger.getLogger(Caminar.class.getName()).log(Level.SEVERE, null, ex);


}
}
}

public void parar(){


this.estado=false;
}
11

-Dirección

public Direccion(){
private Serpiente serpiente;
public Direccion(){

private void formKeyPressed(java.awt.event.KeyEvent evt) {


switch (evt.getKeyCode()) {
case KeyEvent.VK_LEFT:
serpiente.CambiarDireccion("iz");
break;
case KeyEvent.VK_RIGHT:
serpiente.CambiarDireccion("de");
break;
case KeyEvent.VK_UP:
serpiente.CambiarDireccion("ar");
break;
case KeyEvent.VK_DOWN:
serpiente.CambiarDireccion("ab");
break;
default:
break;
}
}
}

También podría gustarte