岁月无痕741 2021-08-17 13:04 采纳率: 100%
浏览 110
已结题

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;
}



```

  • 写回答

2条回答 默认 最新

  • aaaa0ggMC 2021-08-17 14:51
    关注

    优化后的代码:

    #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;
    }
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月25日
  • 已采纳回答 8月17日
  • 修改了问题 8月17日
  • 创建了问题 8月17日

悬赏问题

  • ¥15 Mac虚拟机安装Windows,Windows中用idea跑项目,报错process finished with exit code -1073741819(0xc0000005) 如何解决?
  • ¥15 关于python爬虫返回js数据结构的处理
  • ¥15 ubuntu所用stm32标准库开发烧录没反映
  • ¥15 运维工程师(在职人员回答)
  • ¥15 python 爬虫问题
  • ¥15 Kmeans的趋势分析有会的吗
  • ¥20 R语言单细胞测序 对seurat对象进行标准化时出现问题
  • ¥15 Anaconda navigator updateor一直更新
  • ¥15 请问如何在matlab里使用raven工具?
  • ¥100 关于ios手游充值到一定金额,再点充值提示公众号的问题。