Avatar billede viper_killerguy Nybegynder
23. maj 2003 - 22:26 Der er 16 kommentarer

kørsel og tage imod input samtidigt.

jeg skal lave et snake spil, problemer er at den lagger når man trykker på en tast, jeg vil spørge om der er en bedre måde at lave det på:
mit fehlscript:
while(loop)
{
sleep(100);
if (!kbhit())
{
cout << "#";
} else {
int input = getch();
if (input == 75) { ....
}
}

problemet med mit slamkode er at den lagger når man trykker på en tast, så spillet kommer til at kørere mærkligt.

håber i forstår hvad jeg mener.
Avatar billede bertelbrander Praktikant
23. maj 2003 - 23:15 #1
Jeg forstår ikke hvad du mener, men kan godt se at der mangler en del i at lave et snake spil.

Prøv at se på dette spørgsmål og dets svar:
http://www.eksperten.dk/spm/354828

Det kunne være en start på et snake spil.
Avatar billede viper_killerguy Nybegynder
24. maj 2003 - 00:08 #2
det spørgsmål du linker til ændre kun position når man trykker på en knap, i et snake baseret script, skal den selv bevæge sig hver antal ms, og når man trykker på en task ændre den en værdi der fortæller script hvilken vej den skal bevæge sig hver antal ms. Problemet med mit script er at den lagger sykt når man trykker på en task.
Avatar billede bertelbrander Praktikant
24. maj 2003 - 00:21 #3
Jeg forstår ikke hvad "lagger sykt" betyder.
I spørgsmålet som jeg linker til kunne man tilføje to variabler dx og dy.
Disse kunne sættes til værdierne 1 og 0 initielt, for hver runde i loopen kunne man så lægge dx til pos.x og dy til pos.y.
Når der blev trykket på f.ex venstre tast kunne man sætte dx til -1 og dy til 0, ved tryk på ned kunne dx sættes til 0 og dy til 1 etc.
Avatar billede viper_killerguy Nybegynder
24. maj 2003 - 00:23 #4
kan da lige forklarer lidt mere om scriptet.

while(loop)
{
sleep(100);
if (!kbhit())
{
gotoxy(x,y)
cout << "#";
if (direction == 1) { x += 1; }
osv.
} else {
int input = getch();
if (input == 75) { direction = 1; }
if (input == 77) { direction = 2; }
osv.
}
}

det her er selvfølgelig ikke et snake spil, bare grundprincippet i hvordan det ser ud.
Avatar billede viper_killerguy Nybegynder
24. maj 2003 - 00:28 #5
når scriptet kører ændre den selv koordinaterne til #'en hver 100 ms i en bestemt retning.
Når man så trykker på en tast, ændre scriptet retningen, så #'en bevæger sig i en ny retning.
Problemet er at når man trykker på en tast, går der en 3 loops der tager mindst 200ms.
Jeg skal finde en anden metode at kører scriptet på, så det ikke lagger når man trykker på en knap og scriptet skal ændre retning på #'en.
Avatar billede bertelbrander Praktikant
24. maj 2003 - 00:34 #6
1: Du bør nok flytte snak'en for hver gennemløb af loopen.
2: Du bør nok slette noget af halen for hver gennemløb, ellers bliver slangen hurtigt for lang.
3: Når man trykker på en piletast returnerer getch() først et 0 og derefter 75 etc.

F.ex:
while(loop)
{
  sleep(100);
  gotoxy(x, y)
  cout << " ";  // slet halen
  if (direction == 1) { x += 1; } // osv.
  gotoxy(x, y)
  cout << "#";
 
  if (kbhit())
  {
    int input = getch();
    if(input == 0)
    {
      input = getch();
      if (input == 75) { direction = 1; }
      if (input == 77) { direction = 2; } // osv.
    }
  }
}

Dette vil give en slange med et hoved men uden hale.
Du kan herefter lave et array så du kan huske hvor slangen er så du kan slette enden af halen.
Avatar billede bertelbrander Praktikant
24. maj 2003 - 00:40 #7
Bortset fra det er den optimale løsning stadig at bruge GetAsyncKeyState() som i eksemplet jeg linkede til.
Avatar billede viper_killerguy Nybegynder
24. maj 2003 - 00:44 #8
der er ingen fejl i koden, problemet er at den er meget langsom.
alt det andet pjat med selve snake-spillet har jeg kodet, problemet er at scriptet går lidt i stå når man trykker på en tast.
Mit virker ikke hvis jeg smider en if(input == 0) ind. men det virkede fint før.
Avatar billede viper_killerguy Nybegynder
24. maj 2003 - 00:59 #9
GetAsyncKeyState() virker ikke her. borland 5.5 melder ikke fejl, og jeg har includede windows.h, den viser ingen fejl, det virker bare ikke.
Avatar billede bertelbrander Praktikant
24. maj 2003 - 01:03 #10
Hviken kode er der ikke fejl i?
Hvilken kompiler bruger du?
Prøv at lave følgende lille program og se hvad der sker når du trykker på piletasterne, prøv også at trykke på H (dvs shift h):

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

int main(void)
{
  int x;
  while((x = getch()) != 'q')
  {
    printf("Key %d\n", x);
  }
  return 0;
}
Avatar billede bertelbrander Praktikant
24. maj 2003 - 01:13 #11
Jeg lavede følgende lille program og kompilerede det med Borland C++ 5.5.1, og det ser ud til at virke:

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

int main(void)
{
  while ( !(GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) )
  {
    if ( GetAsyncKeyState(VK_LEFT) & 0x8000 )
      printf("Left\n");

    if ( GetAsyncKeyState(VK_RIGHT) & 0x8000 )
      printf("Right\n");
    if ( GetAsyncKeyState(VK_UP) & 0x8000 )
      printf("Up\n");
    if ( GetAsyncKeyState(VK_DOWN) & 0x8000 )
      printf("Down\n");
  }
  return 0;
}
Avatar billede viper_killerguy Nybegynder
24. maj 2003 - 01:17 #12
ja, der kommer et nul først når man bruger specille tegn, kan jeg se nu.

Jeg prøvede med dit første eksempel igen, og jeg må have ramt tasterne rigtigt denne gang for nu virker det perfekt.

Men lav lige et "svar" så jeg kan få afsluttet spørgsmålet og give dig nogle points.
Avatar billede viper_killerguy Nybegynder
24. maj 2003 - 01:17 #13
og mange tak forresten.
Avatar billede bertelbrander Praktikant
24. maj 2003 - 01:21 #14
Du kunne optimere lidt ved at bytte rundt på rækkefølgen i loopen, så du tester på tastetryk lige efter at du har sleep'et:

while(loop)
{
  sleep(100);
  if (kbhit())
  {
    int input = getch();
    if(input == 0)
    {
      input = getch();
      if (input == 75) { direction = 1; }
      if (input == 77) { direction = 2; } // osv.
    }
  }
  gotoxy(x, y)
  cout << " ";  // slet halen
  if (direction == 1) { x += 1; } // osv.
  gotoxy(x, y)
  cout << "#";
}
Avatar billede bertelbrander Praktikant
24. maj 2003 - 01:23 #15
Desværre virke min svar knap ikke...
Avatar billede viper_killerguy Nybegynder
24. maj 2003 - 01:36 #16
det var da lidt kedeligt.
Men mange tak for hjælpen.
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