-3

リソース ファイルで PlaySound() を使用する方法についてちょっと混乱しています。ここを読んですべてをテストすると、コンソール プロンプト u_u で wav ファイルのサウンドを取得できません。ですから、私を助けていただければ、とても感謝しています。$

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "resources.h"

#pragma comment(lib, "Winmm.lib")

int main () {

srand (time(NULL));

int secreto, num, s1, s2, s3, d1, d2, d3, toque, fama, computer, ntoques, nfamas, fin, pc;

PlaySound(MAKEINTRESOURCE(sound), NULL, SND_RESOURCE | SND_ASYNC | SND_LOOP);

printf ("\n\n\t\t***************************************\n\n");
printf ("\n\n\t\t** Bienvenido al juego: Toque y Fama **\n\n"); //momento donde se inicia el juego
printf ("\n\n\t\t***************************************\n\n");
secreto = (rand()%899+100); //funcion que permitira aleatoriamente elegir un numero secreto
printf ("\n\n\n\tEn este juego tienes que adivinar el numero que estoy pensando! \n\n\t\t\tSeras capaz de lograrlo?\n\n\n");
printf ("\nPor favor, ingrese un numero de tres cifras\n\n");
scanf ("\n%d",&num); //aqui el jugador digita un numero con el fin de adivinar el de su rival

while ((num<000)||(num<=011)||(num>=1000)) {
    printf ("\n\nLos digitos ingresados no son de tres cifras");
    printf ("\n\nIngrese un nuevo numero: \n\n");
    scanf ("%d",&num);
}

while (num != secreto) { //se produciran iteraciones siempre que el numero que se digite sea distinto al numero secreto del rival
    s1= secreto/100;
    s2= (secreto%100-secreto%100%10)/10; //aqui se hace la division del numero secreto para poder hacer las combinaciones
    s3= secreto%100%10;

    d1= num/100;
    d2= (num%100-num%100%10)/10; //lo mismo se hace con el numero dado por el rival
    d3= num%100%10;

    toque = 0;
    fama  = 0;

    if ((d1==s1)||(d2==s2)||(d3==s3)||(d1==s2)||(d1==s3)||(d2==s1)||(d2==s3)||(d3==s1)||(d3==s2)) { //aca se ven las combinaciones posibles de toques y famas
        if (d1==s1){
            fama=fama+1;
        }
        if (d2==s2){
            fama=fama+1;
        }
        if (d3==s3){
            fama=fama+1;
        }
        if (d1==s2){
            toque=toque+1;
        }
        if (d1==s3){
            toque=toque+1;
        }
        if (d2==s1){
            toque=toque+1;
        }
        if (d2==s3){
            toque=toque+1;
        }
        if (d3==s1){
            toque=toque+1;
        }
        if (d3==s2){
            toque=toque+1;
        }
        if (toque==1){
            printf ("Tu tienes un toque\n");
        }
        if (toque==2||toque==3){
            printf ("Tu tienes %d toques\n",toque);
        }
        if (fama==1){
            printf ("Tu tienes una fama\n");
        }
        if (fama==2||fama==3){
            printf ("Tu tienes %d famas\n",fama);
        }
    }
    computer = (rand()%899+100); //esta funcion permitira generar el numero que cumplira la funcion de adivinar el secreto rival
    printf ("\n\t\t\t*******************\n\n");
    printf ("\n\t\t\tTurno de la Maquina\n\n");
    printf ("\n\t\t\t*******************\n\n");
    printf ("\n\nNo has acertado, estos son mis numeros: \n\n");
    printf ("%d\n\n",computer);
    printf ("\nIngrese cantidad de toques acertados\n\n");
    scanf ("\n%d",&ntoques);

    while ((ntoques<0)||(ntoques>=4)) {
        printf ("\nLos toques ingresados no son correctos. Favor ingresar nuevamente\n\n");
        scanf ("\n%d",&ntoques);
    }

    printf ("\nIngrese cantidad de famas acertadas\n\n");
    scanf ("\n%d",&nfamas);

    while ((nfamas<0)||(nfamas>=4)) {
        printf ("\nLas famas ingresadas no son correctas. Favor ingresar nuevamente\n\n");
        scanf ("\n%d",&nfamas);
    }

    if (nfamas==3) {
        pc = 1;
        fin = secreto;
        num = fin;
    }
    else {
        printf ("\n\t\t\t*****************\n\n");
        printf ("\n\t\t\tTurno del Jugador\n\n"); //se vuelve a la iteracion si no se ha adivinado el numero
        printf ("\n\t\t\t*****************\n\n");
        printf ("\n\nIngresa un nuevo numero: \n\n");
        scanf ("\n%d",&num);

        while ((num<000)||(num<=011)||(num>=1000)) {
            printf ("\nLos digitos ingresados no son de tres cifras");
            printf ("\n\nIngrese un nuevo numero: \n\n");
            scanf ("\n%d",&num);
        }
    }
}
if (pc==1) {
    printf ("\n\nTe he derrotado\n\n"); //si se adivina, sale de la iteracion y escribe la derrota del jugador
    printf ("\n\nEl juego ha concluido\n\n");
}
else {
    printf ("\n\nMe has derrotado\n\n"); //si el jugador adivina el secreto rival, el ordenador escribira esta frase
    printf ("\n\nEl juego ha concluido\n\n");
}

return 0;
}

私のリソースファイルには次の行があります

sound WAVE "eric johnson - 017 eric johnson - cliffs of dover441.wav"

そして、ヘッダー ファイル (resources.h) は、単純に

#ifndef RESOURCE_H_INCLUDED
#define RESOURCE_H_INCLUDED

#define sound 1001

#endif // RESOURCE_H_INCLUDED

コンパイル、フラグ -lwinmm および -mwindows を追加すると、プログラムはコンパイルされますが、実行すると、プログラムの残りの部分から音も応答も得られず、メモリを消費するだけで、他には何もありません。

すべてに感謝します:3。

4

1 に答える 1

1

引数を渡していますが、プログラムはそれを使用していません。以下のように変更

int main(int argc, const char* argv[])
...
    PlaySound(TEXT(argv[1]), NULL, SND_FILENAME);

これにより、渡されたファイル名が取得され、再生されます。

Edit1 これが機能するかどうかを確認します

PlaySound((LPCTSTR) SND_ALIAS_SYSTEMSTART, NULL, SND_ALIAS_ID);

起動音が聞こえるはずです - これは基本的に、PlaySound が基本的に機能することを証明しています。まったく音が出ない場合は、別の原因が考えられます。ロードする曲はすべてメモリに収まる必要があることに注意してください。

それが機能する場合は、試してください

PlaySound(TEXT("SystemStart"), NULL, SND_ALIAS);

それが機能する場合は、\windows\media\chimes.wav を現在のディレクトリにコピーして試してください。

PlaySound(TEXT(".\\chimes.wav"), NULL, SND_FILENAME);

それでもうまくいかない場合は、実行時のディレクトリを特定します。それが機能するようになったら、.wav ファイルで試してください。それが機能する場合は、フルパス名を試してください

PlaySound(TEXT("\\Windows\\Media\\Windows Logoff Sound.wav"), NULL, SND_FILENAME);

それが機能する場合は、WAV ファイルのフル パスで試してください。

于 2014-07-22T05:19:24.180 に答える