snake_game

JUEGO SNAKE

Para el desarrollo del juego se debe tener en cuenta dos aspectos:

  1. 1 movimiento de la serpiente.
  2. 2 alimento de la serpiente.

El primer aspecto a tratar es el movimiento de la serpiente, es decir, esta se movera solo en una direccion y debe mantener dicha dirección sin necesidad de mantener un boton presionado.

Para controlar el movimiento de la serpiente se crea un modulo en el cual smanejará su dirección

module posicion_snake(vert, hor, posx, posy, clk2);
    input clk2;
    input [1:0] vert;
    input [1:0] hor;
    output reg [9:0] posx=300;
    output reg [9:0] posy=200;

    always @(posedge clk2) begin
        if ((hor==2'b01)&(vert==2'b00)) begin
            posy=posy;
            if (posx>=600)    
                 posx=300;
            else     
                posx=posx+1;

        end
        if ((hor==2'b10)&(vert==2'b00)) begin
            posy=posy;
            if (posx<=10)
                posx=300;
            else 
                posx=posx-1;

        end
        if ((hor==2'b00)&(vert==2'b01)) begin
            posx=posx;
            if (posy>=400)
                posy=200;
            else
                posy=posy+1;
        end
        if ((hor==2'b00)&(vert==2'b10)) begin
            posx=posx;
            if (posy<=10)
                posy=200;
            else
                posy=posy-1;

        end
    end

endmodule

Despues de esto, se tendrá en cuenta que la serpiente deberá seguir su recorrido sin necesidad de mantener presionados los botones, esto se logra implementando el siguiente diagrama de estados en otro módulo.

0s_4Z_0hmVBxtbVlswIUqQ6xJdY1OScXULv8a_C7YMPdigE5tgkgb67rnEGT6Kp2VVilgKU=s121

module movimiento_serpiente(clk, izquierda, derecha, arriba, abajo, vert, hor, clk2);

input clk, izquierda, derecha, arriba, abajo;
output reg [1:0] vert;
output reg [1:0] hor;
output reg clk2;

reg [18:0] temp=0;
always @(posedge clk) begin
temp=temp+1;
clk2=temp[18];
end

reg [1:0]next_state;
reg [1:0]current_state;

parameter inicio = 0, i1=1, i2=2, i3=3, i4=4;

always @(izquierda or derecha or abajo or arriba or current_state)begin

case (current_state)

inicio:begin
vert=2'b01;
hor=2'b00;
if ((arriba==0)&(abajo==1)&(derecha==0)&(izquierda==0)) next_state = i1;
else if ((arriba==0)&(abajo==0)&(derecha==1)&(izquierda==0)) next_state = i2;
else if ((arriba==0)&(abajo==0)&(derecha==0)&(izquierda==1)) next_state = i3;
else next_state=inicio;
end

i1:begin
vert=2'b10;
hor=2'b00;
if ((arriba==1)&(abajo==0)&(derecha==0)&(izquierda==0)) next_state = inicio;
else if ((arriba==0)&(abajo==0)&(derecha==1)&(izquierda==0)) next_state = i2;
else if ((arriba==0)&(abajo==0)&(derecha==0)&(izquierda==1)) next_state = i3;
else next_state=i1;
end

i2:begin
vert=2'b00;
hor=2'b10;
if ((arriba==1)&(abajo==0)&(derecha==0)&(izquierda==0)) next_state = inicio;
else if ((arriba==0)&(abajo==0)&(derecha==0)&(izquierda==1)) next_state = i3;
else if ((arriba==0)&(abajo==1)&(derecha==0)&(izquierda==0)) next_state = i1;
else next_state=i2;
end

i3:begin
vert=2'b00;
hor=2'b01;
if ((arriba==1)&(abajo==0)&(derecha==0)&(izquierda==0)) next_state = inicio;
else if ((arriba==0)&(abajo==0)&(derecha==1)&(izquierda==0)) next_state = i2;
else if ((arriba==0)&(abajo==1)&(derecha==0)&(izquierda==0)) next_state = i1;

De esta forma se puede lograr un movimieno continuo.
Nota: se implementa en el segundo codigo, los límites a los cuales puede llegar la serpiente, es decir, un reset.

Para el segundo punto hay que tener en cuenta, que cuando la serpiente pase por encima de la comida, esta desaparecera y tendra que aparecer en otro lado, una ide a esto seria:

[[code]]
if (poscx==posx && poscy==posy)begin
poscx = ((x + 4271)*4273 - 9973*3)*57;
poscy = ((y + 3343)*3347 - 9857*3)*55;
x=poscx;
y=poscy;
end
[[/code]][[https://cdn.tutsplus.com/active/uploads/legacy/tuts/418_snakeAS3/AS3_Snake_Game.png]]

De esta forma se asegura que la comida aparecera en otro sitio.

Esto es lo fundamental en el desarrollo del juego snake.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License