两个玩家的蛇 - 多线程不起作用

时间:2017-01-11 23:17:45

标签: c

我正试图进入C“更深层次”,所以我决定写一个游戏 - Snake for 2 players。

创建一个“地图”,Snake结构,将它放入“地图”(使用COORD)不是问题,但我知道,我会卡在某个地方,所以......就在这里。

/ *我创建了两个名为ruch()和ruch2()的函数,它们都使用_kbhit()和_getch()来移动s1和s2 Snake结构(只有“head”已经写好了,会照顾“tail” “后来)。 问题是我希望每个Snake在一个选定的方向上同时移动(基于_getch()),所以我尝试使用指南中的多线程函数,但它不起作用。

以下是代码:http://pastebin.com/psm6hm3p

Previosly,没有名为ruch2()的函数,它与原始ruch()合并。 这里是原始的ruch():http://pastebin.com/WXpPfK8H - 所以每当用户按下键时你都可以看到,其中一个案例开始循环(直到下一个_getch()) - 它可以工作,但它被窃听 - 只有一个Snake能够连续移动,因为当一个移动时 - 第二个等待_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;
    }
}

}

负责多线程的一些代码行不起作用:

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 - 多线程问题

编辑:一些函数的名字是波兰语,所以ruch = move,zryj = food,Snake japko =食物结构,rysuj =绘制地图一次,并通过putcharXY(COORD)“旅行”

1 个答案:

答案 0 :(得分:0)

这不是线程的好用例。

您的两个帖子都定期调用_kbhit()_getch()。这意味着他们可以有效地战斗&#34;过度输入 - 当按下某个键时,无论哪个人设法调用_getch(),首先获得该键,而另一个获得任何内容。

重写您的程序以作为处理两个玩家的单个循环运行。你不需要线程。

相关问题