void PlayMusic() { unsigned char i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { for(j=0;j<SONG_LONG[i]*20;j++) //播放各个音符,SONG_LONG 为拍子长度 { beep=~beep; for(k=0;k<SONG_TONE[i]/3;k++);//SONG_TONE 延时表决定了每个音符的频率 } delay_ms(50); i++; } }这个代码为什么会导致最后一个音拉长不停止
时间: 2024-03-03 12:51:28 浏览: 85
这段代码中,最后一个音符拉长不停止的原因可能是因为在播放最后一个音符时,未对beep进行停止操作。
建议在while循环结束后添加一个语句,将beep置为0,即可停止最后一个音符的播放。例如:
```
void PlayMusic() {
unsigned char i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) {
for(j=0;j<SONG_LONG[i]*20;j++) {
beep=~beep;
for(k=0;k<SONG_TONE[i]/3;k++);
}
delay_ms(50);
i++;
}
beep = 0; // 停止最后一个音符的播放
}
```
相关问题
#include <windows.h> #include <mmsystem.h> //需要包含此头文件 #pragma comment(lib,"winmm.lib") //需要链接此库文件 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("PlayMusic"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("Program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, TEXT("PlayMusic"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); //打开音乐 mciSendString(TEXT("open music.mp3 alias myMusic"), NULL, 0, NULL); //循环播放音乐 mciSendString(TEXT("play myMusic repeat"), NULL, 0, NULL); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } //关闭音乐 mciSendString(TEXT("close myMusic"), NULL, 0, NULL); return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }这里的音乐文件该怎么放在程序的同一目录下
您可以将音乐文件直接放在程序的同一目录下,然后将文件名 `"music.mp3"` 替换为您实际的音乐文件名即可。如果您想要将音乐文件放在程序的子目录中,可以在文件名前加上相对路径,例如 `"./music/music.mp3"`。
注意,在使用 `mciSendString` 函数播放音乐文件之前,需要在程序中包含 `mmsystem.h` 头文件,并且在链接库中加入 `winmm.lib` 库文件。可以通过 `#include <mmsystem.h>` 和 `#pragma comment(lib,"winmm.lib")` 实现。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <graphics.h> #include <conio.h> #include <mmsystem.h> #pragma comment(lib,"winmm.lib") IMAGE background; IMAGE array[16]; IMAGE arrayY[16]; struct bgInfo { int x; int y; int speed; }; struct bgInfo bg = { 1000, 0, 5 }; enum 方向 { LEFT, RIGHT }; struct roleInfo { int x; int y; int direct; }; struct roleInfo role = { 300, 400 ,RIGHT }; void loadResource() { loadimage(&background, "Background\\background.jpg"); for (int i = 0; i < 16; i++) { char fileName[50] = ""; sprintf(fileName, "Helix_attack\\Helix_attack_r%d.gif", i + 1); loadimage(array + i, fileName); sprintf(fileName, "Helix_attack\\Helix_attacky_r%d.gif", i + 1); loadimage(arrayY + i, fileName); } } void drawStand(int i) { putimage(0, 0, 1000, 700, &background, bg.x, bg.y); putimage(role.x, role.y, arrayY + i, SRCAND); putimage(role.x, role.y, array + i, SRCPAINT); } void drawKey(int beginFrame, int endFrame) { int i = beginFrame; while (i < endFrame) { putimage(0, 0, 1000, 700, &background, bg.x, bg.y); putimage(role.x, role.y, arrayY + i, SRCAND); putimage(role.x, role.y, array + i, SRCPAINT); i++; Sleep(50); } } DWORD WINAPI playMusic(LPVOID lpVoid) { mciSendString("open 1.mp3", 0, 0, 0); mciSendString("play 1.mp3 wait", 0, 0, 0); mciSendString("close 1.mp3", 0, 0, 0); return 0; } void keyDown() { fflush(stdin); char userKey = _getch(); switch (userKey) { case 'a': case 'A': case 75: bg.x -= bg.speed; role.x -= 5; if (bg.x <= 0) bg.x = 0; break; case 'd': case 'D': case 77: bg.x += bg.speed; role.x += 5; if (bg.x >= background.getwidth() - 1000) bg.x = background.getwidth() - 1000; break; case 'w': case 'W': case 72: role.y -= 5; break; case 's': case 'S': case 80: role.y += 5; break; case ' ': CreateThread(0, 0, playMusic, 0, 0, 0); drawKey(4, 16); break; } } int main() { loadResource(); initgraph(1000, 700); int i = 0; while (1) { drawStand(i); i++; if (i == 4) i = 0; Sleep(50); if (_kbhit()) { keyDown(); } } _getch(); closegraph(); return 0; }
这段代码是一个简单的游戏程序,使用了C语言和EasyX图形库。程序的功能是控制一个角色在背景中移动,并播放音乐。
代码的主要流程如下:
1. 加载资源:通过loadimage函数加载背景图片和角色动画图片。
2. 绘制静态画面:通过putimage函数将背景图片和角色绘制到屏幕上。
3. 监听键盘输入:通过_getch函数获取用户按下的键,根据不同的键执行相应的操作。
4. 移动角色:根据用户按下的键来改变背景的位置和角色的位置,实现角色的移动。
5. 播放音乐:通过CreateThread函数创建一个线程来播放音乐,使用mciSendString函数打开、播放和关闭音乐文件。
6. 绘制动态画面:通过循环调用drawStand函数,不断切换角色的动画帧,实现角色的动态效果。
7. 程序退出:当用户按下任意键时,程序退出。
请注意,这段代码使用了EasyX图形库,请确保你已经安装了EasyX,并配置好开发环境。另外,代码中的图片文件和音乐文件需要与代码文件放在同一目录下。
阅读全文