vc++6.0的,游戏里的暂停界面弹不出来怎么解决

求帮助,我的代码运行后进入初始游戏界面,再开始游戏后进行游戏时无法用暂停功能,弹不出暂停界面。帮我修改一下代码达成效果,再看看存储档和用音乐的格式有没有问题。能帮我优化一下代码就更好了。我是非计算机专业的就对这一本游戏书,就被要求做一款游戏。解答不要太难的,我连小白都算不上的。代码是要在vc++6.0运行的,代码是我对着资源改的很乱。


```c++
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>

// 引用 Windows Multimedia API
#pragma comment(lib,"Winmm.lib")

#define High 600  // 游戏画面尺寸
#define Width 700
#define BallNum 3 // 小球个数

int score = 0; // 得分
int gameStatus = 0; // 游戏状态,0为初始菜单界面,1为正常游戏,2为结束游戏状态,3为游戏暂停
int ball_x[BallNum]={100,300,500},ball_y[BallNum],ball2_x[BallNum]={200,400,600},ball_y2[BallNum],ball_vy[BallNum]={2,1,3},ball_vy2[BallNum]={4,6,5} ; // 小球的坐标
    int radius=15;  // 小球的半径
    int i;
char input;
void startMenu(); // 初始菜单界面
void pauseMenu(); // 游戏暂停后菜单界面,一般按ESC键后启动该界面
void startup();  // 数据初始化    
void show();  // 显示画面
void updateWithoutInput();  // 与用户输入无关的更新
void updateWithInput();     // 与用户输入有关的更新
void gameover();     // 游戏结束、后续处理
void readRecordFile();  //读取游戏数据文件存档
void writeRecordFile();  //存储游戏数据文件存档

void startMenu() // 初始菜单界面
{
    setbkcolor(RGB(80,130,190));// 设置背景色为蓝色
    cleardevice();// 用背景色清空屏幕
    setbkmode(TRANSPARENT);
    settextcolor(BLACK);
    settextstyle(50,0, _T("黑体"));
    outtextxy(233,120, "1 新游戏");
    outtextxy(233, 180, "2 读取游戏存档");
    outtextxy(233, 240, "3 退出");

    FlushBatchDraw();
    Sleep(2);

    char input;
    if(kbhit())  // 判断是否有输入
    {
        input = getch();  // 根据用户的不同输入来移动,不必输入回车
        if (input == '1') 
            gameStatus = 1;
    
        else if (input == '2')
        {
            readRecordFile();
            gameStatus = 1;
        }
        else if (input == '3')
        {
            gameStatus = 2;
            exit(0);
        }
    }
}

void pauseMenu() // 游戏暂停后菜单界面,一般按ESC键后启动该界面
{
    setbkcolor(RGB(80,130,190));// 设置背景色为蓝色
    cleardevice();// 用背景色清空屏幕
    setbkmode(TRANSPARENT);
    settextcolor(BLACK);
    settextstyle(50,0, _T("黑体"));
    outtextxy(233,120, "1 继续游戏");
    outtextxy(233, 180, "2 保存档案");
    outtextxy(233, 240, "3 退出");

    FlushBatchDraw();
    Sleep(2);
    
    char input;
    if(kbhit())  // 判断是否有输入
    {
        input = getch();  // 根据用户的不同输入来移动,不必输入回车
        if (input == '1') 
            gameStatus = 1;
        else if (input == '2')
        {
            writeRecordFile();
            gameStatus = 1;
        }
        else if (input == '3')
        {
            gameStatus = 2;
            exit(0);
        }
    }
}

void readRecordFile()  //读取游戏数据文件存档
{
    FILE *fp;
    fp = fopen("D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\gameRecord.dat","r");
    fscanf(fp,"%d %d %d %d %d %d %d",&ball_x[BallNum],&ball_y[BallNum],&ball2_x[BallNum],&ball_y2[BallNum],&ball_vy[BallNum],&ball_vy2[BallNum],&score);
    fclose(fp);
}

void writeRecordFile()  //存储游戏数据文件存档
{
    FILE *fp;
    fp = fopen("D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\gameRecord.dat","w");
    fprintf(fp,"%d %d %d %d %d %d %d",ball_x[BallNum],ball_y[BallNum],ball2_x[BallNum],ball_y2[BallNum],ball_vy[BallNum],ball_vy2[BallNum],score);
    fclose(fp);
}

void startup()
{
    initgraph(Width,High);
    // 获取窗口句柄
    HWND hwnd = GetHWnd();
    // 设置窗口标题文字
    SetWindowText(hwnd, "节奏大师 v1.0");

    BeginBatchDraw();    
    
    while (gameStatus==0)
        startMenu(); // 初始菜单界面
}

void show()
{
    while (gameStatus==3)
        pauseMenu(); // 游戏暂停后菜单界面,一般按ESC键后启动该界面

    initgraph(Width, High);// 初始化绘图窗口    
    line(0,500,700,500);
    while (1)//for(j=1;j<1000000;j++)//   绘制小球下落
    {
        // 绘制黑线、黑色填充的圆
        setcolor(BLACK);
        setfillcolor(BLACK);
        for (i=0;i<BallNum;i++)
        {
            fillcircle(ball_x[i], ball_y[i], radius);
            fillcircle(ball2_x[i], ball_y2[i], radius);
        }
        for (i=0;i<BallNum;i++)
        {
            ball_x[i] = ball_x[i]; //+ ball_vx[i];
            ball_y[i] = ball_y[i] +ball_vy[i]-1;
            ball_y2[i] = ball_y2[i] +ball_vy2[i];
            if(ball_y2[i]>590) 
            {
                ball_y2[i]=10;
                ball_vy2[i]=ball_vy2[i]+0.1;
            }
            if(ball_y[i]>590) 
            {
                ball_y[i]=10;
                ball_vy[i]=ball_vy2[i]+0.1;
            }
        }

        // 绘制黄线、绿色填充的圆
        setcolor(YELLOW);
        setfillcolor(GREEN);
        for (i=0;i<BallNum;i++)
        {
            fillcircle(ball_x[i], ball_y[i], radius);
        }
        setcolor(YELLOW);
        setfillcolor(BLUE);
        for (i=0;i<BallNum;i++)
        {
            fillcircle(ball2_x[i], ball_y2[i], radius);
        }
    if(kbhit())
    {  
        input = getch();  // 根据用户的不同输入来移动,不必输入回车
        if((input=='a')&&(ball_y[0]>500)) 
            {
            score++;
            mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
            mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
            mciSendString("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\jump.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
            mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
    }
    if((input=='d')&(ball_y[1]>500)) 
        {
            score++;
            mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
            mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
            mciSendString("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\f_gun.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
            mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
    }
    if((input=='k')&(ball_y[2]>500)) 
        {
            score++;
            mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
            mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
            mciSendString("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\jump.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
            mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
    }
    if((input=='s')&(ball_y2[0]>500)) 
        {
            score++;
            mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
            mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
            mciSendString("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\f_gun.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
            mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
    }
    if((input=='j')&(ball_y2[1]>500)) 
        {
            score++;
            mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
            mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
            mciSendString("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\jump.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
            mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
    }
    if((input=='l')&(ball_y2[2]>500)) 
        {
            score++;
            mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
            mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
            mciSendString("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\f_gun.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
            mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
    }
    
    }
    char s[5];
    sprintf(s,"%d",score);
    outtextxy(1,1,s);

    FlushBatchDraw();
    Sleep(50);
}
}
void updateWithoutInput()
{
    
}

void updateWithInput()
{

      for (i=0;i<BallNum;i++) // 随机小球的位置
      {
        
        ball_y[i] = 10;
        ball_y2[i] = 10;
        ball_vy2[i] =ball_vy[i]+(rand()%2)*2 - 1;
    
      }
    
    if(kbhit())  // 判断是否有输入
    {
        input = getch();  // 根据用户的不同输入来移动,不必输入回车
        if (input ==27) // ESC键的ACSII码为27
        {
            gameStatus = 3;
        }
    }
}

void gameover()
{
    EndBatchDraw();
    getch();
    closegraph();
}

int main()
{
    startup();  // 数据初始化
    
    while (1)  //  游戏循环执行
    {
        show();  // 显示画面
        updateWithoutInput();  // 与用户输入无关的更新
        updateWithInput();     // 与用户输入有关的更新
    }
    gameover();     // 游戏结束、后续处理
    return 0;
}



```

优化后的代码:

#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
// 引用 Windows Multimedia API
#pragma comment(lib,"Winmm.lib")
#define High 600  // 游戏画面尺寸
#define Width 700
#define BallNum 3 // 小球个数
//相当于C#的region与end region
#define Block(x)
int score = 0; // 得分
int gameStatus = 0; // 游戏状态,0为初始菜单界面,1为正常游戏,2为结束游戏状态,3为游戏暂停
float ball_x[BallNum]={100,300,500},ball_y[BallNum],ball2_x[BallNum]={200,400,600},ball_y2[BallNum],ball_vy[BallNum]={2,1,3},ball_vy2[BallNum]={4,6,5} ; // 小球的坐标
int radius=15;  // 小球的半径
int i;
char input;
void startMenu(); // 初始菜单界面
void pauseMenu(); // 游戏暂停后菜单界面,一般按ESC键后启动该界面
void startup();  // 数据初始化    
void show();  // 显示画面
void updateWithoutInput();  // 与用户输入无关的更新
void updateWithInput();     // 与用户输入有关的更新
void gameover();     // 游戏结束、后续处理
void readRecordFile();  //读取游戏数据文件存档
void writeRecordFile();  //存储游戏数据文件存档
void startMenu() // 初始菜单界面
{
    setbkcolor(RGB(80,130,190));// 设置背景色为蓝色
    cleardevice();// 用背景色清空屏幕
    setbkmode(TRANSPARENT);
    settextcolor(BLACK);
    settextstyle(50,0, _T("黑体"));
    outtextxy(233,120, _T("1 新游戏"));
    outtextxy(233, 180, _T("2 读取游戏存档"));
    outtextxy(233, 240, _T("3 退出"));
    FlushBatchDraw();
    Sleep(2);
    char input;
    if(_kbhit())  // 判断是否有输入
    {
        input = _getch();  // 根据用户的不同输入来移动,不必输入回车
        if (input == '1') 
            gameStatus = 1;
        else if (input == '2')
        {
            readRecordFile();
            gameStatus = 1;
        }
        else if (input == '3')
        {
            gameStatus = 2;
            exit(0);
        }
    }
}
void pauseMenu() // 游戏暂停后菜单界面,一般按ESC键后启动该界面
{
    setbkcolor(RGB(80,130,190));// 设置背景色为蓝色
    cleardevice();// 用背景色清空屏幕
    setbkmode(TRANSPARENT);
    settextcolor(BLACK);
    settextstyle(50,0, _T("黑体"));
    outtextxy(233,120, _T("1 继续游戏"));
    outtextxy(233, 180, _T("2 保存档案"));
    outtextxy(233, 240, _T("3 退出"));
    FlushBatchDraw();
    Sleep(2);
    char input;
    if(_kbhit())  // 判断是否有输入
    {
        input = _getch();  // 根据用户的不同输入来移动,不必输入回车
        if (input == '1') 
            gameStatus = 1;
        else if (input == '2')
        {
            writeRecordFile();
            gameStatus = 1;
        }
        else if (input == '3')
        {
            gameStatus = 2;
            exit(0);
        }
    }
}
void readRecordFile()  //读取游戏数据文件存档
{
    FILE *fp;
    fopen_s(&fp,"D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\gameRecord.dat","r");
    if(!fp)return;
    fscanf_s(fp,"%f %f %f %f %f %f %f",&ball_x[BallNum],&ball_y[BallNum],&ball2_x[BallNum],&ball_y2[BallNum],&ball_vy[BallNum],&ball_vy2[BallNum],&score);
    fclose(fp);
}
void writeRecordFile()  //存储游戏数据文件存档
{
    FILE *fp;
    fopen_s(&fp,"D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\gameRecord.dat","w");
    if(!fp)return;
    fprintf_s(fp,"%f %f %f %f %f %f %f",ball_x[BallNum],ball_y[BallNum],ball2_x[BallNum],ball_y2[BallNum],ball_vy[BallNum],ball_vy2[BallNum],score);
    fclose(fp);
}
void startup()
{
    initgraph(Width,High);
    // 获取窗口句柄
    HWND hwnd = GetHWnd();
    // 设置窗口标题文字
    SetWindowText(hwnd, _T("节奏大师 v1.0"));
    BeginBatchDraw();    
    while (gameStatus==0)
        startMenu(); // 初始菜单界面
}
void show()
{
    //修改建议:startup不是已经init了吗还要一遍吗,多次一举
    //initgraph(Width, High);// 初始化绘图窗口
    //Block(看一下是不是要while循环){
    while(1){
        while (gameStatus==3)
            pauseMenu(); // 游戏暂停后菜单界面,一般按ESC键后启动该界面
        setbkcolor(RGB(0,0,0));
        cleardevice();
        line(0,500,700,500);
        // 绘制黑线、黑色填充的圆
        setcolor(BLACK);
        setfillcolor(BLACK);
        for (i=0;i<BallNum;i++)
        {
            fillcircle((int)ball_x[i],(int) ball_y[i], radius);
            fillcircle((int)ball2_x[i],(int) ball_y2[i], radius);
        }
        for (i=0;i<BallNum;i++)
        {
            //ball_x[i] = ball_x[i]; //+ ball_vx[i];
            ball_y[i] = ball_y[i] + ball_vy[i]-1;
            ball_y2[i] = ball_y2[i] + ball_vy2[i];
            if(ball_y2[i]>590) 
            {
                ball_y2[i]=10;
                ball_vy2[i]=ball_vy2[i]+(float)0.1;
            }
            if(ball_y[i]>590) 
            {
                ball_y[i]=10;
                ball_vy[i]=ball_vy2[i]+(float)0.1;
            }
        }
        // 绘制黄线、绿色填充的圆
        setcolor(YELLOW);
        setfillcolor(GREEN);
        for (i=0;i<BallNum;i++)
        {
            fillcircle((int)ball_x[i], (int)ball_y[i], radius);
        }
        setcolor(YELLOW);
        setfillcolor(BLUE);
        for (i=0;i<BallNum;i++)
        {
            fillcircle((int)ball2_x[i], (int)ball_y2[i], radius);
        }
        Block(没用的运动与播放音乐){
            if(_kbhit())
            {  
                input = _getch();  // 根据用户的不同输入来移动,不必输入回车
                if((input=='a')&&(ball_y[0]>500)){
                    score++;
                    mciSendString(_T("stop gemusic"), NULL, 0, NULL);   // 先把前面一次的音乐停止
                    mciSendString(_T("close gemusic"), NULL, 0, NULL); // 先把前面一次的音乐关闭
                    mciSendString(_T("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\jump.mp3 alias gemusic"), NULL, 0, NULL); // 打开跳动音乐
                    mciSendString(_T("play gemusic"), NULL, 0, NULL); // 仅播放一次
                }else if (input ==27){
                    gameStatus = 3;
                }}else if((input=='d')&(ball_y[1]>500)){
                        score++;
                        mciSendString(_T("stop gemusic"), NULL, 0, NULL);   // 先把前面一次的音乐停止
                        mciSendString(_T("close gemusic"), NULL, 0, NULL); // 先把前面一次的音乐关闭
                        mciSendString(_T("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\f_gun.mp3 alias gemusic"), NULL, 0, NULL); // 打开跳动音乐
                        mciSendString(_T("play gemusic"), NULL, 0, NULL); // 仅播放一次
                }else if((input=='k')&(ball_y[2]>500)){
                        score++;
                        mciSendString(_T("stop gemusic"), NULL, 0, NULL);   // 先把前面一次的音乐停止
                        mciSendString(_T("close gemusic"), NULL, 0, NULL); // 先把前面一次的音乐关闭
                        mciSendString(_T("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\jump.mp3 alias gemusic"), NULL, 0, NULL); // 打开跳动音乐
                        mciSendString(_T("play gemusic"), NULL, 0, NULL); // 仅播放一次
                }else if((input=='s')&(ball_y2[0]>500)){
                        score++;
                        mciSendString(_T("stop gemusic"), NULL, 0, NULL);   // 先把前面一次的音乐停止
                        mciSendString(_T("close gemusic"), NULL, 0, NULL); // 先把前面一次的音乐关闭
                        mciSendString(_T("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\f_gun.mp3 alias gemusic"), NULL, 0, NULL); // 打开跳动音乐
                        mciSendString(_T("play gemusic"), NULL, 0, NULL); // 仅播放一次
                }else if((input=='j')&(ball_y2[1]>500)){
                        score++;
                        mciSendString(_T("stop gemusic"), NULL, 0, NULL);   // 先把前面一次的音乐停止
                        mciSendString(_T("close gemusic"), NULL, 0, NULL); // 先把前面一次的音乐关闭
                        mciSendString(_T("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\jump.mp3 alias gemusic"), NULL, 0, NULL); // 打开跳动音乐
                        mciSendString(_T("play gemusic"), NULL, 0, NULL); // 仅播放一次
                }else if((input=='l')&(ball_y2[2]>500)) {
                        score++;
                        mciSendString(_T("stop gemusic"), NULL, 0, NULL);   // 先把前面一次的音乐停止
                        mciSendString(_T("close gemusic"), NULL, 0, NULL); // 先把前面一次的音乐关闭
                        mciSendString(_T("open .D:\\c语言\\作业\\随书资源\\第6章\\音乐素材\\f_gun.mp3 alias gemusic"), NULL, 0, NULL); // 打开跳动音乐
                        mciSendString(_T("play gemusic"), NULL, 0, NULL); // 仅播放一次
                }
            }
        //修改建议,用宽字符,否则乱码(反正VisualC++ 2010 Express乱码了)
        wchar_t s[64];
        wsprintf(s,L"Score:%d",score);
        settextstyle(16,0,_T("黑体"));
        outtextxy(1,1,s);
        FlushBatchDraw();
        Sleep(50);
    }
}
void updateWithoutInput()
{
}
void updateWithInput()
{
    for (i=0;i<BallNum;i++) // 随机小球的位置
   {
        ball_y[i] = 10;
        ball_y2[i] = 10;
        ball_vy2[i] =ball_vy[i]+(rand()%2)*2 - 1;
   }
}
void gameover()
{
    EndBatchDraw();
    _getch();
    closegraph();
}
int main()
{
    startup();  // 数据初始化
    while (1)  //  游戏循环执行
    {
        show();  // 显示画面
        //PS:这里永远都无法执行到不知道你怎么想的,反正就这样了
        updateWithoutInput();  // 与用户输入无关的更新
        updateWithInput();     // 与用户输入有关的更新
    }
    gameover();     // 游戏结束、后续处理
    return 0;
}

如果有疑惑,还可以回复我提问

你的show函数一直运行着
while(1){
....
}
没时间执行updateWithInput,所以就无法检测了,应该让show函数不是while,应该把判断的函数与显示函数通通集成到show中
帮你优化的话,还需要点时间