一个猜数字的游戏,采用双线程,第一局游戏正常,结束后会弹出是否继续游戏的提示,可是无论是我选择继续还是退出游戏,要么开始死循环,要么就是跳转到请输入一个数,疯狂循环,不会改了
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
using namespace std;
clock_t Begin, End;
double g_Time;
int g_n, g_num, g_sec, g_flag;
DWORD WINAPI Timer(LPVOID lpParameter)
{
while (g_flag)
{
End = clock();
Sleep(10);
}
return 0;
}
DWORD WINAPI Gamer(LPVOID lpParameter)
{
while (g_flag)
{
cout << "请输入一个数(1-10000):";
cin >> g_n;
if (g_n > g_num)
{
cout << "太高" << endl;
}
else if (g_n < g_num)
{
cout << "太低" << endl;
}
else
{
g_flag = 0;
return 0;
}
}
return 0;
}
class Thread
{
public:
HANDLE h1, h2;
void Create()
{
h2 = CreateThread(NULL, 0, Gamer, NULL, 0, NULL);
h1 = CreateThread(NULL, 0, Timer, NULL, 0, NULL);
}
};
class Game
{
public:
void Play()
{
int op = 0;
g_flag = 1;
srand((unsigned int)time(NULL));
g_num = rand() % 10000 + 1;
Thread T;
cout << "请输入游戏时间(单位为秒):";
cin >> g_sec;
g_Time = 0;
Begin = clock();
T.Create();
while (g_Time < g_sec && g_flag)
{
g_Time = double(End - Begin) / CLOCKS_PER_SEC;
}
if (g_flag == 0)
{
cout << "正确猜出数:" << g_num << endl;
}
else
{
cout << endl
<< "游戏超时,该数字为:" << g_num << endl;
}
}
};
int main()
{
char op;
while (1)
{
Game Gamer;
Gamer.Play();
cout << "游戏结束,输入1退出游戏,输入其它键重新开始。" << endl;
cin >> op;
if (op == '1')
{
break;
}
}
return 0;
}
重新开始时需要把全局变量重置。
代码修改如下:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
using namespace std;
clock_t Begin, End;
double g_Time;
int g_n, g_num, g_sec, g_flag;
DWORD WINAPI Timer(LPVOID lpParameter)
{
while (g_flag)
{
End = clock();
Sleep(10);
}
return 0;
}
DWORD WINAPI Gamer(LPVOID lpParameter)
{
while (g_flag)
{
cout << "请输入一个数(1-10000):";
cin >> g_n;
if (g_n > g_num)
{
cout << "太高" << endl;
}
else if (g_n < g_num)
{
cout << "太低" << endl;
}
else
{
g_flag = 0;
return 0;
}
}
return 0;
}
class Thread
{
public:
HANDLE h1, h2;
void Create()
{
h2 = CreateThread(NULL, 0, Gamer, NULL, 0, NULL);
h1 = CreateThread(NULL, 0, Timer, NULL, 0, NULL);
}
//等待线程执行完毕返回
void Wait()
{
WaitForSingleObject(h1, INFINITE);
WaitForSingleObject(h2, INFINITE);
}
};
class Game
{
public:
void Play()
{
//int op = 0;
g_flag = 1;
g_num = rand() % 10000 + 1;
Thread T;
cout << "请输入游戏时间(单位为秒):";
cin >> g_sec;
g_Time = 0;
Begin = clock();
T.Create();
while (g_Time < g_sec && g_flag)
{
g_Time = double(End - Begin) / CLOCKS_PER_SEC;
}
if (g_flag == 0)
{
cout << "正确猜出数:" << g_num << endl;
}
else
{
cout << endl << "游戏超时,该数字为:" << g_num << endl;
g_flag = 0; //这里让已有线程终止
}
T.Wait();
}
};
int main()
{
int op;
srand((unsigned int)time(NULL)); //这个执行一次即可
Game Gamer; //这个放在while外面即可
while (1)
{
Gamer.Play();
cout << "游戏结束,输入1退出游戏,输入其它键重新开始。" << endl;
cin >> op;
if (op == 1)
{
break;
}
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!