[ Foro de retos de programación ]
Se que no va aqui, pero no encuentro el foro para el apartado de videojuegos, ni siquiera se si tiene. Bueno, perdonadme si no va en este foro
Hice el juego de la serpiente version 1. Al parecer la solucion no está colgada sino que en su lugar esta el de la version 2.
Total, haciendo el codigo, en mi opinion, creo que me ha salido muy engorroso. Soy principiante y bueno por lo menos lo he conseguido solucionar a mi modo.
Me gustaría compararlo con como lo haría Nacho o si hay alguna solucion mas simple:
#include <allegro.h>
#define ANCHO 33 //ancho limite de los ladrillos
#define ALTURA 20 //altura limte de los ladrillos
//POSICIONES INICIALES
#define POSX_INI 100 //posicion inicial en X
#define POSY_INI 100 //posicion inicial en Y
//BOTONES DE DIRECCIONES
#define UP KEY_UP
#define DOWN KEY_DOWN
#define RIGHT KEY_RIGHT
#define LEFT KEY_LEFT
#define PAUSA 25
//DECLARACION DE FUNCIONES============================================================================================================================
int CrearVentana320x200();
void Ladrillo();
void Fruta(int apple);
//____________________________________________________________________________________________________________________________________________________
int main() {
allegro_init();
install_keyboard();
install_timer();
//PREPARANDO LA INTERFAZ==============================================================================================================================
CrearVentana320x200();
Ladrillo();
int POSX_actual = POSX_INI;
int POSY_actual = POSY_INI;
line(screen, 40,100, 100, 100, palette_color[2]); //el trocito de seripiente desde la cabeza hasta la cola
int POSX_actualBlack = 40;
int POSY_actualBlack = 100;
int futXBlack = 40;
int futYBlack = 100;
int INCX = 1;
int INCY = 0;
int chocado = 0; //la variable que hara que se finalice el juego o no
int apple = 5;
Fruta(); //Imprime en el mapa todas las manzanas
//____________________________________________________________________________________________________________________________________________________
// CODIGO JUEGO=======================================================================================================================================
do
{
int futX = POSX_actual+INCX; //incrementamos el pixel que va hacia adelante con el incremento
int futY = POSY_actual+INCY;
// si al incrementar un pixel en la linea, ¿se choca?
if((getpixel(screen,futX,futY)==2)||(getpixel(screen,futX,futY)==43)) //si el pixel que tiene delante es o verde o naranja, se activa el chocado
chocado = 1; //es muy importante la colocacion de esta condicion. Debe ir despues de que añadir el incremento al futX o futY y antes de imprimir la linea
//si toca una manzana, desaparecerlo
if(getpixel(screen,futX,futY) == 40)
{
if((futX>116 && futX<124)||(futY>116 && futY<124)) //si la manzana esta entre esos valores en X ó en Y, lo hacemos desaparecer poniendo un circulo negro encima
circlefill(screen, 120,120,3, palette_color[0]);
else if((futX>296 && futX<304)||(futY>25 && futY<33))
circlefill(screen,300,29,3, palette_color[0]);
else if ((futX>232 && futX<240)||(futY>184 && futY<192))
circlefill(screen,236,188,3, palette_color[0]);
else if((futX>191 && futX<199)||(futY>72 && futY<80))
circlefill(screen,195,76,3, palette_color[0]);
else if((futX>46 && futX<54)||(futY>46 && futY<54))
circlefill(screen,50,50,3, palette_color[0]);
apple--; //si se come alguna de las manzanas, resta las que que le quedan
}
line(screen, POSX_actual, POSY_actual, futX, futY, palette_color[2]);
POSX_actual = futX;
POSY_actual = futY;
//LINEA NEGRA QUE SIGUE LA VERDE PARA TAPARLO
line(screen,POSX_actualBlack,POSY_actualBlack,futXBlack,futYBlack, palette_color[0]); //esta es la linea negra que seguira la verde para taparlo
if(getpixel(screen,futXBlack+1,futYBlack)==2) //derecha.
{ //Si el pixel siguiente es de color verde, hace esta condición
futXBlack++; //suma 1 al pixel en X que va por delante para ir a la dcha
line(screen, POSX_actualBlack,POSY_actualBlack, futXBlack,futYBlack, palette_color[0]);
}
else //si por la derecha no es verde, entonces...
if(getpixel(screen,futXBlack,futYBlack-1)==2) //arriba
{ //si el pixel siguiente es de color verde, hace esta condicion
futYBlack--; //resta 1 al pixel en Y que va por delante para subir
line(screen,POSX_actualBlack,POSY_actualBlack, futXBlack,futYBlack, palette_color[0]);
}
else //si ni a la derecha ni arriba es verde, entonces...
if(getpixel(screen,futXBlack-1,futYBlack)==2) //izquierda
{
futXBlack--; //resta 1 al pixel en X que va por delante para ir a la izda
line(screen, POSX_actualBlack,POSY_actualBlack, futXBlack,futYBlack, palette_color[0]);
}
else if(getpixel(screen,futXBlack,futYBlack+1)==2) //abajo. Si ni a la derecha, ni por arriba ni por la izda es de color verde entonces....
{
futYBlack++; //suma 1 al pixel que va por delante en Y para ir hacia abajo
line(screen, POSX_actualBlack,POSY_actualBlack, futXBlack,futYBlack,palette_color[0]);
}
POSX_actualBlack = futXBlack;
POSY_actualBlack = futYBlack;
//______________________________________________________________________________________________________________________________________________
//DIRECCIONES DEL JUEGO========================================================================================================================
if(keypressed()) //Si se ha pulsado alguna tecla, se cumple la condicion
{
char tecla = readkey() >>8;
switch(tecla)
{
case UP:
INCX = 0; INCY = -1;
break;
case DOWN:
INCX = 0; INCY = 1;
break;
case LEFT:
INCX = -1; INCY = 0;
break;
case RIGHT:
INCX = 1; INCY = 0;
break;
}
}
//____________________________________________________________________________________________________________________________________________
rest(PAUSA);
}while((chocado==0)&&(apple!=0));
textout(screen, font, "Te has comido todas las manzanas", 45,100, palette_color[2]);
readkey();
return 0;
}
END_OF_MAIN()
//============================ FUNCIONES =============================================================================================================
int CrearVentana320x200()
{
if(set_gfx_mode(GFX_SAFE, 320, 200, 0, 0) != 0) //Tamaño de la ventana anch=320, alt=200
{
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Incapaz de entrar en modo gráfico\n%s\n",allegro_error);
return 1;
}
else
return 0;
}
void Ladrillo()
{
rect(screen,0,0,319,199,palette_color[43]); //Dibujar dos rectangulos como marco de la pantalla
rect(screen,2,2,317,197,palette_color[43]);
line(screen,60,60,120,60,palette_color[43]);
line(screen,60,60,60,100,palette_color[43]);
line(screen,90,197,90,130,palette_color[43]);
line(screen,175,40,175,130,palette_color[43]);
line(screen,215,145,215,165,palette_color[43]);
line(screen,215,165,235,165,palette_color[43]);
line(screen,235,165,235,180,palette_color[43]);
line(screen,260,3,260,110,palette_color[43]);
line(screen,295,60,317,60,palette_color[43]);
}
void Fruta()
{
circlefill(screen,120,120,3,palette_color[40]);
circlefill(screen,300,29,3, palette_color[40]);
circlefill(screen,236,188,3, palette_color[40]);
circlefill(screen,50,50,3, palette_color[40]);
circlefill(screen,195,76,3, palette_color[40]);
}
¿Te refieres a este juego? Sí tiene el código de la primera parte de la serpiente, en el apartado 7:
http://www.aprendeaprogramar.com/mod/resource/view.php?id=433
Sí, bueno, si te metes en el apartado 7 verás que el código no es de su versión. El tema de los sprites lo explicas en serpiente 2, y precisamente los sprites lo aplicas en el 1. Además que el codigo es el mismo.
Es a eso a lo que me estoy refiriendo.
Saludos
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)