Avatar billede zyxtem Nybegynder
01. november 2003 - 12:38 Der er 12 kommentarer og
1 løsning

Tidsfrist for input

hey.

  Jeg havde meget svært med at finde et passende navn der beskriver hvad jeg skal bruge. Som en lille opgave til mig selv vil jeg lave et snakespil i konsollen men mangler en lille detalje. Slangen bevæger sig kun når brugeren trykker på en tast så der er slet ingen udfordring i spillet :(

  Så mit spørgsmål er:

  Hvordan får jeg programmet til at vente x antal sekunder på at brugeren giver et input og hvis der ikke kommer noget bestemmer den selv inputtet.

  Et eksempel kunne være et program der gør følgende:

  Skriv et tal indenfor 5 sek.

  Du skrev ikke et tal indenfor tidsfristen så derfor bestemte jeg tallet
Avatar billede zyxtem Nybegynder
01. november 2003 - 12:57 #1
Er forklaringen til at forstå. Synes ikke selv det lyder så godt men synes også det er meget svært at forklare hvad det er jeg vil have
Avatar billede arne_v Ekspert
01. november 2003 - 12:58 #2
Du leder efter kbhit !

Det var en funktion i gamle 16 bit DOS compilere som returnerede hvorvidt
brugeren havde tastet noget. Hvis ja kunne man læse det. Hvis nej kunne
man gøre noget andet.

Nogle 32 bit windows compilere har den stadig.

Hvad platform bruger du ?
Avatar billede zyxtem Nybegynder
01. november 2003 - 13:01 #3
windows2000 men det må også gerne virke under xp. Bruger dev-cpp.
Avatar billede arne_v Ekspert
01. november 2003 - 13:02 #4
Dev-cpp (det er OK - og 2000 versus XP burde ikke gøre nogen forskel - hvis
du brugte Linux så var det anderledes !).

Hvis så prøv og inkluder conio.h og brug kbhit til at teste om der
er input med og getch til at læse det med.

De 5 sekunder laves så med en simpel løkke.
Avatar billede arne_v Ekspert
01. november 2003 - 13:03 #5
Jeg havde følgende lille eksempel liggende:

#include <conio.h>

int main()
{
  while(!kbhit() || getch() != 0x1B) putch('*');
  return 0;
}
Avatar billede arne_v Ekspert
01. november 2003 - 13:08 #6
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>

int main()
{
  int c;
  time_t t;
  t = time(NULL);
  c = -1;
  while(c < 0)
  {
      if(kbhit())
      {
        c = getch();
      }
      else
      {
          if((time(NULL)-t) > 5)
          {
            c = 'A';
          }
          else
          {
            Yield();
          }
      }
  }
  printf("You entered %c\n",(char)c);
  return 0;
}
Avatar billede arne_v Ekspert
01. november 2003 - 13:09 #7
Følgende er nok "pænere" (sleep 100 ms i.s.f. bare yield):

#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>

int main()
{
  int c;
  time_t t;
  t = time(NULL);
  c = -1;
  while(c < 0)
  {
      if(kbhit())
      {
        c = getch();
      }
      else
      {
          if((time(NULL)-t) > 5)
          {
            c = 'A';
          }
          else
          {
            Sleep(100);
          }
      }
  }
  printf("You entered %c\n",(char)c);
  return 0;
}
Avatar billede zyxtem Nybegynder
01. november 2003 - 13:11 #8
Der er lige hvad jeg skulle bruge.
  Gider du ikke lige kort forklare kbhit() lidt nærmere. Er ikke vild med at bruge noget jeg ikke 100% ved hvad er
Avatar billede arne_v Ekspert
01. november 2003 - 13:15 #9
kbhit er en forkortelse for keyboard hit d.v.s. den tester for om
brugeren har ramt tastaturet.

Det er ikke en standard funktion.

Men du har den altså.
Avatar billede zyxtem Nybegynder
01. november 2003 - 13:18 #10
Ja mange tak for hjælpen. Gider du lægge et svar?
Avatar billede arne_v Ekspert
01. november 2003 - 13:22 #11
svar
Avatar billede jpk Nybegynder
01. november 2003 - 14:43 #12
Du kunne også overveje en anden implementation. Den du har valgt, kunne jeg godt forestille mig blev meget svær at håndtere når du vil til at have flere objekter til at flytte sig rundt uafhængig af hinanden!

"Normalt" vil dine objekter have en retningsvektor og en hastighed, der tilsammen med tidsforskellen mellem 2 frames bestemmer objektets position.
I dit tilfælde, med Snake-spillet, vil man så ændre slangens retningsvektor når spilleren trykker på en tast. en mere simpel og robust løsning!
Avatar billede zyxtem Nybegynder
01. november 2003 - 14:46 #13
Bruger en mere primmitiv løsning.

  Har et array der inderholder slangen i banen. Viser denne ved hjælp af cout. system("cls"); og sådan kører det. Kan godt kaldes frames men det er det jo i bund og grund ikke
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester