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