Ir ao conteúdo
  • Cadastre-se

Programa não pega as setas


Visitante

Posts recomendados

Eu estou estudando C por conta própria e em um exercício que pede para fazer um programa que deixe um rastro na tela, só que eu não consigo pegar as setas.


/* rastro.c - exibe um rastro na tela */
#include <stdio.h>
#include <codigo.h>
#include <ctype.h>
#include <stdlib.h>
void cor(void);
main(void)
{
int col=40,lin=12;
char a,b;
clrscr();
gotoxy(1,30);
printf("[F2] - (des)ativa rastro\n[F3] - (des)ativa borracha\n[F4] - seleciona cor\n[F5] - sair");
gotoxy(col,lin);
putch(219);
while(1)
{
a=getch();
if (a==0)
{
b=getch();
switch(
{
case 72: if(lin>1) lin--; break; /* seta para cima */
case 80: if(lin<24)lin++; break; /* seta para baixo */
case 77: if(col<80)col++; break; /* seta para direita */
case 75: if(col>1) col--; break; /* seta para esquerda */
case 62: cor(); break; /* F4 */
case 63: exit(0); /* F5 */
}
gotoxy(col,lin);
putch(219);
}
}
}

void cor(void)
{

}

O <codigo.h> é um head que eu peguei os códigos aqui no fórum e salvei com esse nome:


/* codigo.h - origem Fórum do Clube do Hardware */
#include <windows.h>
int gotoxy(DWORD x,DWORD y) {
COORD Coordenadas;
Coordenadas.X = (x - 1);
Coordenadas.Y = (y - 1);
return (SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Coordenadas));
//se por algum erro não mudar o cursor retorna false.
}
void clrscr(void)
{
DWORD Tamanho = 2000;
DWORD Escritos;
COORD Pos = {0,0};
FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE),' ',Tamanho,Pos,&Escritos);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Pos);
}

Como eu pego as setas? Os códigos ASCII tão certos, mas não funciona. :mellow:

Link para o comentário
Compartilhar em outros sites

E aí mano, fico feliz por ter te ajudado com estas funções aí...

Sobre esse seu código, você declarou a variavel que receberá os valores retornados pela getch()(que faz parte do header conio.h) como char, e a primeira comparação que você fez com ela foi com 0 (a==0), até aí tudo bem pois se o usuário precionar uma das teclas "Function" (F1 a F12) o primeiro valor será zero e o segundo o código da tecla... Porém se o usuário precionar uma das setas do teclado o primeiro valor retornado será 224 e não zero, e o segundo o codigo da tecla.

Porém mesmo que você modifique este detalhe em seu código não irá funcionar quando você ler as setas do teclado,porque assim como já disse o primeiro valor retornado pela getch() será 224, e o intervalo do tipo char é -128 a 127, o que não acusará erro de compilação nem erro de execução no programa, porém ao testar "if(a == 224) nunca retornará verdadeiro (true), para solucionar este problema não declare a variável que receberá o valor como char e sim como int ou unsigned char(intervalo de 0 a 255).

Para facilitar a compreensão desta resposta fiz uma função que pode ser útil a você:


int le_tecla(void)//ler as setas, e de F2 a F5
{//declaração das constantes para a analise dos valores retornados
const int tCima = 0x48,tBaixo = 0x50,tDir = 0x4D,tEsq = 0x4B,tSetas = 0xE0,
tF2 = 0x3C,tF3 = 0x3D,tF4 = 0x3E,tF5 = 0x3F,tFuncoes = 0;
int tec;//variável que receberá os valores retornados
tec = getch();//chamada da função getch() do header <conio.h>
if (tec == tSetas||tec == tFuncoes)
{//Se a tecla lida for uma das setas ou uma das teclas "function" analiza...
tec = getch();//lê o segundo valor retornado
if(tec==tCima||tec==tBaixo||tec==tDir||tec==tEsq||
tec==tF2||tec==tF3||tec==tF4||tec==tF5)//se for uma dessas teclas
return tec;//retorna o código da tecla
}
return 0;//se não for uma das teclas citadas retorna 0
}

Esta função retornará o código das teclas se o usuário digitar uma das setas do teclado, F2,F3,F4 ou F5, caso contrario retornará 0.

Para que está função acima funcione é necessário declarar o header conio.h

aqui um exemplo de uso desta função:


#include<stdio.h>
#include<conio.h>//para usar getch()
const int //decarei as constantes como globais para facilitar as comparações
tCima = 0x48,tBaixo = 0x50,tDir = 0x4D,tEsq = 0x4B,tSetas = 0xE0,
tF2 = 0x3C,tF3 = 0x3D,tF4 = 0x3E,tF5 = 0x3F,tFuncoes = 0;
int le_tecla()//a função le_tecla()
{
int tec;
tec = getch();
if (tec == tSetas||tec == tFuncoes)
{
tec = getch();
if(tec==tCima||tec==tBaixo||tec==tDir||tec==tEsq||
tec==tF2||tec==tF3||tec==tF4||tec==tF5)
return tec;
}
return 0;
}
int main(void)
{
int tecla;//declarei como int mas pode ser unsigned char
printf("Pressione as setas...\nprecione qualquer outra tecla para finalizar o programa...\n\n");
do{//loop do programa
tecla = le_tecla();
if(tecla == tCima) printf("cima\n");
if(tecla == tBaixo) printf("baixo\n");
if(tecla == tEsq) printf("esquerda\n");
if(tecla == tDir) printf("direita\n");
if(tecla == tF2) printf("F2\n");
if(tecla == tF3) printf("F3\n");
if(tecla == tF4) printf("F4\n");
if(tecla == tF5) printf("F5\n");
if(!tecla)printf("\nFim...");
}while(tecla);//fim do loop do programa
getch();
return 0;
}

Este programa irá listar as teclas precionadas se forem uma das setas ou um das teclas Function citadas acima(F2,F3,F4 ou F5), e irá finalizar se for precionada qualquer outra tecla...

Qualquer dúvida só postar.

espero ter te ajudado aí...

Link para o comentário
Compartilhar em outros sites

Muito obrigado, W_Neto. Agora funciona perfeitamente. Aproveitando, será que você consegue fazer a função void cor(void)? Já tentei fazendo um contador para saber quantas vezes a tecla F2 é pressionada e para cada valor de 1 a 16 corresponde uma cor, mas acho que eu fiz alguma coisa errada e apaguei para começar de novo. Aí tá o código como ele está no momento:


/* rastro.c - exibe um rastro na tela */
#include <stdio.h>
#include <conio.c>
#include <ctype.h>
#include <stdlib.h>
void limpa(void);
void cor(void);
main(void)
{
int col=40,lin=12;
int a,b;
int f2=0,f3=0;
clrscr();
gotoxy(1,30);
printf("[F1] - limpa\n[F2] - (des)ativa rastro\n[F3] - (des)ativa borracha\n[F4] - seleciona cor\n[F5] - sair");
gotoxy(col,lin);
putch(219);
while(1)
{
a=getch();
if (a==0 || a==224)
{
b=getch();
switch(
{
case 72: if(lin>1) lin--; break; /* seta para cima */
case 80: if(lin<24)lin++; break; /* seta para baixo */
case 77: if(col<80)col++; break; /* seta para direita */
case 75: if(col>1) col--; break; /* seta para esquerda */
case 59: limpa(); break; /* F1 */
case 60: f2++; break; /* F2 */
case 61: f3++; break; /* F3 */
case 62: cor(); break; /* F4 */
case 63: exit(0); /* F5 */
}
gotoxy(col,lin);
if (f3%2!=0) textcolor(BLACK);
else textcolor(LIGHTGRAY);
if (f2%2==0) putch(219);
}
}
}

void limpa(void)
{
system("CLS");
gotoxy(1,30);
printf("[F1] - limpa\n[F2] - (des)ativa rastro\n[F3] - (des)ativa borracha\n[F4] - seleciona cor\n[F5] - sair");
}

void cor(void)
{

}

Já aproveitei e inseri outras funções, mas apenas a cor eu não consegui. Eu queria que a cada vez que a tecla F2 fosse preessionada a cor se alterasse em sequência, mas não estou conseguindo.

Link para o comentário
Compartilhar em outros sites

Ah, pode encerrar o tópico. Já consegui até mesmo alterar a cor do rastro. Abaixo o código final:


/* rastro.c - exibe um rastro na tela */
#include <stdio.h>
#include <conio.c>
#include <ctype.h>
#include <stdlib.h>
void limpa(void);
main(void)
{
int count=7;
int n;
int col=45,lin=12;
int a,b;
int f2=0,f3=0;
limpa();
gotoxy(col,lin);
putch(219);
while(1)
{
a=getch();
if (a==0 || a==224)
{
b=getch();
switch(
{
case 72: if(lin>1) lin--; break; /* seta para cima */
case 80: if(lin<24)lin++; break; /* seta para baixo */
case 77: if(col<90)col++; break; /* seta para direita */
case 75: if(col>1) col--; break; /* seta para esquerda */
case 59: limpa(); break; /* F1 */
case 60: f2++; break; /* F2 */
case 61: f3++; break; /* F3 */
case 62: count++; break; /* F4 */
case 63: exit(0); /* F5 */
}
gotoxy(col,lin);
n=count;
if (f3%2!=0) textcolor(BLACK);
else textcolor(n);
if (f2%2==0) putch(219);
}
}
}

void limpa(void)
{
textcolor(LIGHTGRAY);
system("CLS");
gotoxy(1,28);
printf("[F1] - limpa\n[F2] - (des)ativa rastro\n[F3] - (des)ativa borracha\n[F4] - seleciona cor\n[F5] - sair");
}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!