Problem z pobieraniem znaków specialnych i case.

0

Pisałem już tutaj w tej sprawię tydzień temu ale nie otrzymałem odpowiedzi, chyba problem nie został do końca zrozumiany. Gdy pobieram klawisz strzałki współrzędne znaku w konsoli się zmieniają. Istnieje też możliwość wykonania instrukcji default jeśli wszystkie warunki się nie spełnią. Problem polega na tym że za jednym zamachem wykonuje się instrukcja case + default. Ma to jakiś związek z postacią pobranego kursora, próbowałem dokonywać konwersji, i zamiast liter przedstawiających strzałki wpisywałem ich kody ASCII. Bezskutecznie. Dodaje kod i liczę na pomoc.

 
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;

void gotoxy(int x, int y);

int main()
{
    char chr;
    int y = 32,x = 11;

do
{
    system("cls");
gotoxy(x,y);
cout << "o";
chr = getch();

switch(chr)
{
    case 'H': y--; break;
    case 'P': y++; break;
    case 'M': x++; break;
    case 'K': x--; break;
    default: cout << chr; break;
}
}while( chr != 27);
}

void gotoxy(int x, int y)
{
  COORD c;
  c.X = x - 1;
  c.Y = y - 1;
  SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}

0

Ale na czym problem polega, co program robi, a co ma robić?
Nie każdy czytał jakiś stary wątek (po co nowy zakładasz w ogóle?)

0

Program ma zwiększyć zmienną w zależności od wciśniętego klawisza. Wszystko działa pięknie, ale default ma się wykonywać jak zostanie wciśnięty klawisz inny od strzałek,a on się wykonuje nawet jak wciśnięty zostanie prawidłowy case, czyli strzałka. Przytrzymując np. strzałkę w górę, literka w konsoli przemieszcza się do góry, ale też wyświetla się np. tekst który był by wstawiony w default.

0

PS. proponuję pobawienie się takim programikiem:

#include <conio.h>
#include <iostream>

int main()
{
   int znak;
   do
   {
       znak = getch();
       std::cout << znak << ' ';
   }
   while (znak!=27);
}

Wyjście ESC.
To może zauważysz co się tak naprawdę dzieje…

0

Najpierw pobiera się znak 224 a potem prawidłowy ?
Jak więc zrobić żeby przesłać od razu znak rozszerzony ?

Z tego co pamiętam to 224 to pusty znak, więc mogę zrobić warunek że jeśli ch1 == 224 to do ch2 przypisać ch1;

Co o tym myślisz ?

0

Najpierw pobiera się znak 224 a potem prawidłowy ?
Prawidłowe jest to, że strzałki generują dwa znaki. Żaden z nich z osobna nie jest „prawidłowy”.
Jak otrzymujesz 224, to jest to informacja, że następny kod nie jest literą, tylko klawiszem specjalnym.

0

To po prostu zrobię case 224 78: lalalla
To chyba rozwiąże sprawę.

0
banialuka napisał(a):

To po prostu zrobię case 224 78: lalalla
To chyba rozwiąże sprawę.

Nie rozwiąże to sprawy. Sprawdzaj czy dostałeś znak 224 i jeżeli tak to pobierz drugi znak i ten sprawdzaj w tym samym przebiegu pętli while.

1 użytkowników online, w tym zalogowanych: 0, gości: 1