2017-01-11 20 views
-2

我試圖進入C「更深」,所以我決定寫一個遊戲 - 2個玩家的蛇。2個玩家的蛇 - 多線程不起作用

創建一個「地圖」,蛇結構,將其放入「地圖」(使用COORD)是沒有問題的,但我知道,我會堅持的地方,所以......在這裏。我創建了兩個名爲ruch()和ruch2()的函數,它們都使用_kbhit()和_getch()來移動s1和s2 Snake結構(只有「頭」已經寫好,將會處理「尾巴「)。 問題是我想讓每個Snake在選定的方向上同時移動(基於_getch()),所以我試圖從指南中使用多線程函數,但它不起作用。

下面的代碼:http://pastebin.com/psm6hm3p

Previosly,沒有函數調用ruch2(),並將其與原魯赫合併()。 這裏是原來的魯赫():http://pastebin.com/WXpPfK8H - 所以你可以看到,每當用戶按下鍵,其中一個個案開始循環(到明年_getch()) - 它的工作原理,但它的竊聽器 - 只有一個蛇能不斷移動,因爲當移動時 - 秒等待_getch(),反之亦然。它也不允許main()中的其他函數運行。 */

功能,其負責移動兩個蛇

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; 
    } 
} 

}

一些代碼行,它們負責多線程該沒有按't work:

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;博士 - 問題與多線程

編輯:一些函數的名字是拋光的話,那麼魯赫=舉動,zryj =食物,蛇japko =食物結構,rysuj =一旦繪製地圖和「通過putcharXY(COORD)

+0

對於我們這些在點擊到異地鏈接的機會不咬,你說你有兩個線程,都等待*同*同步輸入,並且每次搶劫其他的機會,在餐桌上? – WhozCraig

+0

您的帖子需要包含一個[mcve] **這裏**,在問題本身中,而不是在兩個單獨的鏈接外。首先,你的問題應該是獨立的;對主要內容使用外部鏈接意味着如果由於某種原因該鏈接不可用,則您的問題對於未來的用戶而言沒有價值。其次,期待我們離開這個網站並去其他地方弄清楚你所問的只是不合理的。你要求我們提供**免費的幫助**來解決**你的問題** - 你應該儘可能地讓我們變得容易,並且在各處反彈來閱讀它並不是這樣做的。見[問]。 –

+0

編輯@KenWhite – Thomas

回答

0

這不是一個很好的用例線程旅遊」就可以了。

你的線程都定期打電話_kbhit()_getch()。這意味着他們正在有效地「戰鬥」輸入 - 當按下某個按鍵時,無論哪個人先撥打_getch(),都會先獲取該鍵,而另一個則無法獲得。

重寫您的程序以作爲處理兩個球員的單個循環運行。這不需要線程。