Hola bueno soy nuevo en el foro, necesito una pequeña ayuda con mi código del juego Snake ya que tiene algunas fallas, como por ejemplo cuando el cuerpo pasa por encima de la comida la comida desaparece ya que la función borrar_cuerpo la elimina pero si vuelvo a pasar por la posición que tenia dicha comida me la toma y aparece en otro lugar, si alguien puede ayudarme arreglando esa parte del código y también que en el case 4 el juego se reinicie :| bueno si alguien puede ayudarme se lo agradsco.
Dejo el código para que lo vean y me ayuden.
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <process.h>
#include <gotoxy.h>
#define ARRIBA 72
#define IZQUIERDA 75
#define DERECHA 77
#define ABAJO 80
#define ESC 27
#define ENTER 13
FILE *doc, *archi;
int Menu, b;
int cuerpo[200][2];
int n = 1, tam = 10, dir = 3, mat=20;
int x = 10, y = 12;
int xc = 30, yc = 15, pc = 5, oc = 35;
int velocidad = 130;
int score=0, r=0, h=1;
char tecla, nombres[20], cadena[20];
void pintar(){
for(int i=2; i < 78; i++){
gotoxy (i, 3); printf ("%c", 205);
gotoxy(i, 23); printf ("%c", 205);
}
for(int v=4; v < 23; v++){
gotoxy (2,v); printf ("%c", 186);
gotoxy(77,v); printf ("%c", 186);
}
gotoxy (15,1); printf ("***************** Snake By Firu *****************");
gotoxy (2,3); printf ("%c", 201);
gotoxy (2,23); printf ("%c", 200);
gotoxy (77,3); printf ("%c", 187);
gotoxy(77,23); printf ("%c", 188);
}
void scores(){
char cadena[80];
archi=fopen("Score.txt","r"); //en modo lectura r
if(archi == NULL) printf("Archivo no encontrado");
fgets(cadena,80,archi);
do{
printf("%s\n",cadena);
}while(fgets(cadena,80,archi)!=NULL);
fclose(archi);
getch();
system("cls");
}
void bienvenida(){
gotoxy(3,5);
printf(" * * *********** ** * ********* * * *********");
gotoxy(3,6);
printf(" * * * * * * * * * *");
gotoxy(3,7);
printf(" * * * * * * * ** *");
gotoxy(3,8);
printf(" ***** *********** * * * ********* ** *******");
gotoxy(3,9);
printf(" * *** * * * * * * * * * *");
gotoxy(3,10);
printf(" ********* * * ** * * * * *");
gotoxy(3,11);
printf(" ********* *********** * ** * * * * *********");
gotoxy(3,12);
printf(" ******* ************ ***********");
gotoxy(3,13);
printf(" ******* ************** *************");
gotoxy(3,14);
printf(" ******* **************** ***************");
gotoxy(3,15);
printf(" ******* ******* ******* ******* *******");
gotoxy(3,16);
printf(" ******* ******* ******* ******* *******");
gotoxy(3,17);
printf(" *************** *************** ***************");
gotoxy(3,18);
printf(" ************* ************* *************");
gotoxy(3,19);
printf(" *********** *********** ***********");
gotoxy(20,22);
printf("Ingrese su nombre de Usuario: ");
gets(nombres);
system("cls");
}
void OcultaCursor() {
CONSOLE_CURSOR_INFO cci = {100, FALSE};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
void guardar_posicion(){
cuerpo[n][0] = x;
cuerpo[n][1] = y;
n++;
if(n == tam) n = 1;
}
void dibujar_cuerpo(){
for(int i = 1; i < tam; i++){
gotoxy(cuerpo
Dejo el código para que lo vean y me ayuden.
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <process.h>
#include <gotoxy.h>
#define ARRIBA 72
#define IZQUIERDA 75
#define DERECHA 77
#define ABAJO 80
#define ESC 27
#define ENTER 13
FILE *doc, *archi;
int Menu, b;
int cuerpo[200][2];
int n = 1, tam = 10, dir = 3, mat=20;
int x = 10, y = 12;
int xc = 30, yc = 15, pc = 5, oc = 35;
int velocidad = 130;
int score=0, r=0, h=1;
char tecla, nombres[20], cadena[20];
void pintar(){
for(int i=2; i < 78; i++){
gotoxy (i, 3); printf ("%c", 205);
gotoxy(i, 23); printf ("%c", 205);
}
for(int v=4; v < 23; v++){
gotoxy (2,v); printf ("%c", 186);
gotoxy(77,v); printf ("%c", 186);
}
gotoxy (15,1); printf ("***************** Snake By Firu *****************");
gotoxy (2,3); printf ("%c", 201);
gotoxy (2,23); printf ("%c", 200);
gotoxy (77,3); printf ("%c", 187);
gotoxy(77,23); printf ("%c", 188);
}
void scores(){
char cadena[80];
archi=fopen("Score.txt","r"); //en modo lectura r
if(archi == NULL) printf("Archivo no encontrado");
fgets(cadena,80,archi);
do{
printf("%s\n",cadena);
}while(fgets(cadena,80,archi)!=NULL);
fclose(archi);
getch();
system("cls");
}
void bienvenida(){
gotoxy(3,5);
printf(" * * *********** ** * ********* * * *********");
gotoxy(3,6);
printf(" * * * * * * * * * *");
gotoxy(3,7);
printf(" * * * * * * * ** *");
gotoxy(3,8);
printf(" ***** *********** * * * ********* ** *******");
gotoxy(3,9);
printf(" * *** * * * * * * * * * *");
gotoxy(3,10);
printf(" ********* * * ** * * * * *");
gotoxy(3,11);
printf(" ********* *********** * ** * * * * *********");
gotoxy(3,12);
printf(" ******* ************ ***********");
gotoxy(3,13);
printf(" ******* ************** *************");
gotoxy(3,14);
printf(" ******* **************** ***************");
gotoxy(3,15);
printf(" ******* ******* ******* ******* *******");
gotoxy(3,16);
printf(" ******* ******* ******* ******* *******");
gotoxy(3,17);
printf(" *************** *************** ***************");
gotoxy(3,18);
printf(" ************* ************* *************");
gotoxy(3,19);
printf(" *********** *********** ***********");
gotoxy(20,22);
printf("Ingrese su nombre de Usuario: ");
gets(nombres);
system("cls");
}
void OcultaCursor() {
CONSOLE_CURSOR_INFO cci = {100, FALSE};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
void guardar_posicion(){
cuerpo[n][0] = x;
cuerpo[n][1] = y;
n++;
if(n == tam) n = 1;
}
void dibujar_cuerpo(){
for(int i = 1; i < tam; i++){
gotoxy(cuerpo
- , cuerpo[1]);
printf("*");
}
}
void borrar_cuerpo(){
gotoxy(cuerpo[n][0] , cuerpo[n][1]); printf(" ");
}
void teclear(){
if(kbhit()){
tecla = getch();
switch(tecla){
case ARRIBA : if(dir != 2) dir = 1; break;
case ABAJO : if(dir != 1) dir = 2; break;
case DERECHA : if(dir != 4) dir = 3; break;
case IZQUIERDA : if(dir != 3) dir = 4; break;
case ENTER:
gotoxy(35,10);
printf("Pause");
getch();
gotoxy(35,10);
printf(" ");
break;
}
}
}
void cambiar_velocidad(){
if(score == h*10){
velocidad = velocidad - 10;
h++;
}
}
void comida()
{
if(x == xc && xc && y == yc)
{
xc = (rand() % 72) + 4;
yc = (rand() % 18) + 4;
tam++;
score++;
cambiar_velocidad();
gotoxy(xc, yc); printf("%c", 4);
}
}
bool game_over()
{
if(y == 3 || y == 23 || x == 2 || x == 77) return false;
for(int j = tam - 1; j > 0; j--){
if(cuerpo[j][0] == x && cuerpo[j][1] == y)
return false;
}
return true;
}
void puntos(){
gotoxy(34,3);
printf(" Score:%d ", score);
gotoxy(10, 3);
printf(" Nivel: %d ",h);
}
int main()
{
pintar();
bienvenida();
system("cls");
inicio:
pintar();
gotoxy(20,10);
printf("1 - Jugar.");
gotoxy(20,11);
printf("2 - Puntajes.");
gotoxy(20,12);
printf("3 - Cambiar Usuario.");
gotoxy(20,13);
printf("4 - Juego Nuevo.");
gotoxy(20,14);
printf("5 - Salir.\n");
gotoxy(20,16);
printf("Digigite su Seleccion: ");
scanf("%i",&Menu);
system("cls");
switch(Menu){
case 2:
scores();
goto inicio;
break;
case 1:
if(tecla == ENTER){
getch();
gotoxy(20,10);
printf("Pause");
}
OcultaCursor();
pintar();
gotoxy(xc, yc); printf("%c", 4);
while(tecla != ESC && game_over())
{
borrar_cuerpo();
guardar_posicion();
dibujar_cuerpo();
comida();
puntos();
teclear();
teclear();
if(dir == 1) y--;
if(dir == 2) y++;
if(dir == 3) x++;
if(dir == 4) x--;
Sleep(velocidad);
}
pintar();
system("cls");
doc = fopen("Score.txt","a");
gotoxy(30, 11);
printf("Nombre: %s\n",nombres);
gotoxy(30, 12);
printf("Perdio en el nivel: %d",h);
pintar();
gotoxy(30, 13);
printf("Su Score es: %d ",score);
fprintf(doc,"\n");
fprintf(doc," Nombre: %s Nivel: %d Score: %d \n",nombres,h,score);
fclose(doc);
getch();
system("cls");
goto inicio;
break;
case 3:
pintar();
fflush(stdin);
bienvenida();
system("cls");
goto inicio;
break;
case 5:
return 5;
break;
case 4:
fflush(stdin);
OcultaCursor();
pintar();
gotoxy(xc, yc); printf("%c", 4);
while(tecla != ESC && game_over())
{
borrar_cuerpo();
guardar_posicion();
dibujar_cuerpo();
comida();
puntos();
teclear();
teclear();
if(dir == 1) y--;
if(dir == 2) y++;
if(dir == 3) x++;
if(dir == 4) x--;
Sleep(velocidad);
}
pintar();
system("cls");
doc = fopen("Score.txt","a");
gotoxy(30, 11);
printf("Nombre: %s\n",nombres);
gotoxy(30, 12);
printf("Perdio en el nivel: %d",h);
pintar();
gotoxy(30, 13);
printf("Su Score es: %d ",score);
fprintf(doc,"\n");
fprintf(doc," Nombre: %s Nivel: %d Score: %d \n",nombres,h,score);
fclose(doc);
getch();
system("cls");
goto inicio;
break;
}
}