我試圖進入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)
對於我們這些在點擊到異地鏈接的機會不咬,你說你有兩個線程,都等待*同*同步輸入,並且每次搶劫其他的機會,在餐桌上? – WhozCraig
您的帖子需要包含一個[mcve] **這裏**,在問題本身中,而不是在兩個單獨的鏈接外。首先,你的問題應該是獨立的;對主要內容使用外部鏈接意味着如果由於某種原因該鏈接不可用,則您的問題對於未來的用戶而言沒有價值。其次,期待我們離開這個網站並去其他地方弄清楚你所問的只是不合理的。你要求我們提供**免費的幫助**來解決**你的問題** - 你應該儘可能地讓我們變得容易,並且在各處反彈來閱讀它並不是這樣做的。見[問]。 –
編輯@KenWhite – Thomas