我正试图进入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)“旅行”
答案 0 :(得分:0)
这不是线程的好用例。
您的两个帖子都定期调用_kbhit()
和_getch()
。这意味着他们可以有效地战斗&#34;过度输入 - 当按下某个键时,无论哪个人设法调用_getch()
,首先获得该键,而另一个获得任何内容。
重写您的程序以作为处理两个玩家的单个循环运行。你不需要线程。