#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int lim_col, lim_lin, tempo, opcao_seta, sentinela, sentinela_mira;
int x_alvo, y_alvo, x_mira, y_mira, max_menu, velocidade, sentinela_seta;
char tecla;

void aguardar (void);
void configuracao (void);
void limite_abaixo (void);
void limite_acima (void);
void limite_direita (void);
void limite_esquerda (void);
void menu (void);
void mira (void);
void mostra_alvo (void);
void mostra_mira (void);
void padrao (void);
void redireciona (void);
void seta (void);
void tconfiguracao (void);
void tela (void);
void tjogo (void);
void tmenu (void);
void ttela (void);
void tvelocidade (void);

int main()
{
   randomize ();
   sentinela=0;
   padrao ();
   do
   {
      tmenu ();
      menu ();
   }while (sentinela==0);
   return 0;
}

void padrao (void)
{
   velocidade=4;
   lim_col=80;
   lim_lin=24;
   x_mira=38;
   y_mira=11;

}

void tconfiguracao (void)
{
   clrscr ();
   gotoxy (6,5);
   printf ("  OPCOES DE CONFIGURACAO");
   gotoxy (6,7);
   printf ("- TAMANHO DA TELA");
   gotoxy (6,8);
   printf ("- VELOCIDADE");
   gotoxy (6,9);
   printf ("- MENU PRINCIPAL");
   max_menu=9;
   configuracao ();
}

void configuracao (void)
{
    seta ();
    switch (opcao_seta)
    {
    case 7:
	ttela ();
	break;
    case 8:
	tvelocidade ();
	break;
    case 9:
	tmenu ();
	break;
    }
}

void tjogo (void)
{
   int sentinela_jogo;
   char sair_jogo;
   sentinela_jogo=0;
   do
   {
      mostra_alvo ();
/*
      delay (velocidade*1000);
*/
      aguardar ();
      gotoxy (1,y_alvo);
      clreol ();
   }while (sentinela_jogo==0);
}

void mostra_alvo (void)
{
   x_alvo = random (lim_col);
   y_alvo = random (lim_lin);
   gotoxy (x_alvo,y_alvo);
   putchar ('o');
}

void aguardar (void)
{
    int t1, t2;
    for (t1=0; t1<32000 ; t1=t1+1)
    {
	for (t2=0; t2<velocidade*4000; t2=t2+1)
	{
	    /*mostra_mira()*/;
	}
    }
}

void ttela (void)
{
   char tela_opcao;
   int sentinela_opcao, sentinela_tela;
   do
   {
       do
       {
	  clrscr ();
	  printf ("Altura da Tela  (Padrao 24): ");
	  scanf ("%d", &lim_lin);
	  printf ("Largura da Tela (Padrao 80): ");
	  scanf ("%d", &lim_col);
	  gotoxy (lim_col-1, lim_lin-1);
	  putchar ('|');
	  gotoxy (lim_col-4, lim_lin);
	  printf ("___|");
	  do
	  {
	     gotoxy (lim_col-40, lim_lin-2);
	     printf ("Limite da Tela esta correto (S/N): ");
	     tela_opcao= getch ();
	     switch (tela_opcao)
	     {
		case 's':
			sentinela_tela=1;
			sentinela_opcao=1;
			break;
		case 'S':
			sentinela_tela=1;
			sentinela_opcao=1;
			break;
		case 'N':
			sentinela_opcao=1;
			sentinela_tela=0;
			break;
		case 'n':
			sentinela_opcao=1;
			sentinela_tela=0;
			break;
		default: sentinela_opcao=0;break;

	     }
	  }while (sentinela_opcao==0);
       }while (sentinela_tela==0);

   }while (velocidade<1 || velocidade >8);
   opcao_seta=0;
   sentinela_seta=0;
   x_mira=(lim_col-3)/2;
   y_mira=(lim_lin-3)/2;
   tconfiguracao ();
}

void tvelocidade (void)
{
   do
   {
       clrscr ();
       printf ("\n\n\nDigite velocidade\nIniciante (1 |------| 8) Experiente: ");
       scanf ("%d", &velocidade);
   }while (velocidade<1 || velocidade >8);
   /* inversao de valores */
   velocidade=(velocidade-9)*-1;
   opcao_seta=0;
   sentinela_seta=0;
   tconfiguracao ();
}

void tmenu (void)
{
   clrscr ();
   gotoxy (6,5);
   printf ("  OPCOES DE MENU");
   gotoxy (6,7);
   printf ("- CONFIGURACAO");
   gotoxy (6,8);
   printf ("- JOGAR");
   gotoxy (6,9);
   printf ("- SAIR");
   max_menu=9;
}

void menu (void)
{
    seta ();
    switch (opcao_seta)
    {
    case 7:
	tconfiguracao ();
	break;
    case 8:
	tjogo ();
	break;
    case 9:
	sentinela=1;
	break;
    }
}

void seta (void)
{
    char seta;
    int setax, setay;
    setax=3;
    setay=7;
    sentinela_seta=0;
    do
    {
      gotoxy (setax,setay);
      putchar ('-');
      putchar ('>');
      gotoxy (1,setay);
      seta=getch ();
      switch (seta)
      {
	case 80:
		if (setay<=max_menu-1)
		{
		    gotoxy(setax,setay);
		    putchar (' ');
		    putchar (' ');
		    setay=setay+1;
		}
		break;
	case 72:
		if (setay >=8)
		{
		    gotoxy(setax,setay);
		    putchar (' ');
		    putchar (' ');
		    setay=setay-1;
		}
		break;
	case 13:
		opcao_seta=wherey ();
		sentinela_seta=1;
		break;
      }
    }while (sentinela_seta==0);
    clrscr ();
}


void mira (void)
{
   while (sentinela_mira==0)
   {
      mostra_alvo ();

      tecla=getch ();
      redireciona ();

      if (tecla==32) /*32 e codigo ASCII de Barra de Espaco */
      {
	 sentinela=1;
      }
   }
}

void mostra_mira()
{
    gotoxy (x_mira+1, y_mira);
    putchar('*');
    gotoxy (x_mira, y_mira+1);
    putchar ('*');
    putchar ('*');
    putchar ('*');
    gotoxy (x_mira+1, y_mira+2);
    putchar('*');
}

void redireciona (void)
{
   switch (tecla)
   {
      case 'e': limite_acima ();
		break;
      case 's': limite_direita ();
		break;
      case 'd': limite_esquerda ();
		break;
      case 'x': limite_abaixo ();
		break;
      case 'E': limite_acima ();
		break;
      case 'S': limite_direita ();
		break;
      case 'D': limite_esquerda ();
		break;
      case 'X': limite_abaixo ();
		break;
   }
}

void limite_acima (void)
{
	if (y_mira>=0)
	{
	    y_mira=y_mira-1;
	}
	else
	{
	    y_mira=-1;
	}
}

void limite_abaixo (void)
{
	if (y_mira<lim_lin-3)
	{
	    y_mira=y_mira+1;
	}
	else
	{
	    y_mira=lim_lin-3;
	}
}

void limite_direita (void)
{
	if (x_mira>=0)
	{
	    x_mira=x_mira-1;
	}
	else
	{
	    x_mira=-1;
	}
}

void limite_esquerda (void)
{
	if (x_mira<lim_col-3)
	{
	    x_mira=x_mira+1;
	}
	else
	{
	    x_mira=lim_col-3;
	}
}

