2017-01-11 3 views
-2

Ich versuche, in C "tiefer" zu kommen, also habe ich beschlossen, ein Spiel zu schreiben - Schlange für 2 Spieler.Schlange für 2 Spieler - Multithreading funktioniert nicht

Erstellen einer "Karte", Snake-Struktur, setzen Sie es in die "Karte" (mit COORD) ist kein Problem, aber ich wusste, ich würde irgendwo stecken, also ... hier ist es.

/* Ich habe zwei Funktionen namens ruch() und ruch2() erstellt, die beide _kbhit() und _getch() verwenden, um die s1 und s2 Snake Strukturen zu verschieben (nur "head" ist bereits geschrieben, kümmert sich um " Schwanz "später). Das Problem ist, dass ich möchte, dass jede Schlange sich gleichzeitig in eine der gewählten Richtungen bewegt (basierend auf _getch()), also habe ich versucht, eine Multithreading-Funktion von einem der Guides zu verwenden, aber es funktioniert nicht.

Hier ist der Code: http://pastebin.com/psm6hm3p

previosly, gab es keine Funktion namens ruch2() und wurde mit Original ruch verschmolzen(). Und hier ist original ruch(): http://pastebin.com/WXpPfK8H - so wie Sie sehen können, wenn Benutzer die Taste drückt, startet einer der Fälle die Schleife (bis nächsten _getch()) - es funktioniert, aber es ist abgehört - nur eine Schlange ist dazu in der Lage sich fortwährend bewegen, denn wenn man sich bewegt - wartet Sekunde auf _getch() und umgekehrt. Andere Funktionen in main() können nicht ausgeführt werden. */

Funktion, die zum Bewegen beide Schlangen

void ruch(Snake *g){ 
while (_kbhit()){ 
    switch (_getch()){ 
    case lewo: 
     if (g->y > 1){ 
      while (1){ 
       putcharXY(g->x, g->y, 32); 
       g->y--; 
       putcharXY(g->x, g->y, 176); 
       Sleep(500); 
       if (_getch()){ 
        ruch(g); 
       } 
      } 
     } 
     break; 
    case prawo: 
     if (g->y < width - 2){ 
      while (1){ 
       putcharXY(g->x, g->y, 32); 
       g->y++; 
       putcharXY(g->x, g->y, 176); 
       Sleep(500); 
       if (_getch()){ 
        ruch(g); 
       } 
      } 
     } 
     break; 
    case gora: 
     if (g->x > 1){ 
      while (1){ 
       putcharXY(g->x, g->y, 32); 
       g->x--; 
       putcharXY(g->x, g->y, 176); 
       Sleep(500); 
       if (_getch()){ 
        ruch(g); 
       } 
      } 
     } 
     break; 
    case dol: 
     if (g->x < height - 2){ 
      while (1){ 
       putcharXY(g->x, g->y, 32); 
       g->x++; 
       putcharXY(g->x, g->y, 176); 
       Sleep(500); 
       if (_getch()){ 
        ruch(g); 
       } 
      } 
     } 
     break; 
    } 
} 

}

void ruch2(Snake *h){ 
while (_kbhit()){ 
    switch (_getch()){ 
    case 'a': 
     if (h->y>1){ 
      while (1){ 
       putcharXY(h->x, h->y, 32); 
       h->y--; 
       putcharXY(h->x, h->y, 178); 
       Sleep(500); 
       if (_getch()){ 
        ruch2(h); 
       } 
      } 
     } 
     break; 
    case 'd': 
     if (h->y<width - 2){ 
      while (1){ 
       putcharXY(h->x, h->y, 32); 
       h->y++; 
       putcharXY(h->x, h->y, 178); 
       Sleep(500); 
       if (_getch()){ 
        ruch2(h); 
       } 
      } 
     } 
     break; 
    case 'w': 
     if (h->x>1){ 
      while (1){ 
       putcharXY(h->x, h->y, 32); 
       h->x--; 
       putcharXY(h->x, h->y, 178); 
       Sleep(500); 
       if (_getch()){ 
        ruch2(h); 
       } 
      } 
     } 
     break; 
    case 's': 
     if (h->x<height - 2){ 
      while (1){ 
       putcharXY(h->x, h->y, 32); 
       h->x++; 
       putcharXY(h->x, h->y, 178); 
       Sleep(500); 
       if (_getch()){ 
        ruch2(h); 
       } 
      } 
     } 
     break; 
    } 
} 

}

und

einige Codezeilen, die verantwortlich sind für Multithreading verantwortlich ist, die doesn arbeite nicht:

DWORD WINAPI ThreadId1, ThreadId2; 
HANDLE hHandles1, hHandles2; 
hHandles1 = CreateThread(NULL, 0, ruch(&s1), 
    0, 0, &ThreadId1); 
hHandles2 = CreateThread(NULL, 0, ruch2(&s2), 
    0, 0, &ThreadId2); 
if (hHandles1 == NULL || hHandles2 == NULL) 
{ 
    printf("Nieudane tworzenie watkow\n"); 
    exit(0); 
} 
//Oczekiwanie na zakończenie funkcji 
WaitForSingleObject(hHandles1, INFINITE); 
WaitForSingleObject(hHandles2, INFINITE); 

tl; dr - Problem

bearbeiten Multithreading: einige der Funktion der Namen polieren Worte sind, so Ruch = bewegen, zryj = Nahrung, Schlange japko = Lebensmittelstruktur, rysuj = Unentschieden Karte einmal und " reise "darauf über putcharXY (COORD)

+0

Für diejenigen von uns nicht bei der Gelegenheit zu klicken auf einen Offsite-Link, sagst du, dass Sie zwei Threads, beide auf den * gleichen * synchronen Eingang warten, und jeder rauben die andere seiner Chance auf den Tisch? – WhozCraig

+0

Ihr Beitrag muss ein [mcve] ** hier ** enthalten, in der Frage selbst und nicht in zwei separaten Links außerhalb der Website. Erstens sollte Ihre Frage in sich abgeschlossen sein; Wenn Sie externe Links für wichtige Inhalte verwenden, bedeutet dies, dass Ihre Frage für zukünftige Benutzer keinen Wert hat, wenn dieser Link aus irgendeinem Grund nicht verfügbar ist. Zweitens, erwarten Sie uns, diese Seite zu verlassen und woanders hinzugehen, um herauszufinden, was Sie fragen, ist einfach unvernünftig.Sie bitten uns um ** kostenlose Hilfe **, um ** Ihr Problem zu lösen ** - Sie sollten es uns so leicht wie möglich machen, und überall herumspringen, um es zu lesen, tut es nicht. Siehe [fragen]. –

+0

bearbeitet @KenWhite – Thomas

Antwort

0

Dies ist kein guter Anwendungsfall für Threads.

Beide Threads rufen in regelmäßigen Abständen _kbhit() und _getch() auf. Dies bedeutet, dass sie effektiv über Eingaben "kämpfen" - wenn eine Taste gedrückt wird, erhält derjenige, der es schafft, zuerst diesen Schlüssel zu rufen, und der andere bekommt nichts.

Schreiben Sie Ihr Programm so um, dass es als einzelne Schleife ausgeführt wird, die beide Player abdeckt. Sie brauchen dafür keine Threads.