Tastaturabfrage funzt net

D

djtraumwelt

Foren As
Code:
#include <stdio.h>

int ort = 1;
int exit = 0;
char *nter = " ";

int main ()
{
 printf ("Sie befinden sich mitten in einem Komplex aus engen Gängen\nund wissen nicht, wie sie da hin gekommen sind.\nSie wollen weg von diesem seltsamen Ort,\nwas sich aber als ziemlich schwierig erweisen wird...\nZum Beenden des Spiels geben Sie q ein.\n");

 while (exit == 0)
 {
  printf ("%s",nter);

  if (ort == 1)
  {
   printf ("Sie können nach (l)inks, (r)echts, (o)ben, (u)nten laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "l") ort = 2;
   if (nter == "r") ort = 3;
   if (nter == "o") ort = 4;
   if (nter == "u") ort = 5;
  }

  if (ort == 2)
  {
   printf ("Sie können nach (r)echts laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "r") ort = 1;
  }

  if (ort == 3)
  {
   printf ("Sie können nach (l)inks, (o)ben laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "l") ort = 1;
   if (nter == "o") ort = 6;
  }

  if (ort == 4)
  {
   printf ("Sie können nach (l)inks, (u)nten laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "l") ort = 7;
   if (nter == "u") ort = 1;
  }

  if (ort == 5)
  {
   printf ("Sie können nach (r)echts, (o)ben laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "o") ort = 1;
   if (nter == "r") ort = 8;
  }

  if (ort == 6)
  {
   printf ("Sie können nach (u)nten laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "u") ort = 3;
  }

  if (ort == 7)
  {
   printf ("Sie können nach (r)echts, (o)ben laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "o") ort = 9;
   if (nter == "r") ort = 4;
  }

  if (ort == 8)
  {
   printf ("Sie können nach (l)inks, (o)ben laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "l") ort = 5;
   if (nter == "o") ort = 10;
  }

  if (ort == 9)
  {
   printf ("Sie können nach (r)echts, (o)ben, (u)nten laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "o") ort = 11;
   if (nter == "r") ort = 12;
   if (nter == "u") ort = 7;
  }

  if (ort == 10)
  {
   printf ("Sie können nach (l)inks, (u)nten laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "l") ort = 13;
   if (nter == "u") ort = 1;
  }

  if (ort == 11)
  {
   printf ("Sie können nach (r)echts, (u)nten laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "r") ort = 14;
   if (nter == "u") ort = 9;
  }

  if (ort == 12)
  {
   printf ("Sie können nach (l)inks, (u)nten laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "l") ort = 9;
   if (nter == "u") ort = 15;
  }

  if (ort == 13)
  {
   printf ("Sie können nach (r)echts laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "r") ort = 10;
  }

  if (ort == 14)
  {
   printf ("Sie können nach (l)inks, (u)nten laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "l") ort = 11;
   if (nter == "u") ort = 16;
  }

  if (ort == 15)
  {
   printf ("Sie haben einen Porter zu Level 2 gefunden\n");
   ort = 20;
  }

  if (ort == 16)
  {
   printf ("Sie können nach (o)ben laufen!\n");
   if (nter == "q") exit = 1;
   if (nter == "o") ort = 14;
  }

  if (ort == 20) exit = 1;

  scanf ("%s", &nter);

 }
 return 0;
}
 
nur mal kurz drüber geschaut aber du list ort ja niergens ein
 
das mit ort funktioniert, nur nter funktioniert nicht. ich bräuchte ne funktion, die auf eingabe einer taste wartet ohne dass man enter drücken muss und den buchstaben dann in nter schreibt
 
das mit ort funktioniert, nur nter funktioniert nicht. ich bräuchte ne funktion, die auf eingabe einer taste wartet ohne dass man enter drücken muss und den buchstaben dann in nter schreibt

getch() - see this

edit:
wieso nimmst du einenen char-pointer für nter.
nimm einfach einen char nter und frag den direkt ab - ohne die ganzen ifs und ort-zuweisungen
du solltest auch absichern dass man nicht mehr als 1 zeichen eingeben kann für nter
wieso sind deine variablen alle global definiert?

ich würds so machen:
Code:
#include <stdio.h>
#include <termios.h>

int getch() {
    static int ch = -1, fd = 0;
    struct termios neu, alt;
    fd = fileno(stdin);
    tcgetattr(fd, &alt);
    neu = alt;
    neu.c_lflag &= ~(ICANON|ECHO);
    tcsetattr(fd, TCSANOW, &neu);
    ch = getchar();
    tcsetattr(fd, TCSANOW, &alt);
    return ch;
}

int main ()
{

 int ort = 1;
 int exit = 0;
 char c;

 printf ("Sie befinden sich mitten in einem Komplex aus engen Gängen\nund wissen nicht, wie sie da hin gekommen sind.\nSie wollen weg von diesem seltsamen Ort,\nwas sich aber als ziemlich schwierig erweisen wird...\nZum Beenden des Spiels geben Sie q ein.\n");

 while (exit == 0)
 {


  if (ort == 1)
  {
   printf ("Sie können nach (l)inks, (r)echts, (o)ben, (u)nten laufen!\n");
   c=getch();
   if (c == 'q') exit = 1;
   if (c == 'l') ort = 2;
   if (c == 'r') ort = 3;
   if (c == 'o') ort = 4;
   if (c == 'u') ort = 5;
   printf("ORT %i\n",ort);
  }

  [...]

 }
 return 0;
}
 
Zuletzt bearbeitet:
hab jetzt #include <curses.h> reingeschrieben, damit er die funktion getch() findet und versucht mit -lcurses zu kompilieren. dann sagt er mir cannot find -lcurses
 
dann krieg ich einen speicherzugriffsfehler, wenn ich das so mache.

char c; gibt mir ganz viele warnungen und char *c = " "; keine
 
da kriegst du aber die warnings wahrscheinlich weil du dann mit die werte mit denen du vergleichst unter doppelten hochkommas hast - die müssen unter einfachen stehen.

Code:
char c=' ';
...
if (c=='l')
...
 
Zuletzt bearbeitet:
hab jetzt #include <curses.h> reingeschrieben, damit er die funktion getch() findet und versucht mit -lcurses zu kompilieren. dann sagt er mir cannot find -lcurses

Ich (mit g++/gcc) gebe -lncurses an. Ein NC-Oberfläche sieht gut aus, würde ich dir raten mal anzusehen. Als Wikibook ist es einfach erklärt.
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

E/A-Fehler (.snapshots is not a btrfs subvolume).

ip6tables Problem

Prozesskommunikation mit PIPES - wie funktioniert das?

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Zurück
Oben